Files
workinf_Blender_Wasm/tools/web/check-asset-preview-identity.mjs
mes123456 5a11045ca5
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 Blender 5.2 web parity through M12-03D
2026-08-17 17:30:27 -04:00

51 lines
2.9 KiB
JavaScript

import assert from "node:assert/strict";
import crypto from "node:crypto";
import fs from "node:fs";
import os from "node:os";
import path from "node:path";
import { execFileSync } from "node:child_process";
import { fileURLToPath } from "node:url";
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
const manifest = JSON.parse(fs.readFileSync(path.join(root, "tests/golden/M12-02B/manifest.json"), "utf8"));
const identity = JSON.parse(fs.readFileSync(path.join(root, "tests/golden/M12-02B/identity.json"), "utf8"));
const sha256 = (file) => crypto.createHash("sha256").update(fs.readFileSync(file)).digest("hex");
const blender = process.env.BLENDER_BIN ?? path.join(root, manifest.artifacts.blender.path);
const source = path.join(root, manifest.artifacts.source.path);
const generator = path.join(root, manifest.artifacts.generator.path);
const golden = path.join(root, manifest.artifacts.content.path);
assert.match(execFileSync(blender, ["--version"], { encoding: "utf8" }), /^Blender 5\.2\.0 LTS/m);
assert.equal(sha256(blender), identity.generator.executableSha256);
assert.equal(sha256(generator), identity.generator.scriptSha256);
assert.equal(sha256(source), identity.source.sha256);
assert.equal(fs.statSync(source).size, identity.source.byteLength);
assert.equal(sha256(golden), identity.content.sha256);
assert.equal(fs.statSync(golden).size, identity.content.byteLength);
const temporary = fs.mkdtempSync(path.join(os.tmpdir(), "m12-asset-preview-identity-"));
try {
const first = path.join(temporary, "first.png");
const second = path.join(temporary, "second.png");
for (const output of [first, second]) {
execFileSync(blender, ["--background", "--factory-startup", "--python", generator, "--", source, output], { cwd: root, stdio: "pipe" });
assert.equal(sha256(output), identity.content.sha256);
assert.equal(fs.statSync(output).size, identity.content.byteLength);
}
const probe = [
"import bpy,json",
`a=bpy.data.images.load(${JSON.stringify(source)},check_existing=False)`,
`b=bpy.data.images.load(${JSON.stringify(first)},check_existing=False)`,
"print('M12_PREVIEW_COMPARE='+json.dumps({'source':list(a.size),'content':list(b.size),'max':max(abs(x-y) for x,y in zip(a.pixels[:],b.pixels[:]))},separators=(',',':')))",
].join(";");
const output = execFileSync(blender, ["--background", "--factory-startup", "--python-expr", probe], { cwd: root, encoding: "utf8" });
const line = output.split(/\r?\n/).find((item) => item.startsWith("M12_PREVIEW_COMPARE="));
assert.ok(line);
assert.deepEqual(JSON.parse(line.slice("M12_PREVIEW_COMPARE=".length)), { source: [8, 8], content: [8, 8], max: 0 });
}
finally {
fs.rmSync(temporary, { recursive: true, force: true });
}
process.stdout.write(`asset-preview-identity-ok source=${identity.source.sha256} content=${identity.content.sha256} size=${identity.content.width}x${identity.content.height} next=${manifest.nextTask}\n`);