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

    function nodeForSelector(selector, callback) {
        WI.domTreeManager.querySelector(documentNode.id, selector, (nodeId) => {
            callback(WI.domTreeManager.nodeForId(nodeId));
        });
    }

    let suite = InspectorTest.createAsyncSuite("WI.cssPath");

    suite.addTestCase({
        name: "WI.cssPath.TopLevelNode",
        description: "Top level nodes like html, body, and head are unique.",
        test(resolve, reject) {
            nodeForSelector("html", (node) => {
                InspectorTest.expectEqual(WI.cssPath(node), "html", "HTML element should have simple selector 'html'.");
            });
            nodeForSelector("html > body", (node) => {
                InspectorTest.expectEqual(WI.cssPath(node), "body", "BODY element should have simple selector 'body'.");
            });
            nodeForSelector("html > head", (node) => {
                InspectorTest.expectEqual(WI.cssPath(node), "head", "HEAD element should have simple selector 'head'.");
                resolve();
            });
        }
    });

    suite.addTestCase({
        name: "WI.cssPath.ElementWithID",
        description: "Element with ID is unique (#id). Path does not need to go past it.",
        test(resolve, reject) {
            nodeForSelector("#id-test", (node) => {
                InspectorTest.expectEqual(WI.cssPath(node), "#id-test", "Element with id should have simple selector '#id-test'.");
            });
            nodeForSelector("#id-test > div", (node) => {
                InspectorTest.expectEqual(WI.cssPath(node), "#id-test > div", "Element inside element with id should have path from id.");
                resolve();
            });
        }
    });

    suite.addTestCase({
        name: "WI.cssPath.InputElementFlair",
        description: "Input elements include their type.",
        test(resolve, reject) {
            nodeForSelector("#input-test input", (node) => {
                InspectorTest.expectEqual(WI.cssPath(node), "#input-test > input[type=\"password\"]", "Input element should include type.");
                resolve();
            });
        }
    });

    suite.addTestCase({
        name: "WI.cssPath.UniqueTagName",
        description: "Elements with unique tag name do not need nth-child.",
        test(resolve, reject) {
            nodeForSelector("#unique-tag-test > span", (node) => {
                InspectorTest.expectEqual(WI.cssPath(node), "#unique-tag-test > span", "Elements with unique tag name should not need nth-child().");
                resolve();
            });
        }
    });

    suite.addTestCase({
        name: "WI.cssPath.NonUniqueTagName",
        description: "Elements with non-unique tag name need nth-child.",
        test(resolve, reject) {
            nodeForSelector("#non-unique-tag-test > span ~ span", (node) => {
                InspectorTest.expectEqual(WI.cssPath(node), "#non-unique-tag-test > span:nth-child(3)", "Elements with non-unique tag name should need nth-child().");
                resolve();
            });
        }
    });

    suite.addTestCase({
        name: "WI.cssPath.UniqueClassName",
        description: "Elements with unique class names should include their class names.",
        test(resolve, reject) {
            nodeForSelector("#unique-class-test > .beta", (node) => {
                InspectorTest.expectEqual(WI.cssPath(node), "#unique-class-test > div.alpha.beta", "Elements with unique class names should include their class names.");
                resolve();
            });
        }
    });

    suite.addTestCase({
        name: "WI.cssPath.NonUniqueClassName",
        description: "Elements with non-unique class names should not include their class names.",
        test(resolve, reject) {
            nodeForSelector("#non-unique-class-test > div ~ div", (node) => {
                InspectorTest.expectEqual(WI.cssPath(node), "#non-unique-class-test > div:nth-child(2)", "Elements with non-unique class names should not include their class names.");
                resolve();
            });
        }
    });

    suite.addTestCase({
        name: "WI.cssPath.UniqueTagAndClassName",
        description: "Elements with unique tag and class name just use tag for simplicity.",
        test(resolve, reject) {
            nodeForSelector("#unique-tag-and-class-test > .alpha", (node) => {
                InspectorTest.expectEqual(WI.cssPath(node), "#unique-tag-and-class-test > div", "Elements with unique tag and class names should just have simple tag.");
                resolve();
            });
        }
    });

    suite.addTestCase({
        name: "WI.cssPath.DeepPath",
        description: "Tests for element with complex path.",
        test(resolve, reject) {
            nodeForSelector("small", (node) => {
                InspectorTest.expectEqual(WI.cssPath(node), "body > div > div.deep-path-test > ul > li > div:nth-child(4) > ul > li.active > a > small", "Should be able to create path for deep elements.");
                resolve();
            });
        }
    });

    suite.addTestCase({
        name: "WI.cssPath.PseudoElement",
        description: "For a pseudo element we should get the path of the parent and append the pseudo element selector.",
        test(resolve, reject) {
            nodeForSelector("#pseudo-element-test > div ~ div", (node) => {
                let pseudoElementBefore = node.beforePseudoElement();
                InspectorTest.assert(pseudoElementBefore);
                InspectorTest.expectEqual(WI.cssPath(pseudoElementBefore), "#pseudo-element-test > div:nth-child(3)::before", "Should be able to create path for ::before pseudo elements.");
                let pseudoElementAfter = node.afterPseudoElement();
                InspectorTest.assert(pseudoElementAfter);
                InspectorTest.expectEqual(WI.cssPath(pseudoElementAfter), "#pseudo-element-test > div:nth-child(3)::after", "Should be able to create path for ::after pseudo elements.");
                resolve();
            });
        }
    });

    // FIXME: Write tests for nodes inside a Shadow DOM Tree.

    WI.domTreeManager.requestDocument((node) => {
        documentNode = node;
        suite.runTestCasesAndFinish();
    });
}
</script>
</head>
<body onload="runTest()">
<p>Test for WI.cssPath.</p>
<!-- If display:none pseudo elements are not created. -->
<div style="visibility:hidden">
    <div id="id-test">
        <div></div>
    </div>
    <div id="input-test">
        <input type="password">
    </div>
    <div id="unique-tag-test">
        <div></div>
        <span></span>
        <div></div>
    </div>
    <div id="non-unique-tag-test">
        <div></div>
        <span></span>
        <span></span>
        <div></div>
    </div>
    <div id="unique-class-test">
        <div class="alpha"></div>
        <div class="alpha beta"></div>
        <div class="alpha"></div>
    </div>
    <div id="non-unique-class-test">
        <div class="alpha"></div>
        <div class="alpha"></div>
        <div class="alpha"></div>
    </div>
    <div id="unique-tag-and-class-test">
        <div class="alpha"></div>
    </div>
    <div class="deep-path-test">
        <ul>
            <li>
                <h1></h1>
                <div></div>
                <div></div>
                <div>
                    <ul class="list">
                        <li></li>
                        <li class="active"><a href="#"><small></small></a></li>
                        <li></li>
                    </ul>
                </div>
            </li>
        </ul>
    </div>
    <div id="pseudo-element-test">
        <style>
        #pseudo-element-test > div~div::before { content: "before"; }
        #pseudo-element-test > div~div::after { content: "after"; }
        </style>
        <div></div>
        <div></div>
    </div>
</div>
</body>
</html>
