servo/tests/wpt/web-platform-tests/css/css-toggle/toggle-pseudo-class.tentative.html

235 lines
7.1 KiB
HTML

<!DOCTYPE HTML>
<meta charset="UTF-8">
<title>CSS Toggles: creation of toggles</title>
<link rel="author" title="L. David Baron" href="https://dbaron.org/">
<link rel="author" title="Google" href="http://www.google.com/">
<link rel="help" href="https://tabatkins.github.io/css-toggle/#checked-pseudoclass">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="../support/parsing-testcommon.js"></script>
<script src="support/toggle-helpers.js"></script>
<body>
<div id="container"></div>
<script>
test_valid_selector(":toggle(my-toggle)");
test_valid_selector(":toggle(my-toggle 0)");
test_valid_selector(":toggle(my-toggle 1)");
test_valid_selector(":toggle( my-toggle 1 )", ":toggle(my-toggle 1)");
test_valid_selector(":toggle(my-toggle named-state)");
test_valid_selector(":toggle( my-toggle named-state )", ":toggle(my-toggle named-state)");
test_invalid_selector(":toggle(my-toggle, 0)");
test_invalid_selector(":toggle(my-toggle, named-state)");
test_invalid_selector(":toggle(my-toggle named-state 0)");
// In these tests, the following class attributes lead to markup creation:
// class=toggle, class=toggle-self, class=variant-toggle,
// class=variant-toggle-self. These all lead to the creation of a toggle
// called "markup-test". If "-self" is present then the toggle has narrow
// scope (otherwise wide scope). If "variant-" is present then the toggle has
// a value different from what the primary test assertions target (otherwise
// it is what the test assertions target).
//
// The following class attributes lead to test assertions:
// class=assert-match: Assert the :toggle() selector matches the toggle
// class=assert-no-match: Assert the :toggle() selector does not match the
// toggle.
// class=assert-variant-match: Assert the :toggle() selector matches the
// variant toggle.
let scope_search_tests = [
`
<div>
<div class="assert-no-match"></div>
<div class="toggle assert-match">
<div class="assert-match"></div>
</div>
<div class="assert-match"></div>
</div>
<div class="assert-no-match"></div>
`,
`
<div>
<div class="assert-no-match"></div>
<div class="toggle-self assert-match">
<div class="assert-match"></div>
</div>
<div class="assert-no-match"></div>
</div>
<div class="assert-no-match"></div>
`,
`
<div class="toggle"></div>
<div class="variant-toggle-self">
<div class="assert-variant-match"></div>
</div>
<div class="assert-match"></div>
`,
`
<div class="toggle"></div>
<div class="assert-match"></div>
<div class="variant-toggle">
<div class="assert-variant-match"></div>
</div>
<div class="assert-variant-match"></div>
`,
];
for (let t of scope_search_tests) {
promise_test(async function() {
container.innerHTML = t;
for (let e of container.querySelectorAll(".toggle")) {
e.style.toggleRoot = "scope-test 10 at 3";
}
for (let e of container.querySelectorAll(".toggle-self")) {
e.style.toggleRoot = "scope-test 10 at 3 self";
}
for (let e of container.querySelectorAll(".variant-toggle")) {
e.style.toggleRoot = "scope-test 10 at 8";
}
for (let e of container.querySelectorAll(".variant-toggle-self")) {
e.style.toggleRoot = "scope-test 10 at 8 self";
}
for (let e of container.querySelectorAll(
".toggle, .toggle-self, .variant-toggle, .variant-toggle-self")) {
await wait_for_toggle_creation(e);
}
let assert_match = (e, selector) => {
assert_true(e.matches(selector),
`matches ${selector} (class ${e.className})`);
};
let assert_nomatch = (e, selector) => {
assert_false(e.matches(selector),
`does not match ${selector} (class ${e.className})`);
};
for (let e of container.querySelectorAll(".assert-match")) {
assert_match(e, ":toggle(scope-test)");
assert_match(e, ":toggle(scope-test 3)");
assert_nomatch(e, ":toggle(scope-test 8)");
}
for (let e of container.querySelectorAll(".assert-variant-match")) {
assert_match(e, ":toggle(scope-test)");
assert_nomatch(e, ":toggle(scope-test 3)");
assert_match(e, ":toggle(scope-test 8)");
}
for (let e of container.querySelectorAll(".assert-no-match")) {
assert_nomatch(e, ":toggle(scope-test)");
assert_nomatch(e, ":toggle(scope-test 3)");
assert_nomatch(e, ":toggle(scope-test 8)");
}
}, `scope search test for markup ${t}`);
}
let selector_match_tests = [
{
specifier: [ "my-toggle 2 at 1" ],
matching_selectors: [
":toggle(my-toggle)",
":toggle(my-toggle 1)",
],
not_matching_selectors: [
":toggle(my-toggle 0)",
":toggle(my-toggle 2)",
":toggle(my-toggle named-state)",
],
},
{
specifier: [ "my-toggle 2 at 0" ],
matching_selectors: [
":toggle(my-toggle 0)",
],
not_matching_selectors: [
":toggle(my-toggle)",
":toggle(my-toggle 1)",
":toggle(my-toggle 2)",
":toggle(my-toggle named-state)",
],
},
{
specifier: [ "my-toggle 2 at named-state" ],
matching_selectors: [
":toggle(my-toggle)",
":toggle(my-toggle named-state)",
],
not_matching_selectors: [
":toggle(my-toggle 0)",
":toggle(my-toggle 1)",
":toggle(my-toggle 2)",
":toggle(my-toggle infinite)",
":toggle(my-toggle infinity)",
],
},
{
specifier: [
"my-toggle [a b c d] at 0",
"my-toggle [a b c d] at a",
],
matching_selectors: [
":toggle(my-toggle 0)",
":toggle(my-toggle a)",
],
not_matching_selectors: [
":toggle(my-toggle)",
":toggle(my-toggle 1)",
":toggle(my-toggle 2)",
":toggle(my-toggle b)",
":toggle(my-toggle d)",
":toggle(my-toggle named-state)",
],
},
{
specifier: [
"my-toggle [a b c d] at 1",
"my-toggle [a b c d] at b",
],
matching_selectors: [
":toggle(my-toggle)",
":toggle(my-toggle 1)",
":toggle(my-toggle b)",
],
not_matching_selectors: [
":toggle(my-toggle 0)",
":toggle(my-toggle a)",
":toggle(my-toggle 2)",
":toggle(my-toggle d)",
":toggle(my-toggle named-state)",
],
},
{
specifier: [
"my-toggle [a b c d] at unnamed-state",
],
matching_selectors: [
":toggle(my-toggle)",
":toggle(my-toggle unnamed-state)",
],
not_matching_selectors: [
":toggle(my-toggle 0)",
":toggle(my-toggle a)",
":toggle(my-toggle 1)",
":toggle(my-toggle c)",
":toggle(my-toggle 3)",
],
},
];
for (let t of selector_match_tests) {
for (let specifier of t.specifier) {
promise_test(async function() {
container.innerHTML = `<div style="toggle-root: ${specifier}"></div>`;
let e = container.firstChild;
await wait_for_toggle_creation(e);
for (let sel of t.matching_selectors) {
assert_true(e.matches(sel), `${sel} matches`);
}
for (let sel of t.not_matching_selectors) {
assert_false(e.matches(sel), `${sel} does not match`);
}
}, `:toggle() selector matching tests for ${specifier}`);
}
}
</script>