From 47987b945116130195563ae2aca068973063bfe5 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Sat, 31 Dec 2016 23:14:35 +0300 Subject: Fix drawing layers after previous commits. Add unit tests for layer caching functions. --- src/resources/map/maplayer_unittest.cc | 661 ++++++++++++++++++++++++++++++++- 1 file changed, 648 insertions(+), 13 deletions(-) (limited to 'src/resources/map/maplayer_unittest.cc') diff --git a/src/resources/map/maplayer_unittest.cc b/src/resources/map/maplayer_unittest.cc index 90f34ce0e..d78610024 100644 --- a/src/resources/map/maplayer_unittest.cc +++ b/src/resources/map/maplayer_unittest.cc @@ -22,8 +22,11 @@ #include "logger.h" +#include "enums/resources/map/blockmask.h" + #include "resources/image/image.h" +#include "resources/map/map.h" #include "resources/map/maplayer.h" #include "debug.h" @@ -39,7 +42,7 @@ TEST_CASE("MapLayer getTileDrawWidth") SECTION("simple 1") { - MapLayer *layer = new MapLayer("test", + layer = new MapLayer("test", 0, 0, 1, 1, false, @@ -57,7 +60,7 @@ TEST_CASE("MapLayer getTileDrawWidth") SECTION("simple 2") { - MapLayer *layer = new MapLayer("test", + layer = new MapLayer("test", 0, 0, 2, 1, false, @@ -75,7 +78,7 @@ TEST_CASE("MapLayer getTileDrawWidth") SECTION("simple 3") { - MapLayer *layer = new MapLayer("test", + layer = new MapLayer("test", 0, 0, 2, 1, false, @@ -101,7 +104,7 @@ TEST_CASE("MapLayer getTileDrawWidth") SECTION("simple 4") { - MapLayer *layer = new MapLayer("test", + layer = new MapLayer("test", 0, 0, 2, 1, false, @@ -125,9 +128,9 @@ TEST_CASE("MapLayer getTileDrawWidth") REQUIRE(nextTile == 0); } - SECTION("simple 4") + SECTION("simple 4.2") { - MapLayer *layer = new MapLayer("test", + layer = new MapLayer("test", 0, 0, 3, 1, false, @@ -153,7 +156,7 @@ TEST_CASE("MapLayer getTileDrawWidth") SECTION("simple 5") { - MapLayer *layer = new MapLayer("test", + layer = new MapLayer("test", 0, 0, 3, 1, false, @@ -179,7 +182,7 @@ TEST_CASE("MapLayer getTileDrawWidth") SECTION("simple 6") { - MapLayer *layer = new MapLayer("test", + layer = new MapLayer("test", 0, 0, 3, 1, false, @@ -211,9 +214,79 @@ TEST_CASE("MapLayer getTileDrawWidth") REQUIRE(nextTile == 0); } + SECTION("simple 7") + { + layer = new MapLayer("test", + 0, 0, + 3, 1, + false, + 0, + 0); + layer->setTile(0, 0, img1); + layer->setTile(1, 0, img1); + layer->setTile(2, 0, img2); + TileInfo *const tiles = layer->getTiles(); + tiles[1].isEnabled = false; + REQUIRE(layer->getTileDrawWidth(tiles, + 3, + width, + nextTile) == 0); + REQUIRE(width == 32); + REQUIRE(nextTile == 1); + +// REQUIRE(layer->getTileDrawWidth(tiles + 1, +// 2, +// width, +// nextTile) == 0); +// REQUIRE(width == 32); +// REQUIRE(nextTile == 0); + + REQUIRE(layer->getTileDrawWidth(tiles + 2, + 1, + width, + nextTile) == 0); + REQUIRE(width == 32); + REQUIRE(nextTile == 0); + } + + SECTION("simple 8") + { + layer = new MapLayer("test", + 0, 0, + 3, 1, + false, + 0, + 0); + layer->setTile(0, 0, img1); + layer->setTile(1, 0, img1); + layer->setTile(2, 0, img2); + TileInfo *const tiles = layer->getTiles(); + tiles[0].isEnabled = false; +// REQUIRE(layer->getTileDrawWidth(tiles, +// 3, +// width, +// nextTile) == 1); +// REQUIRE(width == 0); +// REQUIRE(nextTile == 1); + + REQUIRE(layer->getTileDrawWidth(tiles + 1, + 2, + width, + nextTile) == 0); + REQUIRE(width == 32); + REQUIRE(nextTile == 0); + + REQUIRE(layer->getTileDrawWidth(tiles + 2, + 1, + width, + nextTile) == 0); + REQUIRE(width == 32); + REQUIRE(nextTile == 0); + } + SECTION("normal 1") { - MapLayer *layer = new MapLayer("test", + layer = new MapLayer("test", 0, 0, 100, 100, false, @@ -333,7 +406,7 @@ TEST_CASE("MapLayer getEmptyTileDrawWidth") SECTION("simple 2") { - MapLayer *layer = new MapLayer("test", + layer = new MapLayer("test", 0, 0, 2, 1, false, @@ -349,7 +422,7 @@ TEST_CASE("MapLayer getEmptyTileDrawWidth") SECTION("simple 4") { - MapLayer *layer = new MapLayer("test", + layer = new MapLayer("test", 0, 0, 3, 1, false, @@ -366,7 +439,7 @@ TEST_CASE("MapLayer getEmptyTileDrawWidth") SECTION("simple 5") { - MapLayer *layer = new MapLayer("test", + layer = new MapLayer("test", 0, 0, 3, 1, false, @@ -383,7 +456,7 @@ TEST_CASE("MapLayer getEmptyTileDrawWidth") SECTION("normal 1") { - MapLayer *layer = new MapLayer("test", + layer = new MapLayer("test", 0, 0, 100, 100, false, @@ -449,3 +522,565 @@ TEST_CASE("MapLayer getEmptyTileDrawWidth") delete img2; delete img3; } + + +TEST_CASE("MapLayer updateCache") +{ + Image *const img1 = new Image(32, 32); + Image *const img2 = new Image(32, 32); + Image *const img3 = new Image(32, 32); + MapLayer *layer = nullptr; + int width; + int nextTile; + + SECTION("simple 1") + { + layer = new MapLayer("test", + 0, 0, + 1, 1, + false, + 0, + 0); + layer->setTile(0, 0, img1); + TileInfo *const tiles = layer->getTiles(); + layer->updateCache(1, 1); + REQUIRE(tiles[0].isEnabled == true); + REQUIRE(tiles[0].width == 32); + REQUIRE(tiles[0].count == 0); + REQUIRE(tiles[0].nextTile == 0); + } + + SECTION("simple 2") + { + layer = new MapLayer("test", + 0, 0, + 2, 1, + false, + 0, + 0); + layer->setTile(0, 0, img1); + TileInfo *const tiles = layer->getTiles(); + layer->updateCache(2, 1); + REQUIRE(tiles[0].isEnabled == true); + REQUIRE(tiles[0].width == 32); + REQUIRE(tiles[0].count == 0); + REQUIRE(tiles[0].nextTile == 1); + REQUIRE(tiles[1].isEnabled == false); + REQUIRE(tiles[1].width == 0); + REQUIRE(tiles[1].count == 0); + REQUIRE(tiles[1].nextTile == 0); + } + + SECTION("simple 3") + { + layer = new MapLayer("test", + 0, 0, + 2, 1, + false, + 0, + 0); + layer->setTile(0, 0, img1); + layer->setTile(1, 0, img2); + TileInfo *const tiles = layer->getTiles(); + layer->updateCache(2, 1); + REQUIRE(tiles[0].isEnabled == true); + REQUIRE(tiles[0].width == 32); + REQUIRE(tiles[0].count == 0); + REQUIRE(tiles[0].nextTile == 0); + REQUIRE(tiles[1].isEnabled == true); + REQUIRE(tiles[1].width == 32); + REQUIRE(tiles[1].count == 0); + REQUIRE(tiles[1].nextTile == 0); + } + + SECTION("simple 4") + { + layer = new MapLayer("test", + 0, 0, + 2, 1, + false, + 0, + 0); + layer->setTile(0, 0, img1); + layer->setTile(1, 0, img1); + TileInfo *const tiles = layer->getTiles(); + layer->updateCache(2, 1); + REQUIRE(tiles[0].isEnabled == true); + REQUIRE(tiles[0].width == 64); + REQUIRE(tiles[0].count == 1); + REQUIRE(tiles[0].nextTile == 1); + REQUIRE(tiles[1].isEnabled == true); + REQUIRE(tiles[1].width == 32); + REQUIRE(tiles[1].count == 0); + REQUIRE(tiles[1].nextTile == 0); + } + + SECTION("simple 4.2") + { + layer = new MapLayer("test", + 0, 0, + 3, 1, + false, + 0, + 0); + layer->setTile(0, 0, img1); + layer->setTile(2, 0, img1); + TileInfo *const tiles = layer->getTiles(); + layer->updateCache(3, 1); + REQUIRE(tiles[0].isEnabled == true); + REQUIRE(tiles[0].width == 32); + REQUIRE(tiles[0].count == 0); + REQUIRE(tiles[0].nextTile == 1); + REQUIRE(tiles[1].isEnabled == false); + REQUIRE(tiles[1].width == 0); + REQUIRE(tiles[1].count == 0); + REQUIRE(tiles[1].nextTile == 0); + REQUIRE(tiles[2].isEnabled == true); + REQUIRE(tiles[2].width == 32); + REQUIRE(tiles[2].count == 0); + REQUIRE(tiles[2].nextTile == 0); + } + + SECTION("simple 5") + { + layer = new MapLayer("test", + 0, 0, + 3, 1, + false, + 0, + 0); + layer->setTile(0, 0, img1); + layer->setTile(1, 0, img1); + TileInfo *const tiles = layer->getTiles(); + layer->updateCache(3, 1); + REQUIRE(tiles[0].isEnabled == true); + REQUIRE(tiles[0].width == 64); + REQUIRE(tiles[0].count == 1); + REQUIRE(tiles[0].nextTile == 2); + REQUIRE(tiles[1].isEnabled == true); + REQUIRE(tiles[1].width == 32); + REQUIRE(tiles[1].count == 0); + REQUIRE(tiles[1].nextTile == 1); + REQUIRE(tiles[2].isEnabled == false); + REQUIRE(tiles[2].width == 0); + REQUIRE(tiles[2].count == 0); + REQUIRE(tiles[2].nextTile == 0); + } + + SECTION("simple 6") + { + layer = new MapLayer("test", + 0, 0, + 3, 1, + false, + 0, + 0); + layer->setTile(0, 0, img1); + layer->setTile(1, 0, img1); + layer->setTile(2, 0, img2); + TileInfo *const tiles = layer->getTiles(); + layer->updateCache(3, 1); + REQUIRE(tiles[0].isEnabled == true); + REQUIRE(tiles[0].width == 64); + REQUIRE(tiles[0].count == 1); + REQUIRE(tiles[0].nextTile == 1); + REQUIRE(tiles[1].isEnabled == true); + REQUIRE(tiles[1].width == 32); + REQUIRE(tiles[1].count == 0); + REQUIRE(tiles[1].nextTile == 0); + REQUIRE(tiles[2].isEnabled == true); + REQUIRE(tiles[2].width == 32); + REQUIRE(tiles[2].count == 0); + REQUIRE(tiles[2].nextTile == 0); + } + + SECTION("simple 7") + { + layer = new MapLayer("test", + 0, 0, + 3, 1, + false, + 0, + 0); + layer->setTile(0, 0, img1); + layer->setTile(1, 0, img1); + layer->setTile(2, 0, img2); + TileInfo *const tiles = layer->getTiles(); + tiles[0].isEnabled = false; + layer->updateCache(3, 1); + REQUIRE(tiles[0].isEnabled == false); + REQUIRE(tiles[0].width == 0); + REQUIRE(tiles[0].count == 0); + REQUIRE(tiles[0].nextTile == 0); + REQUIRE(tiles[1].isEnabled == true); + REQUIRE(tiles[1].width == 32); + REQUIRE(tiles[1].count == 0); + REQUIRE(tiles[1].nextTile == 0); + REQUIRE(tiles[2].isEnabled == true); + REQUIRE(tiles[2].width == 32); + REQUIRE(tiles[2].count == 0); + REQUIRE(tiles[2].nextTile == 0); + } + + SECTION("normal 1") + { + layer = new MapLayer("test", + 0, 0, + 100, 100, + false, + 0, + 0); + layer->setTile(1, 10, img1); + layer->setTile(2, 10, img1); + layer->setTile(3, 10, img1); + layer->setTile(4, 10, img2); + layer->setTile(5, 10, nullptr); + layer->setTile(6, 10, img2); + layer->setTile(7, 10, nullptr); + layer->setTile(8, 10, nullptr); + layer->setTile(9, 10, img2); + layer->setTile(10, 10, img2); + layer->setTile(11, 10, img3); + layer->setTile(12, 10, nullptr); + layer->setTile(13, 10, nullptr); + layer->setTile(14, 10, nullptr); + layer->setTile(15, 10, img1); + layer->setTile(16, 10, img1); + layer->setTile(17, 10, img1); + TileInfo *const tiles = layer->getTiles(); + layer->updateCache(100, 100); + + REQUIRE(tiles[0 * 100 + 0].isEnabled == false); + REQUIRE(tiles[0 * 100 + 0].width == 0); + REQUIRE(tiles[0 * 100 + 0].count == 99); + REQUIRE(tiles[0 * 100 + 0].nextTile == 99); + + REQUIRE(tiles[0 * 100 + 1].isEnabled == false); + REQUIRE(tiles[0 * 100 + 1].width == 0); + REQUIRE(tiles[0 * 100 + 1].count == 98); + REQUIRE(tiles[0 * 100 + 1].nextTile == 98); + + REQUIRE(tiles[10 * 100 + 0].isEnabled == false); + REQUIRE(tiles[10 * 100 + 0].width == 0); + REQUIRE(tiles[10 * 100 + 0].count == 0); + REQUIRE(tiles[10 * 100 + 0].nextTile == 0); + + REQUIRE(tiles[10 * 100 + 1].isEnabled == true); + REQUIRE(tiles[10 * 100 + 1].width == 96); + REQUIRE(tiles[10 * 100 + 1].count == 2); + REQUIRE(tiles[10 * 100 + 1].nextTile == 2); + + REQUIRE(tiles[10 * 100 + 2].isEnabled == true); + REQUIRE(tiles[10 * 100 + 2].width == 64); + REQUIRE(tiles[10 * 100 + 2].count == 1); + REQUIRE(tiles[10 * 100 + 2].nextTile == 1); + + REQUIRE(tiles[10 * 100 + 3].isEnabled == true); + REQUIRE(tiles[10 * 100 + 3].width == 32); + REQUIRE(tiles[10 * 100 + 3].count == 0); + REQUIRE(tiles[10 * 100 + 3].nextTile == 0); + + REQUIRE(tiles[10 * 100 + 4].isEnabled == true); + REQUIRE(tiles[10 * 100 + 4].width == 32); + REQUIRE(tiles[10 * 100 + 4].count == 0); + REQUIRE(tiles[10 * 100 + 4].nextTile == 1); + + REQUIRE(tiles[10 * 100 + 5].isEnabled == false); + REQUIRE(tiles[10 * 100 + 5].width == 0); + REQUIRE(tiles[10 * 100 + 5].count == 0); + REQUIRE(tiles[10 * 100 + 5].nextTile == 0); + + REQUIRE(tiles[10 * 100 + 6].isEnabled == true); + REQUIRE(tiles[10 * 100 + 6].width == 32); + REQUIRE(tiles[10 * 100 + 6].count == 0); + REQUIRE(tiles[10 * 100 + 6].nextTile == 2); + + REQUIRE(tiles[10 * 100 + 7].isEnabled == false); + REQUIRE(tiles[10 * 100 + 7].width == 0); + REQUIRE(tiles[10 * 100 + 7].count == 1); + REQUIRE(tiles[10 * 100 + 7].nextTile == 1); + + REQUIRE(tiles[10 * 100 + 8].isEnabled == false); + REQUIRE(tiles[10 * 100 + 8].width == 0); + REQUIRE(tiles[10 * 100 + 8].count == 0); + REQUIRE(tiles[10 * 100 + 8].nextTile == 0); + + REQUIRE(tiles[10 * 100 + 9].isEnabled == true); + REQUIRE(tiles[10 * 100 + 9].width == 64); + REQUIRE(tiles[10 * 100 + 9].count == 1); + REQUIRE(tiles[10 * 100 + 9].nextTile == 1); + + REQUIRE(tiles[10 * 100 + 10].isEnabled == true); + REQUIRE(tiles[10 * 100 + 10].width == 32); + REQUIRE(tiles[10 * 100 + 10].count == 0); + REQUIRE(tiles[10 * 100 + 10].nextTile == 0); + + REQUIRE(tiles[10 * 100 + 11].isEnabled == true); + REQUIRE(tiles[10 * 100 + 11].width == 32); + REQUIRE(tiles[10 * 100 + 11].count == 0); + REQUIRE(tiles[10 * 100 + 11].nextTile == 3); + + REQUIRE(tiles[10 * 100 + 12].isEnabled == false); + REQUIRE(tiles[10 * 100 + 12].width == 0); + REQUIRE(tiles[10 * 100 + 12].count == 2); + REQUIRE(tiles[10 * 100 + 12].nextTile == 2); + + REQUIRE(tiles[10 * 100 + 13].isEnabled == false); + REQUIRE(tiles[10 * 100 + 13].width == 0); + REQUIRE(tiles[10 * 100 + 13].count == 1); + REQUIRE(tiles[10 * 100 + 13].nextTile == 1); + + REQUIRE(tiles[10 * 100 + 14].isEnabled == false); + REQUIRE(tiles[10 * 100 + 14].width == 0); + REQUIRE(tiles[10 * 100 + 14].count == 0); + REQUIRE(tiles[10 * 100 + 14].nextTile == 0); + + REQUIRE(tiles[10 * 100 + 15].isEnabled == true); + REQUIRE(tiles[10 * 100 + 15].width == 96); + REQUIRE(tiles[10 * 100 + 15].count == 2); + REQUIRE(tiles[10 * 100 + 15].nextTile == 84); + + REQUIRE(tiles[10 * 100 + 16].isEnabled == true); + REQUIRE(tiles[10 * 100 + 16].width == 64); + REQUIRE(tiles[10 * 100 + 16].count == 1); + REQUIRE(tiles[10 * 100 + 16].nextTile == 83); + + REQUIRE(tiles[10 * 100 + 17].isEnabled == true); + REQUIRE(tiles[10 * 100 + 17].width == 32); + REQUIRE(tiles[10 * 100 + 17].count == 0); + REQUIRE(tiles[10 * 100 + 17].nextTile == 82); + } + + SECTION("normal2") + { + const int maxX = 100; + const int maxY = 100; + layer = new MapLayer("test", + 0, 0, + maxX, maxY, + false, + 0, + 0); + TileInfo *const tiles = layer->getTiles(); + for (int x = 0; x < maxX; x ++) + { + for (int y = 0; y < maxY; y ++) + { + layer->setTile(x, y, img1); + tiles[y * maxX + x].isEnabled = false; + } + } + tiles[10 * maxX + 41].isEnabled = true; + layer->updateCache(maxX, maxY); + + REQUIRE(tiles[10 * maxX + 0].isEnabled == false); + REQUIRE(tiles[10 * maxX + 0].width == 0); + REQUIRE(tiles[10 * maxX + 0].count == 40); + REQUIRE(tiles[10 * maxX + 0].nextTile == 40); + + REQUIRE(tiles[10 * maxX + 1].isEnabled == false); + REQUIRE(tiles[10 * maxX + 1].width == 0); + REQUIRE(tiles[10 * maxX + 1].count == 39); + REQUIRE(tiles[10 * maxX + 1].nextTile == 39); + } + + delete layer; + delete img1; + delete img2; + delete img3; +} + +TEST_CASE("MapLayer updateConditionTiles") +{ + Image *const img1 = new Image(32, 32); + Map *map = nullptr; + MapLayer *layer = nullptr; + int width; + int nextTile; + + SECTION("simple 1") + { + map = new Map("map", + 1, 1, + 32, 32); + layer = new MapLayer("test", + 0, 0, + 1, 1, + false, + 0, + 0); + layer->setTile(0, 0, img1); + map->addLayer(layer); + layer->setTileCondition(BlockMask::WATER); + TileInfo *const tiles = layer->getTiles(); + + map->addBlockMask(0, 0, BlockType::NONE); + layer->updateConditionTiles(map->getMetaTiles(), + 1, 1); + REQUIRE(tiles[0].isEnabled == false); + + map->addBlockMask(0, 0, BlockType::WATER); + layer->updateConditionTiles(map->getMetaTiles(), + 1, 1); + REQUIRE(tiles[0].isEnabled == true); + } + + SECTION("normal 1") + { + map = new Map("map", + 100, 200, + 32, 32); + layer = new MapLayer("test", + 0, 0, + 100, 200, + false, + 0, + 0); + layer->setTile(10, 10, img1); + layer->setTile(10, 20, img1); + layer->setTile(10, 30, img1); + map->addLayer(layer); + layer->setTileCondition(BlockMask::WATER); + TileInfo *const tiles = layer->getTiles(); + + map->addBlockMask(10, 10, BlockType::NONE); + map->addBlockMask(10, 20, BlockType::NONE); + map->addBlockMask(20, 20, BlockType::NONE); + layer->updateConditionTiles(map->getMetaTiles(), + 100, 200); + for (int x = 0; x < 100; x ++) + { + for (int y = 0; y < 200; y ++) + { + REQUIRE(tiles[y * 100 + x].isEnabled == false); + } + } + } + + SECTION("normal 2") + { + map = new Map("map", + 100, 200, + 32, 32); + layer = new MapLayer("test", + 0, 0, + 100, 200, + false, + 0, + 0); + layer->setTile(10, 10, img1); + layer->setTile(10, 20, img1); + layer->setTile(10, 30, img1); + map->addLayer(layer); + layer->setTileCondition(BlockMask::WATER); + TileInfo *const tiles = layer->getTiles(); + + map->addBlockMask(10, 10, BlockType::WATER); + map->addBlockMask(10, 20, BlockType::WATER); + map->addBlockMask(20, 20, BlockType::WATER); + layer->updateConditionTiles(map->getMetaTiles(), + 100, 200); + for (int x = 0; x < 100; x ++) + { + for (int y = 0; y < 200; y ++) + { + if ((x == 10 && y == 10) || (x == 10 && y == 20)) + { + REQUIRE(tiles[y * 100 + x].isEnabled == true); + } + else + { + REQUIRE(tiles[y * 100 + x].isEnabled == false); + } + } + } + } + + SECTION("normal 3") + { + map = new Map("map", + 100, 200, + 32, 32); + layer = new MapLayer("test", + 0, 0, + 100, 200, + false, + 0, + 0); + for (int x = 0; x < 100; x ++) + { + for (int y = 0; y < 200; y ++) + { + layer->setTile(x, y, img1); + } + } + map->addLayer(layer); + layer->setTileCondition(BlockMask::WATER); + TileInfo *const tiles = layer->getTiles(); + + map->addBlockMask(10, 10, BlockType::WATER); + map->addBlockMask(10, 20, BlockType::WATER); + layer->updateConditionTiles(map->getMetaTiles(), + 100, 200); + for (int x = 0; x < 100; x ++) + { + for (int y = 0; y < 200; y ++) + { + if ((x == 10 && y == 10) || (x == 10 && y == 20)) + { + REQUIRE(tiles[y * 100 + x].isEnabled == true); + } + else + { + REQUIRE(tiles[y * 100 + x].isEnabled == false); + } + } + } + } + + SECTION("normal 4") + { + map = new Map("map", + 100, 200, + 32, 32); + layer = new MapLayer("test", + 0, 0, + 100, 200, + false, + 0, + 0); + layer->setTile(10, 10, img1); + layer->setTile(10, 20, img1); + map->addLayer(layer); + layer->setTileCondition(BlockMask::WATER); + TileInfo *const tiles = layer->getTiles(); + + for (int x = 0; x < 100; x ++) + { + for (int y = 0; y < 200; y ++) + { + map->addBlockMask(x, y, BlockType::WATER); + } + } + + layer->updateConditionTiles(map->getMetaTiles(), + 100, 200); + for (int x = 0; x < 100; x ++) + { + for (int y = 0; y < 200; y ++) + { + if ((x == 10 && y == 10) || (x == 10 && y == 20)) + { + REQUIRE(tiles[y * 100 + x].isEnabled == true); + } + else + { + REQUIRE(tiles[y * 100 + x].isEnabled == false); + } + } + } + } + + delete map; + delete img1; +} -- cgit v1.2.3-60-g2f50