1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
#include <mbgl/test/util.hpp>
#include <mbgl/style/conversion/json.hpp>
#include <mbgl/style/conversion/layer.hpp>
#include <mbgl/style/layers/background_layer_impl.hpp>
#include <rapidjson/prettywriter.h>
using namespace mbgl;
using namespace mbgl::style;
using namespace mbgl::style::conversion;
using namespace std::literals::chrono_literals;
std::unique_ptr<Layer> parseLayer(const std::string& src) {
Error error;
auto layer = convertJSON<std::unique_ptr<Layer>>(src, error);
if (layer) return std::move(*layer);
return nullptr;
}
std::string stringifyLayer(const Value& value) {
rapidjson::StringBuffer s;
rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(s);
writer.SetIndent(' ', 2u);
stringify(writer, value);
return s.GetString();
}
TEST(StyleConversion, LayerTransition) {
auto layer = parseLayer(R"JSON({
"type": "background",
"id": "background",
"paint": {
"background-color-transition": {
"duration": 400,
"delay": 500
}
}
})JSON");
ASSERT_STREQ("background", layer->getTypeInfo()->type);
ASSERT_EQ(400ms, *static_cast<BackgroundLayer*>(layer.get())->impl().paint
.get<BackgroundColor>().options.duration);
ASSERT_EQ(500ms, *static_cast<BackgroundLayer*>(layer.get())->impl().paint
.get<BackgroundColor>().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());
}
|