#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace mbgl; using namespace mbgl::style; class CustomTileTest { public: util::SimpleIdentity uniqueID; std::shared_ptr fileSource = std::make_shared(); TransformState transformState; util::RunLoop loop; AnnotationManager annotationManager{style}; std::shared_ptr imageManager = ImageManager::create(); std::shared_ptr glyphManager = std::make_shared(); gfx::DynamicTextureAtlasPtr dynamicTextureAtlas; TileParameters tileParameters; style::Style style; CustomTileTest() : tileParameters{.pixelRatio = 1.0, .debugOptions = MapDebugOptions(), .transformState = transformState, .fileSource = fileSource, .mode = MapMode::Continuous, .annotationManager = annotationManager.makeWeakPtr(), .imageManager = imageManager, .glyphManager = glyphManager, .prefetchZoomDelta = 0, .threadPool = {Scheduler::GetBackground(), uniqueID}, .dynamicTextureAtlas = dynamicTextureAtlas}, style{fileSource, 1, tileParameters.threadPool} {} }; TEST(CustomGeometryTile, InvokeFetchTile) { CustomTileTest test; CircleLayer layer("circle", "source"); mapbox::feature::feature_collection features; features.push_back(mapbox::feature::feature{mapbox::geometry::point(0, 0)}); CustomTileLoader loader( [&](const CanonicalTileID& tileId) { EXPECT_EQ(tileId, CanonicalTileID(0, 0, 0)); test.loop.stop(); }, [&](const CanonicalTileID&) { }); auto mb = std::make_shared(*Scheduler::GetCurrent()); ActorRef loaderActor(loader, mb); CustomGeometryTile tile(OverscaledTileID(0, 0, 0), "source", test.tileParameters, makeMutable(), loaderActor); tile.setNecessity(TileNecessity::Required); test.loop.run(); } TEST(CustomGeometryTile, InvokeCancelTile) { CustomTileTest test; CircleLayer layer("circle", "source"); mapbox::feature::feature_collection features; features.push_back(mapbox::feature::feature{mapbox::geometry::point(0, 0)}); CustomTileLoader loader([&](const CanonicalTileID&) {}, [&](const CanonicalTileID& tileId) { EXPECT_EQ(tileId, CanonicalTileID(0, 0, 0)); test.loop.stop(); }); auto mb = std::make_shared(*Scheduler::GetCurrent()); ActorRef loaderActor(loader, mb); CustomGeometryTile tile(OverscaledTileID(0, 0, 0), "source", test.tileParameters, makeMutable(), loaderActor); tile.setNecessity(TileNecessity::Required); tile.setNecessity(TileNecessity::Optional); test.loop.run(); } TEST(CustomGeometryTile, InvokeTileChanged) { CustomTileTest test; CircleLayer layer("circle", "source"); mapbox::feature::feature_collection features; features.push_back(mapbox::feature::feature{mapbox::geometry::point(0, 0)}); CustomTileLoader loader(nullptr, nullptr); auto mb = std::make_shared(*Scheduler::GetCurrent()); ActorRef loaderActor(loader, mb); CustomGeometryTile tile(OverscaledTileID(0, 0, 0), "source", test.tileParameters, makeMutable(), loaderActor); Immutable layerProperties = makeMutable( staticImmutableCast(layer.baseImpl)); StubTileObserver observer; observer.tileChanged = [&](const Tile&) { // Once present, the bucket should never "disappear", which would cause // flickering. ASSERT_TRUE(tile.layerPropertiesUpdated(layerProperties)); }; std::vector> layers{layerProperties}; tile.setLayers(layers); tile.setObserver(&observer); tile.setTileData(features); while (!tile.isComplete()) { test.loop.runOnce(); } }