<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

        <script src=../../media-file.js></script>
        <script src=../../video-test.js></script>
        <script>
            var region;
            var invalidPercentageValues;

            function startTest()
            {
                if (!window.VTTRegion) {
                    failTest();
                    return;
                }

                region = new VTTRegion();
                consoleWrite("** Test instanceof VTTRegion. **");
                testExpected("region instanceof VTTRegion", true);

                consoleWrite("** Test the default indexs of a region. **");
                testExpected("region.track", null);
                testExpected("region.scroll", "");
                testExpected("region.viewportAnchorX", 0);
                testExpected("region.viewportAnchorY", 100);
                testExpected("region.regionAnchorX", 0);
                testExpected("region.regionAnchorY", 100);
                testExpected("region.height", 3);
                testExpected("region.width", 100);

                consoleWrite("<br>** Test that incorrect mutation keeps previous valid values. **");
                run("region.scroll = 'invalid-scroll-value'");
                testExpected("region.scroll", "");

                invalidPercentageValues = [-1, 101, -Infinity, Infinity, NaN];
                for (index in invalidPercentageValues) {
                  consoleWrite("<br>Invalid percentage value: " + invalidPercentageValues[index]);
                  run("region.viewportAnchorX = invalidPercentageValues[index]");
                  testExpected("region.viewportAnchorX", 0);
                  run("region.viewportAnchorY = invalidPercentageValues[index]");
                  testExpected("region.viewportAnchorY", 100);
                  run("region.regionAnchorX = invalidPercentageValues[index]");
                  testExpected("region.regionAnchorX", 0);
                  run("region.regionAnchorY = invalidPercentageValues[index]");
                  testExpected("region.regionAnchorY", 100);
                  run("region.width = invalidPercentageValues[index]");
                  testExpected("region.width", 100);
                }

                run("region.height = -1");
                testExpected("region.height", 3);

                consoleWrite("<br>** Test that proper mutation keeps assigned value. **");
                run("region.height = 130");
                testExpected("region.height", 130);

                run("region.viewportAnchorX = 64");
                testExpected("region.viewportAnchorX", 64);
                run("region.viewportAnchorY = 32");
                testExpected("region.viewportAnchorY", 32);
                run("region.regionAnchorX = 16");
                testExpected("region.regionAnchorX", 16);
                run("region.regionAnchorY = 8");
                testExpected("region.regionAnchorY", 8);

                run("region.width = 42");
                testExpected("region.width", 42);

                endTest();
            }

        </script>
    </head>
    <body onload="startTest()">
        <p>Tests the constructor and mutation of VTTRegion.</p>
    </body>
</html>
