[
  {
    "name": "Type selector, matching html element",
    "selector": "html",
    "expect": [
      "html"
    ],
    "exclude": [
      "element",
      "fragment",
      "detached"
    ],
    "level": 1
  },
  {
    "name": "Type selector, matching body element",
    "selector": "body",
    "expect": [
      "body"
    ],
    "exclude": [
      "element",
      "fragment",
      "detached"
    ],
    "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, 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": ":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",
      "pseudo-empty-p3"
    ],
    "level": 3
  },
  {
    "name": ":empty pseudo-class selector, matching all empty elements",
    "selector": "#pseudo-empty :empty",
    "expect": [
      "pseudo-empty-p1",
      "pseudo-empty-p2",
      "pseudo-empty-p3",
      "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": ":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, 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,
    "xfail": true
  },
  {
    "name": "Namespace selector, matching div elements in no namespace only",
    "selector": "#no-namespace |div",
    "expect": [
      "no-namespace-div3"
    ],
    "level": 3,
    "xfail": true
  },
  {
    "name": "Namespace selector, matching any elements in no namespace only",
    "selector": "#no-namespace |*",
    "expect": [
      "no-namespace-div3"
    ],
    "level": 3,
    "xfail": true
  },
  {
    "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
  }
]