Advance M8-M11 parity workflows
This commit is contained in:
43
web/tests/e2e/render-routing.spec.ts
Normal file
43
web/tests/e2e/render-routing.spec.ts
Normal file
@@ -0,0 +1,43 @@
|
||||
import { expect, test } from "@playwright/test";
|
||||
import fs from "node:fs";
|
||||
import path from "node:path";
|
||||
|
||||
const root = path.resolve(import.meta.dirname, "../../..");
|
||||
const blend = fs.readFileSync(path.join(root, "tests/files/web/m11_render_reference.blend"));
|
||||
const golden = JSON.parse(fs.readFileSync(path.join(root, "tests/golden/M11-05/render-routing.json"), "utf8"));
|
||||
|
||||
test("M11-05 exposes fail-closed render routing for Web, server and hardware capabilities", async ({ page }) => {
|
||||
await page.goto("/");
|
||||
const result = await page.evaluate(async (input) => {
|
||||
const { routeRenderExecution } = await import("/src/three-adapter/render-routing.ts");
|
||||
const { WebEngineClient } = await import("/src/engine-client/WebEngineClient.ts");
|
||||
const client = new WebEngineClient({ timeoutMs: 30_000 });
|
||||
try {
|
||||
const opened = await client.openBlend(Uint8Array.from(input).buffer);
|
||||
const sourceRenderEngine = opened.snapshot.scenes[0]?.renderEngine;
|
||||
if (sourceRenderEngine !== "BLENDER_EEVEE" && sourceRenderEngine !== "BLENDER_EEVEE_NEXT") throw new Error(`Unexpected fixture render engine: ${sourceRenderEngine}`);
|
||||
const base = { schemaVersion: 1 as const, renderEngine: sourceRenderEngine, backend: "WEBGL2" as const, complexity: "BOUNDED" as const };
|
||||
const bounded = routeRenderExecution(base);
|
||||
const cycles = routeRenderExecution({ ...base, renderEngine: "BLENDER_CYCLES", backend: "CYCLES" });
|
||||
const complex = routeRenderExecution({ ...base, backend: "EEVEE_COMPLEX", complexity: "COMPLEX" });
|
||||
const hardware = routeRenderExecution({ ...base, hardwareBackend: "OPTIX" });
|
||||
const availableServer = routeRenderExecution({ ...base, renderEngine: "BLENDER_CYCLES", backend: "CYCLES" }, { serverRenderAvailable: true });
|
||||
const unavailableGpu = routeRenderExecution({ ...base, backend: "WEBGPU" });
|
||||
const unknownEngine = routeRenderExecution({ ...base, renderEngine: "UNKNOWN_ENGINE" });
|
||||
return { sourceRenderEngine, bounded, cycles, complex, hardware, availableServer, unavailableGpu, unknownEngine };
|
||||
}
|
||||
finally { client.terminate(); }
|
||||
}, Array.from(blend));
|
||||
|
||||
expect(result.sourceRenderEngine).toBe("BLENDER_EEVEE");
|
||||
expect(result.bounded).toMatchObject(golden.boundedEevee);
|
||||
for (const serverResult of [result.cycles, result.complex, result.hardware]) {
|
||||
expect(serverResult).toMatchObject({ target: "SERVER_JOB", status: "BLOCKED" });
|
||||
expect(serverResult.issues[0].code).toBe("SERVER_JOB_UNAVAILABLE");
|
||||
}
|
||||
expect(result.availableServer).toMatchObject({ target: golden.cycles.target, ...golden.cycles.withEndpoint });
|
||||
expect(result.unavailableGpu).toMatchObject({ target: golden.webgpu.target, status: golden.webgpu.status });
|
||||
expect(result.unavailableGpu.issues[0].code).toBe(golden.webgpu.code);
|
||||
expect(result.unknownEngine).toMatchObject({ target: golden.unknownEngine.target, status: golden.unknownEngine.status, capability: golden.unknownEngine.capability });
|
||||
expect(result.unknownEngine.issues[0].code).toBe(golden.unknownEngine.code);
|
||||
});
|
||||
Reference in New Issue
Block a user