feat(scada): add manual monitoring timeline
Generic Container CI/CD / test-build-publish (push) Successful in 1m12s
Frontend CI/CD / build-test-publish-and-deploy (push) Successful in 1m12s

This commit is contained in:
2026-11-04 14:27:08 +08:00
parent 78481903d7
commit 0801e161ec
22 changed files with 1314 additions and 664 deletions
@@ -0,0 +1,32 @@
import { describe, expect, it } from "vitest";
import { formatMonitoringInterval, moveTimelineTime, snapTimelineTime } from "./scada-replay-time";
const minute = 60_000;
const start = Date.parse("2026-10-08T08:07:00+08:00");
describe("SCADA timeline timestamps", () => {
it("quantizes continuous pointer positions to five-minute SCADA timestamps", () => {
const end = start + 60 * minute;
expect(snapTimelineTime(Date.parse("2026-10-08T08:26:00+08:00"), start, end, 5 * minute))
.toBe(Date.parse("2026-10-08T08:25:00+08:00"));
expect(snapTimelineTime(Date.parse("2026-10-08T08:28:00+08:00"), start, end, 5 * minute))
.toBe(Date.parse("2026-10-08T08:30:00+08:00"));
});
it("moves keyboard controls between clock-aligned five-minute timestamps", () => {
const end = start + 60 * minute;
expect(moveTimelineTime(start, start, end, 5 * minute, 1)).toBe(Date.parse("2026-10-08T08:10:00+08:00"));
expect(moveTimelineTime(start + 6 * minute, start, end, 5 * minute, -1)).toBe(Date.parse("2026-10-08T08:10:00+08:00"));
});
it("reaches exact range endpoints and never leaves the selected range", () => {
const end = start + 22 * minute;
expect(moveTimelineTime(end - minute, start, end, 5 * minute, 1)).toBe(end);
expect(moveTimelineTime(start + minute, start, end, 5 * minute, -1)).toBe(start);
});
it("formats the independent project monitoring period", () => {
expect(formatMonitoringInterval(900)).toBe("15 分钟");
expect(formatMonitoringInterval(91)).toBe("91 秒");
});
});