75 lines
2.5 KiB
TypeScript
75 lines
2.5 KiB
TypeScript
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);
|
|
});
|
|
});
|