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
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();
|
|
});
|
|
});
|