[
{
  "name": "Type selector, matching html element",
  "selector": "html",
  "expect": [
    "html"
  ],
  "exclude": [
    "element",
    "fragment",
    "detached"
  ],
  "level": 1
},
{
  "name": "Type selector, matching html element",
  "selector": "html",
  "expect": [],
  "exclude": [
    "document"
  ],
  "level": 1
},
{
  "name": "Type selector, matching body element",
  "selector": "body",
  "expect": [
    "body"
  ],
  "exclude": [
    "element",
    "fragment",
    "detached"
  ],
  "level": 1
},
{
  "name": "Type selector, matching body element",
  "selector": "body",
  "expect": [],
  "exclude": [
    "document"
  ],
  "level": 1
},
{
  "name": "Universal selector, matching all children of element with specified ID",
  "selector": "#universal>*",
  "expect": [
    "universal-p1",
    "universal-hr1",
    "universal-pre1",
    "universal-p2",
    "universal-address1"
  ],
  "level": 2
},
{
  "name": "Universal selector, matching all grandchildren of element with specified ID",
  "selector": "#universal>*>*",
  "expect": [
    "universal-code1",
    "universal-span1",
    "universal-a1",
    "universal-code2"
  ],
  "level": 2
},
{
  "name": "Universal selector, matching all children of empty element with specified ID",
  "selector": "#empty>*",
  "expect": [],
  "level": 2
},
{
  "name": "Universal selector, matching all descendants of element with specified ID",
  "selector": "#universal *",
  "expect": [
    "universal-p1",
    "universal-code1",
    "universal-hr1",
    "universal-pre1",
    "universal-span1",
    "universal-p2",
    "universal-a1",
    "universal-address1",
    "universal-code2",
    "universal-a2"
  ],
  "level": 2
},
{
  "name": "Attribute presence selector, matching align attribute with value",
  "selector": ".attr-presence-div1[align]",
  "expect": [
    "attr-presence-div1"
  ],
  "level": 2
},
{
  "name": "Attribute presence selector, matching align attribute with empty value",
  "selector": ".attr-presence-div2[align]",
  "expect": [
    "attr-presence-div2"
  ],
  "level": 2
},
{
  "name": "Attribute presence selector, matching title attribute, case insensitivity",
  "selector": "#attr-presence [TiTlE]",
  "expect": [
    "attr-presence-a1",
    "attr-presence-span1"
  ],
  "exclude": [
    "xhtml"
  ],
  "level": 2
},
{
  "name": "Attribute presence selector, not matching title attribute, case sensitivity",
  "selector": "#attr-presence [TiTlE]",
  "expect": [],
  "exclude": [
    "html"
  ],
  "level": 2
},
{
  "name": "Attribute presence selector, matching custom data-* attribute",
  "selector": "[data-attr-presence]",
  "expect": [
    "attr-presence-pre1",
    "attr-presence-blockquote1"
  ],
  "level": 2
},
{
  "name": "Attribute presence selector, not matching attribute with similar name",
  "selector": ".attr-presence-div3[align], .attr-presence-div4[align]",
  "expect": [],
  "level": 2
},
{
  "name": "Attribute presence selector, matching attribute with non-ASCII characters",
  "selector": "ul[data-中文]",
  "expect": [
    "attr-presence-ul1"
  ],
  "level": 2
},
{
  "name": "Attribute presence selector, not matching default option without selected attribute",
  "selector": "#attr-presence-select1 option[selected]",
  "expect": [],
  "level": 2
},
{
  "name": "Attribute presence selector, matching option with selected attribute",
  "selector": "#attr-presence-select2 option[selected]",
  "expect": [
    "attr-presence-select2-option4"
  ],
  "level": 2
},
{
  "name": "Attribute presence selector, matching multiple options with selected attributes",
  "selector": "#attr-presence-select3 option[selected]",
  "expect": [
    "attr-presence-select3-option2",
    "attr-presence-select3-option3"
  ],
  "level": 2
},
{
  "name": "Attribute value selector, matching align attribute with value",
  "selector": "#attr-value [align=\"center\"]",
  "expect": [
    "attr-value-div1"
  ],
  "level": 2
},
{
  "name": "Attribute value selector, matching align attribute with empty value",
  "selector": "#attr-value [align=\"\"]",
  "expect": [
    "attr-value-div2"
  ],
  "level": 2
},
{
  "name": "Attribute value selector, not matching align attribute with partial value",
  "selector": "#attr-value [align=\"c\"]",
  "expect": [],
  "level": 2
},
{
  "name": "Attribute value selector, not matching align attribute with incorrect value",
  "selector": "#attr-value [align=\"centera\"]",
  "expect": [],
  "level": 2
},
{
  "name": "Attribute value selector, matching custom data-* attribute with unicode escaped value",
  "selector": "[data-attr-value=\"\\e9\"]",
  "expect": [
    "attr-value-div3"
  ],
  "level": 2
},
{
  "name": "Attribute value selector, matching custom data-* attribute with escaped character",
  "selector": "[data-attr-value_foo=\"\\e9\"]",
  "expect": [
    "attr-value-div4"
  ],
  "level": 2
},
{
  "name": "Attribute value selector with single-quoted value, matching multiple inputs with type attributes",
  "selector": "#attr-value input[type='hidden'],#attr-value input[type='radio']",
  "expect": [
    "attr-value-input3",
    "attr-value-input4",
    "attr-value-input6",
    "attr-value-input8",
    "attr-value-input9"
  ],
  "level": 2
},
{
  "name": "Attribute value selector with double-quoted value, matching multiple inputs with type attributes",
  "selector": "#attr-value input[type=\"hidden\"],#attr-value input[type='radio']",
  "expect": [
    "attr-value-input3",
    "attr-value-input4",
    "attr-value-input6",
    "attr-value-input8",
    "attr-value-input9"
  ],
  "level": 2
},
{
  "name": "Attribute value selector with unquoted value, matching multiple inputs with type attributes",
  "selector": "#attr-value input[type=hidden],#attr-value input[type=radio]",
  "expect": [
    "attr-value-input3",
    "attr-value-input4",
    "attr-value-input6",
    "attr-value-input8",
    "attr-value-input9"
  ],
  "level": 2
},
{
  "name": "Attribute value selector, matching attribute with value using non-ASCII characters",
  "selector": "[data-attr-value=中文]",
  "expect": [
    "attr-value-div5"
  ],
  "level": 2
},
{
  "name": "Attribute whitespace-separated list selector, matching class attribute with value",
  "selector": "#attr-whitespace [class~=\"div1\"]",
  "expect": [
    "attr-whitespace-div1"
  ],
  "level": 2
},
{
  "name": "Attribute whitespace-separated list selector, not matching class attribute with empty value",
  "selector": "#attr-whitespace [class~=\"\"]",
  "expect": [],
  "level": 2
},
{
  "name": "Attribute whitespace-separated list selector, not matching class attribute with partial value",
  "selector": "[data-attr-whitespace~=\"div\"]",
  "expect": [],
  "level": 2
},
{
  "name": "Attribute whitespace-separated list selector, matching custom data-* attribute with unicode escaped value",
  "selector": "[data-attr-whitespace~=\"\\0000e9\"]",
  "expect": [
    "attr-whitespace-div4"
  ],
  "level": 2
},
{
  "name": "Attribute whitespace-separated list selector, matching custom data-* attribute with escaped character",
  "selector": "[data-attr-whitespace_foo~=\"\\e9\"]",
  "expect": [
    "attr-whitespace-div5"
  ],
  "level": 2
},
{
  "name": "Attribute whitespace-separated list selector with single-quoted value, matching multiple links with rel attributes",
  "selector": "#attr-whitespace a[rel~='bookmark'],  #attr-whitespace a[rel~='nofollow']",
  "expect": [
    "attr-whitespace-a1",
    "attr-whitespace-a2",
    "attr-whitespace-a3",
    "attr-whitespace-a5",
    "attr-whitespace-a7"
  ],
  "level": 2
},
{
  "name": "Attribute whitespace-separated list selector with double-quoted value, matching multiple links with rel attributes",
  "selector": "#attr-whitespace a[rel~=\"bookmark\"],#attr-whitespace a[rel~='nofollow']",
  "expect": [
    "attr-whitespace-a1",
    "attr-whitespace-a2",
    "attr-whitespace-a3",
    "attr-whitespace-a5",
    "attr-whitespace-a7"
  ],
  "level": 2
},
{
  "name": "Attribute whitespace-separated list selector with unquoted value, matching multiple links with rel attributes",
  "selector": "#attr-whitespace a[rel~=bookmark],    #attr-whitespace a[rel~=nofollow]",
  "expect": [
    "attr-whitespace-a1",
    "attr-whitespace-a2",
    "attr-whitespace-a3",
    "attr-whitespace-a5",
    "attr-whitespace-a7"
  ],
  "level": 2
},
{
  "name": "Attribute whitespace-separated list selector with double-quoted value, not matching value with space",
  "selector": "#attr-whitespace a[rel~=\"book mark\"]",
  "expect": [],
  "level": 2
},
{
  "name": "Attribute whitespace-separated list selector, matching title attribute with value using non-ASCII characters",
  "selector": "#attr-whitespace [title~=中文]",
  "expect": [
    "attr-whitespace-p1"
  ],
  "level": 2
},
{
  "name": "Attribute hyphen-separated list selector, not matching unspecified lang attribute",
  "selector": "#attr-hyphen-div1[lang|=\"en\"]",
  "expect": [],
  "level": 2
},
{
  "name": "Attribute hyphen-separated list selector, matching lang attribute with exact value",
  "selector": "#attr-hyphen-div2[lang|=\"fr\"]",
  "expect": [
    "attr-hyphen-div2"
  ],
  "level": 2
},
{
  "name": "Attribute hyphen-separated list selector, matching lang attribute with partial value",
  "selector": "#attr-hyphen-div3[lang|=\"en\"]",
  "expect": [
    "attr-hyphen-div3"
  ],
  "level": 2
},
{
  "name": "Attribute hyphen-separated list selector, not matching incorrect value",
  "selector": "#attr-hyphen-div4[lang|=\"es-AR\"]",
  "expect": [],
  "level": 2
},
{
  "name": "Attribute begins with selector, matching href attributes beginning with specified substring",
  "selector": "#attr-begins a[href^=\"http://www\"]",
  "expect": [
    "attr-begins-a1",
    "attr-begins-a3"
  ],
  "level": 3
},
{
  "name": "Attribute begins with selector, matching lang attributes beginning with specified substring, ",
  "selector": "#attr-begins [lang^=\"en-\"]",
  "expect": [
    "attr-begins-div2",
    "attr-begins-div4"
  ],
  "level": 3
},
{
  "name": "Attribute begins with selector, not matching class attribute not beginning with specified substring",
  "selector": "#attr-begins [class^=apple]",
  "expect": [],
  "level": 3
},
{
  "name": "Attribute begins with selector with single-quoted value, matching class attribute beginning with specified substring",
  "selector": "#attr-begins [class^=' apple']",
  "expect": [
    "attr-begins-p1"
  ],
  "level": 3
},
{
  "name": "Attribute begins with selector with double-quoted value, matching class attribute beginning with specified substring",
  "selector": "#attr-begins [class^=\" apple\"]",
  "expect": [
    "attr-begins-p1"
  ],
  "level": 3
},
{
  "name": "Attribute begins with selector with unquoted value, not matching class attribute not beginning with specified substring",
  "selector": "#attr-begins [class^= apple]",
  "expect": [],
  "level": 3
},
{
  "name": "Attribute ends with selector, matching href attributes ending with specified substring",
  "selector": "#attr-ends a[href$=\".org\"]",
  "expect": [
    "attr-ends-a1",
    "attr-ends-a3"
  ],
  "level": 3
},
{
  "name": "Attribute ends with selector, matching lang attributes ending with specified substring, ",
  "selector": "#attr-ends [lang$=\"-CH\"]",
  "expect": [
    "attr-ends-div2",
    "attr-ends-div4"
  ],
  "level": 3
},
{
  "name": "Attribute ends with selector, not matching class attribute not ending with specified substring",
  "selector": "#attr-ends [class$=apple]",
  "expect": [],
  "level": 3
},
{
  "name": "Attribute ends with selector with single-quoted value, matching class attribute ending with specified substring",
  "selector": "#attr-ends [class$='apple ']",
  "expect": [
    "attr-ends-p1"
  ],
  "level": 3
},
{
  "name": "Attribute ends with selector with double-quoted value, matching class attribute ending with specified substring",
  "selector": "#attr-ends [class$=\"apple \"]",
  "expect": [
    "attr-ends-p1"
  ],
  "level": 3
},
{
  "name": "Attribute ends with selector with unquoted value, not matching class attribute not ending with specified substring",
  "selector": "#attr-ends [class$=apple ]",
  "expect": [],
  "level": 3
},
{
  "name": "Attribute contains selector, matching href attributes beginning with specified substring",
  "selector": "#attr-contains a[href*=\"http://www\"]",
  "expect": [
    "attr-contains-a1",
    "attr-contains-a3"
  ],
  "level": 3
},
{
  "name": "Attribute contains selector, matching href attributes ending with specified substring",
  "selector": "#attr-contains a[href*=\".org\"]",
  "expect": [
    "attr-contains-a1",
    "attr-contains-a2"
  ],
  "level": 3
},
{
  "name": "Attribute contains selector, matching href attributes containing specified substring",
  "selector": "#attr-contains a[href*=\".example.\"]",
  "expect": [
    "attr-contains-a1",
    "attr-contains-a3"
  ],
  "level": 3
},
{
  "name": "Attribute contains selector, matching lang attributes beginning with specified substring, ",
  "selector": "#attr-contains [lang*=\"en-\"]",
  "expect": [
    "attr-contains-div2",
    "attr-contains-div6"
  ],
  "level": 3
},
{
  "name": "Attribute contains selector, matching lang attributes ending with specified substring, ",
  "selector": "#attr-contains [lang*=\"-CH\"]",
  "expect": [
    "attr-contains-div3",
    "attr-contains-div5"
  ],
  "level": 3
},
{
  "name": "Attribute contains selector with single-quoted value, matching class attribute beginning with specified substring",
  "selector": "#attr-contains [class*=' apple']",
  "expect": [
    "attr-contains-p1"
  ],
  "level": 3
},
{
  "name": "Attribute contains selector with single-quoted value, matching class attribute ending with specified substring",
  "selector": "#attr-contains [class*='orange ']",
  "expect": [
    "attr-contains-p1"
  ],
  "level": 3
},
{
  "name": "Attribute contains selector with single-quoted value, matching class attribute containing specified substring",
  "selector": "#attr-contains [class*='ple banana ora']",
  "expect": [
    "attr-contains-p1"
  ],
  "level": 3
},
{
  "name": "Attribute contains selector with double-quoted value, matching class attribute beginning with specified substring",
  "selector": "#attr-contains [class*=\" apple\"]",
  "expect": [
    "attr-contains-p1"
  ],
  "level": 3
},
{
  "name": "Attribute contains selector with double-quoted value, matching class attribute ending with specified substring",
  "selector": "#attr-contains [class*=\"orange \"]",
  "expect": [
    "attr-contains-p1"
  ],
  "level": 3
},
{
  "name": "Attribute contains selector with double-quoted value, matching class attribute containing specified substring",
  "selector": "#attr-contains [class*=\"ple banana ora\"]",
  "expect": [
    "attr-contains-p1"
  ],
  "level": 3
},
{
  "name": "Attribute contains selector with unquoted value, matching class attribute beginning with specified substring",
  "selector": "#attr-contains [class*= apple]",
  "expect": [
    "attr-contains-p1"
  ],
  "level": 3
},
{
  "name": "Attribute contains selector with unquoted value, matching class attribute ending with specified substring",
  "selector": "#attr-contains [class*=orange ]",
  "expect": [
    "attr-contains-p1"
  ],
  "level": 3
},
{
  "name": "Attribute contains selector with unquoted value, matching class attribute containing specified substring",
  "selector": "#attr-contains [class*= banana ]",
  "expect": [
    "attr-contains-p1"
  ],
  "level": 3
},
{
  "name": ":root pseudo-class selector, matching document root element",
  "selector": ":root",
  "expect": [
    "html"
  ],
  "exclude": [
    "element",
    "fragment",
    "detached"
  ],
  "level": 3
},
{
  "name": ":root pseudo-class selector, not matching document root element",
  "selector": ":root",
  "expect": [],
  "exclude": [
    "document"
  ],
  "level": 3
},
{
  "name": ":nth-child selector, matching the third child element",
  "selector": "#pseudo-nth-table1 :nth-child(3)",
  "expect": [
    "pseudo-nth-td3",
    "pseudo-nth-td9",
    "pseudo-nth-tr3",
    "pseudo-nth-td15"
  ],
  "level": 3
},
{
  "name": ":nth-child selector, matching every third child element",
  "selector": "#pseudo-nth li:nth-child(3n)",
  "expect": [
    "pseudo-nth-li3",
    "pseudo-nth-li6",
    "pseudo-nth-li9",
    "pseudo-nth-li12"
  ],
  "level": 3
},
{
  "name": ":nth-child selector, matching every second child element, starting from the fourth",
  "selector": "#pseudo-nth li:nth-child(2n+4)",
  "expect": [
    "pseudo-nth-li4",
    "pseudo-nth-li6",
    "pseudo-nth-li8",
    "pseudo-nth-li10",
    "pseudo-nth-li12"
  ],
  "level": 3
},
{
  "name": ":nth-child selector, matching every fourth child element, starting from the third",
  "selector": "#pseudo-nth-p1 :nth-child(4n-1)",
  "expect": [
    "pseudo-nth-em2",
    "pseudo-nth-span3"
  ],
  "level": 3
},
{
  "name": ":nth-last-child selector, matching the third last child element",
  "selector": "#pseudo-nth-table1 :nth-last-child(3)",
  "expect": [
    "pseudo-nth-tr1",
    "pseudo-nth-td4",
    "pseudo-nth-td10",
    "pseudo-nth-td16"
  ],
  "level": 3
},
{
  "name": ":nth-last-child selector, matching every third child element from the end",
  "selector": "#pseudo-nth li:nth-last-child(3n)",
  "expect": [
    "pseudo-nth-li1",
    "pseudo-nth-li4",
    "pseudo-nth-li7",
    "pseudo-nth-li10"
  ],
  "level": 3
},
{
  "name": ":nth-last-child selector, matching every second child element from the end, starting from the fourth last",
  "selector": "#pseudo-nth li:nth-last-child(2n+4)",
  "expect": [
    "pseudo-nth-li1",
    "pseudo-nth-li3",
    "pseudo-nth-li5",
    "pseudo-nth-li7",
    "pseudo-nth-li9"
  ],
  "level": 3
},
{
  "name": ":nth-last-child selector, matching every fourth element from the end, starting from the third last",
  "selector": "#pseudo-nth-p1 :nth-last-child(4n-1)",
  "expect": [
    "pseudo-nth-span2",
    "pseudo-nth-span4"
  ],
  "level": 3
},
{
  "name": ":nth-of-type selector, matching the third em element",
  "selector": "#pseudo-nth-p1 em:nth-of-type(3)",
  "expect": [
    "pseudo-nth-em3"
  ],
  "level": 3
},
{
  "name": ":nth-of-type selector, matching every second element of their type",
  "selector": "#pseudo-nth-p1 :nth-of-type(2n)",
  "expect": [
    "pseudo-nth-em2",
    "pseudo-nth-span2",
    "pseudo-nth-span4",
    "pseudo-nth-strong2",
    "pseudo-nth-em4"
  ],
  "level": 3
},
{
  "name": ":nth-of-type selector, matching every second elemetn of their type, starting from the first",
  "selector": "#pseudo-nth-p1 span:nth-of-type(2n-1)",
  "expect": [
    "pseudo-nth-span1",
    "pseudo-nth-span3"
  ],
  "level": 3
},
{
  "name": ":nth-last-of-type selector, matching the thrid last em element",
  "selector": "#pseudo-nth-p1 em:nth-last-of-type(3)",
  "expect": [
    "pseudo-nth-em2"
  ],
  "level": 3
},
{
  "name": ":nth-last-of-type selector, matching every second last element of their type",
  "selector": "#pseudo-nth-p1 :nth-last-of-type(2n)",
  "expect": [
    "pseudo-nth-span1",
    "pseudo-nth-em1",
    "pseudo-nth-strong1",
    "pseudo-nth-em3",
    "pseudo-nth-span3"
  ],
  "level": 3
},
{
  "name": ":nth-last-of-type selector, matching every second last element of their type, starting from the last",
  "selector": "#pseudo-nth-p1 span:nth-last-of-type(2n-1)",
  "expect": [
    "pseudo-nth-span2",
    "pseudo-nth-span4"
  ],
  "level": 3
},
{
  "name": ":first-of-type selector, matching the first em element",
  "selector": "#pseudo-nth-p1 em:first-of-type",
  "expect": [
    "pseudo-nth-em1"
  ],
  "level": 3
},
{
  "name": ":first-of-type selector, matching the first of every type of element",
  "selector": "#pseudo-nth-p1 :first-of-type",
  "expect": [
    "pseudo-nth-span1",
    "pseudo-nth-em1",
    "pseudo-nth-strong1"
  ],
  "level": 3
},
{
  "name": ":first-of-type selector, matching the first td element in each table row",
  "selector": "#pseudo-nth-table1 tr :first-of-type",
  "expect": [
    "pseudo-nth-td1",
    "pseudo-nth-td7",
    "pseudo-nth-td13"
  ],
  "level": 3
},
{
  "name": ":last-of-type selector, matching the last em elemnet",
  "selector": "#pseudo-nth-p1 em:last-of-type",
  "expect": [
    "pseudo-nth-em4"
  ],
  "level": 3
},
{
  "name": ":last-of-type selector, matching the last of every type of element",
  "selector": "#pseudo-nth-p1 :last-of-type",
  "expect": [
    "pseudo-nth-span4",
    "pseudo-nth-strong2",
    "pseudo-nth-em4"
  ],
  "level": 3
},
{
  "name": ":last-of-type selector, matching the last td element in each table row",
  "selector": "#pseudo-nth-table1 tr :last-of-type",
  "expect": [
    "pseudo-nth-td6",
    "pseudo-nth-td12",
    "pseudo-nth-td18"
  ],
  "level": 3
},
{
  "name": ":first-child pseudo-class selector, matching first child div element",
  "selector": "#pseudo-first-child div:first-child",
  "expect": [
    "pseudo-first-child-div1"
  ],
  "level": 2
},
{
  "name": ":first-child pseudo-class selector, doesn't match non-first-child elements",
  "selector": ".pseudo-first-child-div2:first-child, .pseudo-first-child-div3:first-child",
  "expect": [],
  "level": 2
},
{
  "name": ":first-child pseudo-class selector, matching first-child of multiple elements",
  "selector": "#pseudo-first-child span:first-child",
  "expect": [
    "pseudo-first-child-span1",
    "pseudo-first-child-span3",
    "pseudo-first-child-span5"
  ],
  "level": 2
},
{
  "name": ":last-child pseudo-class selector, matching last child div element",
  "selector": "#pseudo-last-child div:last-child",
  "expect": [
    "pseudo-last-child-div3"
  ],
  "level": 3
},
{
  "name": ":last-child pseudo-class selector, doesn't match non-last-child elements",
  "selector": ".pseudo-last-child-div1:last-child, .pseudo-last-child-div2:first-child",
  "expect": [],
  "level": 3
},
{
  "name": ":last-child pseudo-class selector, matching first-child of multiple elements",
  "selector": "#pseudo-last-child span:last-child",
  "expect": [
    "pseudo-last-child-span2",
    "pseudo-last-child-span4",
    "pseudo-last-child-span6"
  ],
  "level": 3
},
{
  "name": ":pseudo-only-child pseudo-class selector, matching all only-child elements",
  "selector": "#pseudo-only :only-child",
  "expect": [
    "pseudo-only-span1"
  ],
  "level": 3
},
{
  "name": ":pseudo-only-child pseudo-class selector, matching only-child em elements",
  "selector": "#pseudo-only em:only-child",
  "expect": [],
  "level": 3
},
{
  "name": ":pseudo-only-of-type pseudo-class selector, matching all elements with no siblings of the same type",
  "selector": "#pseudo-only :only-of-type",
  "expect": [
    "pseudo-only-span1",
    "pseudo-only-em1"
  ],
  "level": 3
},
{
  "name": ":pseudo-only-of-type pseudo-class selector, matching em elements with no siblings of the same type",
  "selector": "#pseudo-only em:only-of-type",
  "expect": [
    "pseudo-only-em1"
  ],
  "level": 3
},
{
  "name": ":empty pseudo-class selector, matching empty p elements",
  "selector": "#pseudo-empty p:empty",
  "expect": [
    "pseudo-empty-p1",
    "pseudo-empty-p2"
  ],
  "level": 3
},
{
  "name": ":empty pseudo-class selector, matching all empty elements",
  "selector": "#pseudo-empty :empty",
  "expect": [
    "pseudo-empty-p1",
    "pseudo-empty-p2",
    "pseudo-empty-span1"
  ],
  "level": 3
},
{
  "name": ":link and :visited pseudo-class selectors, matching a and area elements with href attributes",
  "selector": "#pseudo-link :link, #pseudo-link :visited",
  "expect": [
    "pseudo-link-a1",
    "pseudo-link-a2",
    "pseudo-link-area1"
  ],
  "level": 1
},
{
  "name": ":link and :visited pseudo-class selectors, matching link elements with href attributes",
  "selector": "#head :link, #head :visited",
  "expect": [
    "pseudo-link-link1",
    "pseudo-link-link2"
  ],
  "exclude": [
    "element",
    "fragment",
    "detached"
  ],
  "level": 1
},
{
  "name": ":link and :visited pseudo-class selectors, not matching link elements with href attributes",
  "selector": "#head :link, #head :visited",
  "expect": [],
  "exclude": [
    "document"
  ],
  "level": 1
},
{
  "name": ":link and :visited pseudo-class selectors, chained, mutually exclusive pseudo-classes match nothing",
  "selector": ":link:visited",
  "expect": [],
  "exclude": [
    "document"
  ],
  "level": 1
},
{
  "name": ":target pseudo-class selector, matching the element referenced by the URL fragment identifier",
  "selector": ":target",
  "expect": [],
  "exclude": [
    "document",
    "element"
  ],
  "level": 3
},
{
  "name": ":target pseudo-class selector, matching the element referenced by the URL fragment identifier",
  "selector": ":target",
  "xfail": true,
  "expect": [
    "target"
  ],
  "exclude": [
    "fragment",
    "detached"
  ],
  "level": 3
},
{
  "name": ":lang pseudo-class selector, matching inherited language",
  "selector": "#pseudo-lang-div1:lang(en)",
  "expect": [
    "pseudo-lang-div1"
  ],
  "exclude": [
    "detached",
    "fragment"
  ],
  "level": 2
},
{
  "name": ":lang pseudo-class selector, not matching element with no inherited language",
  "selector": "#pseudo-lang-div1:lang(en)",
  "expect": [],
  "exclude": [
    "document",
    "element"
  ],
  "level": 2
},
{
  "name": ":lang pseudo-class selector, matching specified language with exact value",
  "selector": "#pseudo-lang-div2:lang(fr)",
  "expect": [
    "pseudo-lang-div2"
  ],
  "level": 2
},
{
  "name": ":lang pseudo-class selector, matching specified language with partial value",
  "selector": "#pseudo-lang-div3:lang(en)",
  "expect": [
    "pseudo-lang-div3"
  ],
  "level": 2
},
{
  "name": ":lang pseudo-class selector, not matching incorrect language",
  "selector": "#pseudo-lang-div4:lang(es-AR)",
  "expect": [],
  "level": 2
},
{
  "name": ":enabled pseudo-class selector, matching all enabled form controls",
  "selector": "#pseudo-ui :enabled",
  "expect": [
    "pseudo-ui-input1",
    "pseudo-ui-input2",
    "pseudo-ui-input3",
    "pseudo-ui-input4",
    "pseudo-ui-input5",
    "pseudo-ui-input6",
    "pseudo-ui-input7",
    "pseudo-ui-input8",
    "pseudo-ui-input9",
    "pseudo-ui-textarea1",
    "pseudo-ui-button1"
  ],
  "level": 3
},
{
  "name": ":enabled pseudo-class selector, matching all disabled form controls",
  "selector": "#pseudo-ui :disabled",
  "expect": [
    "pseudo-ui-input10",
    "pseudo-ui-input11",
    "pseudo-ui-input12",
    "pseudo-ui-input13",
    "pseudo-ui-input14",
    "pseudo-ui-input15",
    "pseudo-ui-input16",
    "pseudo-ui-input17",
    "pseudo-ui-input18",
    "pseudo-ui-textarea2",
    "pseudo-ui-button2"
  ],
  "level": 3
},
{
  "name": ":checked pseudo-class selector, matching checked radio buttons and checkboxes",
  "selector": "#pseudo-ui :checked",
  "expect": [
    "pseudo-ui-input4",
    "pseudo-ui-input6",
    "pseudo-ui-input13",
    "pseudo-ui-input15"
  ],
  "level": 3
},
{
  "name": ":not pseudo-class selector, matching ",
  "selector": "#not>:not(div)",
  "expect": [
    "not-p1",
    "not-p2",
    "not-p3"
  ],
  "level": 3
},
{
  "name": ":not pseudo-class selector, matching ",
  "selector": "#not * :not(:first-child)",
  "expect": [
    "not-em1",
    "not-em2",
    "not-em3"
  ],
  "level": 3
},
{
  "name": ":not pseudo-class selector, matching nothing",
  "selector": ":not(*)",
  "expect": [],
  "level": 3
},
{
  "name": ":not pseudo-class selector, matching nothing",
  "selector": ":not(*|*)",
  "expect": [],
  "level": 3
},
{
  "name": ":first-line pseudo-element (one-colon syntax) selector, not matching any elements",
  "selector": "#pseudo-element:first-line",
  "expect": [],
  "level": 2
},
{
  "name": "::first-line pseudo-element (two-colon syntax) selector, not matching any elements",
  "selector": "#pseudo-element::first-line",
  "expect": [],
  "level": 3
},
{
  "name": ":first-letter pseudo-element (one-colon syntax) selector, not matching any elements",
  "selector": "#pseudo-element:first-letter",
  "expect": [],
  "level": 2
},
{
  "name": "::first-letter pseudo-element (two-colon syntax) selector, not matching any elements",
  "selector": "#pseudo-element::first-letter",
  "expect": [],
  "level": 3
},
{
  "name": ":before pseudo-element (one-colon syntax) selector, not matching any elements",
  "selector": "#pseudo-element:before",
  "expect": [],
  "level": 2
},
{
  "name": "::before pseudo-element (two-colon syntax) selector, not matching any elements",
  "selector": "#pseudo-element::before",
  "expect": [],
  "level": 3
},
{
  "name": ":after pseudo-element (one-colon syntax) selector, not matching any elements",
  "selector": "#pseudo-element:after",
  "expect": [],
  "level": 2
},
{
  "name": "::after pseudo-element (two-colon syntax) selector, not matching any elements",
  "selector": "#pseudo-element::after",
  "expect": [],
  "level": 3
},
{
  "name": "Class selector, matching element with specified class",
  "selector": ".class-p",
  "expect": [
    "class-p1",
    "class-p2",
    "class-p3"
  ],
  "level": 1
},
{
  "name": "Class selector, chained, matching only elements with all specified classes",
  "selector": "#class .apple.orange.banana",
  "expect": [
    "class-div1",
    "class-div2",
    "class-p4",
    "class-div3",
    "class-p6",
    "class-div4"
  ],
  "level": 1
},
{
  "name": "Class Selector, chained, with type selector",
  "selector": "div.apple.banana.orange",
  "expect": [
    "class-div1",
    "class-div2",
    "class-div3",
    "class-div4"
  ],
  "level": 1
},
{
  "name": "Class selector, matching element with class value using non-ASCII characters",
  "selector": ".台北Táiběi",
  "expect": [
    "class-span1"
  ],
  "level": 1
},
{
  "name": "Class selector, matching multiple elements with class value using non-ASCII characters",
  "selector": ".台北",
  "expect": [
    "class-span1",
    "class-span2"
  ],
  "level": 1
},
{
  "name": "Class selector, chained, matching element with multiple class values using non-ASCII characters",
  "selector": ".台北Táiběi.台北",
  "expect": [
    "class-span1"
  ],
  "level": 1
},
{
  "name": "Class selector, matching element with class with escaped character",
  "selector": ".foo\\:bar",
  "expect": [
    "class-span3"
  ],
  "level": 1
},
{
  "name": "Class selector, matching element with class with escaped character",
  "selector": ".test\\.foo\\[5\\]bar",
  "expect": [
    "class-span4"
  ],
  "level": 1
},
{
  "name": "ID selector, matching element with specified id",
  "selector": "#id #id-div1",
  "expect": [
    "id-div1"
  ],
  "level": 1
},
{
  "name": "ID selector, chained, matching element with specified id",
  "selector": "#id-div1, #id-div1",
  "expect": [
    "id-div1"
  ],
  "level": 1
},
{
  "name": "ID selector, chained, matching element with specified id",
  "selector": "#id-div1, #id-div2",
  "expect": [
    "id-div1",
    "id-div2"
  ],
  "level": 1
},
{
  "name": "ID Selector, chained, with type selector",
  "selector": "div#id-div1, div#id-div2",
  "expect": [
    "id-div1",
    "id-div2"
  ],
  "level": 1
},
{
  "name": "ID selector, not matching non-existent descendant",
  "selector": "#id #none",
  "expect": [],
  "level": 1
},
{
  "name": "ID selector, not matching non-existent ancestor",
  "selector": "#none #id-div1",
  "expect": [],
  "level": 1
},
{
  "name": "ID selector, matching multiple elements with duplicate id",
  "selector": "#id-li-duplicate",
  "expect": [
    "id-li-duplicate",
    "id-li-duplicate",
    "id-li-duplicate",
    "id-li-duplicate"
  ],
  "level": 1
},
{
  "name": "ID selector, matching id value using non-ASCII characters",
  "selector": "#台北Táiběi",
  "expect": [
    "台北Táiběi"
  ],
  "level": 1
},
{
  "name": "ID selector, matching id value using non-ASCII characters",
  "selector": "#台北",
  "expect": [
    "台北"
  ],
  "level": 1
},
{
  "name": "ID selector, matching id values using non-ASCII characters",
  "selector": "#台北Táiběi, #台北",
  "expect": [
    "台北Táiběi",
    "台北"
  ],
  "level": 1
},
{
  "name": "ID selector, matching element with id with escaped character",
  "selector": "#\\#foo\\:bar",
  "expect": [
    "#foo:bar"
  ],
  "level": 1
},
{
  "name": "ID selector, matching element with id with escaped character",
  "selector": "#test\\.foo\\[5\\]bar",
  "expect": [
    "test.foo[5]bar"
  ],
  "level": 1
},
{
  "name": "Namespace selector, matching element with any namespace",
  "selector": "#any-namespace *|div",
  "expect": [
    "any-namespace-div1",
    "any-namespace-div2",
    "any-namespace-div3",
    "any-namespace-div4"
  ],
  "level": 3
},
{
  "name": "Namespace selector, matching div elements in no namespace only",
  "selector": "#no-namespace |div",
  "expect": [
    "no-namespace-div3"
  ],
  "level": 3
},
{
  "name": "Namespace selector, matching any elements in no namespace only",
  "selector": "#no-namespace |*",
  "expect": [
    "no-namespace-div3"
  ],
  "level": 3
},
{
  "name": "Descendant combinator, matching element that is a descendant of an element with id",
  "selector": "#descendant div",
  "expect": [
    "descendant-div1",
    "descendant-div2",
    "descendant-div3",
    "descendant-div4"
  ],
  "level": 1
},
{
  "name": "Descendant combinator, matching element with id that is a descendant of an element",
  "selector": "body #descendant-div1",
  "expect": [
    "descendant-div1"
  ],
  "exclude": [
    "detached",
    "fragment"
  ],
  "level": 1
},
{
  "name": "Descendant combinator, matching element with id that is a descendant of an element",
  "selector": "div #descendant-div1",
  "expect": [
    "descendant-div1"
  ],
  "level": 1
},
{
  "name": "Descendant combinator, matching element with id that is a descendant of an element with id",
  "selector": "#descendant #descendant-div2",
  "expect": [
    "descendant-div2"
  ],
  "level": 1
},
{
  "name": "Descendant combinator, matching element with class that is a descendant of an element with id",
  "selector": "#descendant .descendant-div2",
  "expect": [
    "descendant-div2"
  ],
  "level": 1
},
{
  "name": "Descendant combinator, matching element with class that is a descendant of an element with class",
  "selector": ".descendant-div1 .descendant-div3",
  "expect": [
    "descendant-div3"
  ],
  "level": 1
},
{
  "name": "Descendant combinator, not matching element with id that is not a descendant of an element with id",
  "selector": "#descendant-div1 #descendant-div4",
  "expect": [],
  "level": 1
},
{
  "name": "Descendant combinator, whitespace characters",
  "selector": "#descendant\t\r\n#descendant-div2",
  "expect": [
    "descendant-div2"
  ],
  "level": 1
},
{
  "name": "Child combinator, matching element that is a child of an element with id",
  "selector": "#child>div",
  "expect": [
    "child-div1",
    "child-div4"
  ],
  "level": 2
},
{
  "name": "Child combinator, matching element with id that is a child of an element",
  "selector": "div>#child-div1",
  "expect": [
    "child-div1"
  ],
  "level": 2
},
{
  "name": "Child combinator, matching element with id that is a child of an element with id",
  "selector": "#child>#child-div1",
  "expect": [
    "child-div1"
  ],
  "level": 2
},
{
  "name": "Child combinator, matching element with id that is a child of an element with class",
  "selector": "#child-div1>.child-div2",
  "expect": [
    "child-div2"
  ],
  "level": 2
},
{
  "name": "Child combinator, matching element with class that is a child of an element with class",
  "selector": ".child-div1>.child-div2",
  "expect": [
    "child-div2"
  ],
  "level": 2
},
{
  "name": "Child combinator, not matching element with id that is not a child of an element with id",
  "selector": "#child>#child-div3",
  "expect": [],
  "level": 2
},
{
  "name": "Child combinator, not matching element with id that is not a child of an element with class",
  "selector": "#child-div1>.child-div3",
  "expect": [],
  "level": 2
},
{
  "name": "Child combinator, not matching element with class that is not a child of an element with class",
  "selector": ".child-div1>.child-div3",
  "expect": [],
  "level": 2
},
{
  "name": "Child combinator, surrounded by whitespace",
  "selector": "#child-div1\t\r\n>\t\r\n#child-div2",
  "expect": [
    "child-div2"
  ],
  "level": 2
},
{
  "name": "Child combinator, whitespace after",
  "selector": "#child-div1>\t\r\n#child-div2",
  "expect": [
    "child-div2"
  ],
  "level": 2
},
{
  "name": "Child combinator, whitespace before",
  "selector": "#child-div1\t\r\n>#child-div2",
  "expect": [
    "child-div2"
  ],
  "level": 2
},
{
  "name": "Child combinator, no whitespace",
  "selector": "#child-div1>#child-div2",
  "expect": [
    "child-div2"
  ],
  "level": 2
},
{
  "name": "Adjacent sibling combinator, matching element that is an adjacent sibling of an element with id",
  "selector": "#adjacent-div2+div",
  "expect": [
    "adjacent-div4"
  ],
  "level": 2
},
{
  "name": "Adjacent sibling combinator, matching element with id that is an adjacent sibling of an element",
  "selector": "div+#adjacent-div4",
  "expect": [
    "adjacent-div4"
  ],
  "level": 2
},
{
  "name": "Adjacent sibling combinator, matching element with id that is an adjacent sibling of an element with id",
  "selector": "#adjacent-div2+#adjacent-div4",
  "expect": [
    "adjacent-div4"
  ],
  "level": 2
},
{
  "name": "Adjacent sibling combinator, matching element with class that is an adjacent sibling of an element with id",
  "selector": "#adjacent-div2+.adjacent-div4",
  "expect": [
    "adjacent-div4"
  ],
  "level": 2
},
{
  "name": "Adjacent sibling combinator, matching element with class that is an adjacent sibling of an element with class",
  "selector": ".adjacent-div2+.adjacent-div4",
  "expect": [
    "adjacent-div4"
  ],
  "level": 2
},
{
  "name": "Adjacent sibling combinator, matching p element that is an adjacent sibling of a div element",
  "selector": "#adjacent div+p",
  "expect": [
    "adjacent-p2"
  ],
  "level": 2
},
{
  "name": "Adjacent sibling combinator, not matching element with id that is not an adjacent sibling of an element with id",
  "selector": "#adjacent-div2+#adjacent-p2, #adjacent-div2+#adjacent-div1",
  "expect": [],
  "level": 2
},
{
  "name": "Adjacent sibling combinator, surrounded by whitespace",
  "selector": "#adjacent-p2\t\r\n+\t\r\n#adjacent-p3",
  "expect": [
    "adjacent-p3"
  ],
  "level": 2
},
{
  "name": "Adjacent sibling combinator, whitespace after",
  "selector": "#adjacent-p2+\t\r\n#adjacent-p3",
  "expect": [
    "adjacent-p3"
  ],
  "level": 2
},
{
  "name": "Adjacent sibling combinator, whitespace before",
  "selector": "#adjacent-p2\t\r\n+#adjacent-p3",
  "expect": [
    "adjacent-p3"
  ],
  "level": 2
},
{
  "name": "Adjacent sibling combinator, no whitespace",
  "selector": "#adjacent-p2+#adjacent-p3",
  "expect": [
    "adjacent-p3"
  ],
  "level": 2
},
{
  "name": "General sibling combinator, matching element that is a sibling of an element with id",
  "selector": "#sibling-div2~div",
  "expect": [
    "sibling-div4",
    "sibling-div6"
  ],
  "level": 3
},
{
  "name": "General sibling combinator, matching element with id that is a sibling of an element",
  "selector": "div~#sibling-div4",
  "expect": [
    "sibling-div4"
  ],
  "level": 3
},
{
  "name": "General sibling combinator, matching element with id that is a sibling of an element with id",
  "selector": "#sibling-div2~#sibling-div4",
  "expect": [
    "sibling-div4"
  ],
  "level": 3
},
{
  "name": "General sibling combinator, matching element with class that is a sibling of an element with id",
  "selector": "#sibling-div2~.sibling-div",
  "expect": [
    "sibling-div4",
    "sibling-div6"
  ],
  "level": 3
},
{
  "name": "General sibling combinator, matching p element that is a sibling of a div element",
  "selector": "#sibling div~p",
  "expect": [
    "sibling-p2",
    "sibling-p3"
  ],
  "level": 3
},
{
  "name": "General sibling combinator, not matching element with id that is not a sibling after a p element",
  "selector": "#sibling>p~div",
  "expect": [],
  "level": 3
},
{
  "name": "General sibling combinator, not matching element with id that is not a sibling after an element with id",
  "selector": "#sibling-div2~#sibling-div3, #sibling-div2~#sibling-div1",
  "expect": [],
  "level": 3
},
{
  "name": "General sibling combinator, surrounded by whitespace",
  "selector": "#sibling-p2\t\r\n~\t\r\n#sibling-p3",
  "expect": [
    "sibling-p3"
  ],
  "level": 3
},
{
  "name": "General sibling combinator, whitespace after",
  "selector": "#sibling-p2~\t\r\n#sibling-p3",
  "expect": [
    "sibling-p3"
  ],
  "level": 3
},
{
  "name": "General sibling combinator, whitespace before",
  "selector": "#sibling-p2\t\r\n~#sibling-p3",
  "expect": [
    "sibling-p3"
  ],
  "level": 3
},
{
  "name": "General sibling combinator, no whitespace",
  "selector": "#sibling-p2~#sibling-p3",
  "expect": [
    "sibling-p3"
  ],
  "level": 3
},
{
  "name": "Syntax, group of selectors separator, surrounded by whitespace",
  "selector": "#group em\t\r \n,\t\r \n#group strong",
  "expect": [
    "group-em1",
    "group-strong1"
  ],
  "level": 1
},
{
  "name": "Syntax, group of selectors separator, whitespace after",
  "selector": "#group em,\t\r\n#group strong",
  "expect": [
    "group-em1",
    "group-strong1"
  ],
  "level": 1
},
{
  "name": "Syntax, group of selectors separator, whitespace before",
  "selector": "#group em\t\r\n,#group strong",
  "expect": [
    "group-em1",
    "group-strong1"
  ],
  "level": 1
},
{
  "name": "Syntax, group of selectors separator, no whitespace",
  "selector": "#group em,#group strong",
  "expect": [
    "group-em1",
    "group-strong1"
  ],
  "level": 1
}
]
