import { describe, expect, it, vi } from "@suaveplan/testing/runner"; import { TransportScheduler } from "../src/scheduler/scheduler.js"; import { Transport } from "../src/transport/transport.js"; describe("integration", () => { it("identical FakeClock runs produce identical callback sequences", { timeout: 5000, }, () => { function run(clock: { now: () => number; advance: (s: number) => void; }) { const tr = new Transport({ clock: clock.now, bpm: 120, ppq: 192 }); const scheduler = new TransportScheduler(tr, clock.now, { pollIntervalMs: 10, }); const log: Array<{ id: number; time: number; ticks: number }> = []; let id = 1; tr.schedule(() => { log.push({ id: id++, time: tr.seconds, ticks: tr.ticks }); }, "0:1:0"); tr.start(); scheduler.start(); clock.advance(0.1); clock.advance(0.1); clock.advance(0.1); clock.advance(0.1); clock.advance(0.1); scheduler.stop(); return log; } const clockA = { t: 0, now: () => 0, advance: (s: number) => { clockA.t += s; clockA.now = () => clockA.t; }, }; clockA.now = () => clockA.t; const clockB = { t: 0, now: () => 0, advance: (s: number) => { clockB.t += s; clockB.now = () => clockB.t; }, }; clockB.now = () => clockB.t; const logA = run(clockA); const logB = run(clockB); expect(logA).toEqual(logB); }); it("repeated callback times are sample-accurate under FakeClock", { timeout: 5000, }, () => { const clock = { t: 0, now: () => 0 }; clock.now = () => clock.t; const tr = new Transport({ clock: clock.now, bpm: 120, ppq: 192 }); const cb = vi.fn(); tr.scheduleRepeat(cb, "4n", "0:0:0"); tr.start(); // Manually process windows to simulate scheduler tr._processWindow(0, 0.6); // Fires at tick 0 (start) and tick 192 (0.5s) expect(cb).toHaveBeenCalledTimes(2); const secondCallTime = cb.mock.calls[1]![0]; // The callback time should be close to the expected tick time (0.5s for quarter at 120bpm) expect(secondCallTime).toBeCloseTo(0.5, 2); }); });