<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../../resources/accessibility-helper.js"></script>
<script src="../../resources/js-test.js"></script>
</head>
<body>

<input id="date-input" type="date" value="2022-11-21" />

<script>
var output = "Tests that subfield values update correctly for date inputs.\n\n";

function keyDown(key, repeat = 1) {
    for (let i = 0; i < repeat; i++)
        eventSender.keyDown(key);
}

if (window.accessibilityController) {
    window.jsTestIsAsync = true;
    const dateInput = document.getElementById("date-input");
    var axDateInput = accessibilityController.accessibleElementById("date-input");

    function getAndLogSubfields(axElement) {
        let subfields = axElement.childAtIndex(0).childAtIndex(0).children;
        subfields.forEach((child) => {
            output += `${child.description} ${child.role} ${child.stringValue}\n`;
        });
        return subfields;
    }

    output += "Original subfield values:\n";
    var subfields = getAndLogSubfields(axDateInput);

    setTimeout(async () => {
        output += "\nFocus date element and press up arrow to increment the month field:\n";
        dateInput.focus();
        keyDown("upArrow");
        output += await expectAsync("subfields[0].intValue", "12");

        output += "\nPress down arrow twice to decrement the month field.\n";
        keyDown("downArrow", 2);
        output += await expectAsync("subfields[0].intValue", "10");

        output += "\nPress the tab key to move to the day field in the date input.\n";
        keyDown("\t");
        output += await expectAsync("subfields[2].intValue", "21");

        output += "\nType 10 in the day subfield.\n";
        keyDown("1");
        keyDown("0")
        output += await expectAsync("subfields[2].intValue", "10");

        output += "\nPress down arrow to decrement the day field.\n";
        keyDown("downArrow");
        output += await expectAsync("subfields[2].intValue", "9");

        output += "\nPress up arrow twice to increment the day field.\n";
        keyDown("upArrow", 2);
        output += await expectAsync("subfields[2].intValue", "11");

        output += "\nPress tab to move to the year field in the date input.\n";
        keyDown("\t");
        output += await expectAsync("subfields[4].intValue", "2022");

        output+= "\nPress down arrow 10 times to decrement the year field.\n";
        keyDown("downArrow", 10);
        output += await expectAsync("subfields[4].intValue", "2012");

        output += "\nPress up arrow to increment the year field.\n";
        keyDown("upArrow");
        output += await expectAsync("subfields[4].intValue", "2013");

        output += "\nSet the date via JavaScript.\n";
        dateInput.value = "2023-12-31";
        await waitFor(() => {
            var dateObject = axDateInput.childAtIndex(0).childAtIndex(0);
            return dateObject.childrenCount >= 5 ? !!dateObject.children[4] : null;
        });

        output += await expectAsync("axDateInput.childAtIndex(0).childAtIndex(0).children[4].intValue", "2023");
        getAndLogSubfields(axDateInput);

        debug(output);
        finishJSTest();
    });
}
</script>
</body>
</html>
