diff options
Diffstat (limited to 'test/miscellaneous/clip_ids.cpp')
-rw-r--r-- | test/miscellaneous/clip_ids.cpp | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/test/miscellaneous/clip_ids.cpp b/test/miscellaneous/clip_ids.cpp new file mode 100644 index 0000000000..ebd819e264 --- /dev/null +++ b/test/miscellaneous/clip_ids.cpp @@ -0,0 +1,251 @@ +#include <iostream> +#include "../util.hpp" + +#include <algorithm> + +#include <mbgl/util/clip_ids.hpp> +#include <mbgl/util/std.hpp> + +using namespace mbgl; + +template <typename T> void generate(const T &sources) { + ClipIDGenerator generator; + + for (size_t j = 0; j < sources.size(); j++) { + std::forward_list<Tile *> tile_ptrs; + std::transform(sources[j].begin(), sources[j].end(), std::front_inserter(tile_ptrs), [](const std::shared_ptr<Tile> &tile) { return tile.get(); }); + generator.update(tile_ptrs); + } +} + +template <typename T> void print(const T &sources) { + for (size_t j = 0; j < sources.size(); j++) { + for (size_t i = 0; i < sources[j].size(); i++) { + std::cout << " ASSERT_EQ(ClipID(\"" << sources[j][i]->clip.mask << "\", \"" << sources[j][i]->clip.reference << "\"), sources[" << j << "][" << i << "]->clip);\n"; + } + } +} + +TEST(ClipIDs, ParentAndFourChildren) { + const std::vector<std::vector<std::shared_ptr<Tile>>> sources = { + { + std::make_shared<Tile>(Tile::ID { 1, 0, 0 }), + std::make_shared<Tile>(Tile::ID { 1, 0, 1 }), + std::make_shared<Tile>(Tile::ID { 1, 1, 0 }), + std::make_shared<Tile>(Tile::ID { 1, 1, 1 }), + std::make_shared<Tile>(Tile::ID { 0, 0, 0 }), + }, + }; + + generate(sources); + // print(sources); + + ASSERT_EQ(ClipID("00000111", "00000010"), sources[0][0]->clip); + ASSERT_EQ(ClipID("00000111", "00000011"), sources[0][1]->clip); + ASSERT_EQ(ClipID("00000111", "00000100"), sources[0][2]->clip); + ASSERT_EQ(ClipID("00000111", "00000101"), sources[0][3]->clip); + ASSERT_EQ(ClipID("00000111", "00000001"), sources[0][4]->clip); +} + +TEST(ClipIDs, ParentAndFourChildrenNegative) { + const std::vector<std::vector<std::shared_ptr<Tile>>> sources = { + { + std::make_shared<Tile>(Tile::ID { 1, -2, 0 }), + std::make_shared<Tile>(Tile::ID { 1, -2, 1 }), + std::make_shared<Tile>(Tile::ID { 1, -1, 0 }), + std::make_shared<Tile>(Tile::ID { 1, -1, 1 }), + std::make_shared<Tile>(Tile::ID { 0, -1, 0 }), + }, + }; + + generate(sources); + // print(sources); + + ASSERT_EQ(ClipID("00000111", "00000010"), sources[0][0]->clip); + ASSERT_EQ(ClipID("00000111", "00000011"), sources[0][1]->clip); + ASSERT_EQ(ClipID("00000111", "00000100"), sources[0][2]->clip); + ASSERT_EQ(ClipID("00000111", "00000101"), sources[0][3]->clip); + ASSERT_EQ(ClipID("00000111", "00000001"), sources[0][4]->clip); +} + +TEST(ClipIDs, NegativeParentAndMissingLevel) { + const std::vector<std::vector<std::shared_ptr<Tile>>> sources = { + { + std::make_shared<Tile>(Tile::ID { 1, -1, 0 }), + std::make_shared<Tile>(Tile::ID { 2, -1, 0 }), + std::make_shared<Tile>(Tile::ID { 2, -2, 1 }), + std::make_shared<Tile>(Tile::ID { 2, -1, 1 }), + std::make_shared<Tile>(Tile::ID { 2, -2, 0 }), + }, + }; + + generate(sources); + // print(sources); + + ASSERT_EQ(ClipID("00000111", "00000001"), sources[0][0]->clip); + ASSERT_EQ(ClipID("00000111", "00000100"), sources[0][1]->clip); + ASSERT_EQ(ClipID("00000111", "00000011"), sources[0][2]->clip); + ASSERT_EQ(ClipID("00000111", "00000101"), sources[0][3]->clip); + ASSERT_EQ(ClipID("00000111", "00000010"), sources[0][4]->clip); +} + + +TEST(ClipIDs, SevenOnSameLevel) { + const std::vector<std::vector<std::shared_ptr<Tile>>> sources = { + { + std::make_shared<Tile>(Tile::ID { 2, 0, 0 }), + std::make_shared<Tile>(Tile::ID { 2, 0, 1 }), + std::make_shared<Tile>(Tile::ID { 2, 0, 2 }), + std::make_shared<Tile>(Tile::ID { 2, 1, 0 }), + std::make_shared<Tile>(Tile::ID { 2, 1, 1 }), + std::make_shared<Tile>(Tile::ID { 2, 1, 2 }), + std::make_shared<Tile>(Tile::ID { 2, 2, 0 }), + }, + }; + + generate(sources); + // print(sources); + + ASSERT_EQ(ClipID("00000111", "00000001"), sources[0][0]->clip); + ASSERT_EQ(ClipID("00000111", "00000010"), sources[0][1]->clip); + ASSERT_EQ(ClipID("00000111", "00000011"), sources[0][2]->clip); + ASSERT_EQ(ClipID("00000111", "00000100"), sources[0][3]->clip); + ASSERT_EQ(ClipID("00000111", "00000101"), sources[0][4]->clip); + ASSERT_EQ(ClipID("00000111", "00000110"), sources[0][5]->clip); + ASSERT_EQ(ClipID("00000111", "00000111"), sources[0][6]->clip); +} + +TEST(ClipIDs, MultipleLevels) { + const std::vector<std::vector<std::shared_ptr<Tile>>> sources = { + { + std::make_shared<Tile>(Tile::ID { 2, 0, 0 }), + std::make_shared<Tile>(Tile::ID { 3, 0, 0 }), + std::make_shared<Tile>(Tile::ID { 3, 0, 1 }), + std::make_shared<Tile>(Tile::ID { 4, 0, 2 }), + std::make_shared<Tile>(Tile::ID { 4, 1, 2 }), + std::make_shared<Tile>(Tile::ID { 4, 0, 3 }), + std::make_shared<Tile>(Tile::ID { 4, 1, 3 }), + std::make_shared<Tile>(Tile::ID { 3, 1, 0 }), + std::make_shared<Tile>(Tile::ID { 3, 1, 1 }), + std::make_shared<Tile>(Tile::ID { 2, 1, 0 }), + std::make_shared<Tile>(Tile::ID { 3, 2, 0 }), + std::make_shared<Tile>(Tile::ID { 3, 2, 1 }), + }, + }; + + generate(sources); + // print(sources); + + ASSERT_EQ(ClipID("00001111", "00000001"), sources[0][0]->clip); + ASSERT_EQ(ClipID("00001111", "00000011"), sources[0][1]->clip); + ASSERT_EQ(ClipID("00001111", "00000100"), sources[0][2]->clip); + ASSERT_EQ(ClipID("00001111", "00001001"), sources[0][3]->clip); + ASSERT_EQ(ClipID("00001111", "00001011"), sources[0][4]->clip); + ASSERT_EQ(ClipID("00001111", "00001010"), sources[0][5]->clip); + ASSERT_EQ(ClipID("00001111", "00001100"), sources[0][6]->clip); + ASSERT_EQ(ClipID("00001111", "00000101"), sources[0][7]->clip); + ASSERT_EQ(ClipID("00001111", "00000110"), sources[0][8]->clip); + ASSERT_EQ(ClipID("00001111", "00000010"), sources[0][9]->clip); + ASSERT_EQ(ClipID("00001111", "00000111"), sources[0][10]->clip); + ASSERT_EQ(ClipID("00001111", "00001000"), sources[0][11]->clip); +} + + +TEST(ClipIDs, Bug206) { + const std::vector<std::vector<std::shared_ptr<Tile>>> sources = { + { + std::make_shared<Tile>(Tile::ID { 10, 162, 395 }), + std::make_shared<Tile>(Tile::ID { 10, 162, 396 }), + std::make_shared<Tile>(Tile::ID { 10, 163, 395 }), + std::make_shared<Tile>(Tile::ID { 11, 326, 791 }), + std::make_shared<Tile>(Tile::ID { 12, 654, 1582 }), + std::make_shared<Tile>(Tile::ID { 12, 654, 1583 }), + std::make_shared<Tile>(Tile::ID { 12, 655, 1582 }), + std::make_shared<Tile>(Tile::ID { 12, 655, 1583 }), + std::make_shared<Tile>(Tile::ID { 10, 163, 396 }), + std::make_shared<Tile>(Tile::ID { 10, 164, 395 }), + std::make_shared<Tile>(Tile::ID { 10, 164, 396 }), + }, + }; + + generate(sources); + // print(sources); + + ASSERT_EQ(ClipID("00001111", "00000001"), sources[0][0]->clip); + ASSERT_EQ(ClipID("00001111", "00000010"), sources[0][1]->clip); + ASSERT_EQ(ClipID("00001111", "00000011"), sources[0][2]->clip); + ASSERT_EQ(ClipID("00001111", "00000111"), sources[0][3]->clip); + ASSERT_EQ(ClipID("00001111", "00001000"), sources[0][4]->clip); + ASSERT_EQ(ClipID("00001111", "00001001"), sources[0][5]->clip); + ASSERT_EQ(ClipID("00001111", "00001010"), sources[0][6]->clip); + ASSERT_EQ(ClipID("00001111", "00001011"), sources[0][7]->clip); + ASSERT_EQ(ClipID("00001111", "00000100"), sources[0][8]->clip); + ASSERT_EQ(ClipID("00001111", "00000101"), sources[0][9]->clip); + ASSERT_EQ(ClipID("00001111", "00000110"), sources[0][10]->clip); +} + + +TEST(ClipIDs, MultipleSources) { + const std::vector<std::vector<std::shared_ptr<Tile>>> sources = { + { + std::make_shared<Tile>(Tile::ID { 0, 0, 0 }), + std::make_shared<Tile>(Tile::ID { 1, 1, 1 }), + std::make_shared<Tile>(Tile::ID { 2, 2, 1 }), + std::make_shared<Tile>(Tile::ID { 2, 2, 2 }), + }, + { + std::make_shared<Tile>(Tile::ID { 0, 0, 0 }), + std::make_shared<Tile>(Tile::ID { 1, 1, 1 }), + std::make_shared<Tile>(Tile::ID { 2, 1, 1 }), + std::make_shared<Tile>(Tile::ID { 2, 2, 2 }), + }, + { + std::make_shared<Tile>(Tile::ID { 1, 0, 0 }), + std::make_shared<Tile>(Tile::ID { 1, 0, 1 }), + std::make_shared<Tile>(Tile::ID { 1, 1, 0 }), + std::make_shared<Tile>(Tile::ID { 1, 1, 1 }), + std::make_shared<Tile>(Tile::ID { 2, 1, 1 }), + }, + }; + + generate(sources); + // print(sources); + + ASSERT_EQ(ClipID("00000111", "00000001"), sources[0][0]->clip); + ASSERT_EQ(ClipID("00000111", "00000010"), sources[0][1]->clip); + ASSERT_EQ(ClipID("00000111", "00000011"), sources[0][2]->clip); + ASSERT_EQ(ClipID("00000111", "00000100"), sources[0][3]->clip); + ASSERT_EQ(ClipID("00011000", "00001000"), sources[1][0]->clip); + ASSERT_EQ(ClipID("00000111", "00000010"), sources[1][1]->clip); + ASSERT_EQ(ClipID("00011000", "00010000"), sources[1][2]->clip); + ASSERT_EQ(ClipID("00000111", "00000100"), sources[1][3]->clip); + ASSERT_EQ(ClipID("11100000", "00100000"), sources[2][0]->clip); + ASSERT_EQ(ClipID("11100000", "01000000"), sources[2][1]->clip); + ASSERT_EQ(ClipID("11100000", "01100000"), sources[2][2]->clip); + ASSERT_EQ(ClipID("11100000", "10000000"), sources[2][3]->clip); + ASSERT_EQ(ClipID("00011000", "00010000"), sources[2][4]->clip); +} + + +TEST(ClipIDs, DuplicateIDs) { + const std::vector<std::vector<std::shared_ptr<Tile>>> sources = { + { + std::make_shared<Tile>(Tile::ID { 2, 0, 0 }), + std::make_shared<Tile>(Tile::ID { 2, 0, 1 }), + }, + { + std::make_shared<Tile>(Tile::ID { 2, 0, 0 }), + std::make_shared<Tile>(Tile::ID { 2, 0, 1 }), + std::make_shared<Tile>(Tile::ID { 2, 0, 1 }), + } + }; + + generate(sources); + // print(sources); + + ASSERT_EQ(ClipID("00000011", "00000001"), sources[0][0]->clip); + ASSERT_EQ(ClipID("00000011", "00000010"), sources[0][1]->clip); + ASSERT_EQ(ClipID("00000011", "00000001"), sources[1][0]->clip); + ASSERT_EQ(ClipID("00000011", "00000010"), sources[1][1]->clip); + ASSERT_EQ(ClipID("00000011", "00000010"), sources[1][2]->clip); +} |