161 lines
4.8 KiB
JavaScript
161 lines
4.8 KiB
JavaScript
|
|
import { expect } from "@esm-bundle/chai";
|
||
|
|
import { RuinGenerator } from "../../src/generation/RuinGenerator.js";
|
||
|
|
import { VoxelGrid } from "../../src/grid/VoxelGrid.js";
|
||
|
|
|
||
|
|
describe("Generation: RuinGenerator", () => {
|
||
|
|
let grid;
|
||
|
|
let generator;
|
||
|
|
|
||
|
|
beforeEach(() => {
|
||
|
|
grid = new VoxelGrid(30, 10, 30);
|
||
|
|
generator = new RuinGenerator(grid, 12345);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("CoA 1: Should initialize with texture generators and spawn zones", () => {
|
||
|
|
expect(generator.floorGen).to.exist;
|
||
|
|
expect(generator.wallGen).to.exist;
|
||
|
|
expect(generator.generatedAssets).to.have.property("palette");
|
||
|
|
expect(generator.generatedAssets).to.have.property("spawnZones");
|
||
|
|
expect(generator.generatedAssets.spawnZones).to.have.property("player");
|
||
|
|
expect(generator.generatedAssets.spawnZones).to.have.property("enemy");
|
||
|
|
});
|
||
|
|
|
||
|
|
it("CoA 2: generate should create rooms", () => {
|
||
|
|
generator.generate(5, 4, 8);
|
||
|
|
|
||
|
|
// Should have some air spaces (rooms)
|
||
|
|
let airCount = 0;
|
||
|
|
for (let x = 0; x < grid.size.x; x++) {
|
||
|
|
for (let z = 0; z < grid.size.z; z++) {
|
||
|
|
if (grid.getCell(x, 1, z) === 0) {
|
||
|
|
airCount++;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
expect(airCount).to.be.greaterThan(0);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("CoA 3: generate should mark spawn zones", () => {
|
||
|
|
generator.generate(3, 4, 6);
|
||
|
|
|
||
|
|
// Should have spawn zones if rooms were created
|
||
|
|
if (generator.generatedAssets.spawnZones.player.length > 0) {
|
||
|
|
expect(generator.generatedAssets.spawnZones.player.length).to.be.greaterThan(0);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
it("CoA 4: roomsOverlap should detect overlapping rooms", () => {
|
||
|
|
const rooms = [
|
||
|
|
{ x: 5, z: 5, w: 6, d: 6 },
|
||
|
|
{ x: 8, z: 8, w: 6, d: 6 }, // Overlaps with first
|
||
|
|
];
|
||
|
|
|
||
|
|
expect(generator.roomsOverlap(rooms[1], rooms)).to.be.true;
|
||
|
|
});
|
||
|
|
|
||
|
|
it("CoA 5: roomsOverlap should return false for non-overlapping rooms", () => {
|
||
|
|
const rooms = [
|
||
|
|
{ x: 5, z: 5, w: 4, d: 4 },
|
||
|
|
];
|
||
|
|
const newRoom = { x: 15, z: 15, w: 4, d: 4 }; // Far away
|
||
|
|
|
||
|
|
// roomsOverlap checks if newRoom overlaps with any existing room
|
||
|
|
expect(generator.roomsOverlap(newRoom, rooms)).to.be.false;
|
||
|
|
});
|
||
|
|
|
||
|
|
it("CoA 6: getCenter should calculate room center", () => {
|
||
|
|
const room = { x: 10, z: 10, w: 6, d: 8, y: 1 };
|
||
|
|
|
||
|
|
const center = generator.getCenter(room);
|
||
|
|
|
||
|
|
expect(center.x).to.equal(13); // 10 + 6/2 = 13
|
||
|
|
expect(center.z).to.equal(14); // 10 + 8/2 = 14
|
||
|
|
expect(center.y).to.equal(1);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("CoA 7: buildRoom should create floor and walls", () => {
|
||
|
|
const room = { x: 5, y: 1, z: 5, w: 6, d: 6 };
|
||
|
|
|
||
|
|
generator.buildRoom(room);
|
||
|
|
|
||
|
|
// Floor should exist
|
||
|
|
expect(grid.getCell(7, 0, 7)).to.not.equal(0);
|
||
|
|
|
||
|
|
// Interior should be air
|
||
|
|
expect(grid.getCell(7, 1, 7)).to.equal(0);
|
||
|
|
|
||
|
|
// Perimeter should be walls
|
||
|
|
expect(grid.getCell(5, 1, 5)).to.not.equal(0); // Corner wall
|
||
|
|
});
|
||
|
|
|
||
|
|
it("CoA 8: buildCorridor should connect two points", () => {
|
||
|
|
const start = { x: 5, y: 1, z: 5 };
|
||
|
|
const end = { x: 15, y: 1, z: 15 };
|
||
|
|
|
||
|
|
generator.buildCorridor(start, end);
|
||
|
|
|
||
|
|
// Path should have floor
|
||
|
|
expect(grid.getCell(10, 0, 5)).to.not.equal(0);
|
||
|
|
expect(grid.getCell(15, 0, 10)).to.not.equal(0);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("CoA 9: markSpawnZone should collect valid floor tiles", () => {
|
||
|
|
// Create a room manually
|
||
|
|
const room = { x: 5, y: 1, z: 5, w: 6, d: 6 };
|
||
|
|
generator.buildRoom(room);
|
||
|
|
|
||
|
|
generator.markSpawnZone(room, "player");
|
||
|
|
|
||
|
|
// Should have some spawn positions
|
||
|
|
expect(generator.generatedAssets.spawnZones.player.length).to.be.greaterThan(0);
|
||
|
|
|
||
|
|
// Spawn positions should be valid floor tiles
|
||
|
|
const spawn = generator.generatedAssets.spawnZones.player[0];
|
||
|
|
expect(grid.getCell(spawn.x, spawn.y - 1, spawn.z)).to.not.equal(0); // Solid below
|
||
|
|
expect(grid.getCell(spawn.x, spawn.y, spawn.z)).to.equal(0); // Air at spawn
|
||
|
|
});
|
||
|
|
|
||
|
|
it("CoA 10: applyTextures should assign floor and wall IDs", () => {
|
||
|
|
// Create a simple structure
|
||
|
|
const room = { x: 5, y: 1, z: 5, w: 6, d: 6 };
|
||
|
|
generator.buildRoom(room);
|
||
|
|
|
||
|
|
generator.applyTextures();
|
||
|
|
|
||
|
|
// Floor should have IDs 200-209
|
||
|
|
const floorId = grid.getCell(7, 1, 7);
|
||
|
|
if (floorId !== 0) {
|
||
|
|
// If it's a floor surface
|
||
|
|
expect(floorId).to.be.greaterThanOrEqual(200);
|
||
|
|
expect(floorId).to.be.lessThanOrEqual(209);
|
||
|
|
}
|
||
|
|
|
||
|
|
// Wall should have IDs 100-109
|
||
|
|
const wallId = grid.getCell(5, 1, 5);
|
||
|
|
if (wallId !== 0) {
|
||
|
|
expect(wallId).to.be.greaterThanOrEqual(100);
|
||
|
|
expect(wallId).to.be.lessThanOrEqual(109);
|
||
|
|
}
|
||
|
|
});
|
||
|
|
|
||
|
|
it("CoA 11: generate should scatter cover objects", () => {
|
||
|
|
generator.generate(3, 4, 6);
|
||
|
|
|
||
|
|
// 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++;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
expect(coverCount).to.be.greaterThan(0);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|