Files
workinf_Blender_Wasm/web/tests/e2e/sequencer-audio-recovery.spec.ts
mes123456 0fe8d2bb56
Some checks failed
M6 deployable RC / quick (push) Has been cancelled
M6 deployable RC / chromium (push) Has been cancelled
M6 deployable RC / release (push) Has been cancelled
Advance M8-M11 parity workflows
2026-08-17 04:37:07 -04:00

73 lines
3.4 KiB
TypeScript

import { expect, test } from "@playwright/test";
import fs from "node:fs";
import path from "node:path";
const root = path.resolve(import.meta.dirname, "../../..");
const golden = JSON.parse(fs.readFileSync(path.join(root, "tests/golden/M11-13/sequencer-audio-recovery.json"), "utf8")) as {
outputGain: number;
lifecycle: Array<[string, string, boolean, number, string | null]>;
missingDevice: [string, string, string];
};
test("M11-13 suspends, resumes, mutes, recovers, and closes a Chromium AudioContext", async ({ page }) => {
await page.goto("/");
await page.evaluate((outputGain) => {
const button = document.createElement("button");
button.id = "m11-audio-user-gesture";
button.textContent = "Start audio test";
document.body.append(button);
const result = new Promise((resolve, reject) => {
button.addEventListener("click", async () => {
try {
const { SequencerAudioSession } = await import("/src/sequencer/SequencerAudioSession.ts");
const summarize = (report: import("/src/sequencer/SequencerAudioSession.ts").SequencerAudioSessionReportIR) => [
report.contextState,
report.outputState,
report.muted,
report.outputGain,
report.issueCode,
];
const supported = "AudioContext" in globalThis;
const session = new SequencerAudioSession({ outputGain });
const initialized = await session.initialize();
const lifecycle = [];
lifecycle.push(summarize(await session.suspend()));
lifecycle.push(summarize(session.setMuted(true)));
lifecycle.push(summarize(await session.resume()));
lifecycle.push(summarize(session.setMuted(false)));
lifecycle.push(summarize(await session.suspend()));
lifecycle.push(summarize(await session.resume()));
lifecycle.push(summarize(await session.close()));
const missingSession = new SequencerAudioSession({ scope: {}, outputGain });
const missing = await missingSession.initialize();
const missingDevice = [missing.contextState, missing.outputState, missing.issueCode];
const missingClosed = await missingSession.close();
resolve({ supported, initialized, lifecycle, missingDevice, missingClosed });
}
catch (error) {
reject(error);
}
}, { once: true });
});
(globalThis as typeof globalThis & { __m11AudioResult?: Promise<unknown> }).__m11AudioResult = result;
}, golden.outputGain);
await page.locator("#m11-audio-user-gesture").click();
const result = await page.evaluate(() =>
(globalThis as typeof globalThis & { __m11AudioResult: Promise<unknown> }).__m11AudioResult) as {
supported: boolean;
initialized: { contextState: string; issueCode: string | null };
lifecycle: Array<[string, string, boolean, number, string | null]>;
missingDevice: [string, string, string];
missingClosed: { contextState: string; outputState: string; outputGain: number };
};
expect(result.supported).toBe(true);
expect(["RUNNING", "SUSPENDED"]).toContain(result.initialized.contextState);
expect(result.initialized.issueCode).toBeNull();
expect(result.lifecycle).toEqual(golden.lifecycle);
expect(result.missingDevice).toEqual(golden.missingDevice);
expect(result.missingClosed).toMatchObject({ contextState: "CLOSED", outputState: "SILENT", outputGain: 0 });
});