<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function test()
{
    let documentNode;

    let suite = InspectorTest.createAsyncSuite("DOMNode.SelectorEscapes");

    suite.addTestCase({
        name: "DOMNode.SelectorEscapes.NormalId",
        test(resolve, reject) {
            documentNode.querySelector("#id", (nodeId) => {
                let domNode = WI.domManager.nodeForId(nodeId);
                InspectorTest.assert(domNode, "Got DOMNode for id `id`");
                
                InspectorTest.expectEqual(domNode._idSelector(false), "#id", "Unescaped id selector should be `#id`.");
                InspectorTest.expectEqual(domNode._classSelector(false), ".class", "Unescaped class selector should be `.class`.");
                InspectorTest.expectEqual(domNode.unescapedSelector, "div#id.class", "Unescaped selector should be `div#id.class`.");

                InspectorTest.expectEqual(domNode._idSelector(true), "#id", "Escaped id selector should be `#id`.");
                InspectorTest.expectEqual(domNode._classSelector(true), ".class", "Escaped class selector should be `.class`.");
                InspectorTest.expectEqual(domNode.displayName, "div#id.class", "Display name should be `div#id.class`.");
                
                resolve();
            });
        }
    });

    suite.addTestCase({
        name: "DOMNode.SelectorEscapes.NumberId",
        test(resolve, reject) {
            documentNode.querySelector("#\\31 23Id", (nodeId) => {
                let domNode = WI.domManager.nodeForId(nodeId);
                InspectorTest.assert(domNode, "Got DOMNode for id `123Id`");

                InspectorTest.expectEqual(domNode._idSelector(false), "#123Id", "Unescaped id selector should be `#123Id`.");
                InspectorTest.expectEqual(domNode._classSelector(false), ".123Class", "Unescaped class selector should be `.123Class`.");
                InspectorTest.expectEqual(domNode.unescapedSelector, "div#123Id.123Class", "Unescaped selector should be `div#123Id.123Class`.");

                InspectorTest.expectEqual(domNode._idSelector(true), "[id=\"\\31 23Id\"]", "Escaped id selector should be `[id=\"\\31 23Id\"]`.");
                InspectorTest.expectEqual(domNode._classSelector(true), ".\\31 23Class", "Escaped class selector should be `.\\31 23Class`.");
                InspectorTest.expectEqual(domNode.displayName, "div[id=\"\\31 23Id\"].\\31 23Class", "Display name should be `div[id=\"\\31 23Id\"].\\31 23Class`.");

                resolve();
            });
        }
    });

    suite.addTestCase({
        name: "DOMNode.SelectorEscapes.PoundId",
        test(resolve, reject) {
            documentNode.querySelector("#\\#id", (nodeId) => {
                let domNode = WI.domManager.nodeForId(nodeId);
                InspectorTest.assert(domNode, "Got DOMNode for id `#id`");
                
                InspectorTest.expectEqual(domNode._idSelector(false), "##id", "Unescaped id selector should be `##id`.");
                InspectorTest.expectEqual(domNode._classSelector(false), ".#class", "Unescaped class selector should be `.#class`.");
                InspectorTest.expectEqual(domNode.unescapedSelector, "div##id.#class", "Unescaped selector should be `div##id.#class`.");

                InspectorTest.expectEqual(domNode._idSelector(true), "#\\#id", "Escaped id selector should be `#\\#id`.");
                InspectorTest.expectEqual(domNode._classSelector(true), ".\\#class", "Escaped class selector should be `.\\#class`.");
                InspectorTest.expectEqual(domNode.displayName, "div#\\#id.\\#class", "Display name should be `div#\\#id.\\#class`.");

                resolve();
            });
        }
    });

    WI.domManager.requestDocument((node) => {
        documentNode = node;
        suite.runTestCasesAndFinish();
    });
}
</script>
</head>
<body onload="runTest()">
<p>Test for DOMNode.SelectorEscapes.</p>
<div style="display: none">
    <div id="id" class="class"></div>
    <div id="123Id" class="123Class"></div>
    <div id="#id" class="#class"></div>
</div>
</body>
</html>
