Files
EVEngine/test/pcg_tree_manager.cpp
T

51 lines
1.8 KiB
C++

#include "zeroerr/unittest.h"
#include <limits>
#include <simplesquirrel/simplesquirrel.hpp>
#include "procgen/PointSet.h"
#include "procgen/heightmap/PcgTreeManager.h"
#include "procgen/heightmap/TerrainStampScript.h"
using namespace eve::procgen;
TEST_CASE("procgen.pcgTreeManager.aggregatesWorldTreesAndUsesRectangularRange") {
PcgTreeManager manager;
REQUIRE(manager.reset(-10.f,-20.f,30.f,40.f).ok());
REQUIRE(manager.addTree(-2.f,3.f,0).ok());
PointSet tile;
tile.add(1.f,8.f,1.f);
tile.add(4.f,9.f,4.f);
REQUIRE(manager.addTrees(tile,2).ok());
CHECK(manager.getCount()==3);
auto near=manager.countInRange(1.f,1.f,3.f);
REQUIRE(near.ok());
CHECK(near.value()==3); // inclusive square, including (4,4)
CHECK(manager.countInRange(1.f,1.f,2.9f).value()==1);
}
TEST_CASE("procgen.pcgTreeManager.failedBatchIsAtomic") {
PcgTreeManager manager;
CHECK(!manager.addTree(0,0,0).ok());
REQUIRE(manager.reset(0,0,10,10).ok());
REQUIRE(manager.addTree(2,2,0).ok());
PointSet invalid;
invalid.add(3,0,3);
invalid.add(10,0,3);
CHECK(!manager.addTrees(invalid,1).ok());
CHECK(manager.getCount()==1);
CHECK(!manager.countInRange(0,0,-1).ok());
CHECK(!manager.addTree(std::numeric_limits<float>::infinity(),0,0).ok());
}
TEST_CASE("procgen.pcgTreeManager.bindsRealVm") {
PointSet trees;trees.add(2,0,2);trees.add(8,0,8);
ssq::VM vm(1024);auto table=vm.addTable("eve");exposeHeightmap(table);
vm.addFunc("trees",[&](){return &trees;});
vm.run(vm.compileSource(R"(
local m=eve.PcgTreeManager();assert(m.reset(0.0,0.0,10.0,10.0).ok);
assert(m.addTrees(trees(),4).value==2);assert(m.addTree(5.0,5.0,1).value==3);
assert(m.getCount()==3 && m.countInRange(5.0,5.0,3.0).value==3);
)"));
}