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.

617 lines
16 KiB
JavaScript

import { ColorGeometryInstanceAttribute } from "../../Source/Cesium.js";
import { defaultValue } from "../../Source/Cesium.js";
import { defined } from "../../Source/Cesium.js";
import { GeometryInstance } from "../../Source/Cesium.js";
import { Rectangle } from "../../Source/Cesium.js";
import { RectangleGeometry } from "../../Source/Cesium.js";
import { HorizontalOrigin } from "../../Source/Cesium.js";
import { LabelCollection } from "../../Source/Cesium.js";
import { PerInstanceColorAppearance } from "../../Source/Cesium.js";
import { Primitive } from "../../Source/Cesium.js";
import { PrimitiveCollection } from "../../Source/Cesium.js";
import { VerticalOrigin } from "../../Source/Cesium.js";
import createScene from "../createScene.js";
describe(
"Scene/PrimitiveCollection",
function () {
var scene;
var context;
var rectangle;
var primitives;
beforeAll(function () {
scene = createScene();
scene.primitives.destroyPrimitives = false;
context = scene.context;
rectangle = Rectangle.fromDegrees(-80.0, 20.0, -70.0, 30.0);
});
afterAll(function () {
scene.destroyForSpecs();
});
beforeEach(function () {
primitives = new PrimitiveCollection();
});
afterEach(function () {
scene.primitives.removeAll();
primitives =
primitives && !primitives.isDestroyed() && primitives.destroy();
});
function createLabels(position) {
position = defaultValue(position, {
x: -1.0,
y: 0.0,
z: 0.0,
});
var labels = new LabelCollection();
labels.add({
position: position,
text: "x",
horizontalOrigin: HorizontalOrigin.CENTER,
verticalOrigin: VerticalOrigin.CENTER,
});
return labels;
}
function createRectangle() {
return new Primitive({
geometryInstances: new GeometryInstance({
geometry: new RectangleGeometry({
rectangle: rectangle,
}),
attributes: {
color: new ColorGeometryInstanceAttribute(1.0, 1.0, 0.0, 0.5),
},
}),
appearance: new PerInstanceColorAppearance(),
releaseGeometryInstances: true,
asynchronous: false,
});
}
function verifyPrimitivesRender(primitives, color) {
scene.primitives.removeAll();
scene.camera.setView({ destination: rectangle });
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(primitives);
if (defined(color)) {
expect(scene).toRender(color);
} else {
expect(scene).notToRender([0, 0, 0, 255]);
}
}
it("constructs with options", function () {
var collection = new PrimitiveCollection({
show: false,
destroyPrimitives: false,
});
expect(collection.show).toEqual(false);
expect(collection.destroyPrimitives).toEqual(false);
collection.destroy();
});
it("gets default show", function () {
expect(primitives.show).toEqual(true);
});
it("get throws if index is undefined", function () {
expect(function () {
primitives.get(undefined);
}).toThrowDeveloperError();
});
it("has zero primitives when constructed", function () {
expect(primitives.length).toEqual(0);
});
it("adds a primitive with add()", function () {
var p = createLabels();
expect(primitives.add(p)).toBe(p);
expect(primitives.length).toEqual(1);
});
it("add works with an index", function () {
var p0 = createLabels();
var p1 = createLabels();
expect(function () {
primitives.add(p0, 1);
}).toThrowDeveloperError();
expect(function () {
primitives.add(p0, -1);
}).toThrowDeveloperError();
primitives.add(p0, 0);
expect(primitives.get(0)).toBe(p0);
expect(function () {
primitives.add(p1, -1);
}).toThrowDeveloperError();
expect(function () {
primitives.add(p1, 2);
}).toThrowDeveloperError();
primitives.add(p1, 0);
expect(primitives.get(0)).toBe(p1);
});
it("removes the first primitive", function () {
var p0 = createLabels();
var p1 = createLabels();
primitives.add(p0);
primitives.add(p1);
expect(primitives.length).toEqual(2);
expect(primitives.remove(p0)).toEqual(true);
expect(primitives.length).toEqual(1);
expect(primitives.get(0)).toBe(p1);
expect(primitives.remove(p1)).toEqual(true);
expect(primitives.length).toEqual(0);
});
it("removes the last primitive", function () {
var p0 = createLabels();
var p1 = createLabels();
primitives.add(p0);
primitives.add(p1);
expect(primitives.length).toEqual(2);
expect(primitives.remove(p1)).toEqual(true);
expect(primitives.length).toEqual(1);
expect(primitives.get(0)).toBe(p0);
expect(primitives.remove(p0)).toEqual(true);
expect(primitives.length).toEqual(0);
});
it("removes a primitive twice", function () {
var p0 = createLabels();
primitives.add(p0);
expect(primitives.remove(p0)).toEqual(true);
expect(primitives.remove(p0)).toEqual(false);
});
it("removes null", function () {
expect(primitives.remove()).toEqual(false);
});
it("removes all primitives", function () {
primitives.add(createLabels());
primitives.add(createLabels());
primitives.add(createLabels());
expect(primitives.length).toEqual(3);
primitives.removeAll();
expect(primitives.length).toEqual(0);
});
it("contains a primitive", function () {
var labels = createLabels();
primitives.add(labels);
expect(primitives.contains(labels)).toEqual(true);
});
it("does not contain a primitive", function () {
var labels0 = createLabels();
var labels1 = createLabels();
primitives.add(labels0);
expect(primitives.contains(labels1)).toEqual(false);
});
it("does not contain removed primitive", function () {
var labels0 = createLabels();
primitives.add(labels0);
primitives.remove(labels0);
expect(primitives.contains(labels0)).toEqual(false);
});
it("does not contain all removed primitives", function () {
var labels0 = createLabels();
primitives.add(labels0);
primitives.removeAll();
expect(primitives.contains(labels0)).toEqual(false);
});
it("does not contain undefined", function () {
expect(primitives.contains()).toEqual(false);
});
it("adds and removes a primitive in two composites", function () {
var p = createLabels();
primitives.add(p);
primitives.destroyPrimitives = false;
var otherPrimitives = new PrimitiveCollection();
otherPrimitives.add(p);
otherPrimitives.destroyPrimitives = false;
// In both composites
expect(primitives.contains(p)).toEqual(true);
expect(otherPrimitives.contains(p)).toEqual(true);
// In one composite
expect(primitives.remove(p)).toEqual(true);
expect(primitives.contains(p)).toEqual(false);
expect(otherPrimitives.contains(p)).toEqual(true);
// In neither composite
expect(otherPrimitives.remove(p)).toEqual(true);
expect(primitives.contains(p)).toEqual(false);
expect(otherPrimitives.contains(p)).toEqual(false);
expect(primitives.remove(p)).toEqual(false);
expect(otherPrimitives.remove(p)).toEqual(false);
p.destroy();
otherPrimitives.destroy();
});
it("does not remove from a second composite", function () {
var p = createLabels();
primitives.add(p);
var otherPrimitives = new PrimitiveCollection();
expect(otherPrimitives.contains(p)).toEqual(false);
expect(otherPrimitives.remove(p)).toEqual(false);
otherPrimitives.destroy();
});
it("gets default destroyPrimitives", function () {
expect(primitives.destroyPrimitives).toEqual(true);
});
it("renders a primitive added with add()", function () {
primitives.add(createLabels());
verifyPrimitivesRender(primitives);
});
it("does not render", function () {
primitives.show = false;
primitives.add(createLabels());
verifyPrimitivesRender(primitives, [0, 0, 0, 255]);
});
it("renders a primitive in more than one composite", function () {
var p = createLabels();
primitives.add(p);
var otherPrimitives = new PrimitiveCollection();
otherPrimitives.destroyPrimitives = false;
otherPrimitives.add(p);
verifyPrimitivesRender(primitives);
verifyPrimitivesRender(otherPrimitives);
otherPrimitives.destroy();
});
it("renders child composites", function () {
var children = new PrimitiveCollection();
children.add(createLabels());
primitives.add(children);
verifyPrimitivesRender(primitives);
});
it("picks a primitive added with add()", function () {
var labels = createLabels();
var l = labels.get(0);
primitives.add(labels);
verifyPrimitivesRender(primitives);
expect(scene).toPickPrimitive(l);
});
it("does not pick", function () {
var labels = createLabels();
primitives.show = false;
primitives.add(labels);
verifyPrimitivesRender(primitives, [0, 0, 0, 255]);
expect(scene).notToPick();
});
it("picks child composites", function () {
var labels = createLabels();
var l = labels.get(0);
var children = new PrimitiveCollection();
children.add(labels);
primitives.add(children);
verifyPrimitivesRender(primitives);
expect(scene).toPickPrimitive(l);
});
it("picks a primitive added with render order (0)", function () {
var p0 = createRectangle();
var p1 = createRectangle();
primitives.add(p0);
primitives.add(p1);
verifyPrimitivesRender(primitives);
expect(scene).toPickPrimitive(p1);
});
it("picks a primitive added with render order (1)", function () {
var p0 = createRectangle();
var p1 = createRectangle();
primitives.add(p1);
primitives.add(p0);
verifyPrimitivesRender(primitives);
expect(scene).toPickPrimitive(p0);
});
it("picks a primitive added with raise (0)", function () {
var p0 = createRectangle();
var p1 = createRectangle();
primitives.add(p0);
primitives.add(p1);
primitives.raise(p1); // Already on top
verifyPrimitivesRender(primitives);
expect(scene).toPickPrimitive(p1);
});
it("picks a primitive added with raise (1)", function () {
var p0 = createRectangle();
var p1 = createRectangle();
primitives.add(p0);
primitives.add(p1);
primitives.raise(p0); // Moved to top
verifyPrimitivesRender(primitives);
expect(scene).toPickPrimitive(p0);
});
it("picks a primitive added with raiseToTop (0)", function () {
var p0 = createRectangle();
var p1 = createRectangle();
primitives.add(p0);
primitives.add(p1);
primitives.raiseToTop(p1); // Already on top
verifyPrimitivesRender(primitives);
expect(scene).toPickPrimitive(p1);
});
it("picks a primitive added with raiseToTop (1)", function () {
var p0 = createRectangle();
var p1 = createRectangle();
primitives.add(p0);
primitives.add(p1);
primitives.raiseToTop(p0); // Moved to top
verifyPrimitivesRender(primitives);
expect(scene).toPickPrimitive(p0);
});
it("picks a primitive added with lower (0)", function () {
var p0 = createRectangle();
var p1 = createRectangle();
primitives.add(p0);
primitives.add(p1);
primitives.lower(p1); // Moved back
verifyPrimitivesRender(primitives);
expect(scene).toPickPrimitive(p0);
});
it("picks a primitive added with lower (1)", function () {
var p0 = createRectangle();
var p1 = createRectangle();
primitives.add(p0);
primitives.add(p1);
primitives.lower(p0); // Already on bottom
verifyPrimitivesRender(primitives);
expect(scene).toPickPrimitive(p1);
});
it("picks a primitive added with lowerToBottom (0)", function () {
var p0 = createRectangle();
var p1 = createRectangle();
primitives.add(p0);
primitives.add(p1);
primitives.lowerToBottom(p1); // Moved back
verifyPrimitivesRender(primitives);
expect(scene).toPickPrimitive(p0);
});
it("picks a primitive added with lowerToBottom (1)", function () {
var p0 = createRectangle();
var p1 = createRectangle();
primitives.add(p0);
primitives.add(p1);
primitives.lowerToBottom(p0); // Already on bottom
verifyPrimitivesRender(primitives);
expect(scene).toPickPrimitive(p1);
});
it("is not destroyed when first constructed", function () {
expect(primitives.isDestroyed()).toEqual(false);
});
it("is destroyed after calling destroy()", function () {
primitives.destroy();
expect(primitives.isDestroyed()).toEqual(true);
});
it("destroys its primitives", function () {
var labels = new LabelCollection(context);
primitives.add(labels);
expect(labels.isDestroyed()).toEqual(false);
primitives.destroy();
expect(labels.isDestroyed()).toEqual(true);
});
it("destroys children", function () {
var labels = new LabelCollection(context);
var children = new PrimitiveCollection();
children.add(labels);
primitives.add(children);
expect(children.isDestroyed()).toEqual(false);
expect(labels.isDestroyed()).toEqual(false);
primitives.destroy();
expect(children.isDestroyed()).toEqual(true);
expect(labels.isDestroyed()).toEqual(true);
});
it("destroys primitive on remove", function () {
var labels = new LabelCollection(context);
primitives.add(labels);
expect(labels.isDestroyed()).toEqual(false);
primitives.remove(labels);
expect(labels.isDestroyed()).toEqual(true);
});
it("destroys primitive on removeAll", function () {
var labels = new LabelCollection(context);
primitives.add(labels);
expect(labels.isDestroyed()).toEqual(false);
primitives.removeAll();
expect(labels.isDestroyed()).toEqual(true);
});
it("does not destroy its primitives", function () {
var labels = new LabelCollection(context);
primitives.destroyPrimitives = false;
primitives.add(labels);
expect(labels.isDestroyed()).toEqual(false);
primitives.destroy();
expect(labels.isDestroyed()).toEqual(false);
labels.destroy();
expect(labels.isDestroyed()).toEqual(true);
});
it("does not destroy primitive on remove", function () {
var labels = new LabelCollection(context);
primitives.destroyPrimitives = false;
primitives.add(labels);
expect(labels.isDestroyed()).toEqual(false);
primitives.remove(labels);
expect(labels.isDestroyed()).toEqual(false);
labels.destroy();
expect(labels.isDestroyed()).toEqual(true);
});
it("does not destroy primitive on removeAll", function () {
var labels = new LabelCollection(context);
primitives.destroyPrimitives = false;
primitives.add(labels);
expect(labels.isDestroyed()).toEqual(false);
primitives.removeAll();
expect(labels.isDestroyed()).toEqual(false);
labels.destroy();
expect(labels.isDestroyed()).toEqual(true);
});
it("throws when add() without an primitive", function () {
expect(function () {
primitives.add();
}).toThrowDeveloperError();
});
it("raise throws when primitive is not in composite", function () {
var p = createLabels();
expect(function () {
primitives.raise(p);
}).toThrowDeveloperError();
});
it("raiseToTop throws when primitive is not in composite", function () {
var p = createLabels();
expect(function () {
primitives.raiseToTop(p);
}).toThrowDeveloperError();
});
it("lower throws when primitive is not in composite", function () {
var p = createLabels();
expect(function () {
primitives.lower(p);
}).toThrowDeveloperError();
});
it("lowerToBottom throws when primitive is not in composite", function () {
var p = createLabels();
expect(function () {
primitives.lowerToBottom(p);
}).toThrowDeveloperError();
});
},
"WebGL"
);