From 69c8f602de9ab087dd841dfabf33a72d46672673 Mon Sep 17 00:00:00 2001 From: "Thiago Marcos P. Santos" Date: Tue, 24 Jan 2017 14:39:08 +0200 Subject: [tests] Add unit test for tile prefetching --- test/map/prefetch.test.cpp | 93 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 test/map/prefetch.test.cpp (limited to 'test/map/prefetch.test.cpp') diff --git a/test/map/prefetch.test.cpp b/test/map/prefetch.test.cpp new file mode 100644 index 0000000000..af2cd4e92f --- /dev/null +++ b/test/map/prefetch.test.cpp @@ -0,0 +1,93 @@ +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +using namespace mbgl; +using namespace mbgl::style; +using namespace std::literals::string_literals; + +TEST(Map, PrefetchTiles) { + util::RunLoop runLoop; + HeadlessBackend backend(test::sharedDisplay()); + BackendScope scope(backend); + OffscreenView view(backend.getContext(), { 512, 512 }); + ThreadPool threadPool(4); + StubFileSource fileSource; + Map map(backend, view.getSize(), 1, fileSource, threadPool, MapMode::Still); + + std::vector tiles; + + fileSource.response = [&] (const Resource& res) -> optional { + Response response; + + auto zoom = std::stoi(res.url); + tiles.push_back(zoom); + + // Return a red tile for prefetched tiles or green to the actual tile. + // The end rendering result should be all green because the map is only + // considered fully rendered when only ideal tiles are shown. + if (zoom == int(map.getZoom()) + 1) { + response.data = std::make_shared( + util::read_file("test/fixtures/map/prefetch/tile_green.png")); + } else { + response.data = std::make_shared( + util::read_file("test/fixtures/map/prefetch/tile_red.png")); + } + + return { std::move(response) }; + }; + + auto checkTilesForZoom = [&](int zoom, const std::vector& expected) { + tiles.clear(); + + // Force tile reloading. + map.getStyle().loadJSON(util::read_file("test/fixtures/map/prefetch/empty.json")); + map.getStyle().loadJSON(util::read_file("test/fixtures/map/prefetch/style.json")); + + map.setLatLngZoom({ 40.726989, -73.992857 }, zoom); // Manhattan + + // Should always render the ideal tiles (i.e. a green map) + test::checkImage("test/fixtures/map/prefetch", test::render(map, view)); + + ASSERT_TRUE(std::is_permutation(tiles.begin(), tiles.end(), expected.begin())); + ASSERT_FALSE(tiles.empty()); + }; + + // Check defaults, should be 4. + ASSERT_EQ(map.getPrefetchZoomDelta(), 4); + checkTilesForZoom(12, { 13, 13, 13, 13, 13, 13, 13, 13, 13, 9 }); + + // Setting it to 0 disables prefetching. + map.setPrefetchZoomDelta(0); + + // No prefetching, raster tiles will use ideal + // tiles instead of the actual zoom level, that is + // why the zoom levels for non-prefetched tiles are + // not the same. + checkTilesForZoom(10, { 11, 11, 11, 11, 11, 11, 11, 11, 11 }); + + map.setPrefetchZoomDelta(5); + checkTilesForZoom(12, { 13, 13, 13, 13, 13, 13, 13, 13, 13, 8 }); + + // Should clamp at `minzoom`. + map.setPrefetchZoomDelta(20); + checkTilesForZoom(10, { 11, 11, 11, 11, 11, 11, 11, 11, 11, 0 }); + + // Disabled again. + map.setPrefetchZoomDelta(0); + checkTilesForZoom(13, { 14, 14, 14, 14, 14, 14, 14, 14, 14 }); +} -- cgit v1.2.1