Files

104 lines
2.9 KiB
C++

#include "testHarness.h"
#include "vf/WorldGen.h"
#include <set>
using namespace vf;
VF_TEST(worldGenChunkIsDeterministic) {
WorldGen gen;
Chunk first, second;
gen.generateChunk(first, {2, 1, -3});
gen.generateChunk(second, {2, 1, -3});
CHECK(first.raw() == second.raw());
Chunk elsewhere;
gen.generateChunk(elsewhere, {2, 1, 4});
CHECK(first.raw() != elsewhere.raw()); // different columns differ
}
VF_TEST(worldGenSurfaceHeightStaysInBounds) {
WorldGen gen;
int lo = 1 << 30, hi = -(1 << 30);
for (int gx = -200; gx <= 200; gx += 7) {
for (int gz = -200; gz <= 200; gz += 7) {
int h = gen.surfaceHeight(gx, gz);
CHECK(h >= 1 && h < gen.settings().maxY);
lo = h < lo ? h : lo;
hi = h > hi ? h : hi;
}
}
CHECK(hi > lo); // terrain actually varies
}
VF_TEST(worldGenProducesSeveralBiomes) {
WorldGen gen;
std::set<int> seen;
for (int gx = -600; gx <= 600; gx += 25)
for (int gz = -600; gz <= 600; gz += 25)
seen.insert(static_cast<int>(gen.biomeAt(gx, gz)));
CHECK(seen.size() >= 3);
}
VF_TEST(worldGenOceanMatchesLowSurface) {
WorldGen gen;
int sea = gen.settings().seaLevel;
for (int gx = -400; gx <= 400; gx += 13) {
for (int gz = -400; gz <= 400; gz += 13) {
bool low = gen.surfaceHeight(gx, gz) < sea - 1;
bool ocean = gen.biomeAt(gx, gz) == Biome::Ocean;
CHECK_EQ(low, ocean);
}
}
}
VF_TEST(worldGenCarvesCavesButNotEverything) {
WorldGen gen;
int caves = 0, solid = 0;
for (int gx = 0; gx < 64; gx += 2)
for (int gy = 4; gy < 40; gy += 2)
for (int gz = 0; gz < 64; gz += 2)
(gen.isCave(gx, gy, gz) ? caves : solid) += 1;
CHECK(caves > 0);
CHECK(solid > caves); // caves are the minority
}
VF_TEST(worldGenPlacesOresUnderground) {
WorldGen gen;
World world;
for (int cx = 0; cx < 2; ++cx)
for (int cz = 0; cz < 2; ++cz)
gen.generateColumn(world, cx, cz);
int ores = 0;
for (int gx = 0; gx < 32; ++gx) {
for (int gz = 0; gz < 32; ++gz) {
int surface = gen.surfaceHeight(gx, gz);
for (int gy = 1; gy < surface; ++gy) {
Block b = world.blockAt(gx, gy, gz);
if (b == Block::CoalOre || b == Block::IronOre || b == Block::GoldOre) {
++ores;
CHECK(gy < surface); // ores are always below the surface
}
}
}
}
CHECK(ores > 0);
}
VF_TEST(worldGenPlantsTrees) {
WorldGen gen;
World world;
int wood = 0;
for (int cx = 0; cx < 8; ++cx) {
for (int cz = 0; cz < 8; ++cz) {
gen.generateColumn(world, cx, cz);
}
}
for (const auto& entry : world.allChunks()) {
for (Block b : entry.second->raw())
if (b == Block::Wood) ++wood;
}
CHECK(wood > 0);
}