<!DOCTYPE html>
<html>
<head>
    <title>Geometry Interfaces: DOMQuad interface tests</title>
    <link rel="author" title="Dirk Schulze" href="mailto:dschulze@adobe.com" />
    <link rel="help" href="https://www.w3.org/TR/geometry-1/#dom-domquad-domquad">
    <link rel="help" href="https://www.w3.org/TR/geometry-1/#dom-domquad-p1">
    <link rel="help" href="https://www.w3.org/TR/geometry-1/#dom-domquad-p2">
    <link rel="help" href="https://www.w3.org/TR/geometry-1/#dom-domquad-p3">
    <link rel="help" href="https://www.w3.org/TR/geometry-1/#dom-domquad-p4">
    <link rel="help" href="https://www.w3.org/TR/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>
        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 },
            bounds: { x: 0, y: 0, width: 0, height: 0 }
        };

        checkDOMQuad(function() { return new DOMQuad(); }, initial, 'testConstructor0');

        test(function() {
            assert_throws_js(TypeError, function() { new DOMQuad(1); });
        },'testConstructor1');

        test(function() {
            assert_throws_js(TypeError, function() { new DOMQuad(1, 2); });
        },'testConstructor2');

        test(function() {
            assert_throws_js(TypeError, function() { new DOMQuad(1, 2, 3); });
        },'testConstructor3');

        test(function() {
            assert_throws_js(TypeError, function() { new DOMQuad(1, 2, 3, 4); });
        },'testConstructor4');

        checkDOMQuad(
                function() { return DOMQuad.fromRect(new DOMRect(10, 20, 100, 200)); },
                {   p1: { x: 10, y: 20, z: 0, w: 1 },
                    p2: { x: 110, y: 20, z: 0, w: 1 },
                    p3: { x: 110, y: 220, z: 0, w: 1 },
                    p4: { x: 10, y: 220, z: 0, w: 1 },
                    bounds: { x: 10, y: 20, width: 100, height: 200 } },
                'fromRect() method on DOMQuad');

        checkDOMQuad(
                function() { return DOMQuad.fromRect(new DOMRect(10, 20, -100, -200)) },
                {   p1: { x: 10, y: 20, z: 0, w: 1 },
                    p2: { x: -90, y: 20, z: 0, w: 1 },
                    p3: { x: -90, y: -180, z: 0, w: 1 },
                    p4: { x: 10, y: -180, z: 0, w: 1 },
                    bounds: { x: -90, y: -180, width: 100, height: 200 } },
                'fromRect() method on DOMQuad with negatives');

        checkDOMQuad(
                function() { return DOMQuad.fromRect(new DOMRect(-Infinity, -Infinity, Infinity, Infinity)) },
                {   p1: { x: -Infinity, y: -Infinity, z: 0, w: 1 },
                    p2: { x: NaN, y: -Infinity, z: 0, w: 1 },
                    p3: { x: NaN, y: NaN, z: 0, w: 1 },
                    p4: { x: -Infinity, y: NaN, z: 0, w: 1 },
                    bounds: { x: NaN, y: NaN, width: NaN, height: NaN } },
                'fromRect() method on DOMQuad with Infinity');

        checkDOMQuad(function() { return new DOMQuad(new DOMRect()); }, initial, 'testConstructor8');

        checkDOMQuad(function() { return new DOMQuad({}); }, initial, 'testConstructor9');

        checkDOMQuad(function() { return new DOMQuad({}, {}); }, initial, 'testConstructor10');

        checkDOMQuad(function() { return new DOMQuad({}, {}, {}); }, initial, 'testConstructor11');

        checkDOMQuad(function() { return new DOMQuad({}, {}, {}, {}); }, initial, 'testConstructor12');

        checkDOMQuad(function() { return new DOMQuad(null, undefined, {}, {}); }, initial, 'testConstructor13');

        checkDOMQuad(function() { return new DOMQuad({}, {}, {}, {}, NaN); }, initial, 'testConstructor14');

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

        checkDOMQuad(function() {
            return new DOMQuad({ y: 10 }, { x: 20 }, { z: 30 }, { x: 20, y: 10, z: 20, w: 10 });
        },
        {   p1: { x: 0, y: 10, z: 0, w: 1 },
            p2: { x: 20, y: 0, z: 0, w: 1 },
            p3: { x: 0, y: 0, z: 30, w: 1 },
            p4: { x: 20, y: 10, z: 20, w: 10 },
            bounds: { x: 0, y: 0, width: 20, height: 10 } },
        'testConstructor16');

        checkDOMQuad(function() {
            // p1 to p4 are readonly attributes.
            var q = new DOMQuad({}, {}, {}, {});
            q.p1 = new DOMPoint(2, 2);
            q.p2 = new DOMPoint(2, 2);
            q.p3 = new DOMPoint(2, 2);
            q.p4 = new DOMPoint(2, 2);
            return q;
        }, initial, 'p1Top4Attributes0');

        checkDOMQuad(function() {
            var q = new DOMQuad({}, {}, {}, {});
            q.p1.x = 2;
            q.p2.x = 2;
            q.p3.x = 2;
            q.p4.x = 2;
            return q;
        },
        {   p1: { x: 2, y: 0, z: 0, w: 1 },
            p2: { x: 2, y: 0, z: 0, w: 1 },
            p3: { x: 2, y: 0, z: 0, w: 1 },
            p4: { x: 2, y: 0, z: 0, w: 1 },
            bounds: { x: 2, y: 0, width: 0, height: 0 } },
        'p1Top4Attributes1');

        function checkDOMQuad(createQuad, exp, name) {
            test(function() {
                var q = createQuad();
                assert_equals(q.p1.x, exp.p1.x, "Expected value for p1.x is " + exp.p1.x);
                assert_equals(q.p1.y, exp.p1.y, "Expected value for p1.y is " + exp.p1.y);
                assert_equals(q.p1.z, exp.p1.z, "Expected value for p1.z is " + exp.p1.z);
                assert_equals(q.p1.w, exp.p1.w, "Expected value for p1.w is " + exp.p1.w);
                assert_equals(q.p2.x, exp.p2.x, "Expected value for p2.x is " + exp.p2.x);
                assert_equals(q.p2.y, exp.p2.y, "Expected value for p2.y is " + exp.p2.y);
                assert_equals(q.p2.z, exp.p2.z, "Expected value for p2.z is " + exp.p2.z);
                assert_equals(q.p2.w, exp.p2.w, "Expected value for p2.w is " + exp.p2.w);
                assert_equals(q.p3.x, exp.p3.x, "Expected value for p3.x is " + exp.p3.x);
                assert_equals(q.p3.y, exp.p3.y, "Expected value for p3.y is " + exp.p3.y);
                assert_equals(q.p3.z, exp.p3.z, "Expected value for p3.z is " + exp.p3.z);
                assert_equals(q.p3.w, exp.p3.w, "Expected value for p3.w is " + exp.p3.w);
                assert_equals(q.p4.x, exp.p4.x, "Expected value for p4.x is " + exp.p4.x);
                assert_equals(q.p4.y, exp.p4.y, "Expected value for p4.y is " + exp.p4.y);
                assert_equals(q.p4.z, exp.p4.z, "Expected value for p4.z is " + exp.p4.z);
                assert_equals(q.p4.w, exp.p4.w, "Expected value for p4.w is " + exp.p4.w);
            }, name + ": points");

            test(function() {
                var q = createQuad();
                assert_equals(q.getBounds().x, exp.bounds.x, "Expected value for getBounds().x is " + exp.bounds.x);
                assert_equals(q.getBounds().y, exp.bounds.y, "Expected value for getBounds().y is " + exp.bounds.y);
                assert_equals(q.getBounds().width, exp.bounds.width, "Expected value for getBounds().width is " + exp.bounds.width);
                assert_equals(q.getBounds().height, exp.bounds.height, "Expected value for getBounds().height is " + exp.bounds.height);
            }, name + ": bounds");
        }
    </script>
</body>
</html>
