<!DOCTYPE html>
<html>
<head>
    <title>Geometry Interfaces: DOMRect and DOMRectReadOnly interface tests.</title>
    <link rel="author" title="Dirk Schulze" href="mailto:simon.fraser@apple.com" />
    <link rel="help" href="http://www.w3.org/TR/geometry-1/#DOMRect">
    <link rel="help" href="https://drafts.fxtf.org/geometry/#DOMRect">
    <script src="../resources/testharness.js"></script>
    <script src="../resources/testharnessreport.js"></script>
</head>
<body>
    <p>Test DOMRect and DOMRectReadOnly interfaces</p>
    <div id="log"></div>
    <script>
        test(function() {
            checkDOMRect(new DOMRectReadOnly(), { x:0, y:0, width:0, height:0 });
        },'testDOMRectReadOnlyConstructor0');
        test(function() {
            var x = 10;
            var y = 12;
            var width = 99;
            var height = 102;
            checkDOMRect(new DOMRectReadOnly(x, y, width, height), { x, y, width, height });
        },'testDOMRectReadOnlyConstructor4Args');
        test(function() {
            var x = 10;
            var y = 12;
            var width = 99;
            var height = 102;
            checkDOMRect(new DOMRectReadOnly(x), { x, y:0, width:0, height:0 });
        },'testDOMRectReadOnlyConstructor1Arg');
        test(function() {
            var x = 10;
            var y = 12;
            var width = 99;
            var height = 102;
            checkDOMRect(new DOMRectReadOnly(x, y), { x, y, width:0, height:0 });
        },'testDOMRectReadOnlyConstructor2Args');
        test(function() {
            var x = 10;
            var y = 12;
            var width = 99;
            var height = 102;
            checkDOMRect(new DOMRectReadOnly(x, y, width), { x, y, width, height:0 });
        },'testDOMRectReadOnlyConstructor3Args');
        test(function() {
            x = Math.PI;
            y = Math.SQRT2;
            width = Math.E;
            height = Math.LN10;
            checkDOMRect(new DOMRectReadOnly(x, y, width, height), { x, y, width, height });
        },'testDOMRectReadOnlyConstructorDoublePrecision');
        test(function() {
            var x = 10;
            var y = 12;
            var width = -99;
            var height = 102;
            checkDOMRect(new DOMRectReadOnly(x, y, width, height), { x, y, width, height });
        },'testDOMRectReadOnlyConstructorNegativeWidth');
        test(function() {
            var x = 10;
            var y = 12;
            var width = 99;
            var height = -102;
            checkDOMRect(new DOMRectReadOnly(x, y, width, height), { x, y, width, height });
        },'testDOMRectReadOnlyConstructorNegativeHeight');
        test(function() {
            var x = 1;
            var y = NaN;
            var width = NaN;
            var height = -200;
            checkDOMRect(new DOMRectReadOnly(x, y, width, height), { x, y, width, height });
        },'testDOMRectReadOnlyConstructorNaN1');
        test(function() {
            var x = NaN;
            var y = 2;
            var width = 99;
            var height = NaN;
            checkDOMRect(new DOMRectReadOnly(x, y, width, height), { x, y, width, height });
        },'testDOMRectReadOnlyConstructorNaN2');
        test(function() {
            var x = Infinity;
            var y = -102;
            var width = 304;
            var height = -Infinity;
            checkDOMRect(new DOMRectReadOnly(x, y, width, height), { x, y, width, height });
        },'testDOMRectReadOnlyConstructorInf1');
        test(function() {
            var x = 23;
            var y = -Infinity;
            var width = Infinity;
            var height = -99;
            checkDOMRect(new DOMRectReadOnly(x, y, width, height), { x, y, width, height });
        },'testDOMRectReadOnlyConstructorInf2');
        test(function() {
            var x = 10;
            var y = 12;
            var width = 99;
            var height = 102;
            var domRect = new DOMRectReadOnly(x, y, width, height);
            domRect.x = 1200;
            domRect.height = 300;
            checkDOMRect(domRect, { x, y, width, height });
        },'testDOMRectReadOnlyIsReadOnly');
        test(function() {
            var x = 10;
            var y = 12;
            var width = 99;
            var height = 102;
            checkDOMRect(DOMRectReadOnly.fromRect({ x, y, width, height }), { x, y, width, height });
        },'testDOMRectReadOnlyFromRect');
        test(function() {
            assert_true(DOMRectReadOnly.fromRect({ x:11, y:22, width:33, height:44 }) instanceof DOMRectReadOnly)
        },'testFromRectReturnsDOMRectReadOnly');
        test(function() {
            var x = 10;
            var width = 99;
            checkDOMRect(DOMRectReadOnly.fromRect({ x, width }), { x, y:0, width, height:0 });
        },'testDOMRectReadOnlyFromRectPartial');
        test(function() {
            var x = 10;
            var y = 12;
            var width = 99;
            var height = -102;
            checkDOMRect(DOMRectReadOnly.fromRect({ x, y, width, height }).toJSON(), { x, y, width, height });
        },'testDOMRectReadOnlySerialization');

        test(function() {
            var x = 10;
            var y = 12;
            var width = 99;
            var height = 102;
            checkDOMRect(new DOMRect(x, y, width, height), { x, y, width, height });
        },'testDOMRectConstructor0');
        test(function() {
            var x = 10;
            var y = 12;
            var width = 99;
            var height = 102;
            var domRect = new DOMRect(x, y, width, height);
            domRect.x = 1200;
            domRect.height = 300;
            checkDOMRect(domRect, { x:1200, y, width, height:300 });
        },'testDOMRectIsWritable');
        test(function() {
            var x = 10;
            var y = 12;
            var width = 99;
            var height = 102;
            var domRect = new DOMRect(x, y, width, height);
            domRect.x = NaN;
            domRect.height = NaN;
            checkDOMRect(domRect, { x:NaN, y:12, width:99, height:NaN });
        },'testDOMRectIsWritableWithNaN');
        test(function() {
            assert_true(DOMRect.fromRect({ x:11, y:22, width:33, height:44 }) instanceof DOMRect)
        },'testFromRectReturnsDOMRect');
        test(function() {
            var x = 10;
            var y = 12;
            var width = 99;
            var height = 102;
            checkDOMRect(DOMRect.fromRect({ x, y, width, height }), { x, y, width, height });
        },'testDOMRectFromRect');
        test(function() {
            var x = 10;
            var y = 12;
            var width = 99;
            var height = -102;
            checkDOMRect(DOMRect.fromRect({ x, y, width, height }).toJSON(), { x, y, width, height });
        },'testDOMRectSerialization');

        function checkDOMRect(r, exp) {
            assert_equals(r.x, exp.x, "Expected value for x is " + exp.x);
            assert_equals(r.y, exp.y, "Expected value for y is " + exp.y);
            assert_equals(r.width, exp.width, "Expected value for width is " + exp.width);
            assert_equals(r.height, exp.height, "Expected value for height is " + exp.height);

            assert_equals(r.left, Math.min(exp.x, exp.x + exp.width), "Expected value for left is " + Math.min(exp.x, exp.x + exp.width));
            assert_equals(r.right, Math.max(exp.x, exp.x + exp.width), "Expected value for right is " + Math.max(exp.x, exp.x + exp.width));
            assert_equals(r.top, Math.min(exp.y, exp.y + exp.height), "Expected value for top is " + Math.min(exp.y, exp.y + exp.height));
            assert_equals(r.bottom, Math.max(exp.y, exp.y + exp.height), "Expected value for bottom is " + Math.max(exp.y, exp.y + exp.height));
        }
    </script>
</body>
</html>
