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.

519 lines
16 KiB
JavaScript

import { Iso8601 } from "../../Source/Cesium.js";
import { JulianDate } from "../../Source/Cesium.js";
import { TimeInterval } from "../../Source/Cesium.js";
import { TimeIntervalCollection } from "../../Source/Cesium.js";
import { Entity } from "../../Source/Cesium.js";
import { EntityCollection } from "../../Source/Cesium.js";
describe("DataSources/EntityCollection", function () {
function CollectionListener() {
this.timesCalled = 0;
this.added = undefined;
this.removed = undefined;
this.changed = undefined;
}
CollectionListener.prototype.onCollectionChanged = function (
collection,
added,
removed,
changed
) {
this.timesCalled++;
this.added = added.slice(0);
this.removed = removed.slice(0);
this.changed = changed.slice(0);
};
it("constructor has expected defaults", function () {
var entityCollection = new EntityCollection();
expect(entityCollection.id).toBeDefined();
expect(entityCollection.values.length).toEqual(0);
});
it("add/remove works", function () {
var entity = new Entity();
var entity2 = new Entity();
var entityCollection = new EntityCollection();
entityCollection.add(entity);
expect(entityCollection.values.length).toEqual(1);
entityCollection.add(entity2);
expect(entityCollection.values.length).toEqual(2);
entityCollection.remove(entity2);
expect(entityCollection.values.length).toEqual(1);
entityCollection.remove(entity);
expect(entityCollection.values.length).toEqual(0);
});
it("add sets entityCollection on entity", function () {
var entity = new Entity();
var entityCollection = new EntityCollection();
entityCollection.add(entity);
expect(entity.entityCollection).toBe(entityCollection);
});
it("Entity.isShowing changes when collection show changes.", function () {
var entity = new Entity();
var entityCollection = new EntityCollection();
entityCollection.add(entity);
expect(entity.isShowing).toBe(true);
var listener = jasmine.createSpy("listener");
entity.definitionChanged.addEventListener(listener);
entityCollection.show = false;
expect(listener.calls.count()).toBe(1);
expect(listener.calls.argsFor(0)).toEqual([
entity,
"isShowing",
false,
true,
]);
expect(entity.isShowing).toBe(false);
});
it("add with template", function () {
var entityCollection = new EntityCollection();
var entity = entityCollection.add({
id: "1",
});
expect(entityCollection.values.length).toEqual(1);
expect(entity.id).toBe("1");
expect(entity.constructor).toBe(Entity);
});
it("add/remove raises expected events", function () {
var entity = new Entity();
var entity2 = new Entity();
var entityCollection = new EntityCollection();
var listener = new CollectionListener();
entityCollection.collectionChanged.addEventListener(
listener.onCollectionChanged,
listener
);
entityCollection.add(entity);
expect(listener.timesCalled).toEqual(1);
expect(listener.added.length).toEqual(1);
expect(listener.added[0]).toBe(entity);
expect(listener.removed.length).toEqual(0);
expect(listener.changed.length).toEqual(0);
entity.name = "newName";
expect(listener.timesCalled).toEqual(2);
expect(listener.added.length).toEqual(0);
expect(listener.removed.length).toEqual(0);
expect(listener.changed.length).toEqual(1);
expect(listener.changed[0]).toBe(entity);
entityCollection.add(entity2);
expect(listener.timesCalled).toEqual(3);
expect(listener.added.length).toEqual(1);
expect(listener.added[0]).toBe(entity2);
expect(listener.removed.length).toEqual(0);
expect(listener.changed.length).toEqual(0);
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);
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);
entityCollection.collectionChanged.removeEventListener(
listener.onCollectionChanged,
listener
);
});
it("raises expected events when reentrant", function () {
var entityCollection = new EntityCollection();
var entity = new Entity();
var entity2 = new Entity();
entityCollection.add(entity);
entityCollection.add(entity2);
var entityToDelete = new Entity();
entityCollection.add(entityToDelete);
var entityToAdd = new Entity();
var inCallback = false;
var 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.
//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);
inCallback = true;
if (entity2.name !== "Bob") {
entity2.name = "Bob";
}
if (entityCollection.contains(entityToDelete)) {
entityCollection.removeById(entityToDelete.id);
}
if (!entityCollection.contains(entityToAdd)) {
entityCollection.add(entityToAdd);
}
inCallback = false;
});
entityCollection.collectionChanged.addEventListener(listener);
entity.name = "newName";
expect(listener.calls.count()).toBe(2);
expect(listener.calls.argsFor(0)).toEqual([
entityCollection,
[],
[],
[entity],
]);
expect(listener.calls.argsFor(1)).toEqual([
entityCollection,
[entityToAdd],
[entityToDelete],
[entity2],
]);
expect(entity.name).toEqual("newName");
expect(entity2.name).toEqual("Bob");
expect(entityCollection.contains(entityToDelete)).toEqual(false);
expect(entityCollection.contains(entityToAdd)).toEqual(true);
});
it("suspended add/remove raises expected events", function () {
var entity = new Entity();
var entity2 = new Entity();
var entity3 = new Entity();
var entityCollection = new EntityCollection();
var listener = new CollectionListener();
entityCollection.collectionChanged.addEventListener(
listener.onCollectionChanged,
listener
);
entityCollection.suspendEvents();
entityCollection.suspendEvents();
entityCollection.add(entity);
entityCollection.add(entity2);
entityCollection.add(entity3);
entity2.name = "newName2";
entity3.name = "newName3";
entityCollection.remove(entity2);
expect(listener.timesCalled).toEqual(0);
entityCollection.resumeEvents();
expect(listener.timesCalled).toEqual(0);
entityCollection.resumeEvents();
expect(listener.timesCalled).toEqual(1);
expect(listener.added.length).toEqual(2);
expect(listener.added[0]).toBe(entity);
expect(listener.added[1]).toBe(entity3);
expect(listener.removed.length).toEqual(0);
expect(listener.changed.length).toEqual(0);
entityCollection.suspendEvents();
entity.name = "newName";
entity3.name = "newewName3";
entityCollection.remove(entity3);
entityCollection.resumeEvents();
expect(listener.timesCalled).toEqual(2);
expect(listener.added.length).toEqual(0);
expect(listener.removed.length).toEqual(1);
expect(listener.removed[0]).toBe(entity3);
expect(listener.changed.length).toEqual(1);
expect(listener.changed[0]).toBe(entity);
entityCollection.suspendEvents();
entityCollection.remove(entity);
entityCollection.add(entity);
entityCollection.resumeEvents();
expect(listener.timesCalled).toEqual(2);
entityCollection.collectionChanged.removeEventListener(
listener.onCollectionChanged,
listener
);
});
it("removeAll works", function () {
var entity = new Entity();
var entity2 = new Entity();
var entityCollection = new EntityCollection();
entityCollection.add(entity);
entityCollection.add(entity2);
entityCollection.removeAll();
expect(entityCollection.values.length).toEqual(0);
});
it("removeAll raises expected events", function () {
var entity = new Entity();
var entity2 = new Entity();
var entityCollection = new EntityCollection();
var listener = new CollectionListener();
entityCollection.add(entity);
entityCollection.add(entity2);
entityCollection.collectionChanged.addEventListener(
listener.onCollectionChanged,
listener
);
entityCollection.removeAll();
expect(listener.timesCalled).toEqual(1);
expect(listener.removed.length).toEqual(2);
expect(listener.removed[0]).toBe(entity);
expect(listener.removed[1]).toBe(entity2);
expect(listener.added.length).toEqual(0);
entityCollection.removeAll();
expect(listener.timesCalled).toEqual(1);
entityCollection.collectionChanged.removeEventListener(
listener.onCollectionChanged,
listener
);
});
it("suspended removeAll raises expected events", function () {
var entity = new Entity();
var entity2 = new Entity();
var entityCollection = new EntityCollection();
var listener = new CollectionListener();
entityCollection.add(entity);
entityCollection.add(entity2);
entityCollection.collectionChanged.addEventListener(
listener.onCollectionChanged,
listener
);
entityCollection.suspendEvents();
entity2.name = "newName";
entityCollection.removeAll();
entityCollection.resumeEvents();
expect(listener.timesCalled).toEqual(1);
expect(listener.removed.length).toEqual(2);
expect(listener.removed[0]).toBe(entity);
expect(listener.removed[1]).toBe(entity2);
expect(listener.added.length).toEqual(0);
expect(listener.changed.length).toEqual(0);
entityCollection.suspendEvents();
entityCollection.add(entity);
entityCollection.add(entity2);
entityCollection.remove(entity2);
entityCollection.removeAll();
entityCollection.resumeEvents();
expect(listener.timesCalled).toEqual(1);
entityCollection.collectionChanged.removeEventListener(
listener.onCollectionChanged,
listener
);
});
it("removeById returns false if id not in collection.", function () {
var entityCollection = new EntityCollection();
expect(entityCollection.removeById("notThere")).toBe(false);
});
it("getById works", function () {
var entity = new Entity();
var entity2 = new Entity();
var entityCollection = new EntityCollection();
entityCollection.add(entity);
entityCollection.add(entity2);
expect(entityCollection.getById(entity.id)).toBe(entity);
expect(entityCollection.getById(entity2.id)).toBe(entity2);
});
it("getById returns undefined for non-existent object", function () {
var entityCollection = new EntityCollection();
expect(entityCollection.getById("123")).toBeUndefined();
});
it("getOrCreateEntity creates a new object if it does not exist.", function () {
var entityCollection = new EntityCollection();
expect(entityCollection.values.length).toEqual(0);
var testObject = entityCollection.getOrCreateEntity("test");
expect(entityCollection.values.length).toEqual(1);
expect(entityCollection.values[0]).toEqual(testObject);
});
it("getOrCreateEntity does not create a new object if it already exists.", function () {
var entityCollection = new EntityCollection();
expect(entityCollection.values.length).toEqual(0);
var testObject = entityCollection.getOrCreateEntity("test");
expect(entityCollection.values.length).toEqual(1);
expect(entityCollection.values[0]).toEqual(testObject);
var testObject2 = entityCollection.getOrCreateEntity("test");
expect(entityCollection.values.length).toEqual(1);
expect(entityCollection.values[0]).toEqual(testObject);
expect(testObject2).toEqual(testObject);
});
it("computeAvailability returns infinite with no data.", function () {
var entityCollection = new EntityCollection();
var availability = entityCollection.computeAvailability();
expect(availability.start).toEqual(Iso8601.MINIMUM_VALUE);
expect(availability.stop).toEqual(Iso8601.MAXIMUM_VALUE);
});
it("computeAvailability returns intersction of collections.", function () {
var entityCollection = new EntityCollection();
var entity = entityCollection.getOrCreateEntity("1");
var entity2 = entityCollection.getOrCreateEntity("2");
var entity3 = entityCollection.getOrCreateEntity("3");
entity.availability = new TimeIntervalCollection();
entity.availability.addInterval(
TimeInterval.fromIso8601({
iso8601: "2012-08-01/2012-08-02",
})
);
entity2.availability = new TimeIntervalCollection();
entity2.availability.addInterval(
TimeInterval.fromIso8601({
iso8601: "2012-08-05/2012-08-06",
})
);
entity3.availability = undefined;
var availability = entityCollection.computeAvailability();
expect(availability.start).toEqual(JulianDate.fromIso8601("2012-08-01"));
expect(availability.stop).toEqual(JulianDate.fromIso8601("2012-08-06"));
});
it("computeAvailability works if only start or stop time is infinite.", function () {
var entityCollection = new EntityCollection();
var entity = entityCollection.getOrCreateEntity("1");
var entity2 = entityCollection.getOrCreateEntity("2");
var entity3 = entityCollection.getOrCreateEntity("3");
entity.availability = new TimeIntervalCollection();
entity.availability.addInterval(
TimeInterval.fromIso8601({
iso8601: "2012-08-01/9999-12-31T24:00:00Z",
})
);
entity2.availability = new TimeIntervalCollection();
entity2.availability.addInterval(
TimeInterval.fromIso8601({
iso8601: "0000-01-01T00:00:00Z/2012-08-06",
})
);
entity3.availability = undefined;
var availability = entityCollection.computeAvailability();
expect(availability.start).toEqual(JulianDate.fromIso8601("2012-08-01"));
expect(availability.stop).toEqual(JulianDate.fromIso8601("2012-08-06"));
});
it("resumeEvents throws if no matching suspendEvents ", function () {
var entityCollection = new EntityCollection();
expect(function () {
entityCollection.resumeEvents();
}).toThrowDeveloperError();
});
it("add throws with undefined Entity", function () {
var entityCollection = new EntityCollection();
expect(function () {
entityCollection.add(undefined);
}).toThrowDeveloperError();
});
it("add throws for Entity with same id", function () {
var entityCollection = new EntityCollection();
var entity = new Entity({
id: "1",
});
var entity2 = new Entity({
id: "1",
});
entityCollection.add(entity);
expect(function () {
entityCollection.add(entity2);
}).toThrowRuntimeError();
});
it("contains returns true if in collection", function () {
var entityCollection = new EntityCollection();
var entity = entityCollection.getOrCreateEntity("asd");
expect(entityCollection.contains(entity)).toBe(true);
});
it("contains returns false if not in collection", function () {
var entityCollection = new EntityCollection();
expect(entityCollection.contains(new Entity())).toBe(false);
});
it("contains throws with undefined Entity", function () {
var entityCollection = new EntityCollection();
expect(function () {
entityCollection.contains(undefined);
}).toThrowDeveloperError();
});
it("remove returns false with undefined Entity", function () {
var entityCollection = new EntityCollection();
expect(entityCollection.remove(undefined)).toBe(false);
});
it("removeById returns false with undefined id", function () {
var entityCollection = new EntityCollection();
expect(entityCollection.removeById(undefined)).toBe(false);
});
it("getById throws if no id specified", function () {
var entityCollection = new EntityCollection();
expect(function () {
entityCollection.getById(undefined);
}).toThrowDeveloperError();
});
it("getOrCreateEntity throws if no id specified", function () {
var entityCollection = new EntityCollection();
expect(function () {
entityCollection.getOrCreateEntity(undefined);
}).toThrowDeveloperError();
});
});