Spaces:
Configuration error
Configuration error
File size: 1,987 Bytes
9f21d0a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | import { describe, expect, test } from "vitest";
import { SAMPLES_PER_ORBIT, trajectoryWindow, WINDOW_ORBITS_BACK, WINDOW_ORBITS_FORWARD } from "./trajectoryWindow";
const ISS_PERIOD_MIN = 92.6;
describe("trajectoryWindow", () => {
test("spans half an orbit back and one and a half forward", () => {
const window = trajectoryWindow(ISS_PERIOD_MIN);
const periodSeconds = ISS_PERIOD_MIN * 60;
expect(window.offsetSeconds).toBeCloseTo(-periodSeconds * WINDOW_ORBITS_BACK, 6);
expect(window.spanSeconds).toBeCloseTo(periodSeconds * (WINDOW_ORBITS_BACK + WINDOW_ORBITS_FORWARD), 6);
});
test("steps at the sampling rate and counts the closing boundary", () => {
const window = trajectoryWindow(ISS_PERIOD_MIN);
expect(window.stepSeconds).toBeCloseTo((ISS_PERIOD_MIN * 60) / SAMPLES_PER_ORBIT, 6);
// Two orbits at 120 a revolution is 240 steps, and the loop takes the stop
// boundary as well. The running app reported exactly 241 samples a satellite.
expect(window.sampleCount).toBe(241);
});
test("scales with the period rather than assuming LEO", () => {
// A geostationary period: the same 241 samples, spread far wider.
const geo = trajectoryWindow(1436);
expect(geo.sampleCount).toBe(241);
expect(geo.stepSeconds).toBeCloseTo((1436 * 60) / SAMPLES_PER_ORBIT, 6);
});
test("an unusable period yields an empty window rather than NaN", () => {
// A satrec that failed to parse reports no mean motion, and the period comes
// out zero or infinite. Dividing that would give a NaN sample count and, in
// the worker, a NaN-sized buffer.
for (const period of [0, -1, Number.NaN, Number.POSITIVE_INFINITY]) {
const window = trajectoryWindow(period);
expect(window.sampleCount).toBe(0);
expect(Number.isFinite(window.stepSeconds)).toBe(true);
expect(Number.isFinite(window.offsetSeconds)).toBe(true);
expect(Number.isFinite(window.spanSeconds)).toBe(true);
}
});
});
|