<!DOCTYPE html>
<meta charset=utf-8>
<title>cssom-view - elementScroll</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<style>
    #section {
        width: 300px;
        height: 500px;
        /*position: absolute;*/
        top: 16px;
        left: 16px;
        border: inset gray 3px;
        overflow: hidden;
        background: white;
    }

    #scrollable {
        width: 400px;
        height: 700px;
        background: linear-gradient(135deg, red, blue);
    }

</style>

<section id="section">
    <div id="scrollable"></div>
    <div id="unrelated"></div>
</section>

<script>
    setup({explicit_done:true});
    window.onload = function () {
        var section = document.getElementById("section");
        var unrelated = document.getElementById("unrelated");

        test(function () {
            assert_equals(section.scrollTop, 0, "initial scrollTop should be 0");
            assert_equals(section.scrollLeft, 0, "initial scrollLeft should be 0");

            section.scrollTop  = 30;
            section.scrollLeft = 40;

            assert_equals(section.scrollTop, 30, "changed scrollTop should be 40");
            assert_equals(section.scrollLeft, 40, "changed scrollLeft should be 40");
            assert_equals(unrelated.scrollTop, 0, "unrelated element should not scroll");
            assert_equals(unrelated.scrollLeft, 0, "unrelated element should not scroll");
        },  "Element scrollTop/Left getter/setter test");

        test(function () {
            section.scroll(50, 60);

            assert_equals(section.scrollLeft, 50, "changed scrollLeft should be 50");
            assert_equals(section.scrollTop, 60, "changed scrollTop should be 60");
        },  "Element scroll test (two arguments)");

        test(function () {
            section.scroll({left: 55, top: 65});

            assert_equals(section.scrollLeft, 55, "changed scrollLeft should be 55");
            assert_equals(section.scrollTop, 65, "changed scrollTop should be 65");

            section.scroll({left: 85});

            assert_equals(section.scrollLeft, 85, "changed scrollLeft should be 85");
            assert_equals(section.scrollTop, 65, "scrollTop should stay at 65");

            section.scroll({top: 75});

            assert_equals(section.scrollLeft, 85, "scrollLeft should stay at 85");
            assert_equals(section.scrollTop, 75, "changed scrollTop should be 75");

            section.scroll({});

            assert_equals(section.scrollLeft, 85, "scrollLeft should stay at 85");
            assert_equals(section.scrollTop, 75, "scrollTop should stay at 75");

            section.scroll();

            assert_equals(section.scrollLeft, 85, "scrollLeft should stay at 85");
            assert_equals(section.scrollTop, 75, "scrollTop should stay at 75");
        },  "Element scroll test (one argument)");

        test(function () {
            section.scrollTo(80, 70);

            assert_equals(section.scrollLeft, 80, "changed scrollLeft should be 70");
            assert_equals(section.scrollTop, 70, "changed scrollTop should be 80");
        }, "Element scrollTo test (two arguments)");

        test(function () {
            section.scrollTo({left: 75, top: 85});

            assert_equals(section.scrollLeft, 75, "changed scrollLeft should be 75");
            assert_equals(section.scrollTop, 85, "changed scrollTop should be 85");

            section.scrollTo({left: 65});

            assert_equals(section.scrollLeft, 65, "changed scrollLeft should be 65");
            assert_equals(section.scrollTop, 85, "scrollTop should stay at 85");

            section.scrollTo({top: 55});

            assert_equals(section.scrollLeft, 65, "scrollLeft should stay at 65");
            assert_equals(section.scrollTop, 55, "changed scrollTop should be 55");

            section.scrollTo({});

            assert_equals(section.scrollLeft, 65, "scrollLeft should stay at 65");
            assert_equals(section.scrollTop, 55, "scrollTop should stay at 55");

            section.scrollTo();

            assert_equals(section.scrollLeft, 65, "scrollLeft should stay at 55");
            assert_equals(section.scrollTop, 55, "scrollTop should stay at 55");
        },  "Element scrollTo test (one argument)");

        test(function () {
            var left = section.scrollLeft;
            var top = section.scrollTop;

            section.scrollBy(10, 20);

            assert_equals(section.scrollLeft, left + 10, "increment of scrollLeft should be 10")
            assert_equals(section.scrollTop, top + 20, "increment of scrollTop should be 20")
        }, "Element scrollBy test (two arguments)");

        test(function () {
            var left = section.scrollLeft;
            var top = section.scrollTop;

            section.scrollBy({left: 5, top: 15});
            left += 5
            top += 15

            assert_equals(section.scrollLeft, left, "increment of scrollLeft should be 5")
            assert_equals(section.scrollTop, top, "increment of scrollTop should be 15")

            section.scrollBy({left: -15});
            left -= 15

            assert_equals(section.scrollLeft, left, "decrement of scrollLeft should be 15")
            assert_equals(section.scrollTop, top, "scrollTop should not be modified")

            section.scrollBy({top: -5});
            top -= 5;

            assert_equals(section.scrollLeft, left, "scrollLeft should not be modified")
            assert_equals(section.scrollTop, top, "decrement of scrollTop should be 5")

            section.scrollBy({});

            assert_equals(section.scrollLeft, left, "scrollLeft should not be modified")
            assert_equals(section.scrollTop, top, "scrollTop should not be modified")

            section.scrollBy();

            assert_equals(section.scrollLeft, left, "scrollLeft should not be modified")
            assert_equals(section.scrollTop, top, "scrollTop should not be modified")
        }, "Element scrollBy test (one argument)");

        test(function () {
            section.scrollTop  = 1000;
            section.scrollLeft = 1000;

            assert_equals(section.scrollTop, 700 - 500, "changed scrollTop should be 200");
            assert_equals(section.scrollLeft, 400 - 300, "changed scrollLeft should be 100");

        }, "Element scroll maximum test");

        done();
    };
</script>
