X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=tst%2Fworld%2FChunkTest.cpp;h=0da68d045d0dd04b0dada4d0150c9435355fade8;hb=1709d12eb27ecf7626d724a3fc14096a93f3cb4c;hp=79d349546a568ac602bfbb31a8eca541ae17f8d5;hpb=c592d2d6e230851bd7ed74d98f9046469f4086fd;p=blank.git diff --git a/tst/world/ChunkTest.cpp b/tst/world/ChunkTest.cpp index 79d3495..0da68d0 100644 --- a/tst/world/ChunkTest.cpp +++ b/tst/world/ChunkTest.cpp @@ -305,7 +305,7 @@ void ChunkTest::testNeighbor() { for (int i = 0; i < Block::FACE_COUNT; ++i) { Block::Face face = Block::Face(i); neighbor->Position(Block::FaceNormal(face)); - chunk->SetNeighbor(*neighbor); + chunk->SetNeighbor(face, *neighbor); CPPUNIT_ASSERT_MESSAGE( "chunk did not link right neighbor", chunk->HasNeighbor(face) @@ -323,17 +323,199 @@ void ChunkTest::testNeighbor() { &*chunk, &neighbor->GetNeighbor(Block::Opposite(face)) ); chunk->Unlink(); - chunk->ClearNeighbors(); } +} - neighbor->Position({1, 1, 1}); - chunk->SetNeighbor(*neighbor); - for (int i = 0; i < Block::FACE_COUNT; ++i) { - CPPUNIT_ASSERT_MESSAGE( - "chunk linked with non-neighbor", - !chunk->HasNeighbor(Block::Face(i)) + +void ChunkTest::testBlock() { + unique_ptr chunk(new Chunk(types)); + + for (int index = 0; index < Chunk::size; ++index) { + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "default chunk has non-default block", + Block(), chunk->BlockAt(index) ); } + + Block block(1, Block::FACE_LEFT, Block::TURN_RIGHT); + chunk->SetBlock(0, block); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "wrong type on set block", + block.type, chunk->BlockAt(0).type + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "wrong orientation on set block", + block.orient, chunk->BlockAt(0).orient + ); + for (int index = 1; index < Chunk::size; ++index) { + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "changing block at index 0 affected some other block", + Block(), chunk->BlockAt(index) + ); + } +} + +void ChunkTest::testLight() { + unique_ptr chunk(new Chunk(types)); + + for (int index = 0; index < Chunk::size; ++index) { + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "default chunk has non-zero light level", + 0, chunk->GetLight(index) + ); + } + + chunk->SetLight(0, 15); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "wrong light level on set index", + 15, chunk->GetLight(0) + ); + for (int index = 1; index < Chunk::size; ++index) { + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "changing light at index 0 affected some other index", + 0, chunk->GetLight(index) + ); + } +} + +void ChunkTest::testLightPropagation() { + unique_ptr chunk(new Chunk(types)); + + // 0 air, 1 solid, 2 solid and emits light level of 5 + chunk->SetBlock(Chunk::Pos(7, 7, 7), Block(2)); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "adding luminant block did not set correct light level", + 5, chunk->GetLight(Chunk::Pos(7, 7, 7)) + ); + + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "light did not propagate correctly in +X", + 4, chunk->GetLight(Chunk::Pos(8, 7, 7)) + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "light did not propagate correctly in -X", + 4, chunk->GetLight(Chunk::Pos(6, 7, 7)) + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "light did not propagate correctly in +Y", + 4, chunk->GetLight(Chunk::Pos(7, 8, 7)) + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "light did not propagate correctly in -Y", + 4, chunk->GetLight(Chunk::Pos(7, 6, 7)) + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "light did not propagate correctly in +Z", + 4, chunk->GetLight(Chunk::Pos(7, 7, 8)) + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "light did not propagate correctly in -Z", + 4, chunk->GetLight(Chunk::Pos(7, 7, 6)) + ); + + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "light did not propagate correctly in 2D diagonal", + 3, chunk->GetLight(Chunk::Pos(8, 8, 7)) + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "light did not propagate correctly in 2D diagonal", + 3, chunk->GetLight(Chunk::Pos(7, 6, 8)) + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "light did not propagate correctly in 2D diagonal", + 3, chunk->GetLight(Chunk::Pos(6, 7, 8)) + ); + + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "light did not propagate correctly in 3D diagonal", + 2, chunk->GetLight(Chunk::Pos(8, 6, 6)) + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "light did not propagate correctly in 3D diagonal", + 2, chunk->GetLight(Chunk::Pos(6, 6, 8)) + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "light did not propagate correctly in 3D diagonal", + 2, chunk->GetLight(Chunk::Pos(6, 8, 8)) + ); + + // now block the light to the left + chunk->SetBlock(Chunk::Pos(6, 7, 7), Block(1)); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "adding obstacle affected unrelated index", + 5, chunk->GetLight(Chunk::Pos(7, 7, 7)) + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "adding obstacle affected unrelated index", + 4, chunk->GetLight(Chunk::Pos(8, 7, 7)) + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "adding obstacle affected unrelated index", + 4, chunk->GetLight(Chunk::Pos(7, 8, 7)) + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "adding obstacle affected unrelated index", + 4, chunk->GetLight(Chunk::Pos(7, 6, 7)) + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "adding obstacle affected unrelated index", + 4, chunk->GetLight(Chunk::Pos(7, 7, 8)) + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "adding obstacle affected unrelated index", + 4, chunk->GetLight(Chunk::Pos(7, 7, 6)) + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "adding obstacle affected unrelated index", + 3, chunk->GetLight(Chunk::Pos(6, 6, 7)) + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "adding obstacle affected unrelated index", + 3, chunk->GetLight(Chunk::Pos(6, 8, 7)) + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "adding obstacle affected unrelated index", + 3, chunk->GetLight(Chunk::Pos(6, 7, 6)) + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "adding obstacle affected unrelated index", + 3, chunk->GetLight(Chunk::Pos(6, 7, 6)) + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "adding obstacle affected unrelated index", + 2, chunk->GetLight(Chunk::Pos(5, 6, 7)) + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "adding obstacle affected unrelated index", + 2, chunk->GetLight(Chunk::Pos(5, 8, 7)) + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "adding obstacle affected unrelated index", + 2, chunk->GetLight(Chunk::Pos(5, 7, 6)) + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "adding obstacle affected unrelated index", + 2, chunk->GetLight(Chunk::Pos(5, 7, 6)) + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "adding obstacle resulted in unexpected light level behind it", + 1, chunk->GetLight(Chunk::Pos(5, 7, 7)) + ); + + // and remove it again + chunk->SetBlock(Chunk::Pos(6, 7, 7), Block(0)); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "removing obstacle did not refill light correctly", + 4, chunk->GetLight(Chunk::Pos(6, 7, 7)) + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "removing obstacle did not refill light correctly", + 3, chunk->GetLight(Chunk::Pos(5, 7, 7)) + ); + CPPUNIT_ASSERT_EQUAL_MESSAGE( + "removing obstacle did not refill light correctly", + 2, chunk->GetLight(Chunk::Pos(4, 7, 7)) + ); } }