anb-parsing.html (3336B)
1 <!doctype html> 2 <title>An+B Parsing</title> 3 <script src="/resources/testharness.js"></script> 4 <script src="/resources/testharnessreport.js"></script> 5 <style> 6 7 foo { color: blue; } 8 9 </style> 10 11 <meta name="author" title="Tab Atkins-Bittner"> 12 <link rel=help href="https://drafts.csswg.org/css-syntax/#the-anb-type"> 13 14 <script> 15 16 function roundtripANB(str) { 17 const rule = document.styleSheets[0].cssRules[0]; 18 rule.selectorText = "foo"; 19 rule.selectorText = `:nth-child(${str})`; 20 // Check for parse error. 21 if(rule.selectorText == "foo") return "parse error"; 22 return rule.selectorText.slice(11, -1); 23 } 24 function testANB(input, expected) { 25 test(()=>{ 26 assert_equals(roundtripANB(input), expected); 27 }, `"${input}" becomes "${expected}"`); 28 } 29 30 /* Just going down all the syntax clauses one-by-one */ 31 // odd | even | 32 testANB("odd", "2n+1"); 33 testANB("even", "2n"); 34 // <integer> | 35 testANB("1", "1"); 36 testANB("+1", "1"); 37 testANB("-1", "-1"); 38 // 39 // <n-dimension> | 40 testANB("5n", "5n"); 41 testANB("5N", "5n"); 42 // '+'?† n | 43 testANB("+n", "n"); 44 testANB("n", "n"); 45 testANB("N", "n"); 46 testANB("+ n", "parse error"); 47 // -n | 48 testANB("-n", "-n"); 49 testANB("-N", "-n"); 50 // 51 // <ndashdigit-dimension> | 52 testANB("5n-5", "5n-5"); 53 // '+'?† <ndashdigit-ident> | 54 testANB("+n-5", "n-5"); 55 testANB("n-5", "n-5"); 56 testANB("+ n-5", "parse error"); 57 // <dashndashdigit-ident> | 58 testANB("-n-5", "-n-5"); 59 // 60 // <n-dimension> <signed-integer> | 61 testANB("5n +5", "5n+5"); 62 testANB("5n -5", "5n-5"); 63 // '+'?† n <signed-integer> | 64 testANB("+n +5", "n+5"); 65 testANB("n +5", "n+5"); 66 testANB("+n -5", "n-5"); 67 testANB("+ n +5", "parse error"); 68 testANB("n 5", "parse error"); 69 // -n <signed-integer> | 70 testANB("-n +5", "-n+5"); 71 testANB("-n -5", "-n-5"); 72 testANB("-n 5", "parse error"); 73 // 74 // <ndash-dimension> <signless-integer> | 75 testANB("5n- 5", "5n-5"); 76 testANB("5n- -5", "parse error"); 77 testANB("5n- +5", "parse error"); 78 testANB("-5n- 5", "-5n-5"); 79 // '+'?† n- <signless-integer> | 80 testANB("+n- 5", "n-5"); 81 testANB("n- 5", "n-5"); 82 testANB("+ n- 5", "parse error"); 83 testANB("n- +5", "parse error"); 84 testANB("n- -5", "parse error"); 85 // -n- <signless-integer> | 86 testANB("-n- 5", "-n-5"); 87 testANB("-n- +5", "parse error"); 88 testANB("-n- -5", "parse error"); 89 // 90 // <n-dimension> ['+' | '-'] <signless-integer> 91 testANB("5n + 5", "5n+5"); 92 testANB("5n - 5", "5n-5"); 93 testANB("5n + +5", "parse error"); 94 testANB("5n + -5", "parse error"); 95 testANB("5n - +5", "parse error"); 96 testANB("5n - -5", "parse error"); 97 // '+'?† n ['+' | '-'] <signless-integer> | 98 testANB("+n + 5", "n+5"); 99 testANB("n + 5", "n+5"); 100 testANB("+ n + 5", "parse error"); 101 testANB("+n - 5", "n-5"); 102 testANB("+n + +5", "parse error"); 103 testANB("+n + -5", "parse error"); 104 testANB("+n - +5", "parse error"); 105 testANB("+n - -5", "parse error"); 106 // -n ['+' | '-'] <signless-integer> 107 testANB("-n + 5", "-n+5"); 108 testANB("-n - 5", "-n-5"); 109 testANB("-n + +5", "parse error"); 110 testANB("-n + -5", "parse error"); 111 testANB("-n - +5", "parse error"); 112 testANB("-n - -5", "parse error"); 113 114 /* Swapped ordering is invalid */ 115 testANB("1 - n", "parse error"); 116 testANB("0 - n", "parse error"); 117 testANB("-1 + n", "parse error"); 118 119 /* Odd space usage */ 120 testANB("2 n + 2", "parse error"); 121 testANB("- 2n", "parse error"); 122 testANB("+ 2n", "parse error"); 123 testANB("+2 n", "parse error"); 124 125 </script>