summaryrefslogtreecommitdiff
path: root/test/style
diff options
context:
space:
mode:
Diffstat (limited to 'test/style')
-rw-r--r--test/style/conversion/function.test.cpp54
-rw-r--r--test/style/conversion/geojson_options.test.cpp14
-rw-r--r--test/style/conversion/stringify.test.cpp98
-rw-r--r--test/style/filter.test.cpp6
-rw-r--r--test/style/functions.test.cpp42
-rw-r--r--test/style/group_by_layout.test.cpp44
-rw-r--r--test/style/paint_property.test.cpp94
-rw-r--r--test/style/source.test.cpp6
8 files changed, 326 insertions, 32 deletions
diff --git a/test/style/conversion/function.test.cpp b/test/style/conversion/function.test.cpp
new file mode 100644
index 0000000000..e93207ea13
--- /dev/null
+++ b/test/style/conversion/function.test.cpp
@@ -0,0 +1,54 @@
+#include <mbgl/test/util.hpp>
+
+#include <mbgl/style/conversion.hpp>
+#include <mbgl/style/rapidjson_conversion.hpp>
+#include <mbgl/style/conversion/constant.hpp>
+#include <mbgl/style/conversion/function.hpp>
+#include <mbgl/util/rapidjson.hpp>
+
+using namespace mbgl;
+using namespace mbgl::style;
+using namespace mbgl::style::conversion;
+
+auto parseFunction(const std::string& src) {
+ JSDocument doc;
+ doc.Parse<0>(src);
+ return convert<Function<float>>(doc);
+}
+
+TEST(StyleConversion, Function) {
+ auto fn1 = parseFunction("{\"stops\":[]}");
+ ASSERT_FALSE(fn1);
+ ASSERT_EQ("function must have at least one stop", fn1.error().message);
+
+ auto fn2 = parseFunction("{\"stops\":[1]}");
+ ASSERT_FALSE(fn2);
+ ASSERT_EQ("function stop must be an array", fn2.error().message);
+
+ auto fn3 = parseFunction("{\"stops\":[[]]}");
+ ASSERT_FALSE(fn3);
+ ASSERT_EQ("function stop must have two elements", fn3.error().message);
+
+ auto fn4 = parseFunction("{\"stops\":[[-1,-1]]}");
+ ASSERT_TRUE(bool(fn4));
+
+ auto fn5 = parseFunction("{\"stops\":[[0,1,2]]}");
+ ASSERT_FALSE(fn5);
+ ASSERT_EQ("function stop must have two elements", fn5.error().message);
+
+ auto fn6 = parseFunction("{\"stops\":[[0,\"x\"]]}");
+ ASSERT_FALSE(fn6);
+ ASSERT_EQ("value must be a number", fn6.error().message);
+
+ auto fn7 = parseFunction("{}");
+ ASSERT_FALSE(fn7);
+ ASSERT_EQ("function value must specify stops", fn7.error().message);
+
+ auto fn8 = parseFunction("[]");
+ ASSERT_FALSE(fn8);
+ ASSERT_EQ("function must be an object", fn8.error().message);
+
+ auto fn9 = parseFunction("{\"stops\":[[0,0]],\"base\":false}");
+ ASSERT_FALSE(fn9);
+ ASSERT_EQ("function base must be a number", fn9.error().message);
+}
diff --git a/test/style/conversion/geojson_options.test.cpp b/test/style/conversion/geojson_options.test.cpp
index 46a2aa950b..14a7adbba7 100644
--- a/test/style/conversion/geojson_options.test.cpp
+++ b/test/style/conversion/geojson_options.test.cpp
@@ -4,7 +4,7 @@
#include <mbgl/style/conversion/geojson_options.hpp>
#include <mbgl/test/conversion_stubs.hpp>
-#include <mbgl/platform/log.hpp>
+#include <mbgl/util/logging.hpp>
using namespace mbgl::style;
using namespace mbgl::style::conversion;
@@ -17,7 +17,7 @@ TEST(GeoJSONOptions, Basic) {
}
TEST(GeoJSONOptions, ErrorHandling) {
- ValueMap map {{"maxzoom", "should not be a string"}};
+ ValueMap map {{"maxzoom", std::string{"should not be a string"}}};
Value raw(map);
Result<GeoJSONOptions> converted = convert<GeoJSONOptions>(raw);
ASSERT_FALSE((bool) converted);
@@ -44,14 +44,14 @@ TEST(GeoJSONOptions, RetainsDefaults) {
TEST(GeoJSONOptions, FullConversion) {
ValueMap map {
//GeoJSON-VT
- {"maxzoom", 1},
- {"buffer", 2},
- {"tolerance", 3},
+ {"maxzoom", 1.0f},
+ {"buffer", 2.0f},
+ {"tolerance", 3.0f},
//Supercluster
{"cluster", true},
- {"clusterRadius", 4},
- {"clusterMaxZoom", 5}
+ {"clusterRadius", 4.0f},
+ {"clusterMaxZoom", 5.0f}
};
Value raw(map);
GeoJSONOptions converted = *convert<GeoJSONOptions>(raw);
diff --git a/test/style/conversion/stringify.test.cpp b/test/style/conversion/stringify.test.cpp
new file mode 100644
index 0000000000..be5d65d4ce
--- /dev/null
+++ b/test/style/conversion/stringify.test.cpp
@@ -0,0 +1,98 @@
+#include <mbgl/test/util.hpp>
+
+#include <mbgl/style/conversion/stringify.hpp>
+#include <mbgl/style/types.hpp>
+#include <mbgl/style/layers/symbol_layer_properties.hpp>
+#include <mbgl/util/rapidjson.hpp>
+
+#include <rapidjson/writer.h>
+#include <rapidjson/stringbuffer.h>
+
+using namespace mbgl;
+using namespace mbgl::style;
+using namespace mbgl::style::conversion;
+
+template <class T>
+std::string stringify(const T& t) {
+ rapidjson::StringBuffer s;
+ rapidjson::Writer<rapidjson::StringBuffer> writer(s);
+ stringify(writer, t);
+ return s.GetString();
+}
+
+TEST(Stringify, NullValue) {
+ ASSERT_EQ(stringify(NullValue()), "null");
+}
+
+TEST(Stringify, Boolean) {
+ ASSERT_EQ(stringify(true), "true");
+ ASSERT_EQ(stringify(false), "false");
+}
+
+TEST(Stringify, Uint64) {
+ ASSERT_EQ(stringify(uint64_t(0)), "0");
+ ASSERT_EQ(stringify(uint64_t(1)), "1");
+}
+
+TEST(Stringify, Int64) {
+ ASSERT_EQ(stringify(int64_t(0)), "0");
+ ASSERT_EQ(stringify(int64_t(-1)), "-1");
+}
+
+TEST(Stringify, Double) {
+ ASSERT_EQ(stringify(0.0), "0.0");
+ ASSERT_EQ(stringify(10.1234), "10.1234");
+}
+
+TEST(Stringify, String) {
+ ASSERT_EQ(stringify(std::string("test")), "\"test\"");
+}
+
+TEST(Stringify, Enum) {
+ ASSERT_EQ(stringify(VisibilityType::Visible), "\"visible\"");
+}
+
+TEST(Stringify, Color) {
+ ASSERT_EQ(stringify(Color::blue()), "\"rgba(0,0,255,1)\"");
+}
+
+TEST(Stringify, Array) {
+ ASSERT_EQ(stringify(std::array<float, 2> {{ 1, 2 }}), "[1.0,2.0]");
+}
+
+TEST(Stringify, Vector) {
+ ASSERT_EQ(stringify(std::vector<float> {{ 1, 2 }}), "[1.0,2.0]");
+}
+
+TEST(Stringify, Map) {
+ ASSERT_EQ(stringify(std::unordered_map<std::string, float> {{ "a", 1 }}), "{\"a\":1.0}");
+}
+
+TEST(Stringify, Value) {
+ ASSERT_EQ(stringify(Value(true)), "true");
+ ASSERT_EQ(stringify(Value(uint64_t(0))), "0");
+ ASSERT_EQ(stringify(Value(1.2)), "1.2");
+}
+
+TEST(Stringify, Filter) {
+ ASSERT_EQ(stringify(NullFilter()), "null");
+ ASSERT_EQ(stringify(EqualsFilter { "a", 1.0 }), "[\"==\",\"a\",1.0]");
+}
+
+TEST(Stringify, Function) {
+ ASSERT_EQ(stringify(Function<float>({{0, 1}}, 2)), "{\"base\":2.0,\"stops\":[[0.0,1.0]]}");
+}
+
+TEST(Stringify, PropertyValue) {
+ ASSERT_EQ(stringify(PropertyValue<float>(1)), "1.0");
+ ASSERT_EQ(stringify(PropertyValue<float>(Function<float>({{0, 1}}, 2))), "{\"base\":2.0,\"stops\":[[0.0,1.0]]}");
+}
+
+TEST(Stringify, Layout) {
+ ASSERT_EQ(stringify(SymbolLayoutProperties()), "{}");
+
+ SymbolLayoutProperties layout;
+ layout.unevaluated.get<SymbolAvoidEdges>() = true;
+ layout.unevaluated.get<IconPadding>() = 2.0;
+ ASSERT_EQ(stringify(layout), "{\"symbol-avoid-edges\":true,\"icon-padding\":2.0}");
+}
diff --git a/test/style/filter.test.cpp b/test/style/filter.test.cpp
index b49f424a39..33b64978f5 100644
--- a/test/style/filter.test.cpp
+++ b/test/style/filter.test.cpp
@@ -42,7 +42,7 @@ TEST(Filter, EqualsNumber) {
ASSERT_FALSE(f(feature({{ "foo", std::string("0") }})));
ASSERT_FALSE(f(feature({{ "foo", false }})));
ASSERT_FALSE(f(feature({{ "foo", true }})));
- ASSERT_FALSE(f(feature({{ "foo", nullptr }})));
+ ASSERT_FALSE(f(feature({{ "foo", mapbox::geometry::null_value }})));
ASSERT_FALSE(f(feature({{}})));
}
@@ -113,13 +113,13 @@ TEST(Filter, NotHas) {
TEST(Filter, ID) {
Feature feature1 { Point<double>() };
- feature1.id = { 1234 };
+ feature1.id = { uint64_t(1234) };
ASSERT_TRUE(parse("[\"==\", \"$id\", 1234]")(feature1));
ASSERT_FALSE(parse("[\"==\", \"$id\", \"1234\"]")(feature1));
Feature feature2 { Point<double>() };
- feature2.properties["id"] = { 1234 };
+ feature2.properties["id"] = { uint64_t(1234) };
ASSERT_FALSE(parse("[\"==\", \"$id\", 1234]")(feature2));
}
diff --git a/test/style/functions.test.cpp b/test/style/functions.test.cpp
index 9577bcc633..8553d13349 100644
--- a/test/style/functions.test.cpp
+++ b/test/style/functions.test.cpp
@@ -2,28 +2,31 @@
#include <mbgl/test/util.hpp>
#include <mbgl/style/property_evaluator.hpp>
-#include <mbgl/style/calculation_parameters.hpp>
+#include <mbgl/style/property_evaluation_parameters.hpp>
using namespace mbgl;
using namespace mbgl::style;
float evaluate(PropertyValue<float> value, float zoom) {
- return PropertyValue<float>::visit(value, PropertyEvaluator<float>(CalculationParameters(zoom), 0));
+ return value.evaluate(PropertyEvaluator<float>(PropertyEvaluationParameters(zoom), 0));
}
std::string evaluate(PropertyValue<std::string> value, float zoom) {
- return PropertyValue<std::string>::visit(value, PropertyEvaluator<std::string>(CalculationParameters(zoom), ""));
+ return value.evaluate(PropertyEvaluator<std::string>(PropertyEvaluationParameters(zoom), ""));
+}
+bool evaluate(PropertyValue<bool> value, float zoom) {
+ return value.evaluate(PropertyEvaluator<bool>(PropertyEvaluationParameters(zoom), false));
}
TEST(Function, Constant) {
- EXPECT_EQ(2.0f, evaluate(2, 0));
- EXPECT_EQ(3.8f, evaluate(3.8, 0));
- EXPECT_EQ(22.0f, evaluate(22, 0));
- EXPECT_EQ(2.0f, evaluate(2, 4));
- EXPECT_EQ(3.8f, evaluate(3.8, 4));
- EXPECT_EQ(22.0f, evaluate(22, 4));
- EXPECT_EQ(2.0f, evaluate(2, 22));
- EXPECT_EQ(3.8f, evaluate(3.8, 22));
- EXPECT_EQ(22.0f, evaluate(22, 22));
+ EXPECT_EQ(2.0f, evaluate(PropertyValue<float>(2.0), 0));
+ EXPECT_EQ(3.8f, evaluate(PropertyValue<float>(3.8), 0));
+ EXPECT_EQ(22.0f, evaluate(PropertyValue<float>(22.0), 0));
+ EXPECT_EQ(2.0f, evaluate(PropertyValue<float>(2.0), 4));
+ EXPECT_EQ(3.8f, evaluate(PropertyValue<float>(3.8), 4));
+ EXPECT_EQ(22.0f, evaluate(PropertyValue<float>(22.0), 4));
+ EXPECT_EQ(2.0f, evaluate(PropertyValue<float>(2.0), 22));
+ EXPECT_EQ(3.8f, evaluate(PropertyValue<float>(3.8), 22));
+ EXPECT_EQ(22.0f, evaluate(PropertyValue<float>(22.0), 22));
}
TEST(Function, Stops) {
@@ -50,12 +53,6 @@ TEST(Function, Stops) {
EXPECT_EQ(3.0, evaluate(slope_2, 15));
EXPECT_EQ(3.0, evaluate(slope_2, 22));
- // Test no values.
- Function<float> slope_3({}, 1.75);
- EXPECT_EQ(1, evaluate(slope_3, 2));
- EXPECT_EQ(1, evaluate(slope_3, 6));
- EXPECT_EQ(1, evaluate(slope_3, 12));
-
// Explicit constant slope in fringe regions.
Function<float> slope_4({ { 0, 2 }, { 8, 10 } }, 1);
@@ -66,10 +63,17 @@ TEST(Function, Stops) {
EXPECT_EQ(10, evaluate(slope_4, 8));
// discrete values
- Function<std::string> discrete_0({{ 3, "string0"}, {6, "string1"}, {9, "string2"}}, 1);
+ Function<std::string> discrete_0({{3, "string0"}, {6, "string1"}, {9, "string2"}}, 1);
EXPECT_EQ("string0", evaluate(discrete_0, 2));
EXPECT_EQ("string0", evaluate(discrete_0, 4));
EXPECT_EQ("string1", evaluate(discrete_0, 7));
EXPECT_EQ("string2", evaluate(discrete_0, 9));
EXPECT_EQ("string2", evaluate(discrete_0, 10));
+
+ Function<bool> discreteBool({{1, false}, {3, true}}, 1);
+ EXPECT_FALSE(evaluate(discreteBool, 0));
+ EXPECT_FALSE(evaluate(discreteBool, 1));
+ EXPECT_FALSE(evaluate(discreteBool, 2));
+ EXPECT_TRUE(evaluate(discreteBool, 3));
+ EXPECT_TRUE(evaluate(discreteBool, 4));
}
diff --git a/test/style/group_by_layout.test.cpp b/test/style/group_by_layout.test.cpp
new file mode 100644
index 0000000000..600ba6a0f1
--- /dev/null
+++ b/test/style/group_by_layout.test.cpp
@@ -0,0 +1,44 @@
+#include <mbgl/test/util.hpp>
+
+#include <mbgl/style/group_by_layout.hpp>
+#include <mbgl/style/layers/background_layer.hpp>
+#include <mbgl/style/layers/circle_layer.hpp>
+#include <mbgl/style/layers/line_layer.hpp>
+
+using namespace mbgl;
+using namespace mbgl::style;
+
+TEST(GroupByLayout, Related) {
+ std::vector<std::unique_ptr<Layer>> layers;
+ layers.push_back(std::make_unique<LineLayer>("a", "source"));
+ layers.push_back(std::make_unique<LineLayer>("b", "source"));
+ auto result = groupByLayout(layers);
+ ASSERT_EQ(1u, result.size());
+ ASSERT_EQ(2u, result[0].size());
+}
+
+TEST(GroupByLayout, UnrelatedType) {
+ std::vector<std::unique_ptr<Layer>> layers;
+ layers.push_back(std::make_unique<BackgroundLayer>("background"));
+ layers.push_back(std::make_unique<CircleLayer>("circle", "source"));
+ auto result = groupByLayout(layers);
+ ASSERT_EQ(2u, result.size());
+}
+
+TEST(GroupByLayout, UnrelatedFilter) {
+ std::vector<std::unique_ptr<Layer>> layers;
+ layers.push_back(std::make_unique<LineLayer>("a", "source"));
+ layers.push_back(std::make_unique<LineLayer>("b", "source"));
+ layers[0]->as<LineLayer>()->setFilter(EqualsFilter());
+ auto result = groupByLayout(layers);
+ ASSERT_EQ(2u, result.size());
+}
+
+TEST(GroupByLayout, UnrelatedLayout) {
+ std::vector<std::unique_ptr<Layer>> layers;
+ layers.push_back(std::make_unique<LineLayer>("a", "source"));
+ layers.push_back(std::make_unique<LineLayer>("b", "source"));
+ layers[0]->as<LineLayer>()->setLineCap(LineCapType::Square);
+ auto result = groupByLayout(layers);
+ ASSERT_EQ(2u, result.size());
+}
diff --git a/test/style/paint_property.test.cpp b/test/style/paint_property.test.cpp
new file mode 100644
index 0000000000..487dbe9652
--- /dev/null
+++ b/test/style/paint_property.test.cpp
@@ -0,0 +1,94 @@
+#include <mbgl/test/util.hpp>
+
+#include <mbgl/style/paint_property.hpp>
+
+using namespace mbgl;
+using namespace mbgl::style;
+using namespace std::literals::chrono_literals;
+
+TEST(UnevaluatedPaintProperty, EvaluateDefaultValue) {
+ UnevaluatedPaintProperty<float, PropertyEvaluator<float>> property;
+ ASSERT_EQ(0.0f, property.evaluate(PropertyEvaluationParameters(0), 0.0f));
+}
+
+TEST(UnevaluatedPaintProperty, EvaluateUntransitionedConstant) {
+ UnevaluatedPaintProperty<float, PropertyEvaluator<float>> property {
+ PropertyValue<float>(1.0f),
+ UnevaluatedPaintProperty<float, PropertyEvaluator<float>>(),
+ TransitionOptions(),
+ TimePoint::min()
+ };
+
+ ASSERT_EQ(1.0f, property.evaluate(PropertyEvaluationParameters(0), 0.0f));
+}
+
+TEST(UnevaluatedPaintProperty, EvaluateTransitionedConstantWithoutDelay) {
+ TransitionOptions transition;
+ transition.duration = { 1000ms };
+
+ UnevaluatedPaintProperty<float, PropertyEvaluator<float>> t0 {
+ PropertyValue<float>(0.0f),
+ UnevaluatedPaintProperty<float, PropertyEvaluator<float>>(),
+ TransitionOptions(),
+ TimePoint::min()
+ };
+
+ UnevaluatedPaintProperty<float, PropertyEvaluator<float>> t1 {
+ PropertyValue<float>(1.0f),
+ t0,
+ transition,
+ TimePoint::min()
+ };
+
+ auto evaluate = [&] (Duration delta) {
+ PropertyEvaluationParameters parameters {
+ 0,
+ TimePoint::min() + delta,
+ ZoomHistory(),
+ Duration::zero()
+ };
+
+ return t1.evaluate(parameters, 0.0f);
+ };
+
+ ASSERT_FLOAT_EQ(0.0f, evaluate(0ms));
+ ASSERT_FLOAT_EQ(0.823099f, evaluate(500ms));
+ ASSERT_FLOAT_EQ(1.0f, evaluate(1500ms));
+}
+
+TEST(UnevaluatedPaintProperty, EvaluateTransitionedConstantWithDelay) {
+ TransitionOptions transition;
+ transition.delay = { 1000ms };
+ transition.duration = { 1000ms };
+
+ UnevaluatedPaintProperty<float, PropertyEvaluator<float>> t0 {
+ PropertyValue<float>(0.0f),
+ UnevaluatedPaintProperty<float, PropertyEvaluator<float>>(),
+ TransitionOptions(),
+ TimePoint::min()
+ };
+
+ UnevaluatedPaintProperty<float, PropertyEvaluator<float>> t1 {
+ PropertyValue<float>(1.0f),
+ t0,
+ transition,
+ TimePoint::min()
+ };
+
+ auto evaluate = [&] (Duration delta) {
+ PropertyEvaluationParameters parameters {
+ 0,
+ TimePoint::min() + delta,
+ ZoomHistory(),
+ Duration::zero()
+ };
+
+ return t1.evaluate(parameters, 0.0f);
+ };
+
+ ASSERT_FLOAT_EQ(0.0f, evaluate(0ms));
+ ASSERT_FLOAT_EQ(0.0f, evaluate(500ms));
+ ASSERT_FLOAT_EQ(0.0f, evaluate(612ms));
+ ASSERT_FLOAT_EQ(0.823099f, evaluate(1500ms));
+ ASSERT_FLOAT_EQ(1.0f, evaluate(2500ms));
+}
diff --git a/test/style/source.test.cpp b/test/style/source.test.cpp
index 73908a144b..01f54d6b18 100644
--- a/test/style/source.test.cpp
+++ b/test/style/source.test.cpp
@@ -11,8 +11,8 @@
#include <mbgl/util/string.hpp>
#include <mbgl/util/io.hpp>
#include <mbgl/util/tileset.hpp>
-#include <mbgl/platform/default/thread_pool.hpp>
-#include <mbgl/platform/log.hpp>
+#include <mbgl/util/default_thread_pool.hpp>
+#include <mbgl/util/logging.hpp>
#include <mbgl/map/transform.hpp>
#include <mbgl/style/style.hpp>
@@ -50,7 +50,7 @@ public:
// Squelch logging.
Log::setObserver(std::make_unique<Log::NullObserver>());
- transform.resize({{ 512, 512 }});
+ transform.resize({ 512, 512 });
transform.setLatLngZoom({0, 0}, 0);
transformState = transform.getState();