<!DOCTYPE html>
<html>
<head>
<script src="../../../resources/js-test.js"></script>
<script src="../../../resources/ui-helper.js"></script>
</head>
<body>
<!-- Place the test container above the console output to avoid the need to compensate for page scroll. -->
<div id="test-container">
    <p><input type="color" class="test" data-test-name="color"></p>
    <p><input type="date" class="test" data-test-name="date" value="2019-03-26"></p>
    <p><input type="datetime-local" class="test" data-test-name="datetime-local" value="2019-03-26T14:28:05.455"></p>
    <p><input type="month" class="test" data-test-name="month" value="2019-03"></p>
    <p><select class="test" data-test-name="select">
        <option>First</option>
        <option>Second</option>
    </select></p>
    <p><input type="time" class="test" data-test-name="time" value="14:28"></p>
</div>
<p id="description"></p>
<div id="console"></div>
<script>
window.jsTestIsAsync = true;

let elementToTest;

const modifierDisplayNameMap = {
    "altKey": "Option",
    "ctrlKey": "Control",
    "metaKey": "Command",
    "shiftKey": "Shift",
    "capsLockKey": "Caps Lock",
}

class KeyCommand {
    constructor(key, modifiers = [])
    {
        this.key = key;
        this.modifiers = modifiers;
    }

    toString()
    {
        let readableCommand = this.modifiers.map((modifier) => modifierDisplayNameMap[modifier]);
        readableCommand.push(this.key);
        return readableCommand.join(" + ");
    }
}

function done()
{
    let testContainer = document.getElementById("test-container");
    document.body.removeChild(testContainer);
    finishJSTest()
}

async function runTest()
{
    if (!window.testRunner) {
        testFailed("Must be run in WebKitTestRunner.");
        done();
        return;
    }

    let elementsToTest = document.getElementsByClassName("test");
    for (let keyCommand of [new KeyCommand("escape"), new KeyCommand(".", ["metaKey"])]) {
        debug(`<br>Dismiss by pressing ${keyCommand}:`);
        for (elementToTest of elementsToTest) {
            debug(`<br>For ${elementToTest.dataset.testName}:`);
            let expectedValue = elementToTest.value;
            await UIHelper.activateElementAndWaitForInputSession(elementToTest);
            UIHelper.keyDown(keyCommand.key, keyCommand.modifiers);
            await UIHelper.waitForKeyboardToHide();
            shouldBeEqualToString("elementToTest.value", expectedValue);
        }
    }
    elementToTest = null;
    done();
}

description("Tests that pressing the Escape key or Command + . dismisses a picker without causing a value change.");

runTest();
</script>
</body>
</html>
