text: import { arrayFill } from "../Source/Cesium.js";
  import { Cartesian3 } from "../Source/Cesium.js";
  import { EllipseOutlineGeometry } from "../Source/Cesium.js";
  import { Ellipsoid } from "../Source/Cesium.js";
  import { GeometryOffsetAttribute } from "../Source/Cesium.js";
  import createPackableSpecs from "../createPackableSpecs.js";
  
  describe("Core/EllipseOutlineGeometry", function () {
    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"
    );
  });
  