diff options
author | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2019-02-25 09:53:13 +0200 |
---|---|---|
committer | Alexander Shalamov <alexander.shalamov@mapbox.com> | 2019-02-25 13:22:05 +0200 |
commit | 6a2764bbe0077b42664a8b83915cc3cd9d8890c9 (patch) | |
tree | 17ece693afaaa9513cbc3f5501d55c7f9712ea5c | |
parent | f44d0da6d1bb6e94093bb3199a1689ca80d39693 (diff) | |
download | qtlocation-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.cpp | 119 | ||||
-rw-r--r-- | test/test-files.json | 1 |
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", |