105 lines
3.1 KiB
JavaScript
105 lines
3.1 KiB
JavaScript
|
|
import { expect } from "@esm-bundle/chai";
|
||
|
|
import { VoxelGrid } from "../../src/grid/VoxelGrid.js";
|
||
|
|
import { VoidSeepDepthsGenerator } from "../../src/generation/VoidSeepDepthsGenerator.js";
|
||
|
|
|
||
|
|
// MOCK Browser APIs if missing (though WTR usually provides browser env)
|
||
|
|
// But OffscreenCanvas might need partial mock if headless browser lacks full support or for consistency
|
||
|
|
if (typeof window !== "undefined" && !window.OffscreenCanvas) {
|
||
|
|
class MockCanvas {
|
||
|
|
constructor(width, height) {
|
||
|
|
this.width = width;
|
||
|
|
this.height = height;
|
||
|
|
}
|
||
|
|
getContext(type) {
|
||
|
|
return {
|
||
|
|
createImageData: (w, h) => ({ data: new Uint8ClampedArray(w * h * 4) }),
|
||
|
|
putImageData: () => {},
|
||
|
|
drawImage: () => {},
|
||
|
|
fillStyle: "",
|
||
|
|
fillRect: () => {},
|
||
|
|
strokeStyle: "",
|
||
|
|
beginPath: () => {},
|
||
|
|
moveTo: () => {},
|
||
|
|
lineTo: () => {},
|
||
|
|
stroke: () => {},
|
||
|
|
bezierCurveTo: () => {},
|
||
|
|
createRadialGradient: () => ({ addColorStop: () => {} }),
|
||
|
|
};
|
||
|
|
}
|
||
|
|
transferToImageBitmap() {
|
||
|
|
return {};
|
||
|
|
}
|
||
|
|
}
|
||
|
|
window.OffscreenCanvas = MockCanvas;
|
||
|
|
}
|
||
|
|
|
||
|
|
describe("Generation: VoidSeepDepthsGenerator", () => {
|
||
|
|
it("should generate a void seep map with correct IDs", () => {
|
||
|
|
const grid = new VoxelGrid(40, 20, 40);
|
||
|
|
const generator = new VoidSeepDepthsGenerator(grid, 12345);
|
||
|
|
generator.generate();
|
||
|
|
|
||
|
|
let solidCount = 0;
|
||
|
|
let obsidianCount = 0;
|
||
|
|
let corruptionCount = 0;
|
||
|
|
let glowingPillarCount = 0;
|
||
|
|
|
||
|
|
for (let x = 0; x < grid.size.x; x++) {
|
||
|
|
for (let y = 0; y < grid.size.y; y++) {
|
||
|
|
for (let z = 0; z < grid.size.z; z++) {
|
||
|
|
const id = grid.getCell(x, y, z);
|
||
|
|
if (id !== 0) {
|
||
|
|
solidCount++;
|
||
|
|
if (id === 50 || id === 52) obsidianCount++;
|
||
|
|
if (id === 51 || id === 55) corruptionCount++;
|
||
|
|
if (id === 53) glowingPillarCount++;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
expect(solidCount).to.be.greaterThan(0, "Should generate solid voxels");
|
||
|
|
expect(obsidianCount).to.be.greaterThan(
|
||
|
|
0,
|
||
|
|
"Should generate obsidian (50, 52)"
|
||
|
|
);
|
||
|
|
expect(corruptionCount).to.be.greaterThan(
|
||
|
|
0,
|
||
|
|
"Should generate corruption (51, 55)"
|
||
|
|
);
|
||
|
|
|
||
|
|
// Difficulty 1 with seed 12345 verified to have pillars
|
||
|
|
expect(glowingPillarCount).to.be.greaterThan(
|
||
|
|
0,
|
||
|
|
"Should generate glowing pillars (53) with seed 12345"
|
||
|
|
);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("should have start and end zones", () => {
|
||
|
|
const grid = new VoxelGrid(40, 20, 40);
|
||
|
|
// Use a seed that doesn't put a huge rift exactly at start logic if randomly unlikely
|
||
|
|
const generator = new VoidSeepDepthsGenerator(grid, 99999);
|
||
|
|
generator.generate();
|
||
|
|
|
||
|
|
const cx = 20;
|
||
|
|
|
||
|
|
// Start Zone (North, Z min)
|
||
|
|
let startSolid = false;
|
||
|
|
for (let x = cx - 2; x <= cx + 2; x++) {
|
||
|
|
for (let z = 1; z <= 5; z++) {
|
||
|
|
if (grid.getCell(x, 5, z) !== 0) startSolid = true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
expect(startSolid).to.be.true;
|
||
|
|
|
||
|
|
// End Zone (South, Z max)
|
||
|
|
let endSolid = false;
|
||
|
|
for (let x = cx - 2; x <= cx + 2; x++) {
|
||
|
|
for (let z = 35; z <= 38; z++) {
|
||
|
|
if (grid.getCell(x, 5, z) !== 0) endSolid = true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
expect(endSolid).to.be.true;
|
||
|
|
});
|
||
|
|
});
|