#include #include #include #include #include #include #include #include #include #include using namespace mbgl; namespace { std::shared_ptr namedMarker(const std::string &name) { PremultipliedImage image = decodeImage(util::read_file("test/fixtures/sprites/" + name)); return std::make_shared(std::move(image), 1.0); } class AnnotationTest { public: util::RunLoop loop; std::shared_ptr display { std::make_shared() }; HeadlessView view { display, 1 }; StubFileSource fileSource; Map map { view, fileSource, MapMode::Still }; void checkRendering(const char * name) { test::checkImage(std::string("test/fixtures/annotations/") + name, test::render(map), 0.0002, 0.1); } }; } // end namespace TEST(Annotations, SymbolAnnotation) { AnnotationTest test; test.map.setStyleJSON(util::read_file("test/fixtures/api/empty.json")); test.map.addAnnotationIcon("default_marker", namedMarker("default_marker.png")); test.map.addAnnotation(SymbolAnnotation { Point(0, 0), "default_marker" }); test.checkRendering("point_annotation"); // FIXME: https://github.com/mapbox/mapbox-gl-native/issues/5419 //test.map.setZoom(test.map.getMaxZoom()); //test.checkRendering("point_annotation"); } TEST(Annotations, LineAnnotation) { AnnotationTest test; LineString line = {{ { 0, 0 }, { 45, 45 }, { 30, 0 } }}; LineAnnotation annotation { line }; annotation.color = { { 255, 0, 0, 1 } }; annotation.width = { 5 }; test.map.setStyleJSON(util::read_file("test/fixtures/api/empty.json")); test.map.addAnnotation(annotation); test.checkRendering("line_annotation"); test.map.setZoom(test.map.getMaxZoom()); test.checkRendering("line_annotation_max_zoom"); } TEST(Annotations, FillAnnotation) { AnnotationTest test; Polygon polygon = {{ {{ { 0, 0 }, { 0, 45 }, { 45, 45 }, { 45, 0 } }} }}; FillAnnotation annotation { polygon }; annotation.color = { { 255, 0, 0, 1 } }; test.map.setStyleJSON(util::read_file("test/fixtures/api/empty.json")); test.map.addAnnotation(annotation); test.checkRendering("fill_annotation"); test.map.setZoom(test.map.getMaxZoom()); test.checkRendering("fill_annotation_max_zoom"); } TEST(Annotations, OverlappingFillAnnotation) { AnnotationTest test; Polygon polygon = {{ {{ { 0, 0 }, { 0, 45 }, { 45, 45 }, { 45, 0 } }} }}; FillAnnotation underlaidAnnotation { polygon }; underlaidAnnotation.color = { { 0, 255, 0, 1 } }; FillAnnotation overlaidAnnotation { polygon }; overlaidAnnotation.color = { { 255, 0, 0, 1 } }; test.map.setStyleJSON(util::read_file("test/fixtures/api/empty.json")); test.map.addAnnotation(underlaidAnnotation); test.map.addAnnotation(overlaidAnnotation); test.checkRendering("overlapping_fill_annotation"); } TEST(Annotations, StyleSourcedShapeAnnotation) { AnnotationTest test; Polygon polygon = {{ {{ { 0, 0 }, { 0, 45 }, { 45, 45 }, { 45, 0 } }} }}; test.map.setStyleJSON(util::read_file("test/fixtures/api/annotation.json")); test.map.addAnnotation(StyleSourcedAnnotation { polygon, "annotation" }); test.checkRendering("style_sourced_shape_annotation"); } TEST(Annotations, AddMultiple) { AnnotationTest test; test.map.setStyleJSON(util::read_file("test/fixtures/api/empty.json")); test.map.addAnnotationIcon("default_marker", namedMarker("default_marker.png")); test.map.addAnnotation(SymbolAnnotation { Point { -10, 0 }, "default_marker" }); test::render(test.map); test.map.addAnnotation(SymbolAnnotation { Point { 10, 0 }, "default_marker" }); test.checkRendering("add_multiple"); } TEST(Annotations, NonImmediateAdd) { AnnotationTest test; test.map.setStyleJSON(util::read_file("test/fixtures/api/empty.json")); test::render(test.map); Polygon polygon = {{ {{ { 0, 0 }, { 0, 45 }, { 45, 45 }, { 45, 0 } }} }}; FillAnnotation annotation { polygon }; annotation.color = { { 255, 0, 0, 1 } }; test.map.addAnnotation(annotation); test.checkRendering("non_immediate_add"); } TEST(Annotations, UpdateSymbolAnnotationGeometry) { AnnotationTest test; test.map.setStyleJSON(util::read_file("test/fixtures/api/empty.json")); test.map.addAnnotationIcon("default_marker", namedMarker("default_marker.png")); test.map.addAnnotationIcon("flipped_marker", namedMarker("flipped_marker.png")); AnnotationID point = test.map.addAnnotation(SymbolAnnotation { Point { 0, 0 }, "default_marker" }); test::render(test.map); test.map.updateAnnotation(point, SymbolAnnotation { Point { -10, 0 }, "default_marker" }); test.checkRendering("update_point"); } TEST(Annotations, UpdateSymbolAnnotationIcon) { AnnotationTest test; test.map.setStyleJSON(util::read_file("test/fixtures/api/empty.json")); test.map.addAnnotationIcon("default_marker", namedMarker("default_marker.png")); test.map.addAnnotationIcon("flipped_marker", namedMarker("flipped_marker.png")); AnnotationID point = test.map.addAnnotation(SymbolAnnotation { Point { 0, 0 }, "default_marker" }); test::render(test.map); test.map.updateAnnotation(point, SymbolAnnotation { Point { 0, 0 }, "flipped_marker" }); test.checkRendering("update_icon"); } TEST(Annotations, RemovePoint) { AnnotationTest test; test.map.setStyleJSON(util::read_file("test/fixtures/api/empty.json")); test.map.addAnnotationIcon("default_marker", namedMarker("default_marker.png")); AnnotationID point = test.map.addAnnotation(SymbolAnnotation { Point { 0, 0 }, "default_marker" }); test::render(test.map); test.map.removeAnnotation(point); test.checkRendering("remove_point"); } TEST(Annotations, RemoveShape) { AnnotationTest test; LineString line = {{ { 0, 0 }, { 45, 45 } }}; LineAnnotation annotation { line }; annotation.color = { { 255, 0, 0, 1 } }; annotation.width = { 5 }; test.map.setStyleJSON(util::read_file("test/fixtures/api/empty.json")); AnnotationID shape = test.map.addAnnotation(annotation); test::render(test.map); test.map.removeAnnotation(shape); test.checkRendering("remove_shape"); } TEST(Annotations, ImmediateRemoveShape) { AnnotationTest test; test.map.removeAnnotation(test.map.addAnnotation(LineAnnotation { LineString() })); test.map.setStyleJSON(util::read_file("test/fixtures/api/empty.json")); test::render(test.map); } TEST(Annotations, SwitchStyle) { AnnotationTest test; test.map.setStyleJSON(util::read_file("test/fixtures/api/empty.json")); test.map.addAnnotationIcon("default_marker", namedMarker("default_marker.png")); test.map.addAnnotation(SymbolAnnotation { Point { 0, 0 }, "default_marker" }); test::render(test.map); test.map.setStyleJSON(util::read_file("test/fixtures/api/empty.json")); test.checkRendering("switch_style"); } TEST(Annotations, QueryRenderedFeatures) { AnnotationTest test; test.map.setStyleJSON(util::read_file("test/fixtures/api/empty.json")); test.map.addAnnotationIcon("default_marker", namedMarker("default_marker.png")); test.map.addAnnotation(SymbolAnnotation { Point { 0, 0 }, "default_marker" }); test.map.addAnnotation(SymbolAnnotation { Point { 0, 50 }, "default_marker" }); test::render(test.map); auto features = test.map.queryRenderedFeatures(test.map.pixelForLatLng({ 0, 0 })); EXPECT_EQ(features.size(), 1u); EXPECT_TRUE(!!features[0].id); EXPECT_EQ(*features[0].id, 0); auto features2 = test.map.queryRenderedFeatures(test.map.pixelForLatLng({ 50, 0 })); EXPECT_EQ(features2.size(), 1u); EXPECT_TRUE(!!features2[0].id); EXPECT_EQ(*features2[0].id, 1); }