defineSuite([ 'Core/EllipseOutlineGeometry', 'Core/arrayFill', 'Core/Cartesian3', 'Core/Ellipsoid', 'Core/GeometryOffsetAttribute', 'Specs/createPackableSpecs' ], function( EllipseOutlineGeometry, arrayFill, Cartesian3, Ellipsoid, GeometryOffsetAttribute, createPackableSpecs) { 'use strict'; it('throws without a center', function() { expect(function() { return new EllipseOutlineGeometry({ semiMajorAxis : 1.0, semiMinorAxis : 1.0 }); }).toThrowDeveloperError(); }); it('throws without a semiMajorAxis', function() { expect(function() { return new EllipseOutlineGeometry({ center : Cartesian3.fromDegrees(0,0), semiMinorAxis : 1.0 }); }).toThrowDeveloperError(); }); it('throws without a semiMinorAxis', function() { expect(function() { return new EllipseOutlineGeometry({ center : Cartesian3.fromDegrees(0,0), semiMajorAxis : 1.0 }); }).toThrowDeveloperError(); }); it('throws with a negative granularity', function() { expect(function() { return new EllipseOutlineGeometry({ center : Cartesian3.fromDegrees(0,0), semiMajorAxis : 1.0, semiMinorAxis : 1.0, granularity : -1.0 }); }).toThrowDeveloperError(); }); it('throws when semiMajorAxis is less than the semiMajorAxis', function() { expect(function() { return new EllipseOutlineGeometry({ center : Cartesian3.fromDegrees(0,0), semiMajorAxis : 1.0, semiMinorAxis : 2.0 }); }).toThrowDeveloperError(); }); it('computes positions', function() { var m = EllipseOutlineGeometry.createGeometry(new EllipseOutlineGeometry({ ellipsoid : Ellipsoid.WGS84, center : Cartesian3.fromDegrees(0,0), granularity : 0.1, semiMajorAxis : 1.0, semiMinorAxis : 1.0 })); expect(m.attributes.position.values.length).toEqual(8 * 3); expect(m.indices.length).toEqual(8 * 2); expect(m.boundingSphere.radius).toEqual(1); }); it('computes positions extruded', function() { var m = EllipseOutlineGeometry.createGeometry(new EllipseOutlineGeometry({ ellipsoid : Ellipsoid.WGS84, center : Cartesian3.fromDegrees(0,0), granularity : 0.1, semiMajorAxis : 1.0, semiMinorAxis : 1.0, extrudedHeight : 5.0 })); expect(m.attributes.position.values.length).toEqual(16 * 3); // 8 top + 8 bottom expect(m.indices.length).toEqual(24 * 2); // 8 top + 8 bottom + 8 sides }); it('computes offset attribute', function() { var m = EllipseOutlineGeometry.createGeometry(new EllipseOutlineGeometry({ ellipsoid : Ellipsoid.WGS84, center : Cartesian3.fromDegrees(0,0), granularity : 0.1, semiMajorAxis : 1.0, semiMinorAxis : 1.0, offsetAttribute: GeometryOffsetAttribute.TOP })); var numVertices = 8; expect(m.attributes.position.values.length).toEqual(numVertices * 3); var offset = m.attributes.applyOffset.values; expect(offset.length).toEqual(numVertices); var expected = new Array(offset.length); expected = arrayFill(expected, 1); expect(offset).toEqual(expected); }); it('computes offset attribute extruded for top vertices', function() { var m = EllipseOutlineGeometry.createGeometry(new EllipseOutlineGeometry({ ellipsoid : Ellipsoid.WGS84, center : Cartesian3.fromDegrees(0,0), granularity : 0.1, semiMajorAxis : 1.0, semiMinorAxis : 1.0, extrudedHeight : 5.0, offsetAttribute: GeometryOffsetAttribute.TOP })); var numVertices = 16; expect(m.attributes.position.values.length).toEqual(numVertices * 3); var offset = m.attributes.applyOffset.values; expect(offset.length).toEqual(numVertices); var expected = new Array(offset.length); expected = arrayFill(expected, 0); expected = arrayFill(expected, 1, 0, 8); expect(offset).toEqual(expected); }); it('computes offset attribute extruded for all vertices', function() { var m = EllipseOutlineGeometry.createGeometry(new EllipseOutlineGeometry({ ellipsoid : Ellipsoid.WGS84, center : Cartesian3.fromDegrees(0,0), granularity : 0.1, semiMajorAxis : 1.0, semiMinorAxis : 1.0, extrudedHeight : 5.0, offsetAttribute: GeometryOffsetAttribute.ALL })); var numVertices = 16; expect(m.attributes.position.values.length).toEqual(numVertices * 3); var offset = m.attributes.applyOffset.values; expect(offset.length).toEqual(numVertices); var expected = new Array(offset.length); expected = arrayFill(expected, 1); expect(offset).toEqual(expected); }); it('computes positions extruded, no lines drawn between top and bottom', function() { var m = EllipseOutlineGeometry.createGeometry(new EllipseOutlineGeometry({ ellipsoid : Ellipsoid.WGS84, center : Cartesian3.fromDegrees(0,0), granularity : 0.1, semiMajorAxis : 1.0, semiMinorAxis : 1.0, extrudedHeight : 5.0, numberOfVerticalLines : 0 })); expect(m.attributes.position.values.length).toEqual(16 * 3); expect(m.indices.length).toEqual(16 * 2); }); it('undefined is returned if the minor axis is equal to or less than zero', function() { var ellipseOutline0 = new EllipseOutlineGeometry({ center : Cartesian3.fromDegrees(-75.59777, 40.03883), semiMajorAxis : 300000.0, semiMinorAxis : 0.0 }); var ellipseOutline1 = new EllipseOutlineGeometry({ center : Cartesian3.fromDegrees(-75.59777, 40.03883), semiMajorAxis : 0.0, semiMinorAxis : -1.0 }); var ellipseOutline2 = new EllipseOutlineGeometry({ center : Cartesian3.fromDegrees(-75.59777, 40.03883), semiMajorAxis : 300000.0, semiMinorAxis : -10.0 }); var ellipseOutline3 = new EllipseOutlineGeometry({ center : Cartesian3.fromDegrees(-75.59777, 40.03883), semiMajorAxis : -1.0, semiMinorAxis : -2.0 }); var geometry0 = EllipseOutlineGeometry.createGeometry(ellipseOutline0); var geometry1 = EllipseOutlineGeometry.createGeometry(ellipseOutline1); var geometry2 = EllipseOutlineGeometry.createGeometry(ellipseOutline2); var geometry3 = EllipseOutlineGeometry.createGeometry(ellipseOutline3); expect(geometry0).toBeUndefined(); expect(geometry1).toBeUndefined(); expect(geometry2).toBeUndefined(); expect(geometry3).toBeUndefined(); }); var center = new Cartesian3(8, 9, 10); var ellipsoid = new Ellipsoid(11, 12, 13); var packableInstance = new EllipseOutlineGeometry({ ellipsoid : ellipsoid, center : center, granularity : 1, semiMinorAxis : 2, semiMajorAxis : 3, numberOfVerticalLines : 4, height : 5, rotation : 6, extrudedHeight : 7 }); var packedInstance = [center.x, center.y, center.z, ellipsoid.radii.x, ellipsoid.radii.y, ellipsoid.radii.z, 3, 2, 6, 7, 1, 5, 4, -1]; createPackableSpecs(EllipseOutlineGeometry, packableInstance, packedInstance, 'extruded'); //Because extrudedHeight is optional and has to be taken into account when packing, we have a second test without it. packableInstance = new EllipseOutlineGeometry({ ellipsoid : ellipsoid, center : center, granularity : 1, semiMinorAxis : 2, semiMajorAxis : 3, numberOfVerticalLines : 4, height : 5, rotation : 6 }); packedInstance = [center.x, center.y, center.z, ellipsoid.radii.x, ellipsoid.radii.y, ellipsoid.radii.z, 3, 2, 6, 5, 1, 5, 4, -1]; createPackableSpecs(EllipseOutlineGeometry, packableInstance, packedInstance, 'at height'); });