meat/tests/level.test.ts

73 lines
2.3 KiB
TypeScript
Raw Normal View History

import { expect, test } from "bun:test"
import type { Texture } from "../engine/render/Texture"
import { buildLevel } from "../game/level"
import type { Textures } from "../game/textures"
const texture: Texture = { width: 1, height: 1, data: new Uint32Array([0xFFFFFFFF]) }
const textures: Textures = {
floor: texture,
grass: texture,
bark: texture,
birch: texture,
leaf: texture,
needle: texture,
rock: texture,
flower: texture,
wall: texture,
crate: texture,
npc: texture,
frog: texture,
bee: texture,
robin: texture,
skybox: texture,
}
test("game data compiles into a clone-safe engine render scene", () => {
const level = buildLevel(textures)
expect(level.actors).toHaveLength(60)
expect(Object.isFrozen(level.actors)).toBe(true)
expect(Object.isFrozen(level.render)).toBe(true)
expect(Object.isFrozen(level.render.prototypes)).toBe(true)
expect(level.render.prototypes).toHaveLength(3)
expect(level.render.maxInstances).toBe(level.actors.length)
expect(() => structuredClone(level.render)).not.toThrow()
})
test("actor prototype bounds cover local geometry", () => {
const level = buildLevel(textures)
for (const prototype of level.render.prototypes) {
let covered = true
for (const group of prototype.groups) {
const vertices = group.mesh.verts
for (let i = 0; i < vertices.length; i += 5) {
covered &&=
Math.abs(vertices[i]) <= prototype.radius + 1e-6 &&
vertices[i + 1] >= prototype.minY - 1e-6 &&
vertices[i + 1] <= prototype.maxY + 1e-6 &&
Math.abs(vertices[i + 2]) <= prototype.radius + 1e-6
}
}
expect(covered).toBe(true)
}
})
test("chunk bounds cover geometry in every LOD", () => {
const level = buildLevel(textures)
for (const chunk of level.render.chunks) {
let covered = true
for (const group of [...chunk.near, ...chunk.far]) {
const vertices = group.mesh.verts
for (let i = 0; i < vertices.length; i += 5) {
covered &&=
vertices[i] >= chunk.minX &&
vertices[i] <= chunk.maxX &&
vertices[i + 1] >= chunk.minY &&
vertices[i + 1] <= chunk.maxY &&
vertices[i + 2] >= chunk.minZ &&
vertices[i + 2] <= chunk.maxZ
}
}
expect(covered).toBe(true)
}
})