<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
    <link rel="stylesheet" href="../../js/resources/js-test-style.css">
    <script src="../../js/resources/js-test-pre.js"></script>
</head>
<body>
<p id="description"></p>
<div id="console"></div>
<script language="JavaScript" type="text/javascript">
    var resetWidth;
    var resetHeight;
    var resetX;
    var resetY;

    var width = 100;
    var height = 200;
    var x = 25;
    var y = 50;

    function reset()
    {
        window.moveTo(0, 0);
        window.resizeTo(300, 200);
        resetWidth = window.outerWidth;
        resetHeight = window.outerHeight;
        resetX = window.screenX;
        resetY = window.screenY;
    }

    if (window.layoutTestController)
        layoutTestController.dumpAsText();

    reset();

    description("This test makes sure that we don't allow calling the window moving and resizing\
    methods with less than 2 arguments and that we do allow calling them with more.");

    // resizeTo /////////////////////////
    debug('');
    debug('window.resizeTo Tests');
    debug('');

    debug("Testing - resizeTo with 0 arguments");
    window.resizeTo();
    shouldBe('window.outerWidth', 'resetWidth');
    shouldBe('window.outerHeight', 'resetHeight');
    reset();

    debug("Testing - resizeTo with 1 argument");
    window.resizeTo(x);
    shouldBe('window.outerWidth', 'resetWidth');
    shouldBe('window.outerHeight', 'resetHeight');
    reset();

    debug("Testing - resizeTo with more than 2 arguments");
    window.resizeTo(width, height, 200, "text");
    shouldBe('window.outerWidth', 'width');
    shouldBe('window.outerHeight', 'height');
    reset();

    // resizeBy /////////////////////////
    debug('');
    debug('window.resizeBy Tests');
    debug('');

    debug("Testing - resizeBy with 0 arguments");
    window.resizeBy();
    shouldBe('window.outerWidth', 'resetWidth');
    shouldBe('window.outerHeight', 'resetHeight');
    reset();

    debug("Testing - resizeBy with 1 argument");
    window.resizeBy(x);
    shouldBe('window.outerWidth', 'resetWidth');
    shouldBe('window.outerHeight', 'resetHeight');
    reset();

    debug("Testing - resizeBy with more than 2 arguments");
    window.resizeBy(x, y, 200, "text");
    shouldBe('window.outerWidth', 'resetWidth + x');
    shouldBe('window.outerHeight', 'resetHeight + y');
    reset();


    // moveTo /////////////////////////
    debug('');
    debug('window.moveTo Tests');
    debug('');

    debug("Testing - moveTo with 0 arguments");
    window.moveTo();
    shouldBe('window.screenX', 'resetX');
    shouldBe('window.screenY', 'resetY');
    reset();

    debug("Testing - moveTo with 1 argument");
    window.moveTo(x);
    shouldBe('window.screenX', 'resetX');
    shouldBe('window.screenY', 'resetY');
    reset();

    debug("Testing - moveTo with more than 2 arguments");
    window.moveTo(x, y, 200, "text");
    shouldBe('window.screenX', 'x + screen.availLeft');
    shouldBe('window.screenY', 'y + screen.availTop');
    reset();



    // moveBy /////////////////////////
    debug('');
    debug('window.moveBy Tests');
    debug('');

    debug("Testing - moveBy with 0 arguments");
    window.moveBy();
    shouldBe('window.screenX', 'resetX');
    shouldBe('window.screenY', 'resetY');
    reset();

    debug("Testing - moveBy with 1 argument");
    window.moveBy(x);
    shouldBe('window.screenX', 'resetX');
    shouldBe('window.screenY', 'resetY');
    reset();

    debug("Testing - moveBy with more than 2 arguments");
    window.moveBy(x, y, 200, "text");
    shouldBe('window.screenX', 'resetX + x');
    shouldBe('window.screenY', 'resetY + y');
 
    var successfullyParsed = true;
</script>
<script src="../../js/resources/js-test-post.js"></script>
</body>
</html>
