diff options
Diffstat (limited to 'src/unittest/test_voxelalgorithms.cpp')
-rw-r--r-- | src/unittest/test_voxelalgorithms.cpp | 73 |
1 files changed, 68 insertions, 5 deletions
diff --git a/src/unittest/test_voxelalgorithms.cpp b/src/unittest/test_voxelalgorithms.cpp index 0ffd24b7d..abe48893f 100644 --- a/src/unittest/test_voxelalgorithms.cpp +++ b/src/unittest/test_voxelalgorithms.cpp @@ -22,6 +22,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "gamedef.h" #include "voxelalgorithms.h" #include "util/numeric.h" +#include "dummymap.h" class TestVoxelAlgorithms : public TestBase { public: @@ -30,21 +31,21 @@ public: void runTests(IGameDef *gamedef); - void testVoxelLineIterator(const NodeDefManager *ndef); + void testVoxelLineIterator(); + void testLighting(IGameDef *gamedef); }; static TestVoxelAlgorithms g_test_instance; void TestVoxelAlgorithms::runTests(IGameDef *gamedef) { - const NodeDefManager *ndef = gamedef->getNodeDefManager(); - - TEST(testVoxelLineIterator, ndef); + TEST(testVoxelLineIterator); + TEST(testLighting, gamedef); } //////////////////////////////////////////////////////////////////////////////// -void TestVoxelAlgorithms::testVoxelLineIterator(const NodeDefManager *ndef) +void TestVoxelAlgorithms::testVoxelLineIterator() { // Test some lines // Do not test lines that start or end on the border of @@ -99,3 +100,65 @@ void TestVoxelAlgorithms::testVoxelLineIterator(const NodeDefManager *ndef) UASSERTEQ(int, actual_nodecount, nodecount); } } + +void TestVoxelAlgorithms::testLighting(IGameDef *gamedef) +{ + v3s16 pmin(-32, -32, -32); + v3s16 pmax(31, 31, 31); + v3s16 bpmin = getNodeBlockPos(pmin), bpmax = getNodeBlockPos(pmax); + DummyMap map(gamedef, bpmin, bpmax); + + // Make a 21x21x21 hollow box centered at the origin. + { + std::map<v3s16, MapBlock*> modified_blocks; + MMVManip vm(&map); + vm.initialEmerge(bpmin, bpmax, false); + s32 volume = vm.m_area.getVolume(); + for (s32 i = 0; i < volume; i++) + vm.m_data[i] = MapNode(CONTENT_AIR); + for (s16 z = -10; z <= 10; z++) + for (s16 y = -10; y <= 10; y++) + for (s16 x = -10; x <= 10; x++) + vm.setNodeNoEmerge(v3s16(x, y, z), MapNode(t_CONTENT_STONE)); + for (s16 z = -9; z <= 9; z++) + for (s16 y = -9; y <= 9; y++) + for (s16 x = -9; x <= 9; x++) + vm.setNodeNoEmerge(v3s16(x, y, z), MapNode(CONTENT_AIR)); + voxalgo::blit_back_with_light(&map, &vm, &modified_blocks); + } + + // Place two holes on the edges a torch in the center. + { + std::map<v3s16, MapBlock*> modified_blocks; + map.addNodeAndUpdate(v3s16(-10, 0, 0), MapNode(CONTENT_AIR), modified_blocks); + map.addNodeAndUpdate(v3s16(9, 10, -9), MapNode(t_CONTENT_WATER), modified_blocks); + map.addNodeAndUpdate(v3s16(0, 0, 0), MapNode(t_CONTENT_TORCH), modified_blocks); + } + + const NodeDefManager *ndef = gamedef->ndef(); + { + MapNode n = map.getNode(v3s16(9, 9, -9)); + UASSERTEQ(int, n.getLight(LIGHTBANK_NIGHT, ndef), 0); + UASSERTEQ(int, n.getLight(LIGHTBANK_DAY, ndef), 13); + } + { + MapNode n = map.getNode(v3s16(0, 1, 0)); + UASSERTEQ(int, n.getLight(LIGHTBANK_NIGHT, ndef), 12); + UASSERTEQ(int, n.getLight(LIGHTBANK_DAY, ndef), 12); + } + { + MapNode n = map.getNode(v3s16(-9, -1, 0)); + UASSERTEQ(int, n.getLight(LIGHTBANK_NIGHT, ndef), 3); + UASSERTEQ(int, n.getLight(LIGHTBANK_DAY, ndef), 12); + } + { + MapNode n = map.getNode(v3s16(-10, 0, 0)); + UASSERTEQ(int, n.getLight(LIGHTBANK_NIGHT, ndef), 3); + UASSERTEQ(int, n.getLight(LIGHTBANK_DAY, ndef), 14); + } + { + MapNode n = map.getNode(v3s16(-11, 0, 0)); + UASSERTEQ(int, n.getLight(LIGHTBANK_NIGHT, ndef), 2); + UASSERTEQ(int, n.getLight(LIGHTBANK_DAY, ndef), 15); + } +} |