# 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
79 lines
2.8 KiB
C++
79 lines
2.8 KiB
C++
#include "procgen/ShapeGrammar.h"
|
|
|
|
#include "zeroerr/assert.h"
|
|
#include "zeroerr/unittest.h"
|
|
|
|
using namespace eve::procgen;
|
|
|
|
TEST_CASE("procgen.shapeGrammar.expandsGroupsAndFillRepetition") {
|
|
ShapeGrammar grammar;
|
|
CHECK(grammar.addModule("A", "wall-a", 2.f, 1.f));
|
|
CHECK(grammar.addModule("A", "wall-b", 2.f, 1.f));
|
|
CHECK(!grammar.addModule("A", "wrong-length", 3.f, 1.f));
|
|
CHECK(grammar.addModule("B", "post", 1.f, 1.f));
|
|
CHECK(grammar.validate("A,[B,A]*"));
|
|
|
|
PointSet spline;
|
|
spline.add(0.f, 0.f, 0.f);
|
|
spline.add(10.f, 0.f, 0.f);
|
|
PointSet* first = grammar.generate("A,[B,A]*", &spline, 42, false);
|
|
PointSet* second = grammar.generate("A,[B,A]*", &spline, 42, false);
|
|
REQUIRE(bool(first));
|
|
REQUIRE(bool(second));
|
|
CHECK_EQ(first->getCount(), 5);
|
|
CHECK_EQ(first->getStringAttribute(0, "module", ""), std::string("A"));
|
|
CHECK_EQ(first->getStringAttribute(1, "module", ""), std::string("B"));
|
|
CHECK_EQ(first->getStringAttribute(2, "module", ""), std::string("A"));
|
|
CHECK_EQ(first->getX(0), 1.f);
|
|
CHECK_EQ(first->getX(1), 2.5f);
|
|
CHECK_EQ(first->getX(2), 4.f);
|
|
CHECK_EQ(first->getYaw(0), 0.f);
|
|
CHECK_EQ(first->getFloatAttribute(1, "length", 0.f), 1.f);
|
|
for (int i = 0; i < first->getCount(); ++i)
|
|
CHECK_EQ(first->getStringAttribute(i, "asset", ""),
|
|
second->getStringAttribute(i, "asset", ""));
|
|
CHECK(grammar.debugReport().find("symbols=5") != std::string::npos);
|
|
|
|
delete second;
|
|
delete first;
|
|
}
|
|
|
|
TEST_CASE("procgen.shapeGrammar.supportsPlusExactAndIncompleteModes") {
|
|
ShapeGrammar grammar;
|
|
grammar.addModule("A", "wall", 2.f, 1.f);
|
|
grammar.addModule("B", "post", 1.f, 1.f);
|
|
PointSet spline;
|
|
spline.add(0.f, 0.f, 0.f);
|
|
spline.add(10.f, 0.f, 0.f);
|
|
|
|
PointSet* plus = grammar.generate("[A,B]+", &spline, 1, false);
|
|
REQUIRE(bool(plus));
|
|
CHECK_EQ(plus->getCount(), 6);
|
|
PointSet* exact = grammar.generate("A3,B2", &spline, 1, false);
|
|
REQUIRE(bool(exact));
|
|
CHECK_EQ(exact->getCount(), 5);
|
|
|
|
PointSet shortSpline;
|
|
shortSpline.add(0.f, 0.f, 0.f);
|
|
shortSpline.add(5.f, 0.f, 0.f);
|
|
CHECK(!grammar.generate("A3", &shortSpline, 1, false));
|
|
CHECK(grammar.getError().find("does not fit") != std::string::npos);
|
|
PointSet* partial = grammar.generate("A3", &shortSpline, 1, true);
|
|
REQUIRE(bool(partial));
|
|
CHECK_EQ(partial->getCount(), 2);
|
|
|
|
delete partial;
|
|
delete exact;
|
|
delete plus;
|
|
}
|
|
|
|
TEST_CASE("procgen.shapeGrammar.reportsSyntaxAndUnknownModules") {
|
|
ShapeGrammar grammar;
|
|
grammar.addModule("A", "wall", 1.f, 1.f);
|
|
CHECK(!grammar.validate("[A,A"));
|
|
CHECK(grammar.getError().find("unterminated") != std::string::npos);
|
|
CHECK(!grammar.validate("A,Missing"));
|
|
CHECK(grammar.getError().find("unknown module") != std::string::npos);
|
|
CHECK(!grammar.validate(""));
|
|
}
|