Files
webeditor3d/tests/geometry/whitebox-primitives.test.ts

164 lines
4.9 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
createConeBrush,
createRadialPrismBrush,
createTorusBrush,
createWedgeBrush,
deriveBrushSizeFromGeometry
} from "../../src/document/brushes";
import { buildBoxBrushDerivedMeshData, validateBoxBrushGeometry } from "../../src/geometry/box-brush-mesh";
import {
getBrushEdgeIds,
getBrushFaceIds,
getBrushVertexIds
} from "../../src/geometry/whitebox-topology";
describe("whitebox primitives", () => {
it("builds deterministic wedge topology and finite derived mesh data", () => {
const brush = createWedgeBrush({
id: "brush-wedge-test",
size: {
x: 4,
y: 2,
z: 6
}
});
const derivedMesh = buildBoxBrushDerivedMeshData(brush);
expect(brush.rotationDegrees).toEqual({
x: 0,
y: 0,
z: 180
});
expect(getBrushFaceIds(brush)).toEqual([
"bottom",
"back",
"slope",
"left",
"right"
]);
expect(getBrushEdgeIds(brush)).toEqual([
"bottomBack",
"bottomFront",
"bottomLeft",
"bottomRight",
"topBack",
"leftBack",
"rightBack",
"leftSlope",
"rightSlope"
]);
expect(getBrushVertexIds(brush)).toEqual([
"negX_negY_negZ",
"posX_negY_negZ",
"negX_negY_posZ",
"posX_negY_posZ",
"negX_posY_negZ",
"posX_posY_negZ"
]);
expect(validateBoxBrushGeometry(brush)).toEqual([]);
expect(derivedMesh.faceIdsInOrder).toEqual(getBrushFaceIds(brush));
expect(Array.from(derivedMesh.colliderVertices).every(Number.isFinite)).toBe(
true
);
expect(Array.from(derivedMesh.colliderIndices).every(Number.isFinite)).toBe(
true
);
expect(deriveBrushSizeFromGeometry(brush.geometry)).toEqual(brush.size);
});
it("builds deterministic cylinder topology and finite collider buffers", () => {
const brush = createRadialPrismBrush({
id: "brush-cylinder-test",
sideCount: 12,
size: {
x: 4,
y: 3,
z: 4
}
});
const derivedMesh = buildBoxBrushDerivedMeshData(brush);
expect(getBrushFaceIds(brush)).toEqual([
"top",
"bottom",
...Array.from({ length: 12 }, (_, index) => `side-${index}`)
]);
expect(getBrushEdgeIds(brush)).toHaveLength(36);
expect(getBrushVertexIds(brush)).toHaveLength(24);
expect(validateBoxBrushGeometry(brush)).toEqual([]);
expect(derivedMesh.faceIdsInOrder).toEqual(getBrushFaceIds(brush));
expect(
derivedMesh.faceSurfaces.find((surface) => surface.faceId === "top")?.normal
.y
).toBeGreaterThan(0.99);
expect(
derivedMesh.faceSurfaces.find((surface) => surface.faceId === "bottom")?.normal
.y
).toBeLessThan(-0.99);
expect(Array.from(derivedMesh.colliderVertices).every(Number.isFinite)).toBe(
true
);
expect(Array.from(derivedMesh.colliderIndices).every(Number.isFinite)).toBe(
true
);
expect(deriveBrushSizeFromGeometry(brush.geometry)).toEqual(brush.size);
});
it("builds deterministic cone topology and finite collider buffers", () => {
const brush = createConeBrush({
id: "brush-cone-test",
sideCount: 12,
size: {
x: 4,
y: 3,
z: 4
}
});
const derivedMesh = buildBoxBrushDerivedMeshData(brush);
expect(getBrushFaceIds(brush)).toEqual([
"bottom",
...Array.from({ length: 12 }, (_, index) => `side-${index}`)
]);
expect(getBrushEdgeIds(brush)).toHaveLength(24);
expect(getBrushVertexIds(brush)).toHaveLength(13);
expect(validateBoxBrushGeometry(brush)).toEqual([]);
expect(derivedMesh.faceIdsInOrder).toEqual(getBrushFaceIds(brush));
expect(
derivedMesh.faceSurfaces.find((surface) => surface.faceId === "bottom")?.normal
.y
).toBeLessThan(-0.99);
expect(Array.from(derivedMesh.colliderVertices).every(Number.isFinite)).toBe(
true
);
expect(Array.from(derivedMesh.colliderIndices).every(Number.isFinite)).toBe(
true
);
expect(deriveBrushSizeFromGeometry(brush.geometry)).toEqual(brush.size);
});
it("builds deterministic torus topology and finite collider buffers", () => {
const brush = createTorusBrush({
id: "brush-torus-test",
majorSegmentCount: 16,
tubeSegmentCount: 8
});
const derivedMesh = buildBoxBrushDerivedMeshData(brush);
expect(getBrushFaceIds(brush)).toHaveLength(128);
expect(getBrushEdgeIds(brush)).toHaveLength(256);
expect(getBrushVertexIds(brush)).toHaveLength(128);
expect(validateBoxBrushGeometry(brush)).toEqual([]);
expect(derivedMesh.faceIdsInOrder).toEqual(getBrushFaceIds(brush));
expect(Array.from(derivedMesh.colliderVertices).every(Number.isFinite)).toBe(
true
);
expect(Array.from(derivedMesh.colliderIndices).every(Number.isFinite)).toBe(
true
);
expect(deriveBrushSizeFromGeometry(brush.geometry)).toEqual(brush.size);
});
});