From fb5be4c80cca408b4a30e966a4e040e0c214588d Mon Sep 17 00:00:00 2001 From: Alexander Shalamov Date: Tue, 25 Feb 2020 10:48:17 +0200 Subject: [PATCH] [core] Add unit test for layer serialization --- test/style/conversion/layer.test.cpp | 96 +++++++++++++++++++++++++++- 1 file changed, 95 insertions(+), 1 deletion(-) diff --git a/test/style/conversion/layer.test.cpp b/test/style/conversion/layer.test.cpp index d65644b91..aae5d3495 100644 --- a/test/style/conversion/layer.test.cpp +++ b/test/style/conversion/layer.test.cpp @@ -4,6 +4,8 @@ #include #include +#include + using namespace mbgl; using namespace mbgl::style; using namespace mbgl::style::conversion; @@ -11,7 +13,17 @@ using namespace std::literals::chrono_literals; std::unique_ptr parseLayer(const std::string& src) { Error error; - return std::move(*convertJSON>(src, error)); + auto layer = convertJSON>(src, error); + if (layer) return std::move(*layer); + return nullptr; +} + +std::string stringifyLayer(const Value& value) { + rapidjson::StringBuffer s; + rapidjson::PrettyWriter writer(s); + writer.SetIndent(' ', 2u); + stringify(writer, value); + return s.GetString(); } TEST(StyleConversion, LayerTransition) { @@ -31,3 +43,85 @@ TEST(StyleConversion, LayerTransition) { ASSERT_EQ(500ms, *static_cast(layer.get())->impl().paint .get().options.delay); } + +TEST(StyleConversion, SerializeDefaults) { + auto layer = parseLayer(R"JSON({ + "type": "background", + "id": "background" + })JSON"); + + EXPECT_NE(nullptr, layer); + auto value = layer->serialize(); + EXPECT_NE(nullptr, value.getObject()); + EXPECT_EQ(2u, value.getObject()->size()); +} + +TEST(StyleConversion, RoundtripWithTransitions) { + auto layer = parseLayer(R"JSON({ + "type": "background", + "id": "background", + "paint": { + "background-color-transition": { + "duration": 400, + "delay": 500 + } + } + })JSON"); + + EXPECT_NE(nullptr, layer); + auto value = layer->serialize(); + EXPECT_NE(nullptr, value.getObject()); + EXPECT_EQ(3u, value.getObject()->size()); + + auto roundTripped = parseLayer(stringifyLayer(value)); + EXPECT_NE(nullptr, roundTripped); + auto roundTrippedValue = roundTripped->serialize(); + EXPECT_NE(nullptr, roundTrippedValue.getObject()); + EXPECT_EQ(3u, roundTrippedValue.getObject()->size()); +} + +TEST(StyleConversion, OverrideDefaults) { + auto layer = parseLayer(R"JSON({ + "type": "symbol", + "id": "symbol", + "source": "composite", + "source-layer": "landmarks", + "filter": ["has", "monuments"], + "minzoom": 12, + "maxzoom": 18, + "layout": { + "visibility": "none", + "text-field": ["format", + "Hello", + ["image", ["get", "world"]], + "Example", {"text-color": "rgba(128, 255, 39, 1)"} + ], + "icon-image": ["image", ["get", "landmark_image"]], + "text-size": 24 + }, + "paint": { + "text-color": "turquoise", + "text-color-transition": { + "duration": 300, + "delay": 100 + } + } + })JSON"); + + EXPECT_NE(nullptr, layer); + auto value = layer->serialize(); + EXPECT_NE(nullptr, value.getObject()); + const auto& object = *(value.getObject()); + EXPECT_EQ(9u, object.size()); + EXPECT_EQ(4u, object.at("layout").getObject()->size()); + EXPECT_EQ(2u, object.at("paint").getObject()->size()); + + auto roundTripped = parseLayer(stringifyLayer(value)); + EXPECT_NE(nullptr, roundTripped); + auto roundTrippedValue = roundTripped->serialize(); + const auto& roundTrippedObject = *(roundTrippedValue.getObject()); + EXPECT_NE(nullptr, roundTrippedValue.getObject()); + EXPECT_EQ(9u, roundTrippedObject.size()); + EXPECT_EQ(4u, roundTrippedObject.at("layout").getObject()->size()); + EXPECT_EQ(2u, roundTrippedObject.at("paint").getObject()->size()); +}