<!doctype html>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
<style id="style-container">
</style>
</head>
<body>
</body>
<script>
description('Test the parsing of :nth-child(of) for querySelector and style.');

function testInvalidSelector(selectorString) {
    shouldThrowErrorName('document.querySelector(":nth-child(' + selectorString + ')")', 'SyntaxError');

    var styleContainer = document.getElementById('style-container');
    styleContainer.innerHTML = ':nth-child(' + selectorString + ') { }';
    shouldBe("document.getElementById('style-container').sheet.cssRules.length", "0");
    styleContainer.innerHTML = '';
}

// There are multiple ways of parsing :nth-child() based on the An+B part, we should test everything.
var validNthAnPlusB = [
    "even",
    "odd",
    "n",
    "-n",
    "3",
    "-3",
    "n+0",
    "n-0",
    "0n",
    "3n+5",
    "-3n+5",
    "3n-5",
    "-3n-5",
];

debug("Test invalid selectors:");
// Missing space characters.
for (var i = 0; i < validNthAnPlusB.length; ++i) {
    testInvalidSelector(validNthAnPlusB[i] + " of");
    testInvalidSelector(validNthAnPlusB[i] + " of    ");
    testInvalidSelector(validNthAnPlusB[i] + "of .class");
}

// Use valid identifier but not "of" as a separator.
for (var i = 0; i < validNthAnPlusB.length; ++i) {
    testInvalidSelector(validNthAnPlusB[i] + " empty .class");
    testInvalidSelector(validNthAnPlusB[i] + " from .class");
    testInvalidSelector(validNthAnPlusB[i] + " to .class");
    testInvalidSelector(validNthAnPlusB[i] + " webkit .class");
}

// Matching pseudo elements do not make any sense.
for (var i = 0; i < validNthAnPlusB.length; ++i) {
    testInvalidSelector(validNthAnPlusB[i] + " of ::first-letter");
    testInvalidSelector(validNthAnPlusB[i] + " of ::before");
    testInvalidSelector(validNthAnPlusB[i] + " of ::after");
    testInvalidSelector(validNthAnPlusB[i] + " of ::-webkit-custom");

    testInvalidSelector(validNthAnPlusB[i] + " of .foo, ::before");
    testInvalidSelector(validNthAnPlusB[i] + " of ::before, .foo");
    testInvalidSelector(validNthAnPlusB[i] + " of -webkit-any(::before, .foo)");
    testInvalidSelector(validNthAnPlusB[i] + " of :nth-child(2n+1 of ::before)");
    testInvalidSelector(validNthAnPlusB[i] + " of :not(::before)");
}

// Invalid identifiers, syntax, etc.
for (var i = 0; i < validNthAnPlusB.length; ++i) {
    testInvalidSelector(validNthAnPlusB[i] + " of .123class");
    testInvalidSelector(validNthAnPlusB[i] + " of #123id");
    testInvalidSelector(validNthAnPlusB[i] + " of []");
    testInvalidSelector(validNthAnPlusB[i] + " of ()");
    testInvalidSelector(validNthAnPlusB[i] + " of )");
    testInvalidSelector(validNthAnPlusB[i] + " of {}");
    testInvalidSelector(validNthAnPlusB[i] + " of }");
}

</script>
<script src="../../resources/js-test-post.js"></script>
</html>
