This tests parsing and re-serialization of some CSS selectors. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". PASS parseThenSerializeRule('* { }') is '* { }' PASS parseThenSerializeRule('a { }') is 'a { }' PASS parseThenSerializeRule('#a { }') is '#a { }' PASS parseThenSerializeRule('.a { }') is '.a { }' PASS parseThenSerializeRule(':active { }') is ':active { }' PASS parseThenSerializeRule('[a] { }') is '[a] { }' PASS parseThenSerializeRule('[a="b"] { }') is '[a="b"] { }' PASS parseThenSerializeRule('[a~="b"] { }') is '[a~="b"] { }' PASS parseThenSerializeRule('[a|="b"] { }') is '[a|="b"] { }' PASS parseThenSerializeRule('[a^="b"] { }') is '[a^="b"] { }' PASS parseThenSerializeRule('[a$="b"] { }') is '[a$="b"] { }' PASS parseThenSerializeRule('[a*="b"] { }') is '[a*="b"] { }' PASS parseThenSerializeRule('*|a { }') is '*|a { }' PASS parseThenSerializeRule('n|a { }') is 'n|a { }' PASS parseThenSerializeRule('*|* { }') is '*|* { }' PASS parseThenSerializeRule('n|* { }') is 'n|* { }' PASS parseThenSerializeRule('[*|a] { }') is '[*|a] { }' PASS parseThenSerializeRule('[n|a] { }') is '[n|a] { }' PASS parseThenSerializeRule('a:active { }') is 'a:active { }' PASS parseThenSerializeRule('a b { }') is 'a b { }' PASS parseThenSerializeRule('a + b { }') is 'a + b { }' PASS parseThenSerializeRule('a ~ b { }') is 'a ~ b { }' PASS parseThenSerializeRule('a > b { }') is 'a > b { }' PASS parseThenSerializeRule(':active { }') is ':active { }' PASS parseThenSerializeRule(':checked { }') is ':checked { }' PASS parseThenSerializeRule(':disabled { }') is ':disabled { }' PASS parseThenSerializeRule(':empty { }') is ':empty { }' PASS parseThenSerializeRule(':enabled { }') is ':enabled { }' PASS parseThenSerializeRule(':first-child { }') is ':first-child { }' PASS parseThenSerializeRule(':first-of-type { }') is ':first-of-type { }' PASS parseThenSerializeRule(':focus { }') is ':focus { }' PASS parseThenSerializeRule(':hover { }') is ':hover { }' PASS parseThenSerializeRule(':indeterminate { }') is ':indeterminate { }' PASS parseThenSerializeRule(':link { }') is ':link { }' PASS parseThenSerializeRule(':root { }') is ':root { }' PASS parseThenSerializeRule(':target { }') is ':target { }' PASS parseThenSerializeRule(':visited { }') is ':visited { }' PASS parseThenSerializeRule(':lang(a) { }') is ':lang(a) { }' PASS parseThenSerializeRule(':not(a) { }') is ':not(a) { }' PASS parseThenSerializeRule(':-webkit-any(a,b,p) { }') is ':-webkit-any(a,b,p) { }' PASS parseThenSerializeRule('::after { }') is '::after { }' PASS parseThenSerializeRule('::before { }') is '::before { }' PASS parseThenSerializeRule('::first-letter { }') is '::first-letter { }' PASS parseThenSerializeRule('::first-line { }') is '::first-line { }' PASS parseThenSerializeRule('::selection { }') is '::selection { }' PASS parseThenSerializeRule(':-webkit-any-link { }') is ':-webkit-any-link { }' PASS parseThenSerializeRule(':-webkit-autofill { }') is ':-webkit-autofill { }' PASS parseThenSerializeRule(':-webkit-drag { }') is ':-webkit-drag { }' PASS parseThenSerializeRule('::-webkit-file-upload-button { }') is '::-webkit-file-upload-button { }' PASS parseThenSerializeRule('::-webkit-search-cancel-button { }') is '::-webkit-search-cancel-button { }' PASS parseThenSerializeRule('::-webkit-search-decoration { }') is '::-webkit-search-decoration { }' PASS parseThenSerializeRule('::-webkit-search-results-button { }') is '::-webkit-search-results-button { }' PASS parseThenSerializeRule('::-webkit-search-results-decoration { }') is '::-webkit-search-results-decoration { }' PASS parseThenSerializeRule('::-webkit-slider-thumb { }') is '::-webkit-slider-thumb { }' PASS parseThenSerializeRule('input:not([type="file"]):focus { }') is 'input:not([type="file"]):focus { }' PASS parseThenSerializeRule(':-webkit-any([type="file"]) { }') is ':-webkit-any([type="file"]) { }' PASS parseThenSerializeRule(':-webkit-any(:hover) { }') is ':-webkit-any(:hover) { }' PASS parseThenSerializeRule('input:-webkit-any([type="file"],:hover,:focus):enabled { }') is 'input:-webkit-any([type="file"],:hover,:focus):enabled { }' PASS parseThenSerializeRule(':-webkit-any(input[type="file"],a:hover,button:focus) { }') is ':-webkit-any(input[type="file"],a:hover,button:focus) { }' PASS parseThenSerializeRule(':-webkit-any(.class1.class2.class3) { }') is ':-webkit-any(.class1.class2.class3) { }' PASS parseThenSerializeRule(':-webkit-any(.class1:hover) { }') is ':-webkit-any(.class1:hover) { }' PASS parseThenSerializeRule(':-webkit-any(a.class1.class2.class3:hover) { }') is ':-webkit-any(a.class1.class2.class3:hover) { }' PASS parseThenSerializeRule('*:active { }') is ':active { }' PASS parseThenSerializeRule('|a { }') is 'a { }' PASS parseThenSerializeRule('input[type=file]:focus { }') is 'input[type="file"]:focus { }' PASS parseThenSerializeRule('a+b { }') is 'a + b { }' PASS parseThenSerializeRule('a~b { }') is 'a ~ b { }' PASS parseThenSerializeRule('a>b { }') is 'a > b { }' PASS parseThenSerializeRule(':after { }') is '::after { }' PASS parseThenSerializeRule(':before { }') is '::before { }' PASS parseThenSerializeRule(':first-letter { }') is '::first-letter { }' PASS parseThenSerializeRule(':first-line { }') is '::first-line { }' PASS parseThenSerializeRule(':-webkit-any( a.class1 , #id,[attr] ) { }') is ':-webkit-any(a.class1,#id,[attr]) { }' PASS successfullyParsed is true TEST COMPLETE