136 lines
3.8 KiB
JavaScript
136 lines
3.8 KiB
JavaScript
|
|
import { expect } from "@esm-bundle/chai";
|
||
|
|
import { BaseGenerator } from "../../src/generation/BaseGenerator.js";
|
||
|
|
import { VoxelGrid } from "../../src/grid/VoxelGrid.js";
|
||
|
|
|
||
|
|
describe("Generation: BaseGenerator", () => {
|
||
|
|
let grid;
|
||
|
|
let generator;
|
||
|
|
|
||
|
|
beforeEach(() => {
|
||
|
|
grid = new VoxelGrid(10, 5, 10);
|
||
|
|
generator = new BaseGenerator(grid, 12345);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("CoA 1: Should initialize with grid and RNG", () => {
|
||
|
|
expect(generator.grid).to.equal(grid);
|
||
|
|
expect(generator.rng).to.exist;
|
||
|
|
expect(generator.width).to.equal(10);
|
||
|
|
expect(generator.height).to.equal(5);
|
||
|
|
expect(generator.depth).to.equal(10);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("CoA 2: getSolidNeighbors should count solid neighbors correctly", () => {
|
||
|
|
// Set up a pattern: center is air, surrounded by solids
|
||
|
|
grid.setCell(5, 2, 5, 0); // Center (air)
|
||
|
|
grid.setCell(4, 2, 5, 1); // Left
|
||
|
|
grid.setCell(6, 2, 5, 1); // Right
|
||
|
|
grid.setCell(5, 2, 4, 1); // Front
|
||
|
|
grid.setCell(5, 2, 6, 1); // Back
|
||
|
|
grid.setCell(5, 1, 5, 1); // Below
|
||
|
|
grid.setCell(5, 3, 5, 1); // Above
|
||
|
|
|
||
|
|
const count = generator.getSolidNeighbors(5, 2, 5);
|
||
|
|
|
||
|
|
// Should count at least 6 neighbors (excluding center)
|
||
|
|
expect(count).to.be.greaterThanOrEqual(6);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("CoA 3: getSolidNeighbors should handle out-of-bounds as solid", () => {
|
||
|
|
// Test edge case - corner position
|
||
|
|
grid.setCell(0, 0, 0, 0); // Air at corner
|
||
|
|
|
||
|
|
const count = generator.getSolidNeighbors(0, 0, 0);
|
||
|
|
|
||
|
|
// Out-of-bounds neighbors should count as solid
|
||
|
|
expect(count).to.be.greaterThan(0);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("CoA 4: scatterCover should place objects on valid floor tiles", () => {
|
||
|
|
// Create a floor: solid at y=0, air at y=1
|
||
|
|
for (let x = 1; x < 9; x++) {
|
||
|
|
for (let z = 1; z < 9; z++) {
|
||
|
|
grid.setCell(x, 0, z, 1); // Floor
|
||
|
|
grid.setCell(x, 1, z, 0); // Air above
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
generator.scatterCover(10, 0.5); // 50% density
|
||
|
|
|
||
|
|
// Check that some objects were placed
|
||
|
|
let objectCount = 0;
|
||
|
|
for (let x = 1; x < 9; x++) {
|
||
|
|
for (let z = 1; z < 9; z++) {
|
||
|
|
if (grid.getCell(x, 1, z) === 10) {
|
||
|
|
objectCount++;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// With 50% density on ~64 tiles, we should get some objects
|
||
|
|
expect(objectCount).to.be.greaterThan(0);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("CoA 5: scatterCover should not place objects on invalid tiles", () => {
|
||
|
|
// Create invalid floor: air at y=0 (no solid below)
|
||
|
|
for (let x = 1; x < 9; x++) {
|
||
|
|
for (let z = 1; z < 9; z++) {
|
||
|
|
grid.setCell(x, 0, z, 0); // No floor
|
||
|
|
grid.setCell(x, 1, z, 0); // Air
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
generator.scatterCover(10, 1.0); // 100% density
|
||
|
|
|
||
|
|
// No objects should be placed
|
||
|
|
let objectCount = 0;
|
||
|
|
for (let x = 1; x < 9; x++) {
|
||
|
|
for (let z = 1; z < 9; z++) {
|
||
|
|
if (grid.getCell(x, 1, z) === 10) {
|
||
|
|
objectCount++;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
expect(objectCount).to.equal(0);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("CoA 6: scatterCover should respect density parameter", () => {
|
||
|
|
// Create valid floor
|
||
|
|
for (let x = 1; x < 9; x++) {
|
||
|
|
for (let z = 1; z < 9; z++) {
|
||
|
|
grid.setCell(x, 0, z, 1);
|
||
|
|
grid.setCell(x, 1, z, 0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Test with different densities
|
||
|
|
generator.scatterCover(10, 0.1); // 10% density
|
||
|
|
let lowCount = 0;
|
||
|
|
for (let x = 1; x < 9; x++) {
|
||
|
|
for (let z = 1; z < 9; z++) {
|
||
|
|
if (grid.getCell(x, 1, z) === 10) lowCount++;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Reset and test higher density
|
||
|
|
for (let x = 1; x < 9; x++) {
|
||
|
|
for (let z = 1; z < 9; z++) {
|
||
|
|
grid.setCell(x, 1, z, 0);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
generator.scatterCover(10, 0.9); // 90% density
|
||
|
|
let highCount = 0;
|
||
|
|
for (let x = 1; x < 9; x++) {
|
||
|
|
for (let z = 1; z < 9; z++) {
|
||
|
|
if (grid.getCell(x, 1, z) === 10) highCount++;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Higher density should generally produce more objects
|
||
|
|
// (allowing for randomness, but trend should be clear)
|
||
|
|
expect(highCount).to.be.greaterThan(lowCount);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|