<!doctype html>
<html>
<head>
<meta charset="utf-8">
<script src="../../resources/js-test-pre.js"></script>
<style>
#test-root * {
    background-color: red;
}
</style>
<style id="style">
</style>
</head>
<body>
    <div style="display:none" id="test-root">
        <div data-attribute="WÈb Kit" multiple="padding WèB KIT" id="target1"></div>
        <div data-attribute="padding wÈb kit" multiple="Kit Wèb" id="target2"></div>
        <div data-attribute="KIT WÈB" multiple="Wèb kit" id="target3"></div>
        <div data-attribute="Wèb" multiple="padding wÈb kiT" id="target4"></div>
        <div data-attribute="padding wèb kIt" multiple="wÈb" id="target5"></div>
    </div>
</body>
<script>
description('When matching attributes case insensitively, it should be ASCII case insensitive. This test verifies the behavior when matching a substring in a whitespace-separated list (e.g. [a~="b"])');

function testQuerySelector(selector, expectedIds) {
    shouldBe("document.querySelectorAll('" + selector + "').length", '' + expectedIds.length);
    for (var i = 0; i < expectedIds.length; ++i)
        shouldBeEqualToString("document.querySelectorAll('" + selector + "')[" + i + "].id", 'target' + expectedIds[i]);
}

function testStyling(selector, expectedIds) {
    var stylingElement = document.getElementById("style");
    stylingElement.innerHTML = '' + selector + ' { background-color: rgb(10, 100, 200); }';

    var allTestCases = document.querySelectorAll("#test-root *");
    for (var i = 0; i < allTestCases.length; ++i) {
        var expectMatch = expectedIds.indexOf(parseInt(allTestCases[i].id.replace('target', ''))) >= 0;
        shouldBeEqualToString('getComputedStyle(document.querySelectorAll("#test-root *")[' + i + ']).backgroundColor', expectMatch ? 'rgb(10, 100, 200)' : 'rgb(255, 0, 0)');
    }

    stylingElement.innerHTML = '';
}

function testSelector(selector, expectedIds) {
    debug("Testing \"" + selector + "\"");
    testQuerySelector("#test-root " + selector, expectedIds);
    testStyling("#test-root " + selector, expectedIds);
    debug("");
}

var testCases = [
    // Regular attribute matching is case sensitive.
    ['[data-attribute~=WÈb]', [1]],
    ['[data-attribute~=Kit]', [1]],

    ['[data-attribute~=wÈb]', [2]],
    ['[data-attribute~=kit]', [2]],

    ['[data-attribute~=WÈB]', [3]],
    ['[data-attribute~=KIT]', [3]],

    ['[data-attribute~=Wèb]', [4]],

    ['[data-attribute~=wèb]', [5]],
    ['[data-attribute~=kIt]', [5]],

    // Same selectors with the case-insensitive flag.
    ['[data-attribute~=WÈb i]', [1, 2, 3]],
    ['[data-attribute~=Kit i]', [1, 2, 3, 5]],

    ['[data-attribute~=wÈb i]', [1, 2, 3]],
    ['[data-attribute~=kit i]', [1, 2, 3, 5]],

    ['[data-attribute~=WÈB i]', [1, 2, 3]],
    ['[data-attribute~=KIT i]', [1, 2, 3, 5]],

    ['[data-attribute~=Wèb i]', [4, 5]],

    ['[data-attribute~=wèb i]', [4, 5]],
    ['[data-attribute~=kIt i]', [1, 2, 3, 5]],

    // "multiple" is one of those weird legacy exception: it is always case insensitive in HTML.
    ['[multiple~=WèB]', [1, 2, 3]],
    ['[multiple~=KIT]', [1, 2, 3, 4]],

    ['[multiple~=Wèb]', [1, 2, 3]],
    ['[multiple~=Kit]', [1, 2, 3, 4]],

    ['[multiple~=Wèb]', [1, 2, 3]],
    ['[multiple~=kit]', [1, 2, 3, 4]],

    ['[multiple~=wÈb]', [4, 5]],
    ['[multiple~=kiT]', [1, 2, 3, 4]],

    ['[multiple~=wÈb]', [4, 5]],

    ['[multiple~=WèB i]', [1, 2, 3]],
    ['[multiple~=KIT i]', [1, 2, 3, 4]],

    ['[multiple~=Wèb i]', [1, 2, 3]],
    ['[multiple~=Kit i]', [1, 2, 3, 4]],

    ['[multiple~=Wèb i]', [1, 2, 3]],
    ['[multiple~=kit i]', [1, 2, 3, 4]],

    ['[multiple~=wÈb i]', [4, 5]],
    ['[multiple~=kiT i]', [1, 2, 3, 4]],

    ['[multiple~=wÈb i]', [4, 5]],
];

for (var testCase of testCases) {
    testSelector(testCase[0], testCase[1]);
}
</script>
<script src="../../resources/js-test-post.js"></script>
</html>
