<reponame>msathis/cssselect2
# File generated by make_selectors.py, do not edit

invalid_selectors = [
    {'name': 'Empty String', 'selector': ''},
    {'name': 'Invalid character', 'selector': '['},
    {'name': 'Invalid character', 'selector': ']'},
    {'name': 'Invalid character', 'selector': '('},
    {'name': 'Invalid character', 'selector': ')'},
    {'name': 'Invalid character', 'selector': '{'},
    {'name': 'Invalid character', 'selector': '}'},
    {'name': 'Invalid character', 'selector': '<'},
    {'name': 'Invalid character', 'selector': '>'},
    {'name': 'Invalid ID', 'selector': '#'},
    {'name': 'Invalid group of selectors', 'selector': 'div,'},
    {'name': 'Invalid class', 'selector': '.'},
    {'name': 'Invalid class', 'selector': '.5cm'},
    {'name': 'Invalid class', 'selector': '..test'},
    {'name': 'Invalid class', 'selector': '.foo..quux'},
    {'name': 'Invalid class', 'selector': '.bar.'},
    {'name': 'Invalid combinator', 'selector': 'div & address, p'},
    {'name': 'Invalid combinator', 'selector': 'div ++ address, p'},
    {'name': 'Invalid combinator', 'selector': 'div ~~ address, p'},
    {'name': 'Invalid [att=value] selector', 'selector': '[*=test]'},
    {'name': 'Invalid [att=value] selector', 'selector': '[*|*=test]'},
    {
        'name': 'Invalid [att=value] selector',
        'selector': '[class= space unquoted ]'},
    {'name': 'Unknown pseudo-class', 'selector': 'div:example'},
    {'name': 'Unknown pseudo-class', 'selector': ':example'},
    {'name': 'Unknown pseudo-class', 'selector': 'div:linkexample'},
    {'name': 'Unknown pseudo-element', 'selector': 'div::example'},
    {'name': 'Unknown pseudo-element', 'selector': '::example'},
    {'name': 'Invalid pseudo-element', 'selector': ':::before'},
    {'name': 'Invalid pseudo-element', 'selector': ':: before'},
    {'name': 'Undeclared namespace', 'selector': 'ns|div'},
    {'name': 'Undeclared namespace', 'selector': ':not(ns|div)'},
    {'name': 'Invalid namespace', 'selector': '^|div'},
    {'name': 'Invalid namespace', 'selector': '$|div'},
    {'name': 'Relative selector', 'selector': '>*'}]

valid_selectors = [
    {
        'exclude': ['element', 'fragment', 'detached'],
        'expect': ['html'],
        'level': 1,
        'name': 'Type selector, matching html element',
        'selector': 'html'},
    {
        'exclude': ['document'],
        'expect': [],
        'level': 1,
        'name': 'Type selector, matching html element',
        'selector': 'html'},
    {
        'exclude': ['element', 'fragment', 'detached'],
        'expect': ['body'],
        'level': 1,
        'name': 'Type selector, matching body element',
        'selector': 'body'},
    {
        'exclude': ['document'],
        'expect': [],
        'level': 1,
        'name': 'Type selector, matching body element',
        'selector': 'body'},
    {
        'expect': [
            'universal',
            'universal-p1',
            'universal-code1',
            'universal-hr1',
            'universal-pre1',
            'universal-span1',
            'universal-p2',
            'universal-a1',
            'universal-address1',
            'universal-code2',
            'universal-a2'],
        'level': 2,
        'name': 'Universal selector, matching all elements',
        'selector': '*'},
    {
        'expect': [
            'universal-p1',
            'universal-hr1',
            'universal-pre1',
            'universal-p2',
            'universal-address1'],
        'level': 2,
        'name': 'Universal selector, matching all children of element with '
                'specified ID',
        'selector': '#universal>*'},
    {
        'expect': [
            'universal-code1',
            'universal-span1',
            'universal-a1',
            'universal-code2'],
        'level': 2,
        'name': 'Universal selector, matching all grandchildren of element '
                'with specified ID',
        'selector': '#universal>*>*'},
    {
        'expect': [],
        'level': 2,
        'name': 'Universal selector, matching all children of empty element '
                'with specified ID',
        'selector': '#empty>*'},
    {
        'expect': [
            'universal-p1',
            'universal-code1',
            'universal-hr1',
            'universal-pre1',
            'universal-span1',
            'universal-p2',
            'universal-a1',
            'universal-address1',
            'universal-code2',
            'universal-a2'],
        'level': 2,
        'name': 'Universal selector, matching all descendants of element with '
                'specified ID',
        'selector': '#universal *'},
    {
        'expect': ['attr-presence-div1'],
        'level': 2,
        'name': 'Attribute presence selector, matching align attribute with '
                'value',
        'selector': '.attr-presence-div1[align]'},
    {
        'expect': ['attr-presence-div2'],
        'level': 2,
        'name': 'Attribute presence selector, matching align attribute with '
                'empty value',
        'selector': '.attr-presence-div2[align]'},
    {
        'exclude': ['xhtml'],
        'expect': [
            'attr-presence-a1',
            'attr-presence-span1',
            'attr-presence-i1'],
        'level': 2,
        'name': 'Attribute presence selector, matching title attribute, case '
                'insensitivity',
        'selector': '#attr-presence [*|TiTlE]'},
    {
        'exclude': ['html'],
        'expect': [],
        'level': 2,
        'name': 'Attribute presence selector, not matching title attribute, '
                'case sensitivity',
        'selector': '#attr-presence [*|TiTlE]'},
    {
        'expect': ['attr-presence-pre1', 'attr-presence-blockquote1'],
        'level': 2,
        'name': 'Attribute presence selector, matching custom data-* '
                'attribute',
        'selector': '[data-attr-presence]'},
    {
        'expect': [],
        'level': 2,
        'name': 'Attribute presence selector, not matching attribute with '
                'similar name',
        'selector': '.attr-presence-div3[align], .attr-presence-div4[align]'},
    {
        'expect': ['attr-presence-ul1'],
        'level': 2,
        'name': 'Attribute presence selector, matching attribute with '
                'non-ASCII characters',
        'selector': 'ul[data-中文]'},
    {
        'expect': [],
        'level': 2,
        'name': 'Attribute presence selector, not matching default option '
                'without selected attribute',
        'selector': '#attr-presence-select1 option[selected]'},
    {
        'expect': ['attr-presence-select2-option4'],
        'level': 2,
        'name': 'Attribute presence selector, matching option with selected '
                'attribute',
        'selector': '#attr-presence-select2 option[selected]'},
    {
        'expect': [
            'attr-presence-select3-option2',
            'attr-presence-select3-option3'],
        'level': 2,
        'name': 'Attribute presence selector, matching multiple options with '
                'selected attributes',
        'selector': '#attr-presence-select3 option[selected]'},
    {
        'expect': ['attr-value-div1'],
        '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 '
                'value, unclosed bracket',
        'selector': '#attr-value [align="center"'},
    {
        'expect': ['attr-value-div2'],
        'level': 2,
        'name': 'Attribute value selector, matching align attribute with '
                'empty value',
        'selector': '#attr-value [align=""]'},
    {
        'expect': [],
        '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': ['attr-value-div3'],
        'level': 2,
        'name': 'Attribute value selector, matching custom data-* attribute '
                'with unicode escaped value',
        'selector': '[data-attr-value="\\e9"]'},
    {
        'expect': ['attr-value-div4'],
        'level': 2,
        'name': 'Attribute value selector, matching custom data-* attribute '
                'with escaped character',
        'selector': '[data-attr-value_foo="\\e9"]'},
    {
        'expect': [
            'attr-value-input3',
            'attr-value-input4',
            'attr-value-input6',
            'attr-value-input8',
            'attr-value-input9'],
        '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-div5'],
        'level': 2,
        'name': 'Attribute value selector, matching attribute with value '
                'using non-ASCII characters',
        'selector': '[data-attr-value=中文]'},
    {
        'expect': ['attr-whitespace-div1'],
        'level': 2,
        'name': 'Attribute whitespace-separated list selector, matching class '
                'attribute with value',
        'selector': '#attr-whitespace [class~="div1"]'},
    {
        'expect': [],
        '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': ['attr-whitespace-div4'],
        'level': 2,
        'name': 'Attribute whitespace-separated list selector, matching '
                'custom data-* attribute with unicode escaped value',
        'selector': '[data-attr-whitespace~="\\0000e9"]'},
    {
        'expect': ['attr-whitespace-div5'],
        'level': 2,
        'name': 'Attribute whitespace-separated list selector, matching '
                'custom data-* attribute with escaped character',
        'selector': '[data-attr-whitespace_foo~="\\e9"]'},
    {
        '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 '
                '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': [],
        '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': ['attr-whitespace-p1'],
        'level': 2,
        'name': 'Attribute whitespace-separated list selector, matching title '
                'attribute with value using non-ASCII characters',
        'selector': '#attr-whitespace [title~=中文]'},
    {
        'expect': [],
        'level': 2,
        'name': 'Attribute hyphen-separated list selector, not matching '
                'unspecified lang attribute',
        'selector': '#attr-hyphen-div1[lang|="en"]'},
    {
        'expect': ['attr-hyphen-div2'],
        'level': 2,
        'name': 'Attribute hyphen-separated list selector, matching lang '
                'attribute with exact value',
        'selector': '#attr-hyphen-div2[lang|="fr"]'},
    {
        'expect': ['attr-hyphen-div3'],
        'level': 2,
        'name': 'Attribute hyphen-separated list selector, matching lang '
                'attribute with partial value',
        'selector': '#attr-hyphen-div3[lang|="en"]'},
    {
        'expect': [],
        'level': 2,
        'name': 'Attribute hyphen-separated list selector, not matching '
                'incorrect value',
        'selector': '#attr-hyphen-div4[lang|="es-AR"]'},
    {
        'expect': ['attr-begins-a1', 'attr-begins-a3'],
        'level': 3,
        'name': 'Attribute begins with selector, matching href attributes '
                'beginning with specified substring',
        'selector': '#attr-begins a[href^="http://www"]'},
    {
        'expect': ['attr-begins-div2', 'attr-begins-div4'],
        'level': 3,
        'name': 'Attribute begins with selector, matching lang attributes '
                'beginning with specified substring, ',
        'selector': '#attr-begins [lang^="en-"]'},
    {
        'expect': [],
        'level': 3,
        'name': 'Attribute begins with selector, not matching class attribute '
                'with empty value',
        'selector': '#attr-begins [class^=""]'},
    {
        'expect': [],
        'level': 3,
        'name': 'Attribute begins with selector, not matching class attribute '
                'not beginning with specified substring',
        'selector': '#attr-begins [class^=apple]'},
    {
        'expect': ['attr-begins-p1'],
        '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': [],
        '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': ['attr-ends-a1', 'attr-ends-a3'],
        'level': 3,
        'name': 'Attribute ends with selector, matching href attributes '
                'ending with specified substring',
        'selector': '#attr-ends a[href$=".org"]'},
    {
        'expect': ['attr-ends-div2', 'attr-ends-div4'],
        'level': 3,
        'name': 'Attribute ends with selector, matching lang attributes '
                'ending with specified substring, ',
        'selector': '#attr-ends [lang$="-CH"]'},
    {
        'expect': [],
        'level': 3,
        'name': 'Attribute ends with selector, not matching class attribute '
                'with empty value',
        'selector': '#attr-ends [class$=""]'},
    {
        'expect': [],
        'level': 3,
        'name': 'Attribute ends with selector, not matching class attribute '
                'not ending with specified substring',
        'selector': '#attr-ends [class$=apple]'},
    {
        'expect': ['attr-ends-p1'],
        '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': [],
        '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': ['attr-contains-a1', 'attr-contains-a3'],
        '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-a2'],
        '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-a3'],
        'level': 3,
        'name': 'Attribute contains selector, matching href attributes '
                'containing specified substring',
        'selector': '#attr-contains a[href*=".example."]'},
    {
        'expect': ['attr-contains-div2', 'attr-contains-div6'],
        'level': 3,
        'name': 'Attribute contains selector, matching lang attributes '
                'beginning with specified substring, ',
        'selector': '#attr-contains [lang*="en-"]'},
    {
        'expect': ['attr-contains-div3', 'attr-contains-div5'],
        'level': 3,
        'name': 'Attribute contains selector, matching lang attributes ending '
                'with specified substring, ',
        'selector': '#attr-contains [lang*="-CH"]'},
    {
        'expect': [],
        'level': 3,
        'name': 'Attribute contains selector, not matching class attribute '
                'with empty value',
        'selector': '#attr-contains [class*=""]'},
    {
        'expect': ['attr-contains-p1'],
        '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 ]'},
    {
        'exclude': ['element', 'fragment', 'detached'],
        'expect': ['html'],
        'level': 3,
        'name': ':root pseudo-class selector, matching document root element',
        'selector': ':root'},
    {
        'exclude': ['document'],
        'expect': [],
        'level': 3,
        'name': ':root pseudo-class selector, not matching document root '
                'element',
        'selector': ':root'},
    {
        'expect': [
            'pseudo-nth-td3',
            'pseudo-nth-td9',
            'pseudo-nth-tr3',
            'pseudo-nth-td15'],
        'level': 3,
        'name': ':nth-child selector, matching the third child element',
        'selector': '#pseudo-nth-table1 :nth-child(3)'},
    {
        'expect': [
            'pseudo-nth-li3',
            'pseudo-nth-li6',
            'pseudo-nth-li9',
            'pseudo-nth-li12'],
        'level': 3,
        'name': ':nth-child selector, matching every third child element',
        'selector': '#pseudo-nth li:nth-child(3n)'},
    {
        'expect': [
            'pseudo-nth-li4',
            'pseudo-nth-li6',
            'pseudo-nth-li8',
            'pseudo-nth-li10',
            '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-em2', 'pseudo-nth-span3'],
        '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-tr1',
            'pseudo-nth-td4',
            'pseudo-nth-td10',
            'pseudo-nth-td16'],
        'level': 3,
        'name': ':nth-last-child selector, matching the third last child '
                'element',
        'selector': '#pseudo-nth-table1 :nth-last-child(3)'},
    {
        'expect': [
            'pseudo-nth-li1',
            'pseudo-nth-li4',
            'pseudo-nth-li7',
            'pseudo-nth-li10'],
        '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-li3',
            'pseudo-nth-li5',
            'pseudo-nth-li7',
            'pseudo-nth-li9'],
        '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-span2', 'pseudo-nth-span4'],
        '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-em3'],
        'level': 3,
        'name': ':nth-of-type selector, matching the third em element',
        'selector': '#pseudo-nth-p1 em:nth-of-type(3)'},
    {
        '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 element of '
                'their type',
        'selector': '#pseudo-nth-p1 :nth-of-type(2n)'},
    {
        'expect': ['pseudo-nth-span1', 'pseudo-nth-span3'],
        '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-em2'],
        'level': 3,
        'name': ':nth-last-of-type selector, matching the third last em '
                'element',
        'selector': '#pseudo-nth-p1 em:nth-last-of-type(3)'},
    {
        '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',
        'selector': '#pseudo-nth-p1 :nth-last-of-type(2n)'},
    {
        'expect': ['pseudo-nth-span2', 'pseudo-nth-span4'],
        '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-em1'],
        'level': 3,
        'name': ':first-of-type selector, matching the first em element',
        'selector': '#pseudo-nth-p1 em:first-of-type'},
    {
        'expect': ['pseudo-nth-span1', 'pseudo-nth-em1', 'pseudo-nth-strong1'],
        '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-td1', 'pseudo-nth-td7', 'pseudo-nth-td13'],
        '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-em4'],
        'level': 3,
        'name': ':last-of-type selector, matching the last em elemnet',
        'selector': '#pseudo-nth-p1 em:last-of-type'},
    {
        'expect': ['pseudo-nth-span4', 'pseudo-nth-strong2', '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-td6', 'pseudo-nth-td12', 'pseudo-nth-td18'],
        '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-first-child-div1'],
        'level': 2,
        'name': ':first-child pseudo-class selector, matching first child div '
                'element',
        'selector': '#pseudo-first-child div:first-child'},
    {
        'expect': [],
        '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': [
            'pseudo-first-child-span1',
            'pseudo-first-child-span3',
            'pseudo-first-child-span5'],
        'level': 2,
        'name': ':first-child pseudo-class selector, matching first-child of '
                'multiple elements',
        'selector': '#pseudo-first-child span:first-child'},
    {
        'expect': ['pseudo-last-child-div3'],
        'level': 3,
        'name': ':last-child pseudo-class selector, matching last child div '
                'element',
        'selector': '#pseudo-last-child div:last-child'},
    {
        'expect': [],
        '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': [
            'pseudo-last-child-span2',
            'pseudo-last-child-span4',
            'pseudo-last-child-span6'],
        'level': 3,
        'name': ':last-child pseudo-class selector, matching first-child of '
                'multiple elements',
        'selector': '#pseudo-last-child span:last-child'},
    {
        'expect': ['pseudo-only-span1'],
        'level': 3,
        'name': ':pseudo-only-child pseudo-class selector, matching all '
                'only-child elements',
        'selector': '#pseudo-only :only-child'},
    {
        'expect': [],
        'level': 3,
        'name': ':pseudo-only-child pseudo-class selector, matching '
                'only-child em elements',
        'selector': '#pseudo-only em:only-child'},
    {
        'expect': ['pseudo-only-span1', 'pseudo-only-em1'],
        '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-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-empty-p1', 'pseudo-empty-p2'],
        '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-span1'],
        'level': 3,
        'name': ':empty pseudo-class selector, matching all empty elements',
        'selector': '#pseudo-empty :empty'},
    {
        'expect': ['pseudo-link-a1', 'pseudo-link-a2', 'pseudo-link-area1'],
        'level': 1,
        'name': ':link and :visited pseudo-class selectors, matching a and '
                'area elements with href attributes',
        'selector': '#pseudo-link :link, #pseudo-link :visited'},
    {
        'exclude': ['element', 'fragment', 'detached'],
        'expect': [],
        'level': 1,
        'name': ':link and :visited pseudo-class selectors, matching no '
                'elements',
        'selector': '#head :link, #head :visited'},
    {
        'exclude': ['document'],
        'expect': [],
        'level': 1,
        'name': ':link and :visited pseudo-class selectors, not matching link '
                'elements with href attributes',
        'selector': '#head :link, #head :visited'},
    {
        'exclude': ['document'],
        'expect': [],
        'level': 1,
        'name': ':link and :visited pseudo-class selectors, chained, mutually '
                'exclusive pseudo-classes match nothing',
        'selector': ':link:visited'},
    {
        'exclude': ['document', 'element'],
        'expect': [],
        'level': 3,
        'name': ':target pseudo-class selector, matching the element '
                'referenced by the URL fragment identifier',
        'selector': ':target'},
    {
        'exclude': ['fragment', 'detached'],
        'expect': ['target'],
        'level': 3,
        'name': ':target pseudo-class selector, matching the element '
                'referenced by the URL fragment identifier',
        'selector': ':target'},
    {
        'exclude': ['detached', 'fragment'],
        'expect': ['pseudo-lang-div1'],
        'level': 2,
        'name': ':lang pseudo-class selector, matching inherited language',
        'selector': '#pseudo-lang-div1:lang(en)'},
    {
        'exclude': ['document', 'element'],
        'expect': [],
        'level': 2,
        'name': ':lang pseudo-class selector, not matching element with no '
                'inherited language',
        'selector': '#pseudo-lang-div1:lang(en)'},
    {
        'expect': ['pseudo-lang-div2'],
        'level': 2,
        'name': ':lang pseudo-class selector, matching specified language '
                'with exact value',
        'selector': '#pseudo-lang-div2:lang(fr)'},
    {
        'expect': ['pseudo-lang-div3'],
        'level': 2,
        'name': ':lang pseudo-class selector, matching specified language '
                'with partial value',
        'selector': '#pseudo-lang-div3:lang(en)'},
    {
        'expect': [],
        'level': 2,
        'name': ':lang pseudo-class selector, not matching incorrect language',
        'selector': '#pseudo-lang-div4:lang(es-AR)'},
    {
        '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 enabled form '
                'controls',
        'selector': '#pseudo-ui :enabled'},
    {
        'expect': [],
        'level': 3,
        'name': ':enabled pseudo-class selector, not matching link elements',
        'selector': '#pseudo-link :enabled',
        'unexpected': [
            'pseudo-link-a1',
                'pseudo-link-a2',
                'pseudo-link-a3',
                'pseudo-link-map1',
                'pseudo-link-area1',
                'pseudo-link-area2']},
    {
        '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': ':disabled pseudo-class selector, matching all disabled form '
                'controls',
        'selector': '#pseudo-ui :disabled'},
    {
        'expect': [],
        'level': 3,
        'name': ':disabled pseudo-class selector, not matching link elements',
        'selector': '#pseudo-link :disabled',
        'unexpected': [
            'pseudo-link-a1',
                'pseudo-link-a2',
                'pseudo-link-a3',
                'pseudo-link-map1',
                'pseudo-link-area1',
                'pseudo-link-area2']},
    {
        'expect': [
            'pseudo-ui-input4',
            'pseudo-ui-input6',
            'pseudo-ui-input13',
            'pseudo-ui-input15'],
        'level': 3,
        'name': ':checked pseudo-class selector, matching checked radio '
                'buttons and checkboxes',
        'selector': '#pseudo-ui :checked'},
    {
        'expect': ['not-p1', 'not-p2', 'not-p3'],
        'level': 3,
        'name': ':not pseudo-class selector, matching ',
        'selector': '#not>:not(div)'},
    {
        'expect': ['not-em1', 'not-em2', 'not-em3'],
        'level': 3,
        'name': ':not pseudo-class selector, matching ',
        'selector': '#not * :not(:first-child)'},
    {
        'expect': [],
        'level': 3,
        'name': ':not pseudo-class selector, matching nothing',
        'selector': ':not(*)'},
    {
        'expect': [],
        'level': 3,
        'name': ':not pseudo-class selector, matching nothing',
        'selector': ':not(*|*)'},
    {
        'expect': ['not-p1', 'not-p2', 'not-p3'],
        'level': 3,
        'name': ':not pseudo-class selector argument surrounded by spaces, '
                'matching ',
        'selector': '#not>:not( div )'},
    {
        'expect': [],
        'level': 2,
        'name': ':first-line pseudo-element (one-colon syntax) selector, not '
                'matching any elements',
        'selector': '#pseudo-element:first-line'},
    {
        'expect': [],
        'level': 3,
        'name': '::first-line pseudo-element (two-colon syntax) selector, not '
                'matching any elements',
        'selector': '#pseudo-element::first-line'},
    {
        'expect': [],
        'level': 2,
        'name': ':first-letter pseudo-element (one-colon syntax) selector, '
                'not matching any elements',
        'selector': '#pseudo-element:first-letter'},
    {
        'expect': [],
        'level': 3,
        'name': '::first-letter pseudo-element (two-colon syntax) selector, '
                'not matching any elements',
        'selector': '#pseudo-element::first-letter'},
    {
        'expect': [],
        'level': 2,
        'name': ':before pseudo-element (one-colon syntax) selector, not '
                'matching any elements',
        'selector': '#pseudo-element:before'},
    {
        'expect': [],
        'level': 3,
        'name': '::before pseudo-element (two-colon syntax) selector, not '
                'matching any elements',
        'selector': '#pseudo-element::before'},
    {
        'expect': [],
        'level': 2,
        'name': ':after pseudo-element (one-colon syntax) selector, not '
                'matching any elements',
        'selector': '#pseudo-element:after'},
    {
        'expect': [],
        'level': 3,
        'name': '::after pseudo-element (two-colon syntax) selector, not '
                'matching any elements',
        'selector': '#pseudo-element::after'},
    {
        'expect': ['class-p1', 'class-p2', 'class-p3'],
        'level': 1,
        'name': 'Class selector, matching element with specified class',
        'selector': '.class-p'},
    {
        'expect': [
            'class-div1',
            'class-div2',
            'class-p4',
            'class-div3',
            'class-p6',
            'class-div4'],
        'level': 1,
        'name': 'Class selector, chained, matching only elements with all '
                'specified classes',
        'selector': '#class .apple.orange.banana'},
    {
        'expect': ['class-div1', 'class-div2', 'class-div3', 'class-div4'],
        'level': 1,
        'name': 'Class Selector, chained, with type selector',
        'selector': 'div.apple.banana.orange'},
    {
        'expect': ['class-span1'],
        'level': 1,
        'name': 'Class selector, matching element with class value using '
                'non-ASCII characters (1)',
        'selector': '.台北Táiběi'},
    {
        'expect': ['class-span1', 'class-span2'],
        'level': 1,
        'name': 'Class selector, matching multiple elements with class value '
                'using non-ASCII characters',
        'selector': '.台北'},
    {
        'expect': ['class-span1'],
        'level': 1,
        'name': 'Class selector, chained, matching element with multiple '
                'class values using non-ASCII characters (1)',
        'selector': '.台北Táiběi.台北'},
    {
        'expect': ['class-span3'],
        'level': 1,
        'name': 'Class selector, matching element with class with escaped '
                'character',
        'selector': '.foo\\:bar'},
    {
        'expect': ['class-span4'],
        'level': 1,
        'name': 'Class selector, matching element with class with escaped '
                'character',
        'selector': '.test\\.foo\\[5\\]bar'},
    {
        'expect': ['id-div1'],
        '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', 'id-div2'],
        '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': [],
        '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': [
            'id-li-duplicate',
            'id-li-duplicate',
            'id-li-duplicate',
            'id-li-duplicate'],
        'level': 1,
        'name': 'ID selector, matching multiple elements with duplicate id',
        'selector': '#id-li-duplicate'},
    {
        'expect': ['台北Táiběi'],
        'level': 1,
        'name': 'ID selector, matching id value using non-ASCII characters '
                '(1)',
        'selector': '#台北Táiběi'},
    {
        'expect': ['台北'],
        'level': 1,
        'name': 'ID selector, matching id value using non-ASCII characters '
                '(2)',
        'selector': '#台北'},
    {
        'expect': ['台北Táiběi', '台北'],
        'level': 1,
        'name': 'ID selector, matching id values using non-ASCII characters '
                '(1)',
        'selector': '#台北Táiběi, #台北'},
    {
        'expect': ['#foo:bar'],
        'level': 1,
        'name': 'ID selector, matching element with id with escaped character',
        'selector': '#\\#foo\\:bar'},
    {
        'expect': ['test.foo[5]bar'],
        'level': 1,
        'name': 'ID selector, matching element with id with escaped character',
        'selector': '#test\\.foo\\[5\\]bar'},
    {
        'expect': [
            'any-namespace-div1',
            'any-namespace-div2',
            'any-namespace-div3',
            'any-namespace-div4'],
        'level': 3,
        'name': 'Namespace selector, matching element with any namespace',
        'selector': '#any-namespace *|div'},
    {
        'expect': ['no-namespace-div3'],
        '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': [
            'descendant-div1',
            'descendant-div2',
            'descendant-div3',
            'descendant-div4'],
        'level': 1,
        'name': 'Descendant combinator, matching element that is a descendant '
                'of an element with id',
        'selector': '#descendant div'},
    {
        'exclude': ['detached', 'fragment'],
        'expect': ['descendant-div1'],
        'level': 1,
        'name': 'Descendant combinator, matching element with id that is a '
                'descendant of an element',
        'selector': 'body #descendant-div1'},
    {
        'expect': ['descendant-div1'],
        'level': 1,
        'name': 'Descendant combinator, matching element with id that is a '
                'descendant of an element',
        'selector': 'div #descendant-div1'},
    {
        'expect': ['descendant-div2'],
        '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-div3'],
        'level': 1,
        'name': 'Descendant combinator, matching element with class that is a '
                'descendant of an element with class',
        'selector': '.descendant-div1 .descendant-div3'},
    {
        'expect': [],
        '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': ['descendant-div2'],
        'level': 1,
        'name': 'Descendant combinator, whitespace characters',
        'selector': '#descendant\t\r\n#descendant-div2'},
    {
        'expect': ['child-div1', 'child-div4'],
        'level': 2,
        'name': 'Child combinator, matching element that is a child of an '
                'element with id',
        'selector': '#child>div'},
    {
        'expect': ['child-div1'],
        '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-div2'],
        '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': [],
        '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': ['child-div2'],
        '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': ['adjacent-div4'],
        '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-p2'],
        'level': 2,
        'name': 'Adjacent sibling combinator, matching p element that is an '
                'adjacent sibling of a div element',
        'selector': '#adjacent div+p'},
    {
        'expect': [],
        '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': ['adjacent-p3'],
        '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': ['sibling-div4', 'sibling-div6'],
        'level': 3,
        'name': 'General sibling combinator, matching element that is a '
                'sibling of an element with id',
        'selector': '#sibling-div2~div'},
    {
        'expect': ['sibling-div4'],
        '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', 'sibling-div6'],
        '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-p2', 'sibling-p3'],
        'level': 3,
        'name': 'General sibling combinator, matching p element that is a '
                'sibling of a div element',
        'selector': '#sibling div~p'},
    {
        'expect': [],
        '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': ['sibling-p3'],
        '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': ['group-em1', 'group-strong1'],
        'level': 1,
        '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': [],
        'level': 3,
        'name': 'Slotted selector',
        'selector': '::slotted(foo)'},
    {
        'expect': [],
        'level': 3,
        'name': 'Slotted selector (no matching closing paren)',
        'selector': '::slotted(foo'}]

# File generated by make_selectors.py, do not edit

invalid_selectors = [
    {'name': 'Empty String', 'selector': ''},
    {'name': 'Invalid character', 'selector': '['},
    {'name': 'Invalid character', 'selector': ']'},
    {'name': 'Invalid character', 'selector': '('},
    {'name': 'Invalid character', 'selector': ')'},
    {'name': 'Invalid character', 'selector': '{'},
    {'name': 'Invalid character', 'selector': '}'},
    {'name': 'Invalid character', 'selector': '<'},
    {'name': 'Invalid character', 'selector': '>'},
    {'name': 'Invalid ID', 'selector': '#'},
    {'name': 'Invalid group of selectors', 'selector': 'div,'},
    {'name': 'Invalid class', 'selector': '.'},
    {'name': 'Invalid class', 'selector': '.5cm'},
    {'name': 'Invalid class', 'selector': '..test'},
    {'name': 'Invalid class', 'selector': '.foo..quux'},
    {'name': 'Invalid class', 'selector': '.bar.'},
    {'name': 'Invalid combinator', 'selector': 'div & address, p'},
    {'name': 'Invalid combinator', 'selector': 'div ++ address, p'},
    {'name': 'Invalid combinator', 'selector': 'div ~~ address, p'},
    {'name': 'Invalid [att=value] selector', 'selector': '[*=test]'},
    {'name': 'Invalid [att=value] selector', 'selector': '[*|*=test]'},
    {
        'name': 'Invalid [att=value] selector',
        'selector': '[class= space unquoted ]'},
    {'name': 'Unknown pseudo-class', 'selector': 'div:example'},
    {'name': 'Unknown pseudo-class', 'selector': ':example'},
    {'name': 'Unknown pseudo-class', 'selector': 'div:linkexample'},
    {'name': 'Unknown pseudo-element', 'selector': 'div::example'},
    {'name': 'Unknown pseudo-element', 'selector': '::example'},
    {'name': 'Invalid pseudo-element', 'selector': ':::before'},
    {'name': 'Invalid pseudo-element', 'selector': ':: before'},
    {'name': 'Undeclared namespace', 'selector': 'ns|div'},
    {'name': 'Undeclared namespace', 'selector': ':not(ns|div)'},
    {'name': 'Invalid namespace', 'selector': '^|div'},
    {'name': 'Invalid namespace', 'selector': '$|div'},
    {'name': 'Relative selector', 'selector': '>*'}]

valid_selectors = [
    {
        'exclude': ['element', 'fragment', 'detached'],
        'expect': ['html'],
        'level': 1,
        'name': 'Type selector, matching html element',
        'selector': 'html'},
    {
        'exclude': ['document'],
        'expect': [],
        'level': 1,
        'name': 'Type selector, matching html element',
        'selector': 'html'},
    {
        'exclude': ['element', 'fragment', 'detached'],
        'expect': ['body'],
        'level': 1,
        'name': 'Type selector, matching body element',
        'selector': 'body'},
    {
        'exclude': ['document'],
        'expect': [],
        'level': 1,
        'name': 'Type selector, matching body element',
        'selector': 'body'},
    {
        'expect': [
            'universal',
            'universal-p1',
            'universal-code1',
            'universal-hr1',
            'universal-pre1',
            'universal-span1',
            'universal-p2',
            'universal-a1',
            'universal-address1',
            'universal-code2',
            'universal-a2'],
        'level': 2,
        'name': 'Universal selector, matching all elements',
        'selector': '*'},
    {
        'expect': [
            'universal-p1',
            'universal-hr1',
            'universal-pre1',
            'universal-p2',
            'universal-address1'],
        'level': 2,
        'name': 'Universal selector, matching all children of element with '
                'specified ID',
        'selector': '#universal>*'},
    {
        'expect': [
            'universal-code1',
            'universal-span1',
            'universal-a1',
            'universal-code2'],
        'level': 2,
        'name': 'Universal selector, matching all grandchildren of element '
                'with specified ID',
        'selector': '#universal>*>*'},
    {
        'expect': [],
        'level': 2,
        'name': 'Universal selector, matching all children of empty element '
                'with specified ID',
        'selector': '#empty>*'},
    {
        'expect': [
            'universal-p1',
            'universal-code1',
            'universal-hr1',
            'universal-pre1',
            'universal-span1',
            'universal-p2',
            'universal-a1',
            'universal-address1',
            'universal-code2',
            'universal-a2'],
        'level': 2,
        'name': 'Universal selector, matching all descendants of element with '
                'specified ID',
        'selector': '#universal *'},
    {
        'expect': ['attr-presence-div1'],
        'level': 2,
        'name': 'Attribute presence selector, matching align attribute with '
                'value',
        'selector': '.attr-presence-div1[align]'},
    {
        'expect': ['attr-presence-div2'],
        'level': 2,
        'name': 'Attribute presence selector, matching align attribute with '
                'empty value',
        'selector': '.attr-presence-div2[align]'},
    {
        'exclude': ['xhtml'],
        'expect': [
            'attr-presence-a1',
            'attr-presence-span1',
            'attr-presence-i1'],
        'level': 2,
        'name': 'Attribute presence selector, matching title attribute, case '
                'insensitivity',
        'selector': '#attr-presence [*|TiTlE]'},
    {
        'exclude': ['html'],
        'expect': [],
        'level': 2,
        'name': 'Attribute presence selector, not matching title attribute, '
                'case sensitivity',
        'selector': '#attr-presence [*|TiTlE]'},
    {
        'expect': ['attr-presence-pre1', 'attr-presence-blockquote1'],
        'level': 2,
        'name': 'Attribute presence selector, matching custom data-* '
                'attribute',
        'selector': '[data-attr-presence]'},
    {
        'expect': [],
        'level': 2,
        'name': 'Attribute presence selector, not matching attribute with '
                'similar name',
        'selector': '.attr-presence-div3[align], .attr-presence-div4[align]'},
    {
        'expect': ['attr-presence-ul1'],
        'level': 2,
        'name': 'Attribute presence selector, matching attribute with '
                'non-ASCII characters',
        'selector': 'ul[data-中文]'},
    {
        'expect': [],
        'level': 2,
        'name': 'Attribute presence selector, not matching default option '
                'without selected attribute',
        'selector': '#attr-presence-select1 option[selected]'},
    {
        'expect': ['attr-presence-select2-option4'],
        'level': 2,
        'name': 'Attribute presence selector, matching option with selected '
                'attribute',
        'selector': '#attr-presence-select2 option[selected]'},
    {
        'expect': [
            'attr-presence-select3-option2',
            'attr-presence-select3-option3'],
        'level': 2,
        'name': 'Attribute presence selector, matching multiple options with '
                'selected attributes',
        'selector': '#attr-presence-select3 option[selected]'},
    {
        'expect': ['attr-value-div1'],
        '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 '
                'value, unclosed bracket',
        'selector': '#attr-value [align="center"'},
    {
        'expect': ['attr-value-div2'],
        'level': 2,
        'name': 'Attribute value selector, matching align attribute with '
                'empty value',
        'selector': '#attr-value [align=""]'},
    {
        'expect': [],
        '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': ['attr-value-div3'],
        'level': 2,
        'name': 'Attribute value selector, matching custom data-* attribute '
                'with unicode escaped value',
        'selector': '[data-attr-value="\\e9"]'},
    {
        'expect': ['attr-value-div4'],
        'level': 2,
        'name': 'Attribute value selector, matching custom data-* attribute '
                'with escaped character',
        'selector': '[data-attr-value_foo="\\e9"]'},
    {
        'expect': [
            'attr-value-input3',
            'attr-value-input4',
            'attr-value-input6',
            'attr-value-input8',
            'attr-value-input9'],
        '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-div5'],
        'level': 2,
        'name': 'Attribute value selector, matching attribute with value '
                'using non-ASCII characters',
        'selector': '[data-attr-value=中文]'},
    {
        'expect': ['attr-whitespace-div1'],
        'level': 2,
        'name': 'Attribute whitespace-separated list selector, matching class '
                'attribute with value',
        'selector': '#attr-whitespace [class~="div1"]'},
    {
        'expect': [],
        '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': ['attr-whitespace-div4'],
        'level': 2,
        'name': 'Attribute whitespace-separated list selector, matching '
                'custom data-* attribute with unicode escaped value',
        'selector': '[data-attr-whitespace~="\\0000e9"]'},
    {
        'expect': ['attr-whitespace-div5'],
        'level': 2,
        'name': 'Attribute whitespace-separated list selector, matching '
                'custom data-* attribute with escaped character',
        'selector': '[data-attr-whitespace_foo~="\\e9"]'},
    {
        '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 '
                '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': [],
        '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': ['attr-whitespace-p1'],
        'level': 2,
        'name': 'Attribute whitespace-separated list selector, matching title '
                'attribute with value using non-ASCII characters',
        'selector': '#attr-whitespace [title~=中文]'},
    {
        'expect': [],
        'level': 2,
        'name': 'Attribute hyphen-separated list selector, not matching '
                'unspecified lang attribute',
        'selector': '#attr-hyphen-div1[lang|="en"]'},
    {
        'expect': ['attr-hyphen-div2'],
        'level': 2,
        'name': 'Attribute hyphen-separated list selector, matching lang '
                'attribute with exact value',
        'selector': '#attr-hyphen-div2[lang|="fr"]'},
    {
        'expect': ['attr-hyphen-div3'],
        'level': 2,
        'name': 'Attribute hyphen-separated list selector, matching lang '
                'attribute with partial value',
        'selector': '#attr-hyphen-div3[lang|="en"]'},
    {
        'expect': [],
        'level': 2,
        'name': 'Attribute hyphen-separated list selector, not matching '
                'incorrect value',
        'selector': '#attr-hyphen-div4[lang|="es-AR"]'},
    {
        'expect': ['attr-begins-a1', 'attr-begins-a3'],
        'level': 3,
        'name': 'Attribute begins with selector, matching href attributes '
                'beginning with specified substring',
        'selector': '#attr-begins a[href^="http://www"]'},
    {
        'expect': ['attr-begins-div2', 'attr-begins-div4'],
        'level': 3,
        'name': 'Attribute begins with selector, matching lang attributes '
                'beginning with specified substring, ',
        'selector': '#attr-begins [lang^="en-"]'},
    {
        'expect': [],
        'level': 3,
        'name': 'Attribute begins with selector, not matching class attribute '
                'with empty value',
        'selector': '#attr-begins [class^=""]'},
    {
        'expect': [],
        'level': 3,
        'name': 'Attribute begins with selector, not matching class attribute '
                'not beginning with specified substring',
        'selector': '#attr-begins [class^=apple]'},
    {
        'expect': ['attr-begins-p1'],
        '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': [],
        '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': ['attr-ends-a1', 'attr-ends-a3'],
        'level': 3,
        'name': 'Attribute ends with selector, matching href attributes '
                'ending with specified substring',
        'selector': '#attr-ends a[href$=".org"]'},
    {
        'expect': ['attr-ends-div2', 'attr-ends-div4'],
        'level': 3,
        'name': 'Attribute ends with selector, matching lang attributes '
                'ending with specified substring, ',
        'selector': '#attr-ends [lang$="-CH"]'},
    {
        'expect': [],
        'level': 3,
        'name': 'Attribute ends with selector, not matching class attribute '
                'with empty value',
        'selector': '#attr-ends [class$=""]'},
    {
        'expect': [],
        'level': 3,
        'name': 'Attribute ends with selector, not matching class attribute '
                'not ending with specified substring',
        'selector': '#attr-ends [class$=apple]'},
    {
        'expect': ['attr-ends-p1'],
        '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': [],
        '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': ['attr-contains-a1', 'attr-contains-a3'],
        '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-a2'],
        '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-a3'],
        'level': 3,
        'name': 'Attribute contains selector, matching href attributes '
                'containing specified substring',
        'selector': '#attr-contains a[href*=".example."]'},
    {
        'expect': ['attr-contains-div2', 'attr-contains-div6'],
        'level': 3,
        'name': 'Attribute contains selector, matching lang attributes '
                'beginning with specified substring, ',
        'selector': '#attr-contains [lang*="en-"]'},
    {
        'expect': ['attr-contains-div3', 'attr-contains-div5'],
        'level': 3,
        'name': 'Attribute contains selector, matching lang attributes ending '
                'with specified substring, ',
        'selector': '#attr-contains [lang*="-CH"]'},
    {
        'expect': [],
        'level': 3,
        'name': 'Attribute contains selector, not matching class attribute '
                'with empty value',
        'selector': '#attr-contains [class*=""]'},
    {
        'expect': ['attr-contains-p1'],
        '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 ]'},
    {
        'exclude': ['element', 'fragment', 'detached'],
        'expect': ['html'],
        'level': 3,
        'name': ':root pseudo-class selector, matching document root element',
        'selector': ':root'},
    {
        'exclude': ['document'],
        'expect': [],
        'level': 3,
        'name': ':root pseudo-class selector, not matching document root '
                'element',
        'selector': ':root'},
    {
        'expect': [
            'pseudo-nth-td3',
            'pseudo-nth-td9',
            'pseudo-nth-tr3',
            'pseudo-nth-td15'],
        'level': 3,
        'name': ':nth-child selector, matching the third child element',
        'selector': '#pseudo-nth-table1 :nth-child(3)'},
    {
        'expect': [
            'pseudo-nth-li3',
            'pseudo-nth-li6',
            'pseudo-nth-li9',
            'pseudo-nth-li12'],
        'level': 3,
        'name': ':nth-child selector, matching every third child element',
        'selector': '#pseudo-nth li:nth-child(3n)'},
    {
        'expect': [
            'pseudo-nth-li4',
            'pseudo-nth-li6',
            'pseudo-nth-li8',
            'pseudo-nth-li10',
            '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-em2', 'pseudo-nth-span3'],
        '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-tr1',
            'pseudo-nth-td4',
            'pseudo-nth-td10',
            'pseudo-nth-td16'],
        'level': 3,
        'name': ':nth-last-child selector, matching the third last child '
                'element',
        'selector': '#pseudo-nth-table1 :nth-last-child(3)'},
    {
        'expect': [
            'pseudo-nth-li1',
            'pseudo-nth-li4',
            'pseudo-nth-li7',
            'pseudo-nth-li10'],
        '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-li3',
            'pseudo-nth-li5',
            'pseudo-nth-li7',
            'pseudo-nth-li9'],
        '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-span2', 'pseudo-nth-span4'],
        '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-em3'],
        'level': 3,
        'name': ':nth-of-type selector, matching the third em element',
        'selector': '#pseudo-nth-p1 em:nth-of-type(3)'},
    {
        '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 element of '
                'their type',
        'selector': '#pseudo-nth-p1 :nth-of-type(2n)'},
    {
        'expect': ['pseudo-nth-span1', 'pseudo-nth-span3'],
        '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-em2'],
        'level': 3,
        'name': ':nth-last-of-type selector, matching the third last em '
                'element',
        'selector': '#pseudo-nth-p1 em:nth-last-of-type(3)'},
    {
        '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',
        'selector': '#pseudo-nth-p1 :nth-last-of-type(2n)'},
    {
        'expect': ['pseudo-nth-span2', 'pseudo-nth-span4'],
        '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-em1'],
        'level': 3,
        'name': ':first-of-type selector, matching the first em element',
        'selector': '#pseudo-nth-p1 em:first-of-type'},
    {
        'expect': ['pseudo-nth-span1', 'pseudo-nth-em1', 'pseudo-nth-strong1'],
        '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-td1', 'pseudo-nth-td7', 'pseudo-nth-td13'],
        '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-em4'],
        'level': 3,
        'name': ':last-of-type selector, matching the last em elemnet',
        'selector': '#pseudo-nth-p1 em:last-of-type'},
    {
        'expect': ['pseudo-nth-span4', 'pseudo-nth-strong2', '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-td6', 'pseudo-nth-td12', 'pseudo-nth-td18'],
        '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-first-child-div1'],
        'level': 2,
        'name': ':first-child pseudo-class selector, matching first child div '
                'element',
        'selector': '#pseudo-first-child div:first-child'},
    {
        'expect': [],
        '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': [
            'pseudo-first-child-span1',
            'pseudo-first-child-span3',
            'pseudo-first-child-span5'],
        'level': 2,
        'name': ':first-child pseudo-class selector, matching first-child of '
                'multiple elements',
        'selector': '#pseudo-first-child span:first-child'},
    {
        'expect': ['pseudo-last-child-div3'],
        'level': 3,
        'name': ':last-child pseudo-class selector, matching last child div '
                'element',
        'selector': '#pseudo-last-child div:last-child'},
    {
        'expect': [],
        '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': [
            'pseudo-last-child-span2',
            'pseudo-last-child-span4',
            'pseudo-last-child-span6'],
        'level': 3,
        'name': ':last-child pseudo-class selector, matching first-child of '
                'multiple elements',
        'selector': '#pseudo-last-child span:last-child'},
    {
        'expect': ['pseudo-only-span1'],
        'level': 3,
        'name': ':pseudo-only-child pseudo-class selector, matching all '
                'only-child elements',
        'selector': '#pseudo-only :only-child'},
    {
        'expect': [],
        'level': 3,
        'name': ':pseudo-only-child pseudo-class selector, matching '
                'only-child em elements',
        'selector': '#pseudo-only em:only-child'},
    {
        'expect': ['pseudo-only-span1', 'pseudo-only-em1'],
        '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-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-empty-p1', 'pseudo-empty-p2'],
        '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-span1'],
        'level': 3,
        'name': ':empty pseudo-class selector, matching all empty elements',
        'selector': '#pseudo-empty :empty'},
    {
        'expect': ['pseudo-link-a1', 'pseudo-link-a2', 'pseudo-link-area1'],
        'level': 1,
        'name': ':link and :visited pseudo-class selectors, matching a and '
                'area elements with href attributes',
        'selector': '#pseudo-link :link, #pseudo-link :visited'},
    {
        'exclude': ['element', 'fragment', 'detached'],
        'expect': [],
        'level': 1,
        'name': ':link and :visited pseudo-class selectors, matching no '
                'elements',
        'selector': '#head :link, #head :visited'},
    {
        'exclude': ['document'],
        'expect': [],
        'level': 1,
        'name': ':link and :visited pseudo-class selectors, not matching link '
                'elements with href attributes',
        'selector': '#head :link, #head :visited'},
    {
        'exclude': ['document'],
        'expect': [],
        'level': 1,
        'name': ':link and :visited pseudo-class selectors, chained, mutually '
                'exclusive pseudo-classes match nothing',
        'selector': ':link:visited'},
    {
        'exclude': ['document', 'element'],
        'expect': [],
        'level': 3,
        'name': ':target pseudo-class selector, matching the element '
                'referenced by the URL fragment identifier',
        'selector': ':target'},
    {
        'exclude': ['fragment', 'detached'],
        'expect': ['target'],
        'level': 3,
        'name': ':target pseudo-class selector, matching the element '
                'referenced by the URL fragment identifier',
        'selector': ':target'},
    {
        'exclude': ['detached', 'fragment'],
        'expect': ['pseudo-lang-div1'],
        'level': 2,
        'name': ':lang pseudo-class selector, matching inherited language',
        'selector': '#pseudo-lang-div1:lang(en)'},
    {
        'exclude': ['document', 'element'],
        'expect': [],
        'level': 2,
        'name': ':lang pseudo-class selector, not matching element with no '
                'inherited language',
        'selector': '#pseudo-lang-div1:lang(en)'},
    {
        'expect': ['pseudo-lang-div2'],
        'level': 2,
        'name': ':lang pseudo-class selector, matching specified language '
                'with exact value',
        'selector': '#pseudo-lang-div2:lang(fr)'},
    {
        'expect': ['pseudo-lang-div3'],
        'level': 2,
        'name': ':lang pseudo-class selector, matching specified language '
                'with partial value',
        'selector': '#pseudo-lang-div3:lang(en)'},
    {
        'expect': [],
        'level': 2,
        'name': ':lang pseudo-class selector, not matching incorrect language',
        'selector': '#pseudo-lang-div4:lang(es-AR)'},
    {
        '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 enabled form '
                'controls',
        'selector': '#pseudo-ui :enabled'},
    {
        'expect': [],
        'level': 3,
        'name': ':enabled pseudo-class selector, not matching link elements',
        'selector': '#pseudo-link :enabled',
        'unexpected': [
            'pseudo-link-a1',
                'pseudo-link-a2',
                'pseudo-link-a3',
                'pseudo-link-map1',
                'pseudo-link-area1',
                'pseudo-link-area2']},
    {
        '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': ':disabled pseudo-class selector, matching all disabled form '
                'controls',
        'selector': '#pseudo-ui :disabled'},
    {
        'expect': [],
        'level': 3,
        'name': ':disabled pseudo-class selector, not matching link elements',
        'selector': '#pseudo-link :disabled',
        'unexpected': [
            'pseudo-link-a1',
                'pseudo-link-a2',
                'pseudo-link-a3',
                'pseudo-link-map1',
                'pseudo-link-area1',
                'pseudo-link-area2']},
    {
        'expect': [
            'pseudo-ui-input4',
            'pseudo-ui-input6',
            'pseudo-ui-input13',
            'pseudo-ui-input15'],
        'level': 3,
        'name': ':checked pseudo-class selector, matching checked radio '
                'buttons and checkboxes',
        'selector': '#pseudo-ui :checked'},
    {
        'expect': ['not-p1', 'not-p2', 'not-p3'],
        'level': 3,
        'name': ':not pseudo-class selector, matching ',
        'selector': '#not>:not(div)'},
    {
        'expect': ['not-em1', 'not-em2', 'not-em3'],
        'level': 3,
        'name': ':not pseudo-class selector, matching ',
        'selector': '#not * :not(:first-child)'},
    {
        'expect': [],
        'level': 3,
        'name': ':not pseudo-class selector, matching nothing',
        'selector': ':not(*)'},
    {
        'expect': [],
        'level': 3,
        'name': ':not pseudo-class selector, matching nothing',
        'selector': ':not(*|*)'},
    {
        'expect': ['not-p1', 'not-p2', 'not-p3'],
        'level': 3,
        'name': ':not pseudo-class selector argument surrounded by spaces, '
                'matching ',
        'selector': '#not>:not( div )'},
    {
        'expect': [],
        'level': 2,
        'name': ':first-line pseudo-element (one-colon syntax) selector, not '
                'matching any elements',
        'selector': '#pseudo-element:first-line'},
    {
        'expect': [],
        'level': 3,
        'name': '::first-line pseudo-element (two-colon syntax) selector, not '
                'matching any elements',
        'selector': '#pseudo-element::first-line'},
    {
        'expect': [],
        'level': 2,
        'name': ':first-letter pseudo-element (one-colon syntax) selector, '
                'not matching any elements',
        'selector': '#pseudo-element:first-letter'},
    {
        'expect': [],
        'level': 3,
        'name': '::first-letter pseudo-element (two-colon syntax) selector, '
                'not matching any elements',
        'selector': '#pseudo-element::first-letter'},
    {
        'expect': [],
        'level': 2,
        'name': ':before pseudo-element (one-colon syntax) selector, not '
                'matching any elements',
        'selector': '#pseudo-element:before'},
    {
        'expect': [],
        'level': 3,
        'name': '::before pseudo-element (two-colon syntax) selector, not '
                'matching any elements',
        'selector': '#pseudo-element::before'},
    {
        'expect': [],
        'level': 2,
        'name': ':after pseudo-element (one-colon syntax) selector, not '
                'matching any elements',
        'selector': '#pseudo-element:after'},
    {
        'expect': [],
        'level': 3,
        'name': '::after pseudo-element (two-colon syntax) selector, not '
                'matching any elements',
        'selector': '#pseudo-element::after'},
    {
        'expect': ['class-p1', 'class-p2', 'class-p3'],
        'level': 1,
        'name': 'Class selector, matching element with specified class',
        'selector': '.class-p'},
    {
        'expect': [
            'class-div1',
            'class-div2',
            'class-p4',
            'class-div3',
            'class-p6',
            'class-div4'],
        'level': 1,
        'name': 'Class selector, chained, matching only elements with all '
                'specified classes',
        'selector': '#class .apple.orange.banana'},
    {
        'expect': ['class-div1', 'class-div2', 'class-div3', 'class-div4'],
        'level': 1,
        'name': 'Class Selector, chained, with type selector',
        'selector': 'div.apple.banana.orange'},
    {
        'expect': ['class-span1'],
        'level': 1,
        'name': 'Class selector, matching element with class value using '
                'non-ASCII characters (1)',
        'selector': '.台北Táiběi'},
    {
        'expect': ['class-span1', 'class-span2'],
        'level': 1,
        'name': 'Class selector, matching multiple elements with class value '
                'using non-ASCII characters',
        'selector': '.台北'},
    {
        'expect': ['class-span1'],
        'level': 1,
        'name': 'Class selector, chained, matching element with multiple '
                'class values using non-ASCII characters (1)',
        'selector': '.台北Táiběi.台北'},
    {
        'expect': ['class-span3'],
        'level': 1,
        'name': 'Class selector, matching element with class with escaped '
                'character',
        'selector': '.foo\\:bar'},
    {
        'expect': ['class-span4'],
        'level': 1,
        'name': 'Class selector, matching element with class with escaped '
                'character',
        'selector': '.test\\.foo\\[5\\]bar'},
    {
        'expect': ['id-div1'],
        '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', 'id-div2'],
        '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': [],
        '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': [
            'id-li-duplicate',
            'id-li-duplicate',
            'id-li-duplicate',
            'id-li-duplicate'],
        'level': 1,
        'name': 'ID selector, matching multiple elements with duplicate id',
        'selector': '#id-li-duplicate'},
    {
        'expect': ['台北Táiběi'],
        'level': 1,
        'name': 'ID selector, matching id value using non-ASCII characters '
                '(1)',
        'selector': '#台北Táiběi'},
    {
        'expect': ['台北'],
        'level': 1,
        'name': 'ID selector, matching id value using non-ASCII characters '
                '(2)',
        'selector': '#台北'},
    {
        'expect': ['台北Táiběi', '台北'],
        'level': 1,
        'name': 'ID selector, matching id values using non-ASCII characters '
                '(1)',
        'selector': '#台北Táiběi, #台北'},
    {
        'expect': ['#foo:bar'],
        'level': 1,
        'name': 'ID selector, matching element with id with escaped character',
        'selector': '#\\#foo\\:bar'},
    {
        'expect': ['test.foo[5]bar'],
        'level': 1,
        'name': 'ID selector, matching element with id with escaped character',
        'selector': '#test\\.foo\\[5\\]bar'},
    {
        'expect': [
            'any-namespace-div1',
            'any-namespace-div2',
            'any-namespace-div3',
            'any-namespace-div4'],
        'level': 3,
        'name': 'Namespace selector, matching element with any namespace',
        'selector': '#any-namespace *|div'},
    {
        'expect': ['no-namespace-div3'],
        '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': [
            'descendant-div1',
            'descendant-div2',
            'descendant-div3',
            'descendant-div4'],
        'level': 1,
        'name': 'Descendant combinator, matching element that is a descendant '
                'of an element with id',
        'selector': '#descendant div'},
    {
        'exclude': ['detached', 'fragment'],
        'expect': ['descendant-div1'],
        'level': 1,
        'name': 'Descendant combinator, matching element with id that is a '
                'descendant of an element',
        'selector': 'body #descendant-div1'},
    {
        'expect': ['descendant-div1'],
        'level': 1,
        'name': 'Descendant combinator, matching element with id that is a '
                'descendant of an element',
        'selector': 'div #descendant-div1'},
    {
        'expect': ['descendant-div2'],
        '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-div3'],
        'level': 1,
        'name': 'Descendant combinator, matching element with class that is a '
                'descendant of an element with class',
        'selector': '.descendant-div1 .descendant-div3'},
    {
        'expect': [],
        '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': ['descendant-div2'],
        'level': 1,
        'name': 'Descendant combinator, whitespace characters',
        'selector': '#descendant\t\r\n#descendant-div2'},
    {
        'expect': ['child-div1', 'child-div4'],
        'level': 2,
        'name': 'Child combinator, matching element that is a child of an '
                'element with id',
        'selector': '#child>div'},
    {
        'expect': ['child-div1'],
        '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-div2'],
        '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': [],
        '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': ['child-div2'],
        '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': ['adjacent-div4'],
        '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-p2'],
        'level': 2,
        'name': 'Adjacent sibling combinator, matching p element that is an '
                'adjacent sibling of a div element',
        'selector': '#adjacent div+p'},
    {
        'expect': [],
        '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': ['adjacent-p3'],
        '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': ['sibling-div4', 'sibling-div6'],
        'level': 3,
        'name': 'General sibling combinator, matching element that is a '
                'sibling of an element with id',
        'selector': '#sibling-div2~div'},
    {
        'expect': ['sibling-div4'],
        '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', 'sibling-div6'],
        '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-p2', 'sibling-p3'],
        'level': 3,
        'name': 'General sibling combinator, matching p element that is a '
                'sibling of a div element',
        'selector': '#sibling div~p'},
    {
        'expect': [],
        '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': ['sibling-p3'],
        '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': ['group-em1', 'group-strong1'],
        'level': 1,
        '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': [],
        'level': 3,
        'name': 'Slotted selector',
        'selector': '::slotted(foo)'},
    {
        'expect': [],
        'level': 3,
        'name': 'Slotted selector (no matching closing paren)',
        'selector': '::slotted(foo'}]
# File generated by make_selectors.py, do not edit #attr-value " #attr-value ' #attr-value ' #attr-whitespace " #attr-whitespace ' #attr-whitespace ' #pseudo-link :visited'}, #head :visited'}, #head :visited'}, #id-div1'}, #id-div1'}, #id-div2'}, #id-div1, div#id-div2'}, #none'}, #id-div1'}, #台北'}, #foo\\:bar'}, #descendant-div1'}, #descendant-div1'}, #descendant-div2'}, #descendant-div4'}, #descendant-div2'}, #child-div1'}, #child-div1'}, #child-div3'}, #child-div2'}, #child-div2'}, #child-div2'}, #child-div2'}, #adjacent-div4'}, #adjacent-div4'}, #adjacent-p2, ' #adjacent-div1'}, #adjacent-p3'}, #adjacent-p3'}, #adjacent-p3'}, #adjacent-p3'}, #sibling-div4'}, #sibling-div4'}, #sibling-div3, ' #sibling-div1'}, #sibling-p3'}, #sibling-p3'}, #sibling-p3'}, #sibling-p3'}, #group strong'}, #group strong'}, #group strong'}, #group strong'},