Initial Commit
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
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);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user