You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

581 lines
19 KiB
JavaScript

import { ApproximateTerrainHeights } from "../../Source/Cesium.js";
import { BoundingSphere } from "../../Source/Cesium.js";
import { Cartesian3 } from "../../Source/Cesium.js";
import { Iso8601 } from "../../Source/Cesium.js";
import { BoundingSphereState } from "../../Source/Cesium.js";
import { DataSourceCollection } from "../../Source/Cesium.js";
import { DataSourceDisplay } from "../../Source/Cesium.js";
import { Entity } from "../../Source/Cesium.js";
import { GroundPolylinePrimitive } from "../../Source/Cesium.js";
import { GroundPrimitive } from "../../Source/Cesium.js";
import createScene from "../createScene.js";
import MockDataSource from "../MockDataSource.js";
import { when } from "../../Source/Cesium.js";
describe(
"DataSources/DataSourceDisplay",
function () {
var dataSourceCollection;
var scene;
var display;
beforeAll(function () {
scene = createScene();
dataSourceCollection = new DataSourceCollection();
return when.join(
GroundPrimitive.initializeTerrainHeights(),
GroundPolylinePrimitive.initializeTerrainHeights()
);
});
afterAll(function () {
scene.destroyForSpecs();
// Leave ground primitive uninitialized
ApproximateTerrainHeights._initPromise = undefined;
ApproximateTerrainHeights._terrainHeights = undefined;
});
afterEach(function () {
if (!display.isDestroyed()) {
display.destroy();
}
dataSourceCollection.removeAll();
});
function MockVisualizer() {
this.updatesCalled = 0;
this.lastUpdateTime = undefined;
this.destroyed = false;
this.getBoundingSphereResult = undefined;
this.getBoundingSphereState = undefined;
}
MockVisualizer.prototype.update = function (time) {
this.lastUpdateTime = time;
this.updatesCalled++;
return true;
};
MockVisualizer.prototype.getBoundingSphere = function (entity, result) {
this.getBoundingSphereResult.clone(result);
return this.getBoundingSphereState;
};
MockVisualizer.prototype.isDestroyed = function () {
return this.destroyed;
};
MockVisualizer.prototype.destroy = function () {
this.destroyed = true;
};
function visualizersCallback() {
return [new MockVisualizer()];
}
it("constructor sets expected values", function () {
display = new DataSourceDisplay({
scene: scene,
dataSourceCollection: dataSourceCollection,
visualizersCallback: visualizersCallback,
});
expect(display.scene).toBe(scene);
expect(display.dataSources).toBe(dataSourceCollection);
expect(display.isDestroyed()).toEqual(false);
expect(display.defaultDataSource).toBeDefined();
display.destroy();
});
it("Computes complete bounding sphere.", function () {
var visualizer1 = new MockVisualizer();
visualizer1.getBoundingSphereResult = new BoundingSphere(
new Cartesian3(1, 2, 3),
456
);
visualizer1.getBoundingSphereState = BoundingSphereState.DONE;
var visualizer2 = new MockVisualizer();
visualizer2.getBoundingSphereResult = new BoundingSphere(
new Cartesian3(7, 8, 9),
1011
);
visualizer2.getBoundingSphereState = BoundingSphereState.DONE;
display = new DataSourceDisplay({
scene: scene,
dataSourceCollection: dataSourceCollection,
visualizersCallback: function () {
return [visualizer1, visualizer2];
},
});
var entity = new Entity();
var dataSource = new MockDataSource();
dataSource.entities.add(entity);
display.dataSources.add(dataSource);
display.update(Iso8601.MINIMUM_VALUE);
var result = new BoundingSphere();
var state = display.getBoundingSphere(entity, true, result);
var expected = BoundingSphere.union(
visualizer1.getBoundingSphereResult,
visualizer2.getBoundingSphereResult
);
expect(state).toBe(BoundingSphereState.DONE);
expect(result).toEqual(expected);
});
it("Computes partial bounding sphere.", function () {
var visualizer1 = new MockVisualizer();
visualizer1.getBoundingSphereResult = new BoundingSphere(
new Cartesian3(1, 2, 3),
456
);
visualizer1.getBoundingSphereState = BoundingSphereState.PENDING;
var visualizer2 = new MockVisualizer();
visualizer2.getBoundingSphereResult = new BoundingSphere(
new Cartesian3(7, 8, 9),
1011
);
visualizer2.getBoundingSphereState = BoundingSphereState.DONE;
display = new DataSourceDisplay({
scene: scene,
dataSourceCollection: dataSourceCollection,
visualizersCallback: function () {
return [visualizer1, visualizer2];
},
});
var entity = new Entity();
var dataSource = new MockDataSource();
dataSource.entities.add(entity);
display.dataSources.add(dataSource);
display.update(Iso8601.MINIMUM_VALUE);
var result = new BoundingSphere();
var state = display.getBoundingSphere(entity, true, result);
expect(state).toBe(BoundingSphereState.DONE);
expect(result).toEqual(visualizer2.getBoundingSphereResult);
});
it("Fails complete bounding sphere if allowPartial false.", function () {
var visualizer1 = new MockVisualizer();
visualizer1.getBoundingSphereResult = new BoundingSphere(
new Cartesian3(1, 2, 3),
456
);
visualizer1.getBoundingSphereState = BoundingSphereState.PENDING;
var visualizer2 = new MockVisualizer();
visualizer2.getBoundingSphereResult = new BoundingSphere(
new Cartesian3(7, 8, 9),
1011
);
visualizer2.getBoundingSphereState = BoundingSphereState.DONE;
display = new DataSourceDisplay({
scene: scene,
dataSourceCollection: dataSourceCollection,
visualizersCallback: function () {
return [visualizer1, visualizer2];
},
});
var entity = new Entity();
display.defaultDataSource.entities.add(entity);
var result = new BoundingSphere();
var state = display.getBoundingSphere(entity, false, result);
expect(state).toBe(BoundingSphereState.PENDING);
});
it("Fails bounding sphere for entity without visualization.", function () {
display = new DataSourceDisplay({
dataSourceCollection: dataSourceCollection,
scene: scene,
});
var entity = new Entity();
var dataSource = new MockDataSource();
dataSource.entities.add(entity);
display.dataSources.add(dataSource);
display.update(Iso8601.MINIMUM_VALUE);
var result = new BoundingSphere();
var state = display.getBoundingSphere(entity, false, result);
expect(state).toBe(BoundingSphereState.FAILED);
display.destroy();
});
it("Fails bounding sphere for entity not in a data source.", function () {
display = new DataSourceDisplay({
dataSourceCollection: dataSourceCollection,
scene: scene,
});
display.update(Iso8601.MINIMUM_VALUE);
var entity = new Entity();
var result = new BoundingSphere();
var state = display.getBoundingSphere(entity, false, result);
expect(state).toBe(BoundingSphereState.FAILED);
display.destroy();
});
it("Compute bounding sphere throws without entity.", function () {
display = new DataSourceDisplay({
dataSourceCollection: dataSourceCollection,
scene: scene,
});
var result = new BoundingSphere();
expect(function () {
display.getBoundingSphere(undefined, false, result);
}).toThrowDeveloperError();
});
it("Compute bounding sphere throws without result.", function () {
display = new DataSourceDisplay({
dataSourceCollection: dataSourceCollection,
scene: scene,
});
var entity = new Entity();
expect(function () {
display.getBoundingSphere(entity, false, undefined);
}).toThrowDeveloperError();
});
it("Compute bounding sphere throws without allowPartial.", function () {
display = new DataSourceDisplay({
dataSourceCollection: dataSourceCollection,
scene: scene,
});
var entity = new Entity();
var result = new BoundingSphere();
expect(function () {
display.getBoundingSphere(entity, undefined, result);
}).toThrowDeveloperError();
});
it("destroy does not destroy underlying data sources", function () {
var dataSource = new MockDataSource();
dataSourceCollection.add(dataSource);
display = new DataSourceDisplay({
scene: scene,
dataSourceCollection: dataSourceCollection,
});
expect(dataSource.destroyed).toEqual(false);
display.destroy();
expect(dataSource.destroyed).toEqual(false);
expect(display.isDestroyed()).toEqual(true);
});
it("calling update updates data sources", function () {
var source1 = new MockDataSource();
var source2 = new MockDataSource();
display = new DataSourceDisplay({
scene: scene,
dataSourceCollection: dataSourceCollection,
visualizersCallback: visualizersCallback,
});
dataSourceCollection.add(source1);
dataSourceCollection.add(source2);
var source1Visualizer = source1._visualizers[0];
expect(source1Visualizer).toBeInstanceOf(MockVisualizer);
var source2Visualizer = source2._visualizers[0];
expect(source2Visualizer).toBeInstanceOf(MockVisualizer);
//Nothing should have happened yet because we haven't called update.
expect(source1Visualizer.updatesCalled).toEqual(0);
expect(source2Visualizer.updatesCalled).toEqual(0);
//Update should call update on the visualizers
display.update(Iso8601.MINIMUM_VALUE);
expect(source1Visualizer.lastUpdateTime).toEqual(Iso8601.MINIMUM_VALUE);
expect(source1Visualizer.updatesCalled).toEqual(1);
expect(source2Visualizer.lastUpdateTime).toEqual(Iso8601.MINIMUM_VALUE);
expect(source2Visualizer.updatesCalled).toEqual(1);
});
it("ready is true when datasources are ready", function () {
var source1 = new MockDataSource();
var source2 = new MockDataSource();
display = new DataSourceDisplay({
scene: scene,
dataSourceCollection: dataSourceCollection,
visualizersCallback: visualizersCallback,
});
expect(display.ready).toBe(false);
dataSourceCollection.add(source1);
dataSourceCollection.add(source2);
display.update(Iso8601.MINIMUM_VALUE);
expect(display.ready).toBe(true);
spyOn(MockVisualizer.prototype, "update").and.returnValue(false);
display.update(Iso8601.MINIMUM_VALUE);
expect(display.ready).toBe(false);
});
it("constructor throws if scene undefined", function () {
expect(function () {
return new DataSourceDisplay({
scene: undefined,
dataSourceCollection: dataSourceCollection,
visualizersCallback: visualizersCallback,
});
}).toThrowDeveloperError();
});
it("constructor throws if options undefined", function () {
expect(function () {
return new DataSourceDisplay(undefined);
}).toThrowDeveloperError();
});
it("constructor throws if dataSourceCollection undefined", function () {
expect(function () {
return new DataSourceDisplay({
scene: scene,
dataSourceCollection: undefined,
visualizersCallback: visualizersCallback,
});
}).toThrowDeveloperError();
});
it("update throws if time undefined", function () {
display = new DataSourceDisplay({
scene: scene,
dataSourceCollection: dataSourceCollection,
visualizersCallback: visualizersCallback,
});
expect(function () {
return display.update();
}).toThrowDeveloperError();
});
it("verify update returns false till terrain heights are initialized", function () {
ApproximateTerrainHeights._initPromise = undefined;
ApproximateTerrainHeights._terrainHeights = undefined;
var source1 = new MockDataSource();
var source2 = new MockDataSource();
display = new DataSourceDisplay({
scene: scene,
dataSourceCollection: dataSourceCollection,
visualizersCallback: visualizersCallback,
});
dataSourceCollection.add(source1);
dataSourceCollection.add(source2);
display.update(Iso8601.MINIMUM_VALUE);
expect(display.ready).toBe(false);
return GroundPrimitive.initializeTerrainHeights().then(function () {
display.update(Iso8601.MINIMUM_VALUE);
expect(display.ready).toBe(true);
});
});
it("sets dataSource primitives on add", function () {
var source = new MockDataSource();
display = new DataSourceDisplay({
scene: scene,
dataSourceCollection: dataSourceCollection,
visualizersCallback: visualizersCallback,
});
dataSourceCollection.add(source);
expect(source._primitives).toBeDefined();
expect(source._groundPrimitives).toBeDefined();
expect(display._primitives.contains(source._primitives)).toBe(true);
expect(display._groundPrimitives.contains(source._groundPrimitives)).toBe(
true
);
});
it("cleans up primitives on dataSource removed", function () {
var source = new MockDataSource();
display = new DataSourceDisplay({
scene: scene,
dataSourceCollection: dataSourceCollection,
visualizersCallback: visualizersCallback,
});
dataSourceCollection.add(source);
expect(display._primitives.contains(source._primitives)).toBe(true);
expect(display._groundPrimitives.contains(source._groundPrimitives)).toBe(
true
);
dataSourceCollection.remove(source);
expect(display._primitives.length).toBe(1);
expect(display._groundPrimitives.length).toBe(1);
});
it("raises primitives on dataSource raise", function () {
var source1 = new MockDataSource();
var source2 = new MockDataSource();
var source3 = new MockDataSource();
display = new DataSourceDisplay({
scene: scene,
dataSourceCollection: dataSourceCollection,
visualizersCallback: visualizersCallback,
});
dataSourceCollection.add(source1);
dataSourceCollection.add(source2);
dataSourceCollection.add(source3);
dataSourceCollection.raise(source1);
expect(display._primitives.get(1)).toBe(source2._primitives);
expect(display._primitives.get(2)).toBe(source1._primitives);
expect(display._primitives.get(3)).toBe(source3._primitives);
});
it("lowers primitives on dataSource lower", function () {
var source1 = new MockDataSource();
var source2 = new MockDataSource();
var source3 = new MockDataSource();
display = new DataSourceDisplay({
scene: scene,
dataSourceCollection: dataSourceCollection,
visualizersCallback: visualizersCallback,
});
dataSourceCollection.add(source1);
dataSourceCollection.add(source2);
dataSourceCollection.add(source3);
dataSourceCollection.lower(source3);
expect(display._primitives.get(1)).toBe(source1._primitives);
expect(display._primitives.get(2)).toBe(source3._primitives);
expect(display._primitives.get(3)).toBe(source2._primitives);
});
it("raises primitives to top on dataSource raiseToTop", function () {
var source1 = new MockDataSource();
var source2 = new MockDataSource();
var source3 = new MockDataSource();
display = new DataSourceDisplay({
scene: scene,
dataSourceCollection: dataSourceCollection,
visualizersCallback: visualizersCallback,
});
dataSourceCollection.add(source1);
dataSourceCollection.add(source2);
dataSourceCollection.add(source3);
dataSourceCollection.raiseToTop(source1);
expect(display._primitives.get(1)).toBe(source2._primitives);
expect(display._primitives.get(2)).toBe(source3._primitives);
expect(display._primitives.get(3)).toBe(source1._primitives);
});
it("lowers primitives to bottom on dataSource lowerToBottom", function () {
var source1 = new MockDataSource();
var source2 = new MockDataSource();
var source3 = new MockDataSource();
display = new DataSourceDisplay({
scene: scene,
dataSourceCollection: dataSourceCollection,
visualizersCallback: visualizersCallback,
});
dataSourceCollection.add(source1);
dataSourceCollection.add(source2);
dataSourceCollection.add(source3);
dataSourceCollection.lowerToBottom(source3);
expect(display._primitives.get(1)).toBe(source3._primitives);
expect(display._primitives.get(2)).toBe(source1._primitives);
expect(display._primitives.get(3)).toBe(source2._primitives);
});
it("adds primitives to scene when dataSource is added to the collection", function () {
display = new DataSourceDisplay({
scene: scene,
dataSourceCollection: dataSourceCollection,
visualizersCallback: visualizersCallback,
});
expect(scene.primitives.contains(display._primitives)).toBe(false);
expect(scene.groundPrimitives.contains(display._groundPrimitives)).toBe(
false
);
dataSourceCollection.add(new MockDataSource());
expect(scene.primitives.contains(display._primitives)).toBe(true);
expect(scene.groundPrimitives.contains(display._groundPrimitives)).toBe(
true
);
});
it("adds primitives to scene if dataSourceCollection is not empty", function () {
dataSourceCollection.add(new MockDataSource());
display = new DataSourceDisplay({
scene: scene,
dataSourceCollection: dataSourceCollection,
visualizersCallback: visualizersCallback,
});
expect(scene.primitives.contains(display._primitives)).toBe(true);
expect(scene.groundPrimitives.contains(display._groundPrimitives)).toBe(
true
);
});
it("adds primitives to the scene when entities are added to the default dataSource", function () {
display = new DataSourceDisplay({
scene: scene,
dataSourceCollection: dataSourceCollection,
visualizersCallback: visualizersCallback,
});
expect(scene.primitives.contains(display._primitives)).toBe(false);
expect(scene.groundPrimitives.contains(display._groundPrimitives)).toBe(
false
);
display.defaultDataSource.entities.add(new Entity());
expect(scene.primitives.contains(display._primitives)).toBe(true);
expect(scene.groundPrimitives.contains(display._groundPrimitives)).toBe(
true
);
});
},
"WebGL"
);