define([
        'Core/Cartesian3',
        'Core/HermiteSpline',
        'Core/Spline'
    ], function(
        Cartesian3,
        HermiteSpline,
        Spline) {
        'use strict';

describe('Core/Spline', function() {

    it('contructor throws', function() {
        expect(function() {
            return new Spline();
        }).toThrowDeveloperError();
    });

    it('wraps time that is out-of-bounds', function() {
        var spline = HermiteSpline.createNaturalCubic({
            points : [Cartesian3.ZERO, Cartesian3.UNIT_X, Cartesian3.UNIT_Y],
            times : [0.0, 1.0, 2.0]
        });

        expect(spline.wrapTime(-0.5)).toEqual(1.5);
        expect(spline.wrapTime(2.5)).toEqual(0.5);
    });

    it('clamps time that is out-of-bounds', function() {
        var spline = HermiteSpline.createNaturalCubic({
            points : [Cartesian3.ZERO, Cartesian3.UNIT_X, Cartesian3.UNIT_Y],
            times : [0.0, 1.0, 2.0]
        });

        expect(spline.clampTime(-0.5)).toEqual(0.0);
        expect(spline.clampTime(2.5)).toEqual(2.0);
    });

    it('wrapTime throws without a time', function() {
        var spline = HermiteSpline.createNaturalCubic({
            points : [Cartesian3.ZERO, Cartesian3.UNIT_X, Cartesian3.UNIT_Y],
            times : [0.0, 1.0, 2.0]
        });

        expect(function() {
            spline.wrapTime();
        }).toThrowDeveloperError();
    });

    it('clampTime throws without a time', function() {
        var spline = HermiteSpline.createNaturalCubic({
            points : [Cartesian3.ZERO, Cartesian3.UNIT_X, Cartesian3.UNIT_Y],
            times : [0.0, 1.0, 2.0]
        });

        expect(function() {
            spline.clampTime();
        }).toThrowDeveloperError();
    });

    it('findTimeInterval throws without a time', function() {
        var spline = HermiteSpline.createNaturalCubic({
            points : [Cartesian3.ZERO, Cartesian3.UNIT_X, Cartesian3.UNIT_Y],
            times : [0.0, 1.0, 2.0]
        });

        expect(function() {
            spline.findTimeInterval();
        }).toThrowDeveloperError();
    });

    it('findTimeInterval throws when time is out of range', function() {
        var spline = HermiteSpline.createNaturalCubic({
            points : [Cartesian3.ZERO, Cartesian3.UNIT_X, Cartesian3.UNIT_Y],
            times : [0.0, 1.0, 2.0]
        });

        expect(function() {
            spline.findTimeInterval(4.0);
        }).toThrowDeveloperError();
    });

    it('findTimeInterval', function() {
        var spline = HermiteSpline.createNaturalCubic({
            points : [Cartesian3.ZERO, Cartesian3.UNIT_X, Cartesian3.UNIT_Y, Cartesian3.UNIT_Z],
            times : [0.0, 1.0, 2.0, 4.0]
        });
        var times = spline.times;

        expect(spline.findTimeInterval(times[0])).toEqual(0);

        // jump forward
        expect(spline.findTimeInterval(times[1])).toEqual(1);

        // jump backward
        expect(spline.findTimeInterval(times[0], 1)).toEqual(0);

        // jump far forward
        expect(spline.findTimeInterval(times[times.length - 2], 0)).toEqual(times.length - 2);

        // jump far back
        expect(spline.findTimeInterval(times[0], times.length - 1)).toEqual(0);
    });
});
});
