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.

559 lines
17 KiB
JavaScript

import { Cartesian3 } from "../../Source/Cesium.js";
import { ExtrapolationType } from "../../Source/Cesium.js";
import { JulianDate } from "../../Source/Cesium.js";
import { LagrangePolynomialApproximation } from "../../Source/Cesium.js";
import { LinearApproximation } from "../../Source/Cesium.js";
import { ReferenceFrame } from "../../Source/Cesium.js";
import { TimeInterval } from "../../Source/Cesium.js";
import { PositionProperty } from "../../Source/Cesium.js";
import { SampledPositionProperty } from "../../Source/Cesium.js";
describe("DataSources/SampledPositionProperty", function () {
it("constructor sets expected defaults", function () {
var property = new SampledPositionProperty();
expect(property.referenceFrame).toEqual(ReferenceFrame.FIXED);
expect(property.interpolationDegree).toEqual(1);
expect(property.interpolationAlgorithm).toEqual(LinearApproximation);
expect(property.numberOfDerivatives).toEqual(0);
expect(property.forwardExtrapolationType).toEqual(ExtrapolationType.NONE);
expect(property.forwardExtrapolationDuration).toEqual(0);
expect(property.backwardExtrapolationType).toEqual(ExtrapolationType.NONE);
expect(property.backwardExtrapolationDuration).toEqual(0);
});
it("constructor sets expected values", function () {
var property = new SampledPositionProperty(ReferenceFrame.INERTIAL, 1);
expect(property.referenceFrame).toEqual(ReferenceFrame.INERTIAL);
expect(property.interpolationDegree).toEqual(1);
expect(property.interpolationAlgorithm).toEqual(LinearApproximation);
expect(property.numberOfDerivatives).toEqual(1);
expect(property.forwardExtrapolationType).toEqual(ExtrapolationType.NONE);
expect(property.forwardExtrapolationDuration).toEqual(0);
expect(property.backwardExtrapolationType).toEqual(ExtrapolationType.NONE);
expect(property.backwardExtrapolationDuration).toEqual(0);
});
it("getValue works without a result parameter", function () {
var time = JulianDate.now();
var value = new Cartesian3(1, 2, 3);
var property = new SampledPositionProperty();
property.addSample(time, value);
var result = property.getValue(time);
expect(result).not.toBe(value);
expect(result).toEqual(value);
});
it("getValue works with a result parameter", function () {
var time = JulianDate.now();
var value = new Cartesian3(1, 2, 3);
var property = new SampledPositionProperty();
property.addSample(time, value);
var expected = new Cartesian3();
var result = property.getValue(time, expected);
expect(result).toBe(expected);
expect(expected).toEqual(value);
});
it("getValue returns in fixed frame", function () {
var time = JulianDate.now();
var valueInertial = new Cartesian3(1, 2, 3);
var valueFixed = PositionProperty.convertToReferenceFrame(
time,
valueInertial,
ReferenceFrame.INERTIAL,
ReferenceFrame.FIXED
);
var property = new SampledPositionProperty(ReferenceFrame.INERTIAL);
property.addSample(time, valueInertial);
var result = property.getValue(time);
expect(result).toEqual(valueFixed);
});
it("getValueInReferenceFrame works without a result parameter", function () {
var time = JulianDate.now();
var value = new Cartesian3(1, 2, 3);
var property = new SampledPositionProperty();
property.addSample(time, value);
var result = property.getValueInReferenceFrame(
time,
ReferenceFrame.INERTIAL
);
expect(result).not.toBe(value);
expect(result).toEqual(
PositionProperty.convertToReferenceFrame(
time,
value,
ReferenceFrame.FIXED,
ReferenceFrame.INERTIAL
)
);
});
it("getValueInReferenceFrame works with a result parameter", function () {
var time = JulianDate.now();
var value = new Cartesian3(1, 2, 3);
var property = new SampledPositionProperty(ReferenceFrame.INERTIAL);
property.addSample(time, value);
var expected = new Cartesian3();
var result = property.getValueInReferenceFrame(
time,
ReferenceFrame.FIXED,
expected
);
expect(result).toBe(expected);
expect(expected).toEqual(
PositionProperty.convertToReferenceFrame(
time,
value,
ReferenceFrame.INERTIAL,
ReferenceFrame.FIXED
)
);
});
it("addSamplesPackedArray works", function () {
var data = [0, 7, 8, 9, 1, 8, 9, 10, 2, 9, 10, 11];
var epoch = new JulianDate(0, 0);
var property = new SampledPositionProperty();
property.addSamplesPackedArray(data, epoch);
expect(property.getValue(epoch)).toEqual(new Cartesian3(7, 8, 9));
expect(property.getValue(new JulianDate(0, 0.5))).toEqual(
new Cartesian3(7.5, 8.5, 9.5)
);
});
it("addSample works", function () {
var times = [
new JulianDate(0, 0),
new JulianDate(1, 0),
new JulianDate(2, 0),
];
var values = [
new Cartesian3(7, 8, 9),
new Cartesian3(8, 9, 10),
new Cartesian3(9, 10, 11),
];
var property = new SampledPositionProperty();
property.addSample(times[0], values[0]);
property.addSample(times[1], values[1]);
property.addSample(times[2], values[2]);
expect(property.getValue(times[0])).toEqual(values[0]);
expect(property.getValue(times[1])).toEqual(values[1]);
expect(property.getValue(times[2])).toEqual(values[2]);
expect(property.getValue(new JulianDate(0.5, 0))).toEqual(
new Cartesian3(7.5, 8.5, 9.5)
);
});
it("addSamples works", function () {
var times = [
new JulianDate(0, 0),
new JulianDate(1, 0),
new JulianDate(2, 0),
];
var values = [
new Cartesian3(7, 8, 9),
new Cartesian3(8, 9, 10),
new Cartesian3(9, 10, 11),
];
var property = new SampledPositionProperty();
property.addSamples(times, values);
expect(property.getValue(times[0])).toEqual(values[0]);
expect(property.getValue(times[1])).toEqual(values[1]);
expect(property.getValue(times[2])).toEqual(values[2]);
expect(property.getValue(new JulianDate(0.5, 0))).toEqual(
new Cartesian3(7.5, 8.5, 9.5)
);
});
it("can remove a sample at a date", function () {
var times = [
new JulianDate(0, 0),
new JulianDate(1, 0),
new JulianDate(2, 0),
];
var values = [
new Cartesian3(7, 8, 9),
new Cartesian3(18, 19, 110),
new Cartesian3(9, 10, 11),
];
var property = new SampledPositionProperty();
property.addSamples(times, values);
var listener = jasmine.createSpy("listener");
property.definitionChanged.addEventListener(listener);
var result = property.removeSample(new JulianDate(4, 0));
expect(result).toEqual(false);
result = property.removeSample(times[1]);
expect(listener).toHaveBeenCalledWith(property);
expect(property.getValue(times[0])).toEqual(values[0]);
expect(result).toEqual(true);
// removing the sample at times[1] causes the property to interpolate
expect(property.getValue(times[1])).toEqual(new Cartesian3(8, 9, 10));
expect(property.getValue(times[2])).toEqual(values[2]);
});
it("can remove samples for a time interval", function () {
var times = [
new JulianDate(0, 0),
new JulianDate(1, 0),
new JulianDate(2, 0),
new JulianDate(3, 0),
];
var values = [
new Cartesian3(7, 8, 9),
new Cartesian3(18, 19, 110),
new Cartesian3(19, 20, 110),
new Cartesian3(10, 11, 12),
];
var property = new SampledPositionProperty();
property.addSamples(times, values);
var listener = jasmine.createSpy("listener");
property.definitionChanged.addEventListener(listener);
property.removeSamples(
new TimeInterval({
start: times[1],
stop: times[2],
})
);
expect(listener).toHaveBeenCalledWith(property);
expect(property.getValue(times[0])).toEqual(values[0]);
// removing the samples causes the property to interpolate
expect(property.getValue(times[1])).toEqual(new Cartesian3(8, 9, 10));
expect(property.getValue(times[2])).toEqual(new Cartesian3(9, 10, 11));
expect(property.getValue(times[3])).toEqual(values[3]);
});
it("addSamplesPackedArray works with derivatives", function () {
var data = [
0,
7,
8,
9,
1,
0,
0,
1,
8,
9,
10,
0,
1,
0,
2,
9,
10,
11,
0,
0,
1,
];
var epoch = new JulianDate(0, 0);
var property = new SampledPositionProperty(ReferenceFrame.FIXED, 1);
property.addSamplesPackedArray(data, epoch);
expect(property.getValue(epoch)).toEqual(new Cartesian3(7, 8, 9));
expect(property.getValue(new JulianDate(0, 0.5))).toEqual(
new Cartesian3(7.5, 8.5, 9.5)
);
});
it("addSample works with derivatives", function () {
var times = [
new JulianDate(0, 0),
new JulianDate(1, 0),
new JulianDate(2, 0),
];
var positions = [
new Cartesian3(7, 8, 9),
new Cartesian3(8, 9, 10),
new Cartesian3(9, 10, 11),
];
var velocities = [
[new Cartesian3(0, 0, 1)],
[new Cartesian3(0, 1, 0)],
[new Cartesian3(1, 0, 0)],
];
var property = new SampledPositionProperty(ReferenceFrame.FIXED, 1);
property.addSample(times[0], positions[0], velocities[0]);
property.addSample(times[1], positions[1], velocities[1]);
property.addSample(times[2], positions[2], velocities[2]);
expect(property.getValue(times[0])).toEqual(positions[0]);
expect(property.getValue(times[1])).toEqual(positions[1]);
expect(property.getValue(times[2])).toEqual(positions[2]);
expect(property.getValue(new JulianDate(0.5, 0))).toEqual(
new Cartesian3(7.5, 8.5, 9.5)
);
});
it("addSamples works with derivatives", function () {
var times = [
new JulianDate(0, 0),
new JulianDate(1, 0),
new JulianDate(2, 0),
];
var positions = [
new Cartesian3(7, 8, 9),
new Cartesian3(8, 9, 10),
new Cartesian3(9, 10, 11),
];
var velocities = [
[new Cartesian3(0, 0, 1)],
[new Cartesian3(0, 1, 0)],
[new Cartesian3(1, 0, 0)],
];
var property = new SampledPositionProperty(ReferenceFrame.FIXED, 1);
property.addSamples(times, positions, velocities);
expect(property.getValue(times[0])).toEqual(positions[0]);
expect(property.getValue(times[1])).toEqual(positions[1]);
expect(property.getValue(times[2])).toEqual(positions[2]);
expect(property.getValue(new JulianDate(0.5, 0))).toEqual(
new Cartesian3(7.5, 8.5, 9.5)
);
});
it("addSample throws when derivative is undefined but expected", function () {
var property = new SampledPositionProperty(ReferenceFrame.FIXED, 1);
expect(function () {
property.addSample(
new JulianDate(0, 0),
new Cartesian3(7, 8, 9),
undefined
);
}).toThrowDeveloperError();
});
it("addSamples throws when derivative is undefined but expected", function () {
var times = [
new JulianDate(0, 0),
new JulianDate(1, 0),
new JulianDate(2, 0),
];
var positions = [
new Cartesian3(7, 8, 9),
new Cartesian3(8, 9, 10),
new Cartesian3(9, 10, 11),
];
var property = new SampledPositionProperty(ReferenceFrame.FIXED, 1);
expect(function () {
property.addSamples(times, positions, undefined);
}).toThrowDeveloperError();
});
it("addSamples throws when derivative is not the correct length", function () {
var times = [
new JulianDate(0, 0),
new JulianDate(1, 0),
new JulianDate(2, 0),
];
var positions = [
new Cartesian3(7, 8, 9),
new Cartesian3(8, 9, 10),
new Cartesian3(9, 10, 11),
];
var velocities = [[new Cartesian3(7, 8, 9)], [new Cartesian3(8, 9, 10)]];
var property = new SampledPositionProperty(ReferenceFrame.FIXED, 1);
expect(function () {
property.addSamples(times, positions, velocities);
}).toThrowDeveloperError();
});
it("can set interpolationAlgorithm and degree", function () {
var data = [0, 7, 8, 9, 1, 8, 9, 10, 2, 9, 10, 11];
var epoch = new JulianDate(0, 0);
var timesCalled = 0;
var MockInterpolation = {
type: "Mock",
getRequiredDataPoints: function (degree) {
return 3;
},
interpolateOrderZero: function (x, xTable, yTable, yStride, result) {
expect(x).toEqual(1);
expect(xTable.length).toEqual(3);
expect(xTable[0]).toBe(-2);
expect(xTable[1]).toBe(-1);
expect(xTable[2]).toBe(0);
expect(yTable.length).toEqual(9);
expect(yTable[0]).toBe(7);
expect(yTable[1]).toBe(8);
expect(yTable[2]).toBe(9);
expect(yTable[3]).toBe(8);
expect(yTable[4]).toBe(9);
expect(yTable[5]).toBe(10);
expect(yTable[6]).toBe(9);
expect(yTable[7]).toBe(10);
expect(yTable[8]).toBe(11);
expect(yStride).toEqual(3);
expect(result.length).toEqual(3);
result[0] = 2;
result[1] = 3;
result[2] = 4;
timesCalled++;
return result;
},
};
var property = new SampledPositionProperty();
property.forwardExtrapolationType = ExtrapolationType.EXTRAPOLATE;
property.addSamplesPackedArray(data, epoch);
property.setInterpolationOptions({
interpolationDegree: 2,
interpolationAlgorithm: MockInterpolation,
});
expect(property.getValue(epoch)).toEqual(new Cartesian3(7, 8, 9));
expect(property.getValue(new JulianDate(0, 3))).toEqual(
new Cartesian3(2, 3, 4)
);
expect(timesCalled).toEqual(1);
});
it("Returns undefined if trying to interpolate with less than enough samples.", function () {
var value = new Cartesian3(1, 2, 3);
var time = new JulianDate(0, 0);
var property = new SampledPositionProperty();
property.addSample(time, value);
expect(property.getValue(time)).toEqual(value);
expect(
property.getValue(JulianDate.addSeconds(time, 4, new JulianDate()))
).toBeUndefined();
});
it("throws with no time parameter", function () {
var property = new SampledPositionProperty();
expect(function () {
property.getValue(undefined);
}).toThrowDeveloperError();
});
it("throws with no reference frame parameter", function () {
var property = new SampledPositionProperty();
var time = JulianDate.now();
expect(function () {
property.getValueInReferenceFrame(time, undefined);
}).toThrowDeveloperError();
});
it("equals works when interpolators differ", function () {
var left = new SampledPositionProperty();
var right = new SampledPositionProperty();
expect(left.equals(right)).toEqual(true);
right.setInterpolationOptions({
interpolationAlgorithm: LagrangePolynomialApproximation,
});
expect(left.equals(right)).toEqual(false);
});
it("equals works when interpolator degree differ", function () {
var left = new SampledPositionProperty();
left.setInterpolationOptions({
interpolationDegree: 2,
interpolationAlgorithm: LagrangePolynomialApproximation,
});
var right = new SampledPositionProperty();
right.setInterpolationOptions({
interpolationDegree: 2,
interpolationAlgorithm: LagrangePolynomialApproximation,
});
expect(left.equals(right)).toEqual(true);
right.setInterpolationOptions({
interpolationDegree: 3,
interpolationAlgorithm: LagrangePolynomialApproximation,
});
expect(left.equals(right)).toEqual(false);
});
it("equals works when reference frames differ", function () {
var left = new SampledPositionProperty(ReferenceFrame.FIXED);
var right = new SampledPositionProperty(ReferenceFrame.INERTIAL);
expect(left.equals(right)).toEqual(false);
});
it("equals works when samples differ", function () {
var left = new SampledPositionProperty();
var right = new SampledPositionProperty();
expect(left.equals(right)).toEqual(true);
var time = JulianDate.now();
var value = new Cartesian3(1, 2, 3);
left.addSample(time, value);
expect(left.equals(right)).toEqual(false);
right.addSample(time, value);
expect(left.equals(right)).toEqual(true);
});
it("raises definitionChanged when extrapolation options change", function () {
var property = new SampledPositionProperty();
var listener = jasmine.createSpy("listener");
property.definitionChanged.addEventListener(listener);
property.forwardExtrapolationType = ExtrapolationType.EXTRAPOLATE;
expect(listener).toHaveBeenCalledWith(property);
listener.calls.reset();
property.forwardExtrapolationDuration = 1.0;
expect(listener).toHaveBeenCalledWith(property);
listener.calls.reset();
property.backwardExtrapolationType = ExtrapolationType.HOLD;
expect(listener).toHaveBeenCalledWith(property);
listener.calls.reset();
property.backwardExtrapolationDuration = 1.0;
expect(listener).toHaveBeenCalledWith(property);
listener.calls.reset();
//No events when reassigning to the same value.
property.forwardExtrapolationType = ExtrapolationType.EXTRAPOLATE;
expect(listener).not.toHaveBeenCalled();
property.forwardExtrapolationDuration = 1.0;
expect(listener).not.toHaveBeenCalled();
property.backwardExtrapolationType = ExtrapolationType.HOLD;
expect(listener).not.toHaveBeenCalled();
property.backwardExtrapolationDuration = 1.0;
expect(listener).not.toHaveBeenCalled();
});
});