/*global defineSuite*/
defineSuite([
        'Core/GeographicProjection',
        'Core/Cartesian3',
        'Core/Cartographic',
        'Core/Ellipsoid',
        'Core/Math'
    ], function(
        GeographicProjection,
        Cartesian3,
        Cartographic,
        Ellipsoid,
        CesiumMath) {
    "use strict";

    it('construct0', function() {
        var projection = new GeographicProjection();
        expect(projection.ellipsoid).toEqual(Ellipsoid.WGS84);
    });

    it('construct1', function() {
        var ellipsoid = Ellipsoid.UNIT_SPHERE;
        var projection = new GeographicProjection(ellipsoid);
        expect(projection.ellipsoid).toEqual(ellipsoid);
    });

    it('project0', function() {
        var height = 10.0;
        var cartographic = new Cartographic(0.0, 0.0, height);
        var projection = new GeographicProjection();
        expect(projection.project(cartographic)).toEqual(new Cartesian3(0.0, 0.0, height));
    });

    it('project1', function() {
        var ellipsoid = Ellipsoid.WGS84;
        var cartographic = new Cartographic(Math.PI, CesiumMath.PI_OVER_TWO, 0.0);
        var expected = new Cartesian3(Math.PI * ellipsoid.radii.x, CesiumMath.PI_OVER_TWO * ellipsoid.radii.x, 0.0);
        var projection = new GeographicProjection(ellipsoid);
        expect(projection.project(cartographic)).toEqual(expected);
    });

    it('project2', function() {
        var ellipsoid = Ellipsoid.UNIT_SPHERE;
        var cartographic = new Cartographic(-Math.PI, CesiumMath.PI_OVER_TWO, 0.0);
        var expected = new Cartesian3(-Math.PI, CesiumMath.PI_OVER_TWO, 0.0);
        var projection = new GeographicProjection(ellipsoid);
        expect(projection.project(cartographic)).toEqual(expected);
    });

    it('project3', function() {
        var ellipsoid = Ellipsoid.WGS84;
        var cartographic = new Cartographic(Math.PI, CesiumMath.PI_OVER_TWO, 0.0);
        var expected = new Cartesian3(Math.PI * ellipsoid.radii.x, CesiumMath.PI_OVER_TWO * ellipsoid.radii.x, 0.0);
        var projection = new GeographicProjection(ellipsoid);
        var result = new Cartesian3(0.0, 0.0, 0.0);
        var returnValue = projection.project(cartographic, result);
        expect(result).toEqual(returnValue);
        expect(result).toEqual(expected);
    });

    it('unproject0', function() {
        var cartographic = new Cartographic(CesiumMath.PI_OVER_TWO, CesiumMath.PI_OVER_FOUR, 12.0);
        var projection = new GeographicProjection();
        var projected = projection.project(cartographic);
        expect(projection.unproject(projected)).toEqual(cartographic);
    });

    it('unproject1', function() {
        var cartographic = new Cartographic(CesiumMath.PI_OVER_TWO, CesiumMath.PI_OVER_FOUR, 12.0);
        var projection = new GeographicProjection();
        var projected = projection.project(cartographic);
        var result = new Cartographic(0.0, 0.0, 0.0);
        var returnValue = projection.unproject(projected, result);
        expect(result).toEqual(returnValue);
        expect(result).toEqual(cartographic);
    });

    it('project throws without cartesian', function() {
        var projection = new GeographicProjection();
        expect(function() {
            return projection.unproject();
        }).toThrowDeveloperError();
    });
});
