[core] Add unit tests

This commit is contained in:
Alexander Shalamov
2020-03-27 15:18:39 +02:00
parent ca1ae7604c
commit f3e9c4733a
2 changed files with 119 additions and 4 deletions

View File

@@ -1309,3 +1309,66 @@ TEST(UpdateRenderables, LoadOverscaledMaxZoomTile) {
}),
log);
}
TEST(UpdateRenderables, MaxParentOverscaleFactor) {
ActionLog log;
MockSource source;
auto getTileData = getTileDataFn(log, source.dataTiles);
auto createTileData = createTileDataFn(log, source.dataTiles);
auto retainTileData = retainTileDataFn(log);
auto renderTile = renderTileFn(log);
source.idealTiles.emplace(UnwrappedTileID{4, 0, 0});
source.idealTiles.emplace(UnwrappedTileID{4, 1, 0});
auto tile_0_0_0_0 = source.createTileData(OverscaledTileID{0, 0, 0});
tile_0_0_0_0->renderable = true;
// Set max parent overscale factor to 4, so that tile 0,0,0 would be rendered
algorithm::updateRenderables(
getTileData, createTileData, retainTileData, renderTile, source.idealTiles, source.zoomRange, 4, 4);
EXPECT_EQ(ActionLog({GetTileDataAction{{4, 0, {4, 0, 0}}, NotFound}, // ideal tile
CreateTileDataAction{{4, 0, {4, 0, 0}}},
RetainTileDataAction{{4, 0, {4, 0, 0}}, TileNecessity::Required},
GetTileDataAction{{5, 0, {5, 0, 0}}, NotFound}, // child tiles
GetTileDataAction{{5, 0, {5, 0, 1}}, NotFound},
GetTileDataAction{{5, 0, {5, 1, 0}}, NotFound},
GetTileDataAction{{5, 0, {5, 1, 1}}, NotFound},
GetTileDataAction{{3, 0, {3, 0, 0}}, NotFound}, // ascent
GetTileDataAction{{2, 0, {2, 0, 0}}, NotFound},
GetTileDataAction{{1, 0, {1, 0, 0}}, NotFound},
GetTileDataAction{{0, 0, {0, 0, 0}}, Found},
RetainTileDataAction{{0, 0, {0, 0, 0}}, TileNecessity::Optional},
RenderTileAction{{0, 0, 0}, *tile_0_0_0_0}, // render tile 0,0,0
GetTileDataAction{{4, 0, {4, 1, 0}}, NotFound}, // ideal tile
CreateTileDataAction{{4, 0, {4, 1, 0}}},
RetainTileDataAction{{4, 0, {4, 1, 0}}, TileNecessity::Required},
GetTileDataAction{{5, 0, {5, 2, 0}}, NotFound}, // child tiles
GetTileDataAction{{5, 0, {5, 2, 1}}, NotFound},
GetTileDataAction{{5, 0, {5, 3, 0}}, NotFound},
GetTileDataAction{{5, 0, {5, 3, 1}}, NotFound}}),
log);
log.clear();
// Set max parent overscale factor to 3.
// Parent tile 0,0,0 should not be requested / rendered.
algorithm::updateRenderables(
getTileData, createTileData, retainTileData, renderTile, source.idealTiles, source.zoomRange, 4, 3);
EXPECT_EQ(ActionLog({GetTileDataAction{{4, 0, {4, 0, 0}}, Found}, // ideal tile
RetainTileDataAction{{4, 0, {4, 0, 0}}, TileNecessity::Required},
GetTileDataAction{{5, 0, {5, 0, 0}}, NotFound}, // child tiles
GetTileDataAction{{5, 0, {5, 0, 1}}, NotFound},
GetTileDataAction{{5, 0, {5, 1, 0}}, NotFound},
GetTileDataAction{{5, 0, {5, 1, 1}}, NotFound},
GetTileDataAction{{3, 0, {3, 0, 0}}, NotFound}, // ascent
GetTileDataAction{{2, 0, {2, 0, 0}}, NotFound},
GetTileDataAction{{1, 0, {1, 0, 0}}, NotFound},
GetTileDataAction{{4, 0, {4, 1, 0}}, Found}, // ideal tile
RetainTileDataAction{{4, 0, {4, 1, 0}}, TileNecessity::Required},
GetTileDataAction{{5, 0, {5, 2, 0}}, NotFound}, // child tiles
GetTileDataAction{{5, 0, {5, 2, 1}}, NotFound},
GetTileDataAction{{5, 0, {5, 3, 0}}, NotFound},
GetTileDataAction{{5, 0, {5, 3, 1}}, NotFound}}),
log);
}

View File

@@ -1,7 +1,8 @@
#include <mbgl/test/util.hpp>
#include <mbgl/test/fixture_log_observer.hpp>
#include <mbgl/test/stub_file_source.hpp>
#include <mbgl/test/stub_style_observer.hpp>
#include <mbgl/test/stub_render_source_observer.hpp>
#include <mbgl/test/stub_style_observer.hpp>
#include <mbgl/test/util.hpp>
#include <mbgl/style/layers/circle_layer.hpp>
#include <mbgl/style/layers/circle_layer_impl.hpp>
@@ -32,10 +33,11 @@
#include <mbgl/util/premultiply.hpp>
#include <mbgl/util/image.hpp>
#include <mbgl/util/tileset.hpp>
#include <mbgl/util/logging.hpp>
#include <mbgl/util/optional.hpp>
#include <mbgl/util/range.hpp>
#include <mbgl/util/tileset.hpp>
#include <mbgl/util/timer.hpp>
#include <mbgl/annotation/annotation_manager.hpp>
#include <mbgl/annotation/annotation_source.hpp>
@@ -775,7 +777,8 @@ public:
tileset.zoomRange,
tileset.bounds,
[&](const OverscaledTileID& tileID) { return std::make_unique<FakeTile>(*this, tileID); },
baseImpl->getPrefetchZoomDelta());
baseImpl->getPrefetchZoomDelta(),
baseImpl->getMaxOverscaleFactorForParentTiles());
}
const optional<Tileset>& getTileset() const override {
@@ -880,3 +883,52 @@ TEST(Source, GeoJSONSourceTilesAfterDataReset) {
.update(source.baseImpl, layers, true, true, test.tileParameters(MapMode::Static));
EXPECT_TRUE(renderSource.isLoaded()); // Tiles are reset in static mode.
}
TEST(Source, SetMaxParentOverscaleFactor) {
SourceTest test;
test.transform.jumpTo(CameraOptions().withCenter(LatLng()).withZoom(8.0));
test.transformState = test.transform.getState();
util::Timer timer;
FixtureLog log;
test.fileSource->tileResponse = [&](const Resource& res) {
if (res.tileData->z == 5) {
timer.start(Milliseconds(10), Duration::zero(), [&] { test.end(); });
}
// No tiles above zoom level 5 should be requested.
EXPECT_LE(5, int(res.tileData->z));
Response response;
response.noContent = true;
return response;
};
RasterLayer layer("id", "source");
Immutable<LayerProperties> layerProperties =
makeMutable<RasterLayerProperties>(staticImmutableCast<RasterLayer::Impl>(layer.baseImpl));
std::vector<Immutable<LayerProperties>> layers{layerProperties};
Tileset tileset;
tileset.tiles = {"tiles"};
RasterSource source("source", tileset, 512);
ASSERT_EQ(nullopt, source.getMaxOverscaleFactorForParentTiles());
source.setMaxOverscaleFactorForParentTiles(3);
ASSERT_EQ(3, *source.getMaxOverscaleFactorForParentTiles());
source.loadDescription(*test.fileSource);
auto renderSource = RenderSource::create(source.baseImpl);
renderSource->setObserver(&test.renderSourceObserver);
renderSource->update(source.baseImpl, layers, true, true, test.tileParameters());
test.renderSourceObserver.tileChanged = [&](RenderSource&, const OverscaledTileID&) {
renderSource->update(source.baseImpl, layers, true, true, test.tileParameters());
};
test.run();
EXPECT_EQ(
1u,
log.count(
{EventSeverity::Warning, Event::Style, -1, "Parent tile overscale factor will cap prefetch delta to 3"}));
EXPECT_EQ(0u, log.uncheckedCount());
}