#include #include "gtest/gtest.h" #include #include #include using namespace mbgl; template void generate(const T &sources) { ClipIDGenerator generator; for (size_t j = 0; j < sources.size(); j++) { std::forward_list tile_ptrs; std::transform(sources[j].begin(), sources[j].end(), std::front_inserter(tile_ptrs), [](const std::shared_ptr &tile) { return tile.get(); }); generator.update(tile_ptrs); } } template 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>> sources = { { std::make_shared(Tile::ID { 1, 0, 0 }), std::make_shared(Tile::ID { 1, 0, 1 }), std::make_shared(Tile::ID { 1, 1, 0 }), std::make_shared(Tile::ID { 1, 1, 1 }), std::make_shared(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>> sources = { { std::make_shared(Tile::ID { 1, -2, 0 }), std::make_shared(Tile::ID { 1, -2, 1 }), std::make_shared(Tile::ID { 1, -1, 0 }), std::make_shared(Tile::ID { 1, -1, 1 }), std::make_shared(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>> sources = { { std::make_shared(Tile::ID { 1, -1, 0 }), std::make_shared(Tile::ID { 2, -1, 0 }), std::make_shared(Tile::ID { 2, -2, 1 }), std::make_shared(Tile::ID { 2, -1, 1 }), std::make_shared(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>> sources = { { std::make_shared(Tile::ID { 2, 0, 0 }), std::make_shared(Tile::ID { 2, 0, 1 }), std::make_shared(Tile::ID { 2, 0, 2 }), std::make_shared(Tile::ID { 2, 1, 0 }), std::make_shared(Tile::ID { 2, 1, 1 }), std::make_shared(Tile::ID { 2, 1, 2 }), std::make_shared(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>> sources = { { std::make_shared(Tile::ID { 2, 0, 0 }), std::make_shared(Tile::ID { 3, 0, 0 }), std::make_shared(Tile::ID { 3, 0, 1 }), std::make_shared(Tile::ID { 4, 0, 2 }), std::make_shared(Tile::ID { 4, 1, 2 }), std::make_shared(Tile::ID { 4, 0, 3 }), std::make_shared(Tile::ID { 4, 1, 3 }), std::make_shared(Tile::ID { 3, 1, 0 }), std::make_shared(Tile::ID { 3, 1, 1 }), std::make_shared(Tile::ID { 2, 1, 0 }), std::make_shared(Tile::ID { 3, 2, 0 }), std::make_shared(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>> sources = { { std::make_shared(Tile::ID { 10, 162, 395 }), std::make_shared(Tile::ID { 10, 162, 396 }), std::make_shared(Tile::ID { 10, 163, 395 }), std::make_shared(Tile::ID { 11, 326, 791 }), std::make_shared(Tile::ID { 12, 654, 1582 }), std::make_shared(Tile::ID { 12, 654, 1583 }), std::make_shared(Tile::ID { 12, 655, 1582 }), std::make_shared(Tile::ID { 12, 655, 1583 }), std::make_shared(Tile::ID { 10, 163, 396 }), std::make_shared(Tile::ID { 10, 164, 395 }), std::make_shared(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>> sources = { { std::make_shared(Tile::ID { 0, 0, 0 }), std::make_shared(Tile::ID { 1, 1, 1 }), std::make_shared(Tile::ID { 2, 2, 1 }), std::make_shared(Tile::ID { 2, 2, 2 }), }, { std::make_shared(Tile::ID { 0, 0, 0 }), std::make_shared(Tile::ID { 1, 1, 1 }), std::make_shared(Tile::ID { 2, 1, 1 }), std::make_shared(Tile::ID { 2, 2, 2 }), }, { std::make_shared(Tile::ID { 1, 0, 0 }), std::make_shared(Tile::ID { 1, 0, 1 }), std::make_shared(Tile::ID { 1, 1, 0 }), std::make_shared(Tile::ID { 1, 1, 1 }), std::make_shared(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>> sources = { { std::make_shared(Tile::ID { 2, 0, 0 }), std::make_shared(Tile::ID { 2, 0, 1 }), }, { std::make_shared(Tile::ID { 2, 0, 0 }), std::make_shared(Tile::ID { 2, 0, 1 }), std::make_shared(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); }