<!DOCTYPE html>
<html>
<head>
    <title>Geometry Interfaces: DOMQuad interface tests</title>
    <link rel="author" title="Hwanseung Lee" href="mailto:hs1217.lee@samsung.com" />
    <link rel="help" href="https://drafts.fxtf.org/geometry-1/#DOMQuad">
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
</head>
<body>
    <p>Test DOMQuad interface</p>
    <div id="log"></div>
    <script>

        function init() {
            var initial = {
                p1: { x: 0, y: 0, z: 0, w: 1 },
                p2: { x: 0, y: 0, z: 0, w: 1 },
                p3: { x: 0, y: 0, z: 0, w: 1 },
                p4: { x: 0, y: 0, z: 0, w: 1 }
            };
            return initial;
        }

        test(function() {
            checkDOMQuad(new DOMQuad(), init());
        },'test Constructor no args');

        test(function() {
            checkDOMQuad(new DOMQuad(new DOMPoint()), init());
        },'test Constructor with one init DOMPoint arg');

        test(function() {
            checkDOMQuad(new DOMQuad(new DOMPoint(), new DOMPoint()), init());
        },'test Constructor with two init DOMPoint args');

        test(function() {
            checkDOMQuad(new DOMQuad(new DOMPoint(), new DOMPoint(), new DOMPoint()), init());
        },'test Constructor with three init DOMPoint args');

        test(function() {
            checkDOMQuad(new DOMQuad(new DOMPoint(), new DOMPoint(), new DOMPoint(), new DOMPoint()), init());
        },'test Constructor with four init DOMPoint args');

        test(function() {
            var exp = init();
            exp.p1 = { x: 1, y: 2, z: 3, w: 4 };
            checkDOMQuad(new DOMQuad(new DOMPoint(1, 2, 3, 4)), exp);
        },'test Constructor with one DOMPoint arg');

        test(function() {
            var exp = init();
            exp.p1 = { x: 1, y: 2, z: 3, w: 4 };
            exp.p2 = { x: 5, y: 6, z: 7, w: 8 };
            checkDOMQuad(new DOMQuad(new DOMPoint(1, 2, 3, 4), new DOMPoint(5, 6, 7, 8)), exp);
        },'test Constructor with two DOMPoint args');

        test(function() {
            var exp = init();
            exp.p1 = { x: 1, y: 2, z: 3, w: 4 };
            exp.p2 = { x: 5, y: 6, z: 7, w: 8 };
            exp.p3 = { x: 9, y: 10, z: 11, w: 12 };
            checkDOMQuad(new DOMQuad(new DOMPoint(1, 2, 3, 4), new DOMPoint(5, 6, 7, 8), new DOMPoint(9, 10, 11, 12)), exp);
        },'test Constructor with three DOMPoint args');

        test(function() {
            var exp = init();
            exp.p1 = { x: 1, y: 2, z: 3, w: 4 };
            exp.p2 = { x: 5, y: 6, z: 7, w: 8 };
            exp.p3 = { x: 9, y: 10, z: 11, w: 12 };
            exp.p4 = { x: 13, y: 14, z: 15, w: 16 };
            checkDOMQuad(new DOMQuad(new DOMPoint(1, 2, 3, 4), new DOMPoint(5, 6, 7, 8), new DOMPoint(9, 10, 11, 12), new DOMPoint(13, 14, 15, 16)), exp);
        },'test Constructor with four DOMPoint args');

        test(function() {
            assert_throws_js(TypeError, function() { new DOMQuad(1, 2, 3, 4); });
        },'test Constructor with invaild integer args');

        test(function() {
            assert_throws_js(TypeError, function() { new DOMQuad("1", "2", "3", "4"); });
        },'test Constructor with invaild string args');

        test(function() {
            assert_throws_js(TypeError, function() { new DOMQuad({}, {}, {}, NaN); });
        },'test Constructor with NaN');

        test(function() {
            var domQuad = DOMQuad.fromRect(new DOMRect(10, 20, 100, 200));
            var expQuad = init();
            expQuad.p1 = { x: 10, y: 20, z: 0, w: 1 };
            expQuad.p2 = { x: 110, y: 20, z: 0, w: 1 };
            expQuad.p3 = { x: 110, y: 220, z: 0, w: 1 };
            expQuad.p4 = { x: 10, y: 220, z: 0, w: 1 };
            checkDOMQuad(domQuad, expQuad);
        },'test fromRect');

        test(function() {
            var domQuad = DOMQuad.fromRect(new DOMRect(-Infinity, -Infinity, Infinity, Infinity));
            var expQuad = init();
            expQuad.p1 = { x: -Infinity, y: -Infinity, z: 0, w: 1 };
            expQuad.p2 = { x: NaN, y: -Infinity, z: 0, w: 1 };
            expQuad.p3 = { x: NaN, y: NaN, z: 0, w: 1 };
            expQuad.p4 = { x: -Infinity, y: NaN, z: 0, w: 1 };
            checkDOMQuad(domQuad, expQuad);
        },'test fromRect with Infinity');

        test(function() {
            var domQuad = DOMQuad.fromQuad(
                new DOMQuad(
                    new DOMPoint(1, 2, 3, 4),
                    new DOMPoint(5, 6, 7, 8),
                    new DOMPoint(9, 10, 11, 12),
                    new DOMPoint(13, 14, 15, 16)));
            var exp = init();
            exp.p1 = { x: 1, y: 2, z: 3, w: 4 };
            exp.p2 = { x: 5, y: 6, z: 7, w: 8 };
            exp.p3 = { x: 9, y: 10, z: 11, w: 12 };
            exp.p4 = { x: 13, y: 14, z: 15, w: 16 };
            checkDOMQuad(domQuad, exp);
        },'test fromQuad');

        test(function() {
            var domQuad = new DOMQuad();
            domQuad.p1 = new DOMPoint(1, 2, 3, 4);
            domQuad.p2 = new DOMPoint(1, 2, 3, 4);
            domQuad.p3 = new DOMPoint(1, 2, 3, 4);
            domQuad.p4 = new DOMPoint(1, 2, 3, 4);
            checkDOMQuad(domQuad, init());
        },'test p1, p2, p3, p4 are readonly');

        test(function() {
            var domQuad = DOMQuad.fromQuad(
                new DOMQuad(
                    new DOMPoint(10, 20, 0, 1),
                    new DOMPoint(110, 20, 0, 1),
                    new DOMPoint(110, 220, 0, 1),
                    new DOMPoint(10, 220, 10, 1)));
            var expBound = new DOMRect(10, 20, 100, 200);
            checkDOMRect(domQuad.getBounds(), expBound);
        },'test getBounds');

        function checkDOMQuad(actual, exp) {
            assert_equals(actual.p1.x, exp.p1.x, "p1.x is not matched");
            assert_equals(actual.p1.y, exp.p1.y, "p1.y is not matched");
            assert_equals(actual.p1.z, exp.p1.z, "p1.z is not matched");
            assert_equals(actual.p1.w, exp.p1.w, "p1.w is not matched");
            assert_equals(actual.p2.x, exp.p2.x, "p2.x is not matched");
            assert_equals(actual.p2.y, exp.p2.y, "p2.y is not matched");
            assert_equals(actual.p2.z, exp.p2.z, "p2.z is not matched");
            assert_equals(actual.p2.w, exp.p2.w, "p2.w is not matched");
            assert_equals(actual.p3.x, exp.p3.x, "p3.x is not matched");
            assert_equals(actual.p3.y, exp.p3.y, "p3.y is not matched");
            assert_equals(actual.p3.z, exp.p3.z, "p3.z is not matched");
            assert_equals(actual.p3.w, exp.p3.w, "p3.w is not matched");
            assert_equals(actual.p4.x, exp.p4.x, "p4.x is not matched");
            assert_equals(actual.p4.y, exp.p4.y, "p4.y is not matched");
            assert_equals(actual.p4.z, exp.p4.z, "p4.z is not matched");
            assert_equals(actual.p4.w, exp.p4.w, "p4.w is not matched");
        }

        function checkDOMRect(actual, exp) {
            assert_equals(actual.x, exp.x, "x is not matched");
            assert_equals(actual.y, exp.y, "y is not matched");
            assert_equals(actual.width, exp.width, "width is not matched");
            assert_equals(actual.height, exp.height, "height is not matched");
            assert_equals(actual.top, exp.top, "top is not matched");
            assert_equals(actual.left, exp.left, "left is not matched");
            assert_equals(actual.bottom, exp.bottom, "bottom is not matched");
            assert_equals(actual.right, exp.right, "right is not matched");
        }
    </script>
</body>
</html>
