Files
webeditor3d/tests/domain/bundled-foliage.test.ts

69 lines
2.2 KiB
TypeScript
Raw Normal View History

import { describe, expect, it } from "vitest";
import {
EXPECTED_BUNDLED_FOLIAGE_PROTOTYPE_COUNT,
groupBundledFoliageFiles,
validateBundledFoliageManifest
} from "../../src/foliage/bundled-foliage";
import {
BUNDLED_FOLIAGE_PROTOTYPES,
BUNDLED_FOLIAGE_RELATIVE_PATHS
} from "../../src/foliage/bundled-foliage-manifest";
describe("bundled foliage manifest", () => {
it("groups the copied 160 GLBs into 40 complete prototype LOD chains", () => {
const grouping = groupBundledFoliageFiles(
BUNDLED_FOLIAGE_RELATIVE_PATHS
);
expect(BUNDLED_FOLIAGE_RELATIVE_PATHS).toHaveLength(160);
expect(grouping.diagnostics).toEqual([]);
expect(grouping.groups).toHaveLength(
EXPECTED_BUNDLED_FOLIAGE_PROTOTYPE_COUNT
);
expect(
grouping.groups.every(
(group) =>
group.lods.map((lod) => lod.level).join(",") === "0,1,2,3"
)
).toBe(true);
});
it("exposes a complete engine manifest with bundled LOD paths", () => {
expect(validateBundledFoliageManifest(BUNDLED_FOLIAGE_PROTOTYPES)).toEqual(
[]
);
expect(BUNDLED_FOLIAGE_PROTOTYPES).toHaveLength(40);
expect(
BUNDLED_FOLIAGE_PROTOTYPES.every((prototype) =>
prototype.lods.every(
(lod) =>
lod.source === "bundled" &&
lod.bundledPath.startsWith("/foliage/") &&
lod.bundledPath.endsWith(`_LOD${lod.level}.glb`)
)
)
).toBe(true);
});
it("reports duplicate, missing, and invalid filename groups", () => {
const grouping = groupBundledFoliageFiles([
"Grass/Foo/Foo_LOD0.glb",
"Other/Foo/Foo_LOD0.glb",
"Grass/Foo/Foo_LOD4.glb",
"Grass/Foo/Foo_low.glb"
]);
expect(grouping.diagnostics).toEqual(
expect.arrayContaining([
expect.objectContaining({ code: "duplicate-foliage-lod" }),
expect.objectContaining({ code: "invalid-foliage-lod-level" }),
expect.objectContaining({ code: "invalid-foliage-filename" }),
expect.objectContaining({ code: "missing-foliage-lod", level: 1 }),
expect.objectContaining({ code: "missing-foliage-lod", level: 2 }),
expect.objectContaining({ code: "missing-foliage-lod", level: 3 })
])
);
});
});