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.

658 lines
19 KiB
JavaScript

import { JulianDate } from "../../Source/Cesium.js";
import { TimeInterval } from "../../Source/Cesium.js";
describe("Core/TimeInterval", function () {
function returnTrue() {
return true;
}
it("Constructor sets expected defaults.", function () {
var interval = new TimeInterval();
expect(interval.start).toEqual(new JulianDate());
expect(interval.stop).toEqual(new JulianDate());
expect(interval.isStartIncluded).toBe(true);
expect(interval.isStopIncluded).toBe(true);
expect(interval.data).toBeUndefined();
});
it("Constructor assigns all options.", function () {
var start = JulianDate.now();
var stop = JulianDate.addDays(start, 1, new JulianDate());
var isStartIncluded = false;
var isStopIncluded = false;
var data = {};
var interval = new TimeInterval({
start: start,
stop: stop,
isStartIncluded: isStartIncluded,
isStopIncluded: isStopIncluded,
data: data,
});
expect(interval.start).toEqual(start);
expect(interval.stop).toEqual(stop);
expect(interval.isStartIncluded).toEqual(isStartIncluded);
expect(interval.isStopIncluded).toEqual(isStopIncluded);
expect(interval.data).toEqual(data);
});
it("fromIso8601 assigns expected defaults.", function () {
var start = JulianDate.fromIso8601("2013");
var stop = JulianDate.fromIso8601("2014");
var interval = TimeInterval.fromIso8601({
iso8601: "2013/2014",
});
expect(interval.start).toEqual(start);
expect(interval.stop).toEqual(stop);
expect(interval.isStartIncluded).toBe(true);
expect(interval.isStopIncluded).toBe(true);
expect(interval.data).toBeUndefined();
});
it("fromIso8601 assigns all options.", function () {
var start = JulianDate.fromIso8601("2013");
var stop = JulianDate.fromIso8601("2014");
var isStartIncluded = false;
var isStopIncluded = false;
var data = {};
var interval = TimeInterval.fromIso8601({
iso8601: "2013/2014",
isStartIncluded: isStartIncluded,
isStopIncluded: isStopIncluded,
data: data,
});
expect(interval.start).toEqual(start);
expect(interval.stop).toEqual(stop);
expect(interval.isStartIncluded).toEqual(isStartIncluded);
expect(interval.isStopIncluded).toEqual(isStopIncluded);
expect(interval.data).toEqual(data);
});
it("fromIso8601 works with result parameter.", function () {
var start = JulianDate.fromIso8601("2013");
var stop = JulianDate.fromIso8601("2014");
var isStartIncluded = false;
var isStopIncluded = false;
var data = {};
var expectedResult = new TimeInterval();
var interval = TimeInterval.fromIso8601(
{
iso8601: "2013/2014",
isStartIncluded: isStartIncluded,
isStopIncluded: isStopIncluded,
data: data,
},
expectedResult
);
expect(expectedResult).toBe(interval);
expect(interval.start).toEqual(start);
expect(interval.stop).toEqual(stop);
expect(interval.isStartIncluded).toEqual(isStartIncluded);
expect(interval.isStopIncluded).toEqual(isStopIncluded);
expect(interval.data).toEqual(data);
});
it("fromIso8601 throws error when given Invalid ISO 8601 date.", function () {
expect(function () {
TimeInterval.fromIso8601({ iso8601: "2020-08-29T00:00:00+00:00" });
}).toThrowDeveloperError();
});
it("toIso8601 works", function () {
var isoDate1 = "0950-01-02T03:04:05Z";
var isoDate2 = "0950-01-03T03:04:05Z";
var interval = new TimeInterval({
start: JulianDate.fromIso8601(isoDate1),
stop: JulianDate.fromIso8601(isoDate2),
});
expect(TimeInterval.toIso8601(interval)).toEqual(
"0950-01-02T03:04:05Z/0950-01-03T03:04:05Z"
);
});
it("can round-trip with ISO8601", function () {
var interval = new TimeInterval({
start: JulianDate.now(),
stop: JulianDate.now(),
});
expect(
TimeInterval.fromIso8601({
iso8601: TimeInterval.toIso8601(interval),
})
).toEqual(interval);
});
it("toIso8601 works with specified precision", function () {
var isoDate1 = "0950-01-02T03:04:05.012345Z";
var isoDate2 = "0950-01-03T03:04:05.012345Z";
var interval = new TimeInterval({
start: JulianDate.fromIso8601(isoDate1),
stop: JulianDate.fromIso8601(isoDate2),
});
expect(TimeInterval.toIso8601(interval, 0)).toEqual(
"0950-01-02T03:04:05Z/0950-01-03T03:04:05Z"
);
expect(TimeInterval.toIso8601(interval, 7)).toEqual(
"0950-01-02T03:04:05.0123450Z/0950-01-03T03:04:05.0123450Z"
);
});
it("isEmpty is false for a non-empty interval", function () {
var interval = new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(2),
});
expect(interval.isEmpty).toEqual(false);
});
it("isEmpty is false for an instantaneous interval closed on both ends", function () {
var interval = new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(1),
});
expect(interval.isEmpty).toEqual(false);
});
it("isEmpty is true for an instantaneous interval open on both ends", function () {
var interval = new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(1),
isStartIncluded: false,
isStopIncluded: false,
});
expect(interval.isEmpty).toEqual(true);
});
it("isEmpty is true for an instantaneous interval open on start", function () {
var interval = new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(1),
isStartIncluded: false,
isStopIncluded: true,
});
expect(interval.isEmpty).toEqual(true);
});
it("isEmpty is true for an instantaneous interval open on stop", function () {
var interval = new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(1),
isStartIncluded: true,
isStopIncluded: false,
});
expect(interval.isEmpty).toEqual(true);
});
it("isEmpty is true for an interval with stop before start", function () {
var interval = new TimeInterval({
start: new JulianDate(5),
stop: new JulianDate(4),
});
expect(interval.isEmpty).toEqual(true);
});
it("isEmpty is true for an instantaneous interval only closed on stop end", function () {
var interval = new TimeInterval({
start: new JulianDate(5),
stop: new JulianDate(5),
isStartIncluded: false,
isStopIncluded: true,
});
expect(interval.isEmpty).toEqual(true);
});
it("isEmpty is true for an instantaneous interval only closed on start end", function () {
var interval = new TimeInterval({
start: new JulianDate(5),
stop: new JulianDate(5),
isStartIncluded: true,
isStopIncluded: false,
});
expect(interval.isEmpty).toEqual(true);
});
it("contains works for a non-empty interval.", function () {
var interval = new TimeInterval({
start: new JulianDate(2451545),
stop: new JulianDate(2451546),
});
expect(TimeInterval.contains(interval, new JulianDate(2451545.5))).toEqual(
true
);
expect(TimeInterval.contains(interval, new JulianDate(2451546.5))).toEqual(
false
);
});
it("contains works for an empty interval.", function () {
expect(TimeInterval.contains(TimeInterval.EMPTY, new JulianDate())).toEqual(
false
);
});
it("contains returns true at start and stop times of a closed interval", function () {
var interval = new TimeInterval({
start: new JulianDate(2451545),
stop: new JulianDate(2451546),
isStartIncluded: true,
isStopIncluded: true,
});
expect(TimeInterval.contains(interval, new JulianDate(2451545))).toEqual(
true
);
expect(TimeInterval.contains(interval, new JulianDate(2451546))).toEqual(
true
);
});
it("contains returns false at start and stop times of an open interval", function () {
var interval = new TimeInterval({
start: new JulianDate(2451545),
stop: new JulianDate(2451546),
isStartIncluded: false,
isStopIncluded: false,
});
expect(TimeInterval.contains(interval, new JulianDate(2451545))).toEqual(
false
);
expect(TimeInterval.contains(interval, new JulianDate(2451546))).toEqual(
false
);
});
it("equals and equalsEpsilon work", function () {
var left = new TimeInterval();
var right = new TimeInterval();
expect(left.equals(right)).toEqual(true);
expect(left.equalsEpsilon(right, 0)).toEqual(true);
right = new TimeInterval();
right.start = new JulianDate(-1);
expect(left.equals(right)).toEqual(false);
expect(left.equalsEpsilon(right, 0)).toEqual(false);
right = new TimeInterval();
right.stop = new JulianDate(1);
expect(left.equals(right)).toEqual(false);
expect(left.equalsEpsilon(right, 0)).toEqual(false);
right = new TimeInterval();
right.isStartIncluded = false;
expect(left.equals(right)).toEqual(false);
expect(left.equalsEpsilon(right, 0)).toEqual(false);
right = new TimeInterval();
right.isStopIncluded = false;
expect(left.equals(right)).toEqual(false);
expect(left.equalsEpsilon(right, 0)).toEqual(false);
left = new TimeInterval();
right = new TimeInterval();
right.data = {};
expect(left.equals(right)).toEqual(false);
expect(left.equalsEpsilon(right, 0)).toEqual(false);
expect(left.equals(right, returnTrue)).toEqual(true);
expect(left.equalsEpsilon(right, 0, returnTrue)).toEqual(true);
expect(TimeInterval.equals(undefined, undefined)).toEqual(true);
expect(TimeInterval.equalsEpsilon(undefined, undefined, 0)).toEqual(true);
expect(TimeInterval.equals(left, undefined)).toEqual(false);
expect(TimeInterval.equalsEpsilon(left, undefined, 0)).toEqual(false);
expect(TimeInterval.equals(undefined, right)).toEqual(false);
expect(TimeInterval.equalsEpsilon(undefined, right, 0)).toEqual(false);
});
it("equalsEpsilon works within threshold", function () {
var left = new TimeInterval({
start: new JulianDate(0),
stop: new JulianDate(1),
});
var right = new TimeInterval({
start: new JulianDate(0),
stop: new JulianDate(1, 1),
});
expect(left.equalsEpsilon(right, 1)).toEqual(true);
expect(left.equalsEpsilon(right, 0.99)).toEqual(false);
});
it("clone returns an identical interval", function () {
var interval = new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(2.5),
isStartIncluded: true,
isStopIncluded: false,
data: 12,
});
expect(interval.clone()).toEqual(interval);
});
it("clone works with a result parameter", function () {
var result = new TimeInterval();
var interval = new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(2.5),
isStartIncluded: true,
isStopIncluded: false,
data: 12,
});
var returnedResult = interval.clone(result);
expect(returnedResult).toBe(result);
expect(returnedResult).toEqual(interval);
});
it("clone returns undefined when parameter is undefined", function () {
expect(TimeInterval.clone(undefined)).toBeUndefined();
});
it("formats as ISO8601 with toString", function () {
var interval = new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(2.5),
});
expect(interval.toString()).toEqual(TimeInterval.toIso8601(interval));
});
it("intersect properly intersects with an exhaustive set of cases", function () {
var testParameters = [
new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(2.5),
isStartIncluded: true,
isStopIncluded: true,
}),
new TimeInterval({
start: new JulianDate(1.5),
stop: new JulianDate(2),
isStartIncluded: true,
isStopIncluded: true,
}),
new TimeInterval({
start: new JulianDate(1.5),
stop: new JulianDate(2),
isStartIncluded: true,
isStopIncluded: true,
}),
new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(2.5),
isStartIncluded: true,
isStopIncluded: true,
}),
new TimeInterval({
start: new JulianDate(3),
stop: new JulianDate(4),
isStartIncluded: true,
isStopIncluded: true,
}),
new TimeInterval({
start: new JulianDate(0),
stop: new JulianDate(0),
isStartIncluded: false,
isStopIncluded: false,
}),
new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(2.5),
isStartIncluded: true,
isStopIncluded: true,
}),
new TimeInterval({
start: new JulianDate(2),
stop: new JulianDate(3),
isStartIncluded: true,
isStopIncluded: true,
}),
new TimeInterval({
start: new JulianDate(2),
stop: new JulianDate(2.5),
isStartIncluded: true,
isStopIncluded: true,
}),
new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(2),
isStartIncluded: true,
isStopIncluded: true,
}),
new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(2),
isStartIncluded: false,
isStopIncluded: false,
}),
new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(2),
isStartIncluded: false,
isStopIncluded: false,
}),
new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(2),
isStartIncluded: true,
isStopIncluded: false,
}),
new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(2),
isStartIncluded: false,
isStopIncluded: true,
}),
new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(2),
isStartIncluded: false,
isStopIncluded: false,
}),
new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(2),
isStartIncluded: true,
isStopIncluded: false,
}),
new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(2),
isStartIncluded: true,
isStopIncluded: false,
}),
new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(2),
isStartIncluded: true,
isStopIncluded: false,
}),
new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(3),
isStartIncluded: false,
isStopIncluded: false,
}),
new TimeInterval({
start: new JulianDate(2),
stop: new JulianDate(4),
isStartIncluded: false,
isStopIncluded: false,
}),
new TimeInterval({
start: new JulianDate(2),
stop: new JulianDate(3),
isStartIncluded: false,
isStopIncluded: false,
}),
new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(3),
isStartIncluded: false,
isStopIncluded: false,
}),
new TimeInterval({
start: new JulianDate(2),
stop: new JulianDate(4),
isStartIncluded: true,
isStopIncluded: true,
}),
new TimeInterval({
start: new JulianDate(2),
stop: new JulianDate(3),
isStartIncluded: true,
isStopIncluded: false,
}),
new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(1),
isStartIncluded: false,
isStopIncluded: false,
}),
new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(2),
isStartIncluded: true,
isStopIncluded: true,
}),
new TimeInterval({
start: new JulianDate(0),
stop: new JulianDate(0),
isStartIncluded: false,
isStopIncluded: false,
}),
new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(3),
isStartIncluded: true,
isStopIncluded: true,
}),
new TimeInterval({
start: new JulianDate(2),
stop: new JulianDate(3),
isStartIncluded: true,
isStopIncluded: true,
}),
new TimeInterval({
start: new JulianDate(2),
stop: new JulianDate(3),
isStartIncluded: true,
isStopIncluded: true,
}),
new TimeInterval({
start: new JulianDate(3),
stop: new JulianDate(2),
isStartIncluded: true,
isStopIncluded: true,
}),
new TimeInterval({
start: new JulianDate(3),
stop: new JulianDate(3),
isStartIncluded: true,
isStopIncluded: true,
}),
new TimeInterval({
start: new JulianDate(0),
stop: new JulianDate(0),
isStartIncluded: false,
isStopIncluded: false,
}),
];
for (var i = 0; i < testParameters.length - 2; i = i + 3) {
var first = testParameters[i];
var second = testParameters[i + 1];
var expectedResult = testParameters[i + 2];
var intersect1 = TimeInterval.intersect(
first,
second,
new TimeInterval()
);
var intersect2 = TimeInterval.intersect(
second,
first,
new TimeInterval()
);
expect(intersect1).toEqual(intersect2);
expect(intersect2).toEqual(intersect1);
expect(expectedResult).toEqual(intersect1);
}
});
it("intersect with undefined results in an empty interval.", function () {
var interval = new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(2),
});
expect(
TimeInterval.intersect(interval, undefined, new TimeInterval())
).toEqual(TimeInterval.EMPTY);
});
it("intersect with a merge callback properly merges data.", function () {
var oneToThree = new TimeInterval({
start: new JulianDate(1),
stop: new JulianDate(3),
data: 2,
});
var twoToFour = new TimeInterval({
start: new JulianDate(2),
stop: new JulianDate(4),
data: 3,
});
var twoToThree = TimeInterval.intersect(
oneToThree,
twoToFour,
new TimeInterval(),
function (left, right) {
return left + right;
}
);
expect(twoToThree.start).toEqual(twoToFour.start);
expect(twoToThree.stop).toEqual(oneToThree.stop);
expect(twoToThree.isStartIncluded).toEqual(true);
expect(twoToThree.isStopIncluded).toEqual(true);
expect(twoToThree.data).toEqual(5);
});
it("fromIso8601 throws without options object.", function () {
expect(function () {
TimeInterval.fromIso8601(undefined);
}).toThrowDeveloperError();
});
it("fromIso8601 throws without iso8601.", function () {
expect(function () {
TimeInterval.fromIso8601({});
}).toThrowDeveloperError();
});
it("intersect throws without left.", function () {
var right = new TimeInterval();
var result = new TimeInterval();
expect(function () {
TimeInterval.intersect(undefined, right, result);
}).toThrowDeveloperError();
});
it("contains throws without interval.", function () {
var date = new JulianDate();
expect(function () {
TimeInterval.contains(undefined, date);
}).toThrowDeveloperError();
});
it("contains throws without date.", function () {
var timeInterval = new TimeInterval();
expect(function () {
TimeInterval.contains(timeInterval, undefined);
}).toThrowDeveloperError();
});
});