<!DOCTYPE html>
<html>
<head>
<title>CSS Selectors: Test parsing of an+b selectors</title>
<link rel="author" title="Chris Nardi" href="mailto:[email protected]">
<link rel="help" href="https://drafts.csswg.org/selectors-3/#nth-child-pseudo">
<link rel="help" href="https://drafts.csswg.org/selectors-3/#nth-last-child-pseudo">
<link rel="help" href="https://drafts.csswg.org/selectors-3/#nth-of-type-pseudo">
<link rel="help" href="https://drafts.csswg.org/selectors-3/#nth-last-of-type-pseudo">
<meta charset="utf-8">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style id="teststyles">
</style>
</head>
<body>
<script>
function add_selector_style(source) {
var style_element = document.getElementById("teststyles");
style_element.firstChild.data = source + "{ font-size: 1em; }";
return style_element.sheet;
}
function assert_selector_serializes_to(source, expected_result) {
test(function() {
var sheet = add_selector_style(source);
assert_equals(sheet.cssRules[0].selectorText, expected_result);
}, source + " should be parsed and serialized correctly");
}
function assert_invalid_selector(source) {
test(function() {
var sheet = add_selector_style(source);
assert_equals(sheet.cssRules[0], undefined);
}, source + " should not parse");
}
function run_tests_on_anplusb_selector(source) {
assert_selector_serializes_to(source + '(1n+0)', source + '(n)');
assert_selector_serializes_to(source + '(n+0)', source + '(n)');
assert_selector_serializes_to(source + '(n)', source + '(n)');
assert_selector_serializes_to(source + '(-n+0)', source + '(-n)');
assert_selector_serializes_to(source + '(-n)', source + '(-n)');
assert_selector_serializes_to(source + '(N)', source + '(n)');
assert_selector_serializes_to(source + '(+n+3)', source + '(n+3)');
assert_selector_serializes_to(source + '( +n + 7 )', source + '(n+7)');
assert_selector_serializes_to(source + '( N- 123)', source + '(n-123)');
assert_selector_serializes_to(source + '(n- 10)', source + '(n-10)');
assert_selector_serializes_to(source + '(-n\n- 1)', source + '(-n-1)');
assert_selector_serializes_to(source + '( 23n\n\n+\n\n123 )', source + '(23n+123)');
assert_invalid_selector(source + '(n- 1 2)');
assert_invalid_selector(source + '(n-b1)');
assert_invalid_selector(source + '(n-+1)');
assert_invalid_selector(source + '(n-1n)');
assert_invalid_selector(source + '(-n -b1)');
assert_invalid_selector(source + '(-1n- b1)');
assert_invalid_selector(source + '(-n-13b1)');
assert_invalid_selector(source + '(-n-+1)');
assert_invalid_selector(source + '(-n+n)');
assert_invalid_selector(source + '(+ 1n)');
assert_invalid_selector(source + '( n +12 3)');
assert_invalid_selector(source + '( 12 n )');
assert_invalid_selector(source + '(+12n-0+1)');
assert_invalid_selector(source + '(+12N -- 1)');
assert_invalid_selector(source + '(+12 N )');
assert_invalid_selector(source + '(+ n + 7)');
}
run_tests_on_anplusb_selector(':nth-child');
run_tests_on_anplusb_selector(':nth-last-child');
run_tests_on_anplusb_selector(':nth-of-type');
run_tests_on_anplusb_selector(':nth-last-of-type');
</script>
</body>
</html>