Initial Commit

This commit is contained in:
2026-05-27 23:47:53 +01:00
parent fbc70f96e6
commit 9b28db724f
18103 changed files with 1600554 additions and 0 deletions

View File

@@ -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);
});
});