diff --git a/tests/testWorld.cpp b/tests/testWorld.cpp new file mode 100644 index 0000000..2f443b2 --- /dev/null +++ b/tests/testWorld.cpp @@ -0,0 +1,51 @@ +#include "testHarness.h" +#include "vf/World.h" + +using namespace vf; + +VF_TEST(worldFloorDivHandlesNegatives) { + CHECK_EQ(floorDiv(0, 16), 0); + CHECK_EQ(floorDiv(15, 16), 0); + CHECK_EQ(floorDiv(16, 16), 1); + CHECK_EQ(floorDiv(-1, 16), -1); + CHECK_EQ(floorDiv(-16, 16), -1); + CHECK_EQ(floorDiv(-17, 16), -2); +} + +VF_TEST(worldFloorModHandlesNegatives) { + CHECK_EQ(floorMod(0, 16), 0); + CHECK_EQ(floorMod(-1, 16), 15); + CHECK_EQ(floorMod(16, 16), 0); + CHECK_EQ(floorMod(-17, 16), 15); +} + +VF_TEST(worldSetGetCrossesChunkBorders) { + World world; + world.setBlock(0, 0, 0, Block::Stone); + world.setBlock(-1, 5, 3, Block::Grass); + world.setBlock(31, 40, 17, Block::Sand); + + CHECK(world.blockAt(0, 0, 0) == Block::Stone); + CHECK(world.blockAt(-1, 5, 3) == Block::Grass); + CHECK(world.blockAt(31, 40, 17) == Block::Sand); + CHECK(world.blockAt(100, 100, 100) == Block::Air); +} + +VF_TEST(worldNegativeCoordinateLandsInExpectedChunk) { + World world; + world.setBlock(-1, -1, -1, Block::Wood); + const Chunk* chunk = world.chunkAt({-1, -1, -1}); + CHECK(chunk != nullptr); + CHECK(chunk->at(15, 15, 15) == Block::Wood); + CHECK(world.solidAt(-1, -1, -1)); +} + +VF_TEST(worldEnsureChunkIsIdempotent) { + World world; + Chunk& first = world.ensureChunk({2, 0, 2}); + first.set(1, 1, 1, Block::Dirt); + Chunk& second = world.ensureChunk({2, 0, 2}); + CHECK(&first == &second); + CHECK_EQ(world.chunkCount(), static_cast(1)); + CHECK(second.at(1, 1, 1) == Block::Dirt); +}