feat(catalog): inspect Nitro scales and preview original sprites
This commit is contained in:
1 parent
2619bec165
commit
08b0b5021e
6 files changed
+544
-3
No files matched your search
@@ -0,0 +1,71 @@
|
||||
import { expect, it } from "vitest";
|
||||
import { inspectNitroScales, resolveNitroFrame } from "./nitro-quality";
|
||||
|
||||
const metadata = () => ({
|
||||
assets: { chair_64_a_0_0: { x: 2, y: 3 } },
|
||||
spritesheet: {
|
||||
frames: { chair_64_a_0_0: { frame: { x: 0, y: 0, w: 10, h: 10 } } },
|
||||
},
|
||||
visualizations: [
|
||||
{
|
||||
size: 64,
|
||||
animations: {
|
||||
0: {
|
||||
layers: {
|
||||
0: { frameSequences: { 0: { frames: { 0: { id: 0 } } } } },
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
});
|
||||
it("distinguishes missing 32 from valid authored 64 without generating data", () => {
|
||||
const data = metadata(),
|
||||
before = JSON.stringify(data),
|
||||
report = inspectNitroScales(data, 10, 10);
|
||||
expect(report.scales.map((s) => s.state)).toEqual(["missing", "present"]);
|
||||
expect(JSON.stringify(data)).toBe(before);
|
||||
});
|
||||
it("detects texture bounds and invalid offsets", () => {
|
||||
const data = metadata();
|
||||
data.assets.chair_64_a_0_0.x = NaN;
|
||||
const report = inspectNitroScales(data, 5, 5).scales[1];
|
||||
expect(report.issues.map((i) => i.message)).toEqual([
|
||||
"Invalid sprite offset",
|
||||
"Texture frame is outside the image bounds",
|
||||
]);
|
||||
});
|
||||
it("resolves referenced sprites and mirrors", () => {
|
||||
const data = {
|
||||
...metadata(),
|
||||
assets: {
|
||||
...metadata().assets,
|
||||
chair_32_a_0_0: { source: "chair_64_a_0_0", flipH: true },
|
||||
},
|
||||
};
|
||||
expect(resolveNitroFrame(data, "chair_32_a_0_0")).toMatchObject({
|
||||
name: "chair_64_a_0_0",
|
||||
flipH: true,
|
||||
});
|
||||
});
|
||||
it("detects cycles instead of hanging", () => {
|
||||
expect(() =>
|
||||
resolveNitroFrame(
|
||||
{ assets: { a: { source: "b" }, b: { source: "a" } } },
|
||||
"a",
|
||||
),
|
||||
).toThrow("Cyclic");
|
||||
});
|
||||
it("detects missing animation frames", () => {
|
||||
const data = metadata();
|
||||
data.visualizations[0].animations[0].layers[0].frameSequences[0].frames[0].id = 9;
|
||||
expect(
|
||||
inspectNitroScales(data, 10, 10).scales[1].issues[0].message,
|
||||
).toContain("frame 9");
|
||||
});
|
||||
it("does not invent sprites from visualization metadata alone", () => {
|
||||
expect(
|
||||
inspectNitroScales({ visualizations: [{ size: 32 }] }, 10, 10).scales[0]
|
||||
.state,
|
||||
).toBe("issues");
|
||||
});
|
||||
Reference in new issue
Block a user