cesium/packages/engine/Specs/DataSources/EntityCollectionSpec.js

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

521 lines
16 KiB
JavaScript
Raw Permalink Normal View History

2022-07-22 05:32:08 +08:00
import {
Iso8601,
JulianDate,
TimeInterval,
TimeIntervalCollection,
Entity,
EntityCollection,
2022-11-02 03:39:57 +08:00
} from "../../index.js";
2020-04-17 08:31:36 +08:00
describe("DataSources/EntityCollection", function () {
function CollectionListener() {
this.timesCalled = 0;
this.added = undefined;
this.removed = undefined;
this.changed = undefined;
}
2014-07-03 03:34:44 +08:00
CollectionListener.prototype.onCollectionChanged = function (
collection,
2020-04-17 08:31:36 +08:00
added,
removed,
2020-04-17 08:31:36 +08:00
changed,
) {
this.timesCalled++;
this.added = added.slice(0);
this.removed = removed.slice(0);
this.changed = changed.slice(0);
2020-04-17 08:31:36 +08:00
};
it("constructor has expected defaults", function () {
2014-07-03 03:34:44 +08:00
const entityCollection = new EntityCollection();
expect(entityCollection.id).toBeDefined();
expect(entityCollection.values.length).toEqual(0);
2020-04-17 08:31:36 +08:00
});
it("add/remove works", function () {
2014-07-03 03:34:44 +08:00
const entity = new Entity();
const entity2 = new Entity();
const entityCollection = new EntityCollection();
2020-04-17 08:31:36 +08:00
2014-07-03 03:34:44 +08:00
entityCollection.add(entity);
expect(entityCollection.values.length).toEqual(1);
2020-04-17 08:31:36 +08:00
2014-07-03 03:34:44 +08:00
entityCollection.add(entity2);
expect(entityCollection.values.length).toEqual(2);
2020-04-17 08:31:36 +08:00
2014-07-03 03:34:44 +08:00
entityCollection.remove(entity2);
expect(entityCollection.values.length).toEqual(1);
2020-04-17 08:31:36 +08:00
2014-07-03 03:34:44 +08:00
entityCollection.remove(entity);
expect(entityCollection.values.length).toEqual(0);
2020-04-17 08:31:36 +08:00
});
it("add sets entityCollection on entity", function () {
const entity = new Entity();
const entityCollection = new EntityCollection();
2020-04-17 08:31:36 +08:00
entityCollection.add(entity);
expect(entity.entityCollection).toBe(entityCollection);
2020-04-17 08:31:36 +08:00
});
it("Entity.isShowing changes when collection show changes.", function () {
const entity = new Entity();
const entityCollection = new EntityCollection();
2020-04-17 08:31:36 +08:00
entityCollection.add(entity);
2020-04-17 08:31:36 +08:00
expect(entity.isShowing).toBe(true);
2020-04-17 08:31:36 +08:00
const listener = jasmine.createSpy("listener");
entity.definitionChanged.addEventListener(listener);
2020-04-17 08:31:36 +08:00
entityCollection.show = false;
2020-04-17 08:31:36 +08:00
expect(listener.calls.count()).toBe(1);
expect(listener.calls.argsFor(0)).toEqual([
2020-04-17 08:31:36 +08:00
entity,
"isShowing",
false,
true,
]);
expect(entity.isShowing).toBe(false);
2020-04-17 08:31:36 +08:00
});
it("add with template", function () {
2014-07-03 03:34:44 +08:00
const entityCollection = new EntityCollection();
2020-04-17 08:31:36 +08:00
const entity = entityCollection.add({
2020-04-17 08:31:36 +08:00
id: "1",
2012-06-27 01:43:31 +08:00
});
expect(entityCollection.values.length).toEqual(1);
expect(entity.id).toBe("1");
expect(entity.constructor).toBe(Entity);
2020-04-17 08:31:36 +08:00
});
it("add/remove raises expected events", function () {
2014-07-03 03:34:44 +08:00
const entity = new Entity();
const entity2 = new Entity();
const entityCollection = new EntityCollection();
2020-04-17 08:31:36 +08:00
const listener = new CollectionListener();
2014-07-03 03:34:44 +08:00
entityCollection.collectionChanged.addEventListener(
listener.onCollectionChanged,
2020-04-17 08:31:36 +08:00
listener,
);
2014-07-03 03:34:44 +08:00
entityCollection.add(entity);
expect(listener.timesCalled).toEqual(1);
expect(listener.added.length).toEqual(1);
2014-07-03 03:34:44 +08:00
expect(listener.added[0]).toBe(entity);
expect(listener.removed.length).toEqual(0);
expect(listener.changed.length).toEqual(0);
2020-04-17 08:31:36 +08:00
entity.name = "newName";
expect(listener.timesCalled).toEqual(2);
expect(listener.added.length).toEqual(0);
2014-07-03 03:34:44 +08:00
expect(listener.removed.length).toEqual(0);
expect(listener.changed.length).toEqual(1);
2014-07-03 03:34:44 +08:00
expect(listener.changed[0]).toBe(entity);
2020-04-17 08:31:36 +08:00
2014-07-03 03:34:44 +08:00
entityCollection.add(entity2);
expect(listener.timesCalled).toEqual(3);
2014-07-03 03:34:44 +08:00
expect(listener.added.length).toEqual(1);
expect(listener.added[0]).toBe(entity2);
expect(listener.removed.length).toEqual(0);
expect(listener.changed.length).toEqual(0);
2020-04-17 08:31:36 +08:00
entityCollection.remove(entity2);
expect(listener.timesCalled).toEqual(4);
expect(listener.added.length).toEqual(0);
expect(listener.removed.length).toEqual(1);
expect(listener.removed[0]).toBe(entity2);
expect(listener.changed.length).toEqual(0);
2020-04-17 08:31:36 +08:00
entityCollection.remove(entity);
expect(listener.timesCalled).toEqual(5);
expect(listener.added.length).toEqual(0);
expect(listener.removed.length).toEqual(1);
expect(listener.removed[0]).toBe(entity);
2020-04-17 08:31:36 +08:00
2014-07-03 03:34:44 +08:00
entityCollection.collectionChanged.removeEventListener(
listener.onCollectionChanged,
2020-04-17 08:31:36 +08:00
listener,
);
});
2020-04-17 08:31:36 +08:00
it("raises expected events when reentrant", function () {
const entityCollection = new EntityCollection();
2020-04-17 08:31:36 +08:00
const entity = new Entity();
2014-07-03 03:34:44 +08:00
const entity2 = new Entity();
entityCollection.add(entity);
2014-07-03 03:34:44 +08:00
entityCollection.add(entity2);
2020-04-17 08:31:36 +08:00
const entityToDelete = new Entity();
entityCollection.add(entityToDelete);
2020-04-17 08:31:36 +08:00
const entityToAdd = new Entity();
2020-04-17 08:31:36 +08:00
2016-03-22 04:35:35 +08:00
let inCallback = false;
const listener = jasmine
.createSpy("listener")
.and.callFake(function (collection, added, removed, changed) {
//When we set the name to `newName` below, this code will modify entity2's name, thus triggering
//another event firing that occurs after all current subscribers have been notified of the
//event we are inside of.
2020-04-17 08:31:36 +08:00
//By checking that inCallback is false, we are making sure the entity2.name assignment
//is delayed until after the first round of events is fired.
expect(inCallback).toBe(false);
2014-07-03 03:34:44 +08:00
inCallback = true;
if (entity2.name !== "Bob") {
entity2.name = "Bob";
2020-04-17 08:31:36 +08:00
}
2014-07-03 03:34:44 +08:00
if (entityCollection.contains(entityToDelete)) {
entityCollection.removeById(entityToDelete.id);
2020-04-17 08:31:36 +08:00
}
2014-07-03 03:34:44 +08:00
if (!entityCollection.contains(entityToAdd)) {
entityCollection.add(entityToAdd);
2020-04-17 08:31:36 +08:00
}
2014-07-03 03:34:44 +08:00
inCallback = false;
2020-04-17 08:31:36 +08:00
});
2014-07-03 03:34:44 +08:00
entityCollection.collectionChanged.addEventListener(listener);
2020-04-17 08:31:36 +08:00
entity.name = "newName";
expect(listener.calls.count()).toBe(2);
expect(listener.calls.argsFor(0)).toEqual([
entityCollection,
2020-04-17 08:31:36 +08:00
[],
[],
[entity],
]);
expect(listener.calls.argsFor(1)).toEqual([
entityCollection,
[entityToAdd],
[entityToDelete],
2020-04-17 08:31:36 +08:00
[entity2],
]);
expect(entity.name).toEqual("newName");
2016-03-22 05:42:41 +08:00
expect(entity2.name).toEqual("Bob");
expect(entityCollection.contains(entityToDelete)).toEqual(false);
expect(entityCollection.contains(entityToAdd)).toEqual(true);
2014-07-03 03:34:44 +08:00
});
2020-04-17 08:31:36 +08:00
2014-07-03 03:34:44 +08:00
it("suspended add/remove raises expected events", function () {
const entity = new Entity();
2014-07-03 03:34:44 +08:00
const entity2 = new Entity();
const entity3 = new Entity();
2020-04-17 08:31:36 +08:00
2014-07-03 03:34:44 +08:00
const entityCollection = new EntityCollection();
2020-04-17 08:31:36 +08:00
2014-07-03 03:34:44 +08:00
const listener = new CollectionListener();
entityCollection.collectionChanged.addEventListener(
listener.onCollectionChanged,
2020-04-17 08:31:36 +08:00
listener,
2012-06-27 01:43:31 +08:00
);
2020-04-17 08:31:36 +08:00
entityCollection.suspendEvents();
entityCollection.suspendEvents();
entityCollection.add(entity);
entityCollection.add(entity2);
entityCollection.add(entity3);
entity2.name = "newName2";
entity3.name = "newName3";
entityCollection.remove(entity2);
2020-04-17 08:31:36 +08:00
expect(listener.timesCalled).toEqual(0);
2014-07-03 03:34:44 +08:00
entityCollection.resumeEvents();
2020-04-17 08:31:36 +08:00
expect(listener.timesCalled).toEqual(0);
2014-07-03 03:34:44 +08:00
entityCollection.resumeEvents();
2020-04-17 08:31:36 +08:00
expect(listener.timesCalled).toEqual(1);
expect(listener.added.length).toEqual(2);
2014-07-03 03:34:44 +08:00
expect(listener.added[0]).toBe(entity);
expect(listener.added[1]).toBe(entity3);
2016-03-22 05:42:41 +08:00
expect(listener.removed.length).toEqual(0);
expect(listener.changed.length).toEqual(0);
2020-04-17 08:31:36 +08:00
2016-03-22 05:42:41 +08:00
entityCollection.suspendEvents();
entity.name = "newName";
2016-03-22 05:42:41 +08:00
entity3.name = "newewName3";
entityCollection.remove(entity3);
2014-07-03 03:34:44 +08:00
entityCollection.resumeEvents();
2020-04-17 08:31:36 +08:00
expect(listener.timesCalled).toEqual(2);
2016-03-22 05:42:41 +08:00
expect(listener.added.length).toEqual(0);
expect(listener.removed.length).toEqual(1);
2014-07-03 03:34:44 +08:00
expect(listener.removed[0]).toBe(entity3);
expect(listener.changed.length).toEqual(1);
expect(listener.changed[0]).toBe(entity);
2020-04-17 08:31:36 +08:00
2014-07-03 03:34:44 +08:00
entityCollection.suspendEvents();
entityCollection.remove(entity);
2016-03-22 05:42:41 +08:00
entityCollection.add(entity);
entityCollection.resumeEvents();
2020-04-17 08:31:36 +08:00
expect(listener.timesCalled).toEqual(2);
2020-04-17 08:31:36 +08:00
entityCollection.collectionChanged.removeEventListener(
listener.onCollectionChanged,
listener,
2020-04-17 08:31:36 +08:00
);
});
it("removeAll works", function () {
const entity = new Entity();
const entity2 = new Entity();
2016-03-22 04:35:35 +08:00
const entityCollection = new EntityCollection();
2020-04-17 08:31:36 +08:00
entityCollection.add(entity);
2016-03-22 05:42:41 +08:00
entityCollection.add(entity2);
entityCollection.removeAll();
expect(entityCollection.values.length).toEqual(0);
});
2020-04-17 08:31:36 +08:00
2016-03-22 05:42:41 +08:00
it("removeAll raises expected events", function () {
2014-07-03 03:34:44 +08:00
const entity = new Entity();
const entity2 = new Entity();
2016-03-22 05:42:41 +08:00
const entityCollection = new EntityCollection();
2020-04-17 08:31:36 +08:00
const listener = new CollectionListener();
2020-04-17 08:31:36 +08:00
2016-03-22 05:42:41 +08:00
entityCollection.add(entity);
entityCollection.add(entity2);
2020-04-17 08:31:36 +08:00
entityCollection.collectionChanged.addEventListener(
listener.onCollectionChanged,
listener,
2020-04-17 08:31:36 +08:00
);
entityCollection.removeAll();
2020-04-17 08:31:36 +08:00
2016-03-22 05:42:41 +08:00
expect(listener.timesCalled).toEqual(1);
expect(listener.removed.length).toEqual(2);
2016-03-22 05:42:41 +08:00
expect(listener.removed[0]).toBe(entity);
expect(listener.removed[1]).toBe(entity2);
expect(listener.added.length).toEqual(0);
2020-04-17 08:31:36 +08:00
2016-03-22 05:42:41 +08:00
entityCollection.removeAll();
expect(listener.timesCalled).toEqual(1);
2020-04-17 08:31:36 +08:00
2016-03-22 05:42:41 +08:00
entityCollection.collectionChanged.removeEventListener(
listener.onCollectionChanged,
listener,
);
});
2020-04-17 08:31:36 +08:00
it("suspended removeAll raises expected events", function () {
2014-07-03 03:34:44 +08:00
const entity = new Entity();
const entity2 = new Entity();
const entityCollection = new EntityCollection();
2020-04-17 08:31:36 +08:00
const listener = new CollectionListener();
2020-04-17 08:31:36 +08:00
2014-07-03 03:34:44 +08:00
entityCollection.add(entity);
entityCollection.add(entity2);
2020-04-17 08:31:36 +08:00
2014-07-03 03:34:44 +08:00
entityCollection.collectionChanged.addEventListener(
listener.onCollectionChanged,
listener,
);
2020-04-17 08:31:36 +08:00
2014-07-03 03:34:44 +08:00
entityCollection.suspendEvents();
entity2.name = "newName";
2014-07-03 03:34:44 +08:00
entityCollection.removeAll();
entityCollection.resumeEvents();
expect(listener.timesCalled).toEqual(1);
expect(listener.removed.length).toEqual(2);
2014-07-03 03:34:44 +08:00
expect(listener.removed[0]).toBe(entity);
expect(listener.removed[1]).toBe(entity2);
expect(listener.added.length).toEqual(0);
expect(listener.changed.length).toEqual(0);
2020-04-17 08:31:36 +08:00
2014-07-03 03:34:44 +08:00
entityCollection.suspendEvents();
entityCollection.add(entity);
entityCollection.add(entity2);
2014-07-03 03:34:44 +08:00
entityCollection.remove(entity2);
entityCollection.removeAll();
entityCollection.resumeEvents();
expect(listener.timesCalled).toEqual(1);
2020-04-17 08:31:36 +08:00
entityCollection.collectionChanged.removeEventListener(
listener.onCollectionChanged,
2020-04-17 08:31:36 +08:00
listener,
);
});
it("removeById returns false if id not in collection.", function () {
2014-07-03 03:34:44 +08:00
const entityCollection = new EntityCollection();
expect(entityCollection.removeById("notThere")).toBe(false);
});
2020-04-17 08:31:36 +08:00
it("getById works", function () {
const entity = new Entity();
const entity2 = new Entity();
const entityCollection = new EntityCollection();
2020-04-17 08:31:36 +08:00
2014-07-03 03:34:44 +08:00
entityCollection.add(entity);
entityCollection.add(entity2);
2020-04-17 08:31:36 +08:00
2014-07-03 03:34:44 +08:00
expect(entityCollection.getById(entity.id)).toBe(entity);
expect(entityCollection.getById(entity2.id)).toBe(entity2);
2020-04-17 08:31:36 +08:00
});
it("getById returns undefined for non-existent object", function () {
2014-07-03 03:34:44 +08:00
const entityCollection = new EntityCollection();
expect(entityCollection.getById("123")).toBeUndefined();
2020-04-17 08:31:36 +08:00
});
2014-07-08 21:57:19 +08:00
it("getOrCreateEntity creates a new object if it does not exist.", function () {
2014-07-03 03:34:44 +08:00
const entityCollection = new EntityCollection();
expect(entityCollection.values.length).toEqual(0);
2014-07-03 03:34:44 +08:00
const testObject = entityCollection.getOrCreateEntity("test");
expect(entityCollection.values.length).toEqual(1);
expect(entityCollection.values[0]).toEqual(testObject);
});
2020-04-17 08:31:36 +08:00
it("getOrCreateEntity does not create a new object if it already exists.", function () {
2014-07-03 03:34:44 +08:00
const entityCollection = new EntityCollection();
expect(entityCollection.values.length).toEqual(0);
2014-07-08 21:57:19 +08:00
const testObject = entityCollection.getOrCreateEntity("test");
expect(entityCollection.values.length).toEqual(1);
expect(entityCollection.values[0]).toEqual(testObject);
2014-07-08 21:57:19 +08:00
const testObject2 = entityCollection.getOrCreateEntity("test");
expect(entityCollection.values.length).toEqual(1);
expect(entityCollection.values[0]).toEqual(testObject);
expect(testObject2).toEqual(testObject);
2020-04-17 08:31:36 +08:00
});
it("computeAvailability returns infinite with no data.", function () {
2014-07-03 03:34:44 +08:00
const entityCollection = new EntityCollection();
const availability = entityCollection.computeAvailability();
2014-07-03 03:34:44 +08:00
expect(availability.start).toEqual(Iso8601.MINIMUM_VALUE);
expect(availability.stop).toEqual(Iso8601.MAXIMUM_VALUE);
});
2020-04-17 08:31:36 +08:00
2014-07-03 03:34:44 +08:00
it("computeAvailability returns intersction of collections.", function () {
const entityCollection = new EntityCollection();
2020-04-17 08:31:36 +08:00
2014-07-03 03:34:44 +08:00
const entity = entityCollection.getOrCreateEntity("1");
const entity2 = entityCollection.getOrCreateEntity("2");
const entity3 = entityCollection.getOrCreateEntity("3");
2020-04-17 08:31:36 +08:00
2014-07-03 03:34:44 +08:00
entity.availability = new TimeIntervalCollection();
entity.availability.addInterval(
TimeInterval.fromIso8601({
iso8601: "2012-08-01/2012-08-02",
2020-04-17 08:31:36 +08:00
}),
);
entity2.availability = new TimeIntervalCollection();
2014-07-03 03:34:44 +08:00
entity2.availability.addInterval(
TimeInterval.fromIso8601({
iso8601: "2012-08-05/2012-08-06",
2020-04-17 08:31:36 +08:00
}),
);
2014-07-03 03:34:44 +08:00
entity3.availability = undefined;
2020-04-17 08:31:36 +08:00
2014-07-03 03:34:44 +08:00
const availability = entityCollection.computeAvailability();
expect(availability.start).toEqual(JulianDate.fromIso8601("2012-08-01"));
expect(availability.stop).toEqual(JulianDate.fromIso8601("2012-08-06"));
2020-04-17 08:31:36 +08:00
});
it("computeAvailability works if only start or stop time is infinite.", function () {
2014-07-03 03:34:44 +08:00
const entityCollection = new EntityCollection();
2020-04-17 08:31:36 +08:00
2014-07-03 03:34:44 +08:00
const entity = entityCollection.getOrCreateEntity("1");
const entity2 = entityCollection.getOrCreateEntity("2");
const entity3 = entityCollection.getOrCreateEntity("3");
2020-04-17 08:31:36 +08:00
2014-07-03 03:34:44 +08:00
entity.availability = new TimeIntervalCollection();
entity.availability.addInterval(
TimeInterval.fromIso8601({
iso8601: "2012-08-01/9999-12-31T24:00:00Z",
2020-04-17 08:31:36 +08:00
}),
);
2014-07-03 03:34:44 +08:00
entity2.availability = new TimeIntervalCollection();
entity2.availability.addInterval(
TimeInterval.fromIso8601({
iso8601: "0000-01-01T00:00:00Z/2012-08-06",
2020-04-17 08:31:36 +08:00
}),
);
2014-07-03 03:34:44 +08:00
entity3.availability = undefined;
2020-04-17 08:31:36 +08:00
2014-07-03 03:34:44 +08:00
const availability = entityCollection.computeAvailability();
expect(availability.start).toEqual(JulianDate.fromIso8601("2012-08-01"));
expect(availability.stop).toEqual(JulianDate.fromIso8601("2012-08-06"));
2020-04-17 08:31:36 +08:00
});
2014-07-03 03:34:44 +08:00
it("resumeEvents throws if no matching suspendEvents ", function () {
const entityCollection = new EntityCollection();
expect(function () {
entityCollection.resumeEvents();
}).toThrowDeveloperError();
2014-07-03 03:34:44 +08:00
});
2020-04-17 08:31:36 +08:00
2014-07-03 03:34:44 +08:00
it("add throws with undefined Entity", function () {
const entityCollection = new EntityCollection();
expect(function () {
entityCollection.add(undefined);
}).toThrowDeveloperError();
});
2020-04-17 08:31:36 +08:00
2014-07-03 03:34:44 +08:00
it("add throws for Entity with same id", function () {
const entityCollection = new EntityCollection();
const entity = new Entity({
id: "1",
});
2014-07-03 03:34:44 +08:00
const entity2 = new Entity({
id: "1",
});
2014-07-03 03:34:44 +08:00
entityCollection.add(entity);
2020-04-17 08:31:36 +08:00
expect(function () {
2014-07-03 03:34:44 +08:00
entityCollection.add(entity2);
2024-01-21 03:00:59 +08:00
}).toThrowDeveloperError();
2020-04-17 08:31:36 +08:00
});
it("contains returns true if in collection", function () {
2014-07-03 03:34:44 +08:00
const entityCollection = new EntityCollection();
const entity = entityCollection.getOrCreateEntity("asd");
expect(entityCollection.contains(entity)).toBe(true);
2020-04-17 08:31:36 +08:00
});
it("contains returns false if not in collection", function () {
2014-07-03 03:34:44 +08:00
const entityCollection = new EntityCollection();
expect(entityCollection.contains(new Entity())).toBe(false);
2020-04-17 08:31:36 +08:00
});
it("contains throws with undefined Entity", function () {
2014-07-03 03:34:44 +08:00
const entityCollection = new EntityCollection();
expect(function () {
entityCollection.contains(undefined);
2014-01-11 07:24:43 +08:00
}).toThrowDeveloperError();
2020-04-17 08:31:36 +08:00
});
it("remove returns false with undefined Entity", function () {
2014-07-03 03:34:44 +08:00
const entityCollection = new EntityCollection();
expect(entityCollection.remove(undefined)).toBe(false);
2020-04-17 08:31:36 +08:00
});
it("removeById returns false with undefined id", function () {
2014-07-03 03:34:44 +08:00
const entityCollection = new EntityCollection();
expect(entityCollection.removeById(undefined)).toBe(false);
2020-04-17 08:31:36 +08:00
});
it("getById throws if no id specified", function () {
2014-07-03 03:34:44 +08:00
const entityCollection = new EntityCollection();
expect(function () {
2014-07-03 03:34:44 +08:00
entityCollection.getById(undefined);
2014-01-11 07:24:43 +08:00
}).toThrowDeveloperError();
2020-04-17 08:31:36 +08:00
});
2014-07-08 21:57:19 +08:00
it("getOrCreateEntity throws if no id specified", function () {
2014-07-03 03:34:44 +08:00
const entityCollection = new EntityCollection();
expect(function () {
2014-07-08 21:57:19 +08:00
entityCollection.getOrCreateEntity(undefined);
2014-01-11 07:24:43 +08:00
}).toThrowDeveloperError();
2020-04-17 08:31:36 +08:00
});
});