DSDSWeb/static/js/Cesium-1.53/Specs/DataSources/SampledPositionPropertySpec.js

376 lines
16 KiB
JavaScript
Raw Normal View History

2024-07-11 18:02:47 +08:00
defineSuite([
'DataSources/SampledPositionProperty',
'Core/Cartesian3',
'Core/ExtrapolationType',
'Core/JulianDate',
'Core/LagrangePolynomialApproximation',
'Core/LinearApproximation',
'Core/ReferenceFrame',
'DataSources/PositionProperty'
], function(
SampledPositionProperty,
Cartesian3,
ExtrapolationType,
JulianDate,
LagrangePolynomialApproximation,
LinearApproximation,
ReferenceFrame,
PositionProperty) {
'use strict';
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 values = [new Cartesian3(7, 8, 9), new Cartesian3(8, 9, 10), new Cartesian3(9, 10, 11)];
var times = [new JulianDate(0, 0), new JulianDate(1, 0), new JulianDate(2, 0)];
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 values = [new Cartesian3(7, 8, 9), new Cartesian3(8, 9, 10), new Cartesian3(9, 10, 11)];
var times = [new JulianDate(0, 0), new JulianDate(1, 0), new JulianDate(2, 0)];
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('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();
});
});