summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Shalamov <alexander.shalamov@mapbox.com>2019-02-25 09:53:13 +0200
committerAlexander Shalamov <alexander.shalamov@mapbox.com>2019-02-25 13:22:05 +0200
commit6a2764bbe0077b42664a8b83915cc3cd9d8890c9 (patch)
tree17ece693afaaa9513cbc3f5501d55c7f9712ea5c
parentf44d0da6d1bb6e94093bb3199a1689ca80d39693 (diff)
downloadqtlocation-mapboxgl-upstream/alexshalamov_filter_circle_layer_tiles.tar.gz
[core] Add unit test for RenderCircleLayer::filterRenderTilesupstream/alexshalamov_filter_circle_layer_tiles
-rw-r--r--test/renderer/layers/render_circle_layer.test.cpp119
-rw-r--r--test/test-files.json1
2 files changed, 120 insertions, 0 deletions
diff --git a/test/renderer/layers/render_circle_layer.test.cpp b/test/renderer/layers/render_circle_layer.test.cpp
new file mode 100644
index 0000000000..bb02b2e885
--- /dev/null
+++ b/test/renderer/layers/render_circle_layer.test.cpp
@@ -0,0 +1,119 @@
+#include <mbgl/test/util.hpp>
+
+#include <mbgl/style/layers/circle_layer.hpp>
+#include <mbgl/renderer/layers/render_circle_layer.hpp>
+#include <mbgl/renderer/render_tile.hpp>
+#include <mbgl/renderer/bucket.hpp>
+#include <mbgl/tile/tile.hpp>
+
+using namespace mbgl;
+using namespace mbgl::style;
+
+class MockBucket final : public Bucket {
+public:
+ using Bucket::Bucket;
+ void upload(gl::Context&) {}
+ bool hasData() const { return false; }
+ bool supportsLayer(const style::Layer::Impl&) const { return true; }
+};
+
+class MockTile final : public Tile {
+public:
+ MockTile(OverscaledTileID id) : Tile(Tile::Kind::Geometry, id) {
+ renderable = true;
+ bucket = std::make_shared<MockBucket>();
+ }
+ void upload(gl::Context&){}
+ Bucket* getBucket(const style::Layer::Impl&) const {return bucket.get();}
+
+ std::shared_ptr<MockBucket> bucket;
+};
+
+struct MockRenderTileData {
+ std::vector<std::reference_wrapper<RenderTile>> getRenderTiles() {
+ return {renderTiles.begin(), renderTiles.end()};
+ }
+ std::list<RenderTile> renderTiles;
+ std::vector<std::unique_ptr<MockTile>> tiles;
+};
+
+template<typename ...Ts>
+MockRenderTileData generateRenderTileData(Ts&&... tileIds) {
+ MockRenderTileData data;
+ for (auto&& tileId : { tileIds... }) {
+ auto tile = std::make_unique<MockTile>(tileId.overscaleTo(tileId.canonical.z));
+ data.renderTiles.push_back(RenderTile(tileId, *tile));
+ data.tiles.emplace_back(std::move(tile));
+ }
+ return data;
+}
+
+TEST(RenderCircleLayer, FilterRenderTiles) {
+ auto layer = std::make_unique<CircleLayer>("circle", "source");
+ auto renderLayer = std::make_unique<RenderCircleLayer>(layer->mutableImpl());
+
+ // One parent overlaps 4 children.
+ auto one = generateRenderTileData(UnwrappedTileID{0, 0, 0},
+ UnwrappedTileID{1, 0, 0},
+ UnwrappedTileID{1, 0, 1},
+ UnwrappedTileID{1, 1, 0},
+ UnwrappedTileID{1, 1, 1});
+
+ ASSERT_EQ(renderLayer->filterRenderTiles(one.getRenderTiles()).size(), 1);
+
+ // Two parent tiles overlap 5 child tiles.
+ auto two = generateRenderTileData(UnwrappedTileID{0, 0, 0},
+ UnwrappedTileID{1, 0, 0},
+ UnwrappedTileID{1, 0, 1},
+ UnwrappedTileID{1, 1, 0},
+ UnwrappedTileID{1, 1, 1},
+ UnwrappedTileID{0, 0, 0},
+ UnwrappedTileID{1, 1, 1});
+
+ ASSERT_EQ(renderLayer->filterRenderTiles(two.getRenderTiles()).size(), 2);
+
+ // Three parent tiles overlapping 3 child tiles.
+ auto three = generateRenderTileData(UnwrappedTileID{13,4662,2369},
+ UnwrappedTileID{13,4662,2370},
+ UnwrappedTileID{13,4662,2371},
+ UnwrappedTileID{13,4663,2371},
+ UnwrappedTileID{14,9325,4740},
+ UnwrappedTileID{14,9326,4739},
+ UnwrappedTileID{14,9326,4740},
+ UnwrappedTileID{14,9326,4741},
+ UnwrappedTileID{14,9326,4742},
+ UnwrappedTileID{14,9327,4739},
+ UnwrappedTileID{14,9327,4740},
+ UnwrappedTileID{14,9327,4741},
+ UnwrappedTileID{14,9327,4742},
+ UnwrappedTileID{14,9328,4739},
+ UnwrappedTileID{14,9328,4740});
+
+ ASSERT_EQ(renderLayer->filterRenderTiles(three.getRenderTiles()).size(), 12);
+
+ // One parent that overlaps 4 children tiles.
+ auto four = generateRenderTileData(UnwrappedTileID{10,583,296},
+ UnwrappedTileID{14,9324,4739},
+ UnwrappedTileID{14,9324,4740},
+ UnwrappedTileID{14,9325,4739},
+ UnwrappedTileID{14,9325,4740},
+ UnwrappedTileID{14,9325,4741},
+ UnwrappedTileID{14,9325,4742},
+ UnwrappedTileID{14,9325,4743},
+ UnwrappedTileID{14,9326,4739},
+ UnwrappedTileID{14,9326,4740},
+ UnwrappedTileID{14,9326,4741},
+ UnwrappedTileID{14,9326,4742},
+ UnwrappedTileID{14,9326,4743},
+ UnwrappedTileID{14,9327,4739},
+ UnwrappedTileID{14,9327,4740},
+ UnwrappedTileID{14,9327,4741},
+ UnwrappedTileID{14,9327,4742},
+ UnwrappedTileID{14,9327,4743},
+ UnwrappedTileID{14,9328,4739},
+ UnwrappedTileID{14,9328,4740},
+ UnwrappedTileID{14,9328,4741},
+ UnwrappedTileID{14,9328,4742});
+
+ ASSERT_EQ(renderLayer->filterRenderTiles(four.getRenderTiles()).size(), 18);
+}
diff --git a/test/test-files.json b/test/test-files.json
index 498237e072..4e81bdf201 100644
--- a/test/test-files.json
+++ b/test/test-files.json
@@ -30,6 +30,7 @@
"test/renderer/backend_scope.test.cpp",
"test/renderer/group_by_layout.test.cpp",
"test/renderer/image_manager.test.cpp",
+ "test/renderer/layers/render_circle_layer.test.cpp",
"test/sprite/sprite_loader.test.cpp",
"test/sprite/sprite_parser.test.cpp",
"test/src/mbgl/test/fixture_log_observer.cpp",