<!DOCTYPE html>
<html>
<head>
<title>Shorthand animation name ordering test</title>
<style>
#box {
    position: relative;
    height: 100px;
    width: 100px;
    background-color: red;
    margin: 5px;
}

@-webkit-keyframes test {
    from { left: 0px; }
    to { left: 100px; }
}

@-webkit-keyframes backwards {
    from { left: 0px; }
    to { left: 100px; }
}

@-webkit-keyframes alternate {
    from { left: 0px; }
    to { left: 100px; }
}

@-webkit-keyframes linear {
    from { left: 0px; }
    to { left: 100px; }
}

@-webkit-keyframes ease {
    from { left: 0px; }
    to { left: 100px; }
}
</style>
<script>

const PROPERTIES_TO_TEST = [
    "webkitAnimationName",
    "webkitAnimationDuration",
    "webkitAnimationTimingFunction",
    "webkitAnimationDelay",
    "webkitAnimationIterationCount",
    "webkitAnimationDirection",
    "webkitAnimationFillMode"
];

const DEFAULT_VALUES = [
    "none",
    "0",
    "ease",
    "0",
    "1",
    "normal",
    "none"
];

const TEST_INPUTS = [
    "test 3s",
    "3s test",  // name is not first
    "3s test forwards",  // includes fill mode
    "3s forwards test",  // fill mode will match before name
    "3s linear forwards test", // both timing and fill mode will match first
    "3s forwards test linear", // name in between two keywords
    "3s 4s 5 forwards linear test", // name coming last
    "3s 4s infinite alternate forwards linear test", // all keywords before name
    "3s 4s infinite alternate none linear test", // none keyword for fill mode before none keyword for name
    "3s 4s infinite alternate forwards ease linear", // a special case where the 'linear' animation name will actually work because the timing function already parsed
];

const EXPECTED_VALUES = [
    ["test", "3s", "ease", "0s", "1", "normal", "none"],
    ["test", "3s", "ease", "0s", "1", "normal", "none"],
    ["test", "3s", "ease", "0s", "1", "normal", "forwards"],
    ["test", "3s", "ease", "0s", "1", "normal", "forwards"],
    ["test", "3s", "linear", "0s", "1", "normal", "forwards"],
    ["test", "3s", "linear", "0s", "1", "normal", "forwards"],
    ["test", "3s", "linear", "4s", "5", "normal", "forwards"],
    ["test", "3s", "linear", "4s", "infinite", "alternate", "forwards"],
    ["test", "3s", "linear", "4s", "infinite", "alternate", "none"],
    ["linear", "3s", "ease", "4s", "infinite", "alternate", "forwards"],
];

var numTestsComplete = 0;

function runTests() {
    runIndividualTest(0);
}

function clearElementAnimationStyle(element) {
    for (var i=0; i < PROPERTIES_TO_TEST.length; i++)
        element.style[PROPERTIES_TO_TEST[i]] = DEFAULT_VALUES[i];
}

function runIndividualTest(testIndex) {
    var result = document.getElementById("result");
    var element = document.getElementById("box");

    clearElementAnimationStyle(element);

    // Unfortunately need to force a style recalculation before testing.
    setTimeout(function () {
        element.style.webkitAnimation = TEST_INPUTS[testIndex];

        // And another forced style recalculation.
        setTimeout(function() {
            var computedStyle = window.getComputedStyle(element);

            for (var i=0; i < PROPERTIES_TO_TEST.length; i++) {
                var value = computedStyle[PROPERTIES_TO_TEST[i]];
                if (value == EXPECTED_VALUES[testIndex][i])
                    result.innerHTML += "PASS Test " + (numTestsComplete + 1) + ": " + PROPERTIES_TO_TEST[i] + " was " + value + "<br>";
                else
                    result.innerHTML += "FAIL Test " + (numTestsComplete + 1) + ": " + PROPERTIES_TO_TEST[i] + " was " + value + " should be " + EXPECTED_VALUES[testIndex][i] + "<br>";
            }

            numTestsComplete++;
            if (numTestsComplete < TEST_INPUTS.length)
                runIndividualTest(numTestsComplete);
            else {
                if (window.testRunner)
                    testRunner.notifyDone();
            }
        }, 0);
    }, 0);
}

if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
}

window.addEventListener("load", runTests, false);
</script>
</head>
<body>
<div id="box"></div>
<div id="result"></div>
</body>
</html>
