133 lines
4.1 KiB
JavaScript
133 lines
4.1 KiB
JavaScript
|
|
import { expect } from "@esm-bundle/chai";
|
||
|
|
import { CaveGenerator } from "../../src/generation/CaveGenerator.js";
|
||
|
|
import { VoxelGrid } from "../../src/grid/VoxelGrid.js";
|
||
|
|
|
||
|
|
describe("Generation: CaveGenerator", () => {
|
||
|
|
let grid;
|
||
|
|
let generator;
|
||
|
|
|
||
|
|
beforeEach(() => {
|
||
|
|
grid = new VoxelGrid(20, 10, 20);
|
||
|
|
generator = new CaveGenerator(grid, 12345);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("CoA 1: Should initialize with texture generators", () => {
|
||
|
|
expect(generator.floorGen).to.exist;
|
||
|
|
expect(generator.wallGen).to.exist;
|
||
|
|
expect(generator.generatedAssets).to.have.property("palette");
|
||
|
|
});
|
||
|
|
|
||
|
|
it("CoA 2: preloadTextures should generate texture palette", () => {
|
||
|
|
generator.preloadTextures();
|
||
|
|
|
||
|
|
// Should have wall variations (100-109)
|
||
|
|
expect(generator.generatedAssets.palette[100]).to.exist;
|
||
|
|
expect(generator.generatedAssets.palette[109]).to.exist;
|
||
|
|
|
||
|
|
// Should have floor variations (200-209)
|
||
|
|
expect(generator.generatedAssets.palette[200]).to.exist;
|
||
|
|
expect(generator.generatedAssets.palette[209]).to.exist;
|
||
|
|
});
|
||
|
|
|
||
|
|
it("CoA 3: generate should create foundation layer", () => {
|
||
|
|
generator.generate(0.5, 2);
|
||
|
|
|
||
|
|
// Foundation (y=0) should be solid
|
||
|
|
for (let x = 0; x < grid.size.x; x++) {
|
||
|
|
for (let z = 0; z < grid.size.z; z++) {
|
||
|
|
expect(grid.getCell(x, 0, z)).to.not.equal(0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
it("CoA 4: generate should keep sky clear", () => {
|
||
|
|
generator.generate(0.5, 2);
|
||
|
|
|
||
|
|
// Top layer (y=height-1) should be air
|
||
|
|
const topY = grid.size.y - 1;
|
||
|
|
for (let x = 0; x < grid.size.x; x++) {
|
||
|
|
for (let z = 0; z < grid.size.z; z++) {
|
||
|
|
expect(grid.getCell(x, topY, z)).to.equal(0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
it("CoA 5: smooth should apply cellular automata rules", () => {
|
||
|
|
// Set up initial pattern
|
||
|
|
for (let x = 0; x < grid.size.x; x++) {
|
||
|
|
for (let z = 0; z < grid.size.z; z++) {
|
||
|
|
for (let y = 1; y < grid.size.y - 1; y++) {
|
||
|
|
grid.setCell(x, y, z, Math.random() > 0.5 ? 1 : 0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
const beforeState = grid.cells.slice();
|
||
|
|
generator.smooth();
|
||
|
|
const afterState = grid.cells.slice();
|
||
|
|
|
||
|
|
// Smoothing should change the grid
|
||
|
|
expect(afterState).to.not.deep.equal(beforeState);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("CoA 6: applyTextures should assign floor and wall IDs", () => {
|
||
|
|
// Create a simple structure: floor at y=1, wall above
|
||
|
|
// Floor surface: solid at y=1 with air above (y=2)
|
||
|
|
// Wall: solid at y=2 with solid above (y=3)
|
||
|
|
for (let x = 1; x < 10; x++) {
|
||
|
|
for (let z = 1; z < 10; z++) {
|
||
|
|
grid.setCell(x, 0, z, 1); // Foundation
|
||
|
|
grid.setCell(x, 1, z, 1); // Floor surface (will be textured as floor if air above)
|
||
|
|
grid.setCell(x, 2, z, 0); // Air above floor (makes y=1 a floor surface)
|
||
|
|
grid.setCell(x, 3, z, 1); // Wall (solid with solid above)
|
||
|
|
grid.setCell(x, 4, z, 1); // Solid above wall
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
generator.applyTextures();
|
||
|
|
|
||
|
|
// Floor surfaces (y=1 with air above) should have IDs 200-209
|
||
|
|
const floorId = grid.getCell(5, 1, 5);
|
||
|
|
expect(floorId).to.be.greaterThanOrEqual(200);
|
||
|
|
expect(floorId).to.be.lessThanOrEqual(209);
|
||
|
|
|
||
|
|
// Walls (y=3 with solid above) should have IDs 100-109
|
||
|
|
const wallId = grid.getCell(5, 3, 5);
|
||
|
|
expect(wallId).to.be.greaterThanOrEqual(100);
|
||
|
|
expect(wallId).to.be.lessThanOrEqual(109);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("CoA 7: generate should scatter cover objects", () => {
|
||
|
|
generator.generate(0.5, 2);
|
||
|
|
|
||
|
|
// Check for cover objects (ID 10)
|
||
|
|
let coverCount = 0;
|
||
|
|
for (let x = 0; x < grid.size.x; x++) {
|
||
|
|
for (let z = 0; z < grid.size.z; z++) {
|
||
|
|
for (let y = 0; y < grid.size.y; y++) {
|
||
|
|
if (grid.getCell(x, y, z) === 10) {
|
||
|
|
coverCount++;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Should have some cover objects
|
||
|
|
expect(coverCount).to.be.greaterThan(0);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("CoA 8: generate with same seed should produce consistent results", () => {
|
||
|
|
const grid1 = new VoxelGrid(20, 10, 20);
|
||
|
|
const gen1 = new CaveGenerator(grid1, 12345);
|
||
|
|
gen1.generate(0.5, 2);
|
||
|
|
|
||
|
|
const grid2 = new VoxelGrid(20, 10, 20);
|
||
|
|
const gen2 = new CaveGenerator(grid2, 12345);
|
||
|
|
gen2.generate(0.5, 2);
|
||
|
|
|
||
|
|
// Same seed should produce same results
|
||
|
|
expect(grid1.cells).to.deep.equal(grid2.cells);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|