/* global module, asyncTest, $, ok, equal, notEqual, start, test, Util, testLog, propEqual, console */

(function () {

    var originalNow;
    var now;

    module("spring", {
        setup: function () {
            now = 0;
            originalNow = OpenSeadragon.now;

            OpenSeadragon.now = function() {
                return now;
            };
        },
        teardown: function () {
            OpenSeadragon.now = originalNow;
        }
    });

    asyncTest('regular spring', function() {
        var spring = new OpenSeadragon.Spring({
            initial: 5,
            animationTime: 1,
            springStiffness: 0.000001
        });

        equal(spring.current.value, 5, 'initial current value');
        equal(spring.target.value, 5, 'initial target value');

        spring.springTo(6);
        equal(spring.current.value, 5, 'current value after springTo');
        equal(spring.target.value, 6, 'target value after springTo');

        now = 500;
        spring.update();
        Util.assessNumericValue(5.5, spring.current.value, 0.00001, 'current value after first update');
        equal(spring.target.value, 6, 'target value after first update');

        now = 1000;
        spring.update();
        equal(spring.current.value, 6, 'current value after second update');
        equal(spring.target.value, 6, 'target value after second update');

        start();
    });

    asyncTest('exponential spring', function() {
        var spring = new OpenSeadragon.Spring({
            exponential: true,
            initial: 1,
            animationTime: 1,
            springStiffness: 0.000001
        });

        equal(spring.current.value, 1, 'initial current value');
        equal(spring.target.value, 1, 'initial target value');

        spring.springTo(2);
        equal(spring.current.value, 1, 'current value after springTo');
        equal(spring.target.value, 2, 'target value after springTo');

        now = 500;
        spring.update();
        Util.assessNumericValue(1.41421, spring.current.value, 0.00001, 'current value after first update');
        equal(spring.target.value, 2, 'target value after first update');

        now = 1000;
        spring.update();
        equal(spring.current.value, 2, 'current value after second update');
        equal(spring.target.value, 2, 'target value after second update');

        start();
    });

})();