<!DOCTYPE html>

<html>
<head>
    <script src="../../../../resources/js-test-pre.js"></script>
    <style>
        body {
            margin: none;
        }
    </style>
    <meta name="viewport" content="initial-scale=1">
</head>
<body>
    <p id="description"></p>
    <div id="console">
    </div>
    <script>
        description("Test that a moving Apple Pencil provides stylus information.");
        window.jsTestIsAsync = true;

        function getUIScript(x, y)
        {
            return `
            (function() {
                uiController.stylusDownAtPoint(${x}, ${y}, 2, 1, 0.5, function () {});
                uiController.stylusMoveToPoint(${x + 1}, ${y + 1}, 2.1, 1.1, 0.6, function () {});
                uiController.stylusUpAtPoint(${x + 10}, ${y + 10}, function () {});
            })();`
        }

        function runTest()
        {
            window.addEventListener("touchstart", (event) => {
                debug("touchstart fired.");
                shouldBe("event.touches.length", "1");
                shouldBe("event.touches[0].touchType", "'stylus'");
                shouldBeCloseTo("event.touches[0].altitudeAngle", 1, 0.01);
                shouldBeCloseTo("event.touches[0].azimuthAngle", 2, 0.01);
                shouldBeCloseTo("event.touches[0].force", 0.5, 0.01);
            });

            window.addEventListener("touchmove", (event) => {
                debug("touchmove fired.");
                shouldBe("event.touches.length", "1");
                shouldBe("event.touches[0].touchType", "'stylus'");
                shouldBeCloseTo("event.touches[0].altitudeAngle", 1.1, 0.01);
                shouldBeCloseTo("event.touches[0].azimuthAngle", 2.1, 0.01);
                shouldBeCloseTo("event.touches[0].force", 0.6, 0.01);
            });

            window.addEventListener("touchend", (event) => {
                debug("touchend fired.");
                finishJSTest();
            });

            if (window.testRunner)
                testRunner.runUIScript(getUIScript(50, 200), function(result) { });
        }

        window.addEventListener("load", runTest, false);
    </script>
    <script src="../../../../resources/js-test-post.js"></script>
</body>
</html>
