Files
EVEngine/test/procgen_biome.cpp
T
西风逍遥游 293be41d66 Merge remote-tracking branch 'origin/dev' into codex/architecture-consolidation
# Conflicts:
#	cmake/module_manifest.cmake
#	docs/usr/modules/procgen.md
#	src/engine/CMakeLists.txt
#	src/engine/cmdline/Run.cpp
#	src/engine/common/ScriptModule.h
#	src/modules/animation/Animation.cpp
#	src/modules/physics/World.cpp
#	src/modules/physics/World3D.cpp
#	src/modules/procgen/Procgen.cpp
#	src/modules/procgen/Procgen.h
#	src/modules/scene/SceneCapabilities.cpp
#	src/modules/schema/Schema.cpp
#	src/modules/schema/Schema.h
2026-08-27 14:52:28 +08:00

60 lines
2.4 KiB
C++

#include "procgen/Biome.h"
#include "zeroerr/assert.h"
#include "zeroerr/unittest.h"
using namespace eve::procgen;
TEST_CASE("procgen.biome.appliesPriorityExclusionAndAssetMetadata") {
BiomeRules rules;
SpatialData domain = SpatialData::box(0.f, 0.f, 0.f, 4.f, 0.f, 4.f);
SpatialData forest = domain;
SpatialData town = SpatialData::sphere(2.f, 0.f, 2.f, 1.1f);
SpatialData noSpawn = SpatialData::sphere(0.f, 0.f, 0.f, 0.5f);
CHECK(rules.addLayer("forest", &forest, 1, 1.f));
CHECK(rules.addLayer("town", &town, 10, 1.f));
CHECK(!rules.addLayer("forest", &forest, 2, 1.f));
CHECK(rules.addAsset("forest", "oak", 3.f, 0.8f, 1.2f, true));
CHECK(rules.addAsset("forest", "pine", 1.f, 1.f, 1.f, true));
CHECK(rules.addAsset("town", "lamp", 1.f, 1.f, 1.f, false));
CHECK(rules.addExclusion(&noSpawn));
PointSet* first = rules.generate(&domain, 2.f, 42, 0.f);
PointSet* second = rules.generate(&domain, 2.f, 42, 0.f);
REQUIRE(bool(first));
REQUIRE(bool(second));
CHECK_EQ(first->getCount(), 8);
CHECK_EQ(second->getCount(), first->getCount());
int townCount = 0;
for (int i = 0; i < first->getCount(); ++i) {
CHECK_EQ(first->getStringAttribute(i, "asset", ""),
second->getStringAttribute(i, "asset", ""));
CHECK_EQ(first->getYaw(i), second->getYaw(i));
CHECK_EQ(first->getScaleX(i), second->getScaleX(i));
if (first->getStringAttribute(i, "biome", "") == "town") {
++townCount;
CHECK_EQ(first->getStringAttribute(i, "asset", ""), std::string("lamp"));
CHECK_EQ(first->getYaw(i), 0.f);
}
}
CHECK_EQ(townCount, 1);
CHECK(rules.debugReport().find("output=8") != std::string::npos);
delete second;
delete first;
}
TEST_CASE("procgen.biome.validatesRulesAndEmptyDensity") {
BiomeRules rules;
SpatialData domain = SpatialData::box(0.f, 0.f, 0.f, 2.f, 0.f, 2.f);
CHECK(!rules.generate(&domain, 1.f, 1, 0.f));
CHECK(rules.getError().find("no biome layers") != std::string::npos);
CHECK(rules.addLayer("empty", &domain, 0, 0.f));
CHECK(!rules.addAsset("missing", "asset", 1.f, 1.f, 1.f, true));
CHECK(rules.addAsset("empty", "asset", 1.f, 1.f, 1.f, true));
PointSet* result = rules.generate(&domain, 1.f, 1, 0.f);
REQUIRE(bool(result));
CHECK_EQ(result->getCount(), 0);
delete result;
}