blob: 59651106842ef1c8b4c373a6a448972f351c2ed4 [file] [log] [blame]
Václav Kubernát07204242018-06-04 18:12:09 +02001/*
2 * Copyright (C) 2018 CESNET, https://photonics.cesnet.cz/
3 * Copyright (C) 2018 FIT CVUT, https://fit.cvut.cz/
4 *
5 * Written by Václav Kubernát <kubervac@fit.cvut.cz>
6 *
7*/
8
Václav Kubernát26b56082020-02-03 18:28:56 +01009#include "trompeloeil_doctest.hpp"
Jan Kundrát76b3ddc2019-07-03 10:31:27 +020010#include <boost/core/demangle.hpp>
Václav Kubernát24df80e2018-06-06 15:18:03 +020011#include "ast_commands.hpp"
Václav Kubernát3a99f002020-03-31 02:27:41 +020012#include "leaf_data_helpers.hpp"
Václav Kubernát07204242018-06-04 18:12:09 +020013#include "parser.hpp"
Václav Kubernáted824d02020-06-09 15:48:30 +020014#include "pretty_printers.hpp"
Václav Kubernátbddbb172018-06-13 16:27:39 +020015#include "static_schema.hpp"
Václav Kubernát509ce652019-05-29 19:46:44 +020016#include "utils.hpp"
Václav Kubernát07204242018-06-04 18:12:09 +020017
18TEST_CASE("leaf editing")
19{
Václav Kubernátbddbb172018-06-13 16:27:39 +020020 auto schema = std::make_shared<StaticSchema>();
Václav Kubernát744f57f2018-06-29 22:46:26 +020021 schema->addModule("mod");
Václav Kubernáteeb38842019-03-20 19:46:05 +010022 schema->addModule("pizza-module");
Václav Kubernátefcac932020-01-10 15:26:32 +010023 schema->addContainer("/", "mod:contA");
Václav Kubernát3a99f002020-03-31 02:27:41 +020024 schema->addLeaf("/", "mod:leafString", yang::String{});
25 schema->addLeaf("/", "mod:leafDecimal", yang::Decimal{});
26 schema->addLeaf("/", "mod:leafBool", yang::Bool{});
27 schema->addLeaf("/", "mod:leafInt8", yang::Int8{});
28 schema->addLeaf("/", "mod:leafInt16", yang::Int16{});
29 schema->addLeaf("/", "mod:leafInt32", yang::Int32{});
30 schema->addLeaf("/", "mod:leafInt64", yang::Int64{});
31 schema->addLeaf("/", "mod:leafUint8", yang::Uint8{});
32 schema->addLeaf("/", "mod:leafUint16", yang::Uint16{});
33 schema->addLeaf("/", "mod:leafUint32", yang::Uint32{});
34 schema->addLeaf("/", "mod:leafUint64", yang::Uint64{});
35 schema->addLeaf("/", "mod:leafBinary", yang::Binary{});
Václav Kubernát222ecff2020-05-14 23:14:35 +020036 schema->addIdentity(std::nullopt, identityRef_{"mod", "food"});
37 schema->addIdentity(std::nullopt, identityRef_{"mod", "vehicle"});
38 schema->addIdentity(identityRef_{"mod", "food"}, identityRef_{"mod", "pizza"});
39 schema->addIdentity(identityRef_{"mod", "food"}, identityRef_{"mod", "spaghetti"});
40 schema->addIdentity(identityRef_{"mod", "pizza"}, identityRef_{"pizza-module", "hawaii"});
Václav Kubernát3a99f002020-03-31 02:27:41 +020041 schema->addLeaf("/", "mod:foodIdentRef", yang::IdentityRef{schema->validIdentities("mod", "food")});
42 schema->addLeaf("/", "mod:pizzaIdentRef", yang::IdentityRef{schema->validIdentities("mod", "pizza")});
43 schema->addLeaf("/mod:contA", "mod:identInCont", yang::IdentityRef{schema->validIdentities("mod", "pizza")});
44 schema->addLeaf("/", "mod:leafEnum", createEnum({"lol", "data", "coze"}));
45 schema->addLeaf("/mod:contA", "mod:leafInCont", yang::String{});
Václav Kubernátefcac932020-01-10 15:26:32 +010046 schema->addList("/", "mod:list", {"number"});
Václav Kubernát3a99f002020-03-31 02:27:41 +020047 schema->addLeaf("/mod:list", "mod:number", yang::Int32{});
48 schema->addLeaf("/mod:list", "mod:leafInList", yang::String{});
Václav Kubernát13b23d72020-04-16 21:49:51 +020049 schema->addLeaf("/", "mod:refToString", yang::LeafRef{"/mod:leafString", std::make_unique<yang::TypeInfo>(schema->leafType("/mod:leafString"))});
50 schema->addLeaf("/", "mod:refToInt8", yang::LeafRef{"/mod:leafInt8", std::make_unique<yang::TypeInfo>(schema->leafType("/mod:leafInt8"))});
51 schema->addLeaf("/", "mod:refToLeafInCont", yang::LeafRef{"/mod:contA/identInCont", std::make_unique<yang::TypeInfo>(schema->leafType("/mod:contA/mod:identInCont"))});
52 schema->addLeaf("/", "mod:intOrString", yang::Union{{yang::TypeInfo{yang::Int32{}}, yang::TypeInfo{yang::String{}}}});
53 schema->addLeaf("/", "mod:twoInts", yang::Union{{yang::TypeInfo{yang::Uint8{}}, yang::TypeInfo{yang::Int16{}}}});
Václav Kubernát2984f442020-02-20 17:43:35 +010054 schema->addLeaf("/", "mod:unionStringEnumLeafref", yang::Union{{
Václav Kubernát13b23d72020-04-16 21:49:51 +020055 yang::LeafDataType{yang::String{}},
56 yang::LeafDataType{createEnum({"foo", "bar"})},
57 yang::LeafDataType{yang::LeafRef{"/mod:leafEnum", std::make_unique<yang::TypeInfo>(schema->leafType("/mod:leafEnum"))}}
Václav Kubernát2984f442020-02-20 17:43:35 +010058 }});
59
60 schema->addList("/", "mod:portSettings", {"port"});
61 schema->addLeaf("/mod:portSettings", "mod:port", createEnum({"eth0", "eth1", "eth2"}));
62 schema->addList("/", "mod:portMapping", {"port"});
63 schema->addLeaf("/mod:portMapping", "mod:port", createEnum({"utf1", "utf2", "utf3"}));
Václav Kubernát13b23d72020-04-16 21:49:51 +020064 schema->addLeaf("/", "mod:activeMappedPort", yang::LeafRef{"/mod:portMapping/mod:port", std::make_unique<yang::TypeInfo>(schema->leafType("/mod:portMapping/mod:port"))});
Václav Kubernát2984f442020-02-20 17:43:35 +010065 schema->addLeaf("/", "mod:activePort", yang::Union{{
Václav Kubernát13b23d72020-04-16 21:49:51 +020066 yang::TypeInfo{createEnum({"wlan0", "wlan1"})},
67 yang::TypeInfo{yang::LeafRef{"/mod:portSettings/mod:port", std::make_unique<yang::TypeInfo>(schema->leafType("/mod:portSettings/mod:port"))}},
68 yang::TypeInfo{yang::LeafRef{"/mod:activeMappedPort", std::make_unique<yang::TypeInfo>(schema->leafType("/mod:activeMappedPort"))}},
Jan Kundrát379bb572020-05-07 03:23:13 +020069 yang::TypeInfo{yang::Empty{}},
Václav Kubernát2984f442020-02-20 17:43:35 +010070 }});
Jan Kundrát379bb572020-05-07 03:23:13 +020071 schema->addLeaf("/", "mod:dummy", yang::Empty{});
Václav Kubernátabf52802020-05-19 01:31:17 +020072 schema->addLeaf("/", "mod:readonly", yang::Int32{}, yang::AccessType::ReadOnly);
Václav Kubernát2984f442020-02-20 17:43:35 +010073
Václav Kubernátdab73ca2020-10-26 23:44:43 +010074 schema->addLeaf("/", "mod:flags", yang::Bits{{"carry", "sign"}});
75
Václav Kubernát07204242018-06-04 18:12:09 +020076 Parser parser(schema);
77 std::string input;
78 std::ostringstream errorStream;
79
80 SECTION("valid input")
81 {
82 set_ expected;
Jan Kundrát03c77a12023-08-28 14:23:05 +020083 dataPath_ cwd;
Václav Kubernát07204242018-06-04 18:12:09 +020084
Václav Kubernát1bbac7c2020-01-15 17:45:41 +010085 SECTION("set mod:leafString \"some_data\"")
Václav Kubernát07204242018-06-04 18:12:09 +020086 {
Václav Kubernát1bbac7c2020-01-15 17:45:41 +010087 input = "set mod:leafString \'some_data\'";
Václav Kubernátfaacd022020-07-08 16:44:38 +020088 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("leafString"));
Václav Kubernátebca2552018-06-08 19:06:02 +020089 expected.m_data = std::string("some_data");
Václav Kubernát07204242018-06-04 18:12:09 +020090 }
91
Jan Kundrát03c77a12023-08-28 14:23:05 +020092 SECTION("cd mod:contA; set leafInCont 'x'")
93 {
94 input = "set leafInCont 'x'";
95 cwd.m_nodes.emplace_back(module_{"mod"}, container_{"contA"});
96 expected.m_path.m_nodes.emplace_back(leaf_("leafInCont"));
97 expected.m_data = std::string("x");
98 }
99
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100100 SECTION("set mod:contA/leafInCont 'more_data'")
Václav Kubernát07204242018-06-04 18:12:09 +0200101 {
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100102 input = "set mod:contA/leafInCont 'more_data'";
Václav Kubernátfaacd022020-07-08 16:44:38 +0200103 expected.m_path.m_nodes.emplace_back(module_{"mod"}, container_("contA"));
104 expected.m_path.m_nodes.emplace_back(leaf_("leafInCont"));
Václav Kubernátebca2552018-06-08 19:06:02 +0200105 expected.m_data = std::string("more_data");
106 }
107
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100108 SECTION("set mod:contA/leafInCont \"data with' a quote\"")
Václav Kubernátc18ffac2020-01-10 16:06:06 +0100109 {
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100110 input = "set mod:contA/leafInCont \"data with' a quote\"";
Václav Kubernátfaacd022020-07-08 16:44:38 +0200111 expected.m_path.m_nodes.emplace_back(module_{"mod"}, container_("contA"));
112 expected.m_path.m_nodes.emplace_back(leaf_("leafInCont"));
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100113 expected.m_data = std::string("data with' a quote");
114 }
115
116 SECTION("set mod:contA/leafInCont 'data with\" a quote'")
117 {
118 input = "set mod:contA/leafInCont 'data with\" a quote'";
Václav Kubernátfaacd022020-07-08 16:44:38 +0200119 expected.m_path.m_nodes.emplace_back(module_{"mod"}, container_("contA"));
120 expected.m_path.m_nodes.emplace_back(leaf_("leafInCont"));
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100121 expected.m_data = std::string("data with\" a quote");
122 }
123
124 SECTION("set mod:contA/leafInCont 'more d\tata'") // spaces in string
125 {
126 input = "set mod:contA/leafInCont 'more d\tata'";
Václav Kubernátfaacd022020-07-08 16:44:38 +0200127 expected.m_path.m_nodes.emplace_back(module_{"mod"}, container_("contA"));
128 expected.m_path.m_nodes.emplace_back(leaf_("leafInCont"));
Václav Kubernátc18ffac2020-01-10 16:06:06 +0100129 expected.m_data = std::string("more d\tata");
130 }
131
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100132 SECTION("set mod:list[number=1]/leafInList \"another_data\"")
Václav Kubernátebca2552018-06-08 19:06:02 +0200133 {
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100134 input = "set mod:list[number=1]/leafInList \"another_data\"";
Václav Kubernátb4e5b182020-11-16 19:55:09 +0100135 auto keys = ListInstance{
Václav Kubernát7707cae2020-01-16 12:04:53 +0100136 {"number", int32_t{1}}};
Václav Kubernátfaacd022020-07-08 16:44:38 +0200137 expected.m_path.m_nodes.emplace_back(module_{"mod"}, listElement_("list", keys));
138 expected.m_path.m_nodes.emplace_back(leaf_("leafInList"));
Václav Kubernátebca2552018-06-08 19:06:02 +0200139 expected.m_data = std::string("another_data");
140 }
141
142 SECTION("data types")
143 {
144 SECTION("string")
145 {
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100146 input = "set mod:leafString \"somedata\"";
Václav Kubernátfaacd022020-07-08 16:44:38 +0200147 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("leafString"));
Václav Kubernátebca2552018-06-08 19:06:02 +0200148 expected.m_data = std::string("somedata");
149 }
150
Václav Kubernátb8bad062021-02-04 00:02:45 +0100151 SECTION("more spaces before value")
152 {
153 input = "set mod:leafString \"somedata\"";
154 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("leafString"));
155 expected.m_data = std::string("somedata");
156 }
157
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200158 SECTION("int8")
Václav Kubernátebca2552018-06-08 19:06:02 +0200159 {
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200160 input = "set mod:leafInt8 2";
Václav Kubernátfaacd022020-07-08 16:44:38 +0200161 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("leafInt8"));
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200162 expected.m_data = int8_t{2};
163 }
164
165 SECTION("negative int8")
166 {
167 input = "set mod:leafInt8 -10";
Václav Kubernátfaacd022020-07-08 16:44:38 +0200168 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("leafInt8"));
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200169 expected.m_data = int8_t{-10};
170 }
171
172 SECTION("uint8")
173 {
174 input = "set mod:leafUint8 2";
Václav Kubernátfaacd022020-07-08 16:44:38 +0200175 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("leafUint8"));
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200176 expected.m_data = uint8_t{2};
177 }
178
179 SECTION("int16")
180 {
181 input = "set mod:leafInt16 30000";
Václav Kubernátfaacd022020-07-08 16:44:38 +0200182 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("leafInt16"));
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200183 expected.m_data = int16_t{30'000};
184 }
185
186 SECTION("uint16")
187 {
188 input = "set mod:leafUint16 30000";
Václav Kubernátfaacd022020-07-08 16:44:38 +0200189 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("leafUint16"));
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200190 expected.m_data = uint16_t{30'000};
191 }
192
193 SECTION("int32")
194 {
195 input = "set mod:leafInt32 30000";
Václav Kubernátfaacd022020-07-08 16:44:38 +0200196 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("leafInt32"));
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200197 expected.m_data = int32_t{30'000};
198 }
199
200 SECTION("uint32")
201 {
202 input = "set mod:leafUint32 30000";
Václav Kubernátfaacd022020-07-08 16:44:38 +0200203 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("leafUint32"));
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200204 expected.m_data = uint32_t{30'000};
205 }
206
207 SECTION("int32")
208 {
209 input = "set mod:leafInt32 30000";
Václav Kubernátfaacd022020-07-08 16:44:38 +0200210 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("leafInt32"));
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200211 expected.m_data = int32_t{30'000};
212 }
213
214 SECTION("uint64")
215 {
216 input = "set mod:leafUint64 30000";
Václav Kubernátfaacd022020-07-08 16:44:38 +0200217 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("leafUint64"));
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200218 expected.m_data = uint64_t{30'000};
Václav Kubernátebca2552018-06-08 19:06:02 +0200219 }
220
221 SECTION("decimal")
222 {
Václav Kubernát744f57f2018-06-29 22:46:26 +0200223 input = "set mod:leafDecimal 3.14159";
Václav Kubernátfaacd022020-07-08 16:44:38 +0200224 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("leafDecimal"));
Václav Kubernátebca2552018-06-08 19:06:02 +0200225 expected.m_data = 3.14159;
226 }
227
228 SECTION("enum")
229 {
Václav Kubernát744f57f2018-06-29 22:46:26 +0200230 input = "set mod:leafEnum coze";
Václav Kubernátfaacd022020-07-08 16:44:38 +0200231 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("leafEnum"));
Václav Kubernátebca2552018-06-08 19:06:02 +0200232 expected.m_data = enum_("coze");
233 }
234
235 SECTION("bool")
236 {
Václav Kubernát744f57f2018-06-29 22:46:26 +0200237 input = "set mod:leafBool true";
Václav Kubernátfaacd022020-07-08 16:44:38 +0200238 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("leafBool"));
Václav Kubernátebca2552018-06-08 19:06:02 +0200239 expected.m_data = true;
240 }
Václav Kubernátab538992019-03-06 15:30:50 +0100241
Václav Kubernát2984f442020-02-20 17:43:35 +0100242 SECTION("union")
243 {
244 SECTION("int")
245 {
Václav Kubernátfaacd022020-07-08 16:44:38 +0200246 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("intOrString"));
Václav Kubernát2984f442020-02-20 17:43:35 +0100247 input = "set mod:intOrString 90";
248 expected.m_data = int32_t{90};
249 }
250 SECTION("string")
251 {
Václav Kubernátfaacd022020-07-08 16:44:38 +0200252 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("intOrString"));
Václav Kubernát2984f442020-02-20 17:43:35 +0100253 input = "set mod:intOrString \"test\"";
254 expected.m_data = std::string{"test"};
255 }
256
257 SECTION("union with two integral types")
258 {
Václav Kubernátfaacd022020-07-08 16:44:38 +0200259 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("twoInts"));
Václav Kubernát2984f442020-02-20 17:43:35 +0100260 SECTION("uint8")
261 {
262 input = "set mod:twoInts 100";
263 expected.m_data = uint8_t{100};
264 }
265 SECTION("int16")
266 {
267 input = "set mod:twoInts 6666";
268 expected.m_data = int16_t{6666};
269 }
270 }
271
272 SECTION("union with enum and leafref to enum")
273 {
Václav Kubernátfaacd022020-07-08 16:44:38 +0200274 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("unionStringEnumLeafref"));
Václav Kubernát2984f442020-02-20 17:43:35 +0100275 SECTION("string")
276 {
277 input = "set mod:unionStringEnumLeafref \"AHOJ\"";
278 expected.m_data = std::string{"AHOJ"};
279 }
280 SECTION("enum")
281 {
282 input = "set mod:unionStringEnumLeafref bar";
283 expected.m_data = enum_("bar");
284 }
285 SECTION("enum leafref")
286 {
287 input = "set mod:unionStringEnumLeafref coze";
288 expected.m_data = enum_("coze");
289 }
290 }
291
292 SECTION("activePort")
293 {
Václav Kubernátfaacd022020-07-08 16:44:38 +0200294 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("activePort"));
Václav Kubernát2984f442020-02-20 17:43:35 +0100295 input = "set mod:activePort ";
296 SECTION("1. anonymous enum")
297 {
298 SECTION("wlan0")
299 {
300 input += "wlan0";
301 expected.m_data = enum_("wlan0");
302 }
303 SECTION("wlan1")
304 {
305 input += "wlan1";
306 expected.m_data = enum_("wlan1");
307 }
308 }
309 SECTION("2. leafref to enum")
310 {
311 SECTION("eth0")
312 {
313 input += "eth0";
314 expected.m_data = enum_("eth0");
315 }
316 SECTION("eth1")
317 {
318 input += "eth1";
319 expected.m_data = enum_("eth1");
320 }
321 SECTION("eth2")
322 {
323 input += "eth2";
324 expected.m_data = enum_("eth2");
325 }
326 }
327 SECTION("3. leafref to leafref")
328 {
329 SECTION("utf1")
330 {
331 input += "utf1";
332 expected.m_data = enum_("utf1");
333 }
334 SECTION("utf2")
335 {
336 input += "utf2";
337 expected.m_data = enum_("utf2");
338 }
339 SECTION("utf3")
340 {
341 input += "utf3";
342 expected.m_data = enum_("utf3");
343 }
344 }
Jan Kundrát379bb572020-05-07 03:23:13 +0200345 SECTION("4. empty")
346 {
347 expected.m_data = empty_{};
348 }
Václav Kubernát2984f442020-02-20 17:43:35 +0100349 }
350 }
351
Václav Kubernátab538992019-03-06 15:30:50 +0100352 SECTION("binary")
353 {
354 SECTION("zero ending '='")
355 {
356 input = "set mod:leafBinary This/IsABase64EncodedSomething++/342431++";
357 expected.m_data = binary_{"This/IsABase64EncodedSomething++/342431++"};
358 }
359
360 SECTION("one ending '='")
361 {
362 input = "set mod:leafBinary This/IsABase64EncodedSomething++/342431++=";
363 expected.m_data = binary_{"This/IsABase64EncodedSomething++/342431++="};
364 }
365
366 SECTION("two ending '='")
367 {
368 input = "set mod:leafBinary This/IsABase64EncodedSomething++/342431++==";
369 expected.m_data = binary_{"This/IsABase64EncodedSomething++/342431++=="};
370 }
Václav Kubernátfaacd022020-07-08 16:44:38 +0200371 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("leafBinary"));
Václav Kubernátab538992019-03-06 15:30:50 +0100372 }
Václav Kubernáteeb38842019-03-20 19:46:05 +0100373
374 SECTION("identityRef")
375 {
376 SECTION("foodIdentRef")
377 {
378 input = "set mod:foodIdentRef ";
Václav Kubernátfaacd022020-07-08 16:44:38 +0200379 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("foodIdentRef"));
Václav Kubernáteeb38842019-03-20 19:46:05 +0100380
381 SECTION("food")
382 {
383 input += "food";
384 expected.m_data = identityRef_("food");
385 }
386 SECTION("mod:food")
387 {
388 input += "mod:food";
389 expected.m_data = identityRef_("mod", "food");
390 }
391 SECTION("pizza")
392 {
393 input += "pizza";
394 expected.m_data = identityRef_("pizza");
395 }
396 SECTION("mod:pizza")
397 {
398 input += "mod:pizza";
399 expected.m_data = identityRef_("mod", "pizza");
400 }
401 SECTION("pizza-module:hawaii")
402 {
403 input += "pizza-module:hawaii";
404 expected.m_data = identityRef_("pizza-module", "hawaii");
405 }
406 }
407 SECTION("pizzaIdentRef")
408 {
409 input = "set mod:pizzaIdentRef ";
Václav Kubernátfaacd022020-07-08 16:44:38 +0200410 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("pizzaIdentRef"));
Václav Kubernáteeb38842019-03-20 19:46:05 +0100411 SECTION("pizza")
412 {
413 input += "pizza";
414 expected.m_data = identityRef_("pizza");
415 }
416 SECTION("mod:pizza")
417 {
418 input += "mod:pizza";
419 expected.m_data = identityRef_("mod", "pizza");
420 }
421 SECTION("pizza-module:hawaii")
422 {
423 input += "pizza-module:hawaii";
424 expected.m_data = identityRef_("pizza-module", "hawaii");
425 }
426 }
427 SECTION("mod:contA/identInCont")
428 {
429 input = "set mod:contA/identInCont ";
Václav Kubernátfaacd022020-07-08 16:44:38 +0200430 expected.m_path.m_nodes.emplace_back(module_{"mod"}, container_("contA"));
431 expected.m_path.m_nodes.emplace_back(leaf_("identInCont"));
Václav Kubernáteeb38842019-03-20 19:46:05 +0100432 SECTION("pizza")
433 {
434 input += "pizza";
435 expected.m_data = identityRef_("pizza");
436 }
437 SECTION("mod:pizza")
438 {
439 input += "mod:pizza";
440 expected.m_data = identityRef_("mod", "pizza");
441 }
442 SECTION("pizza-module:hawaii")
443 {
444 input += "pizza-module:hawaii";
445 expected.m_data = identityRef_("pizza-module", "hawaii");
446 }
447 }
448 }
Václav Kubernát6a8d1d92019-04-24 20:30:36 +0200449 SECTION("leafRef")
450 {
451 SECTION("refToString")
452 {
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100453 input = "set mod:refToString \"blabal\"";
Václav Kubernátfaacd022020-07-08 16:44:38 +0200454 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("refToString"));
Václav Kubernát6a8d1d92019-04-24 20:30:36 +0200455 expected.m_data = std::string("blabal");
456 }
457
458 SECTION("refToInt8")
459 {
460 input = "set mod:refToInt8 42";
Václav Kubernátfaacd022020-07-08 16:44:38 +0200461 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("refToInt8"));
Václav Kubernát6a8d1d92019-04-24 20:30:36 +0200462 expected.m_data = int8_t{42};
463 }
Václav Kubernát2d7b05c2020-04-05 14:02:37 +0200464
465 SECTION("refToLeafInCont")
466 {
467 input = "set mod:refToLeafInCont pizza";
Václav Kubernátfaacd022020-07-08 16:44:38 +0200468 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("refToLeafInCont"));
Václav Kubernát2d7b05c2020-04-05 14:02:37 +0200469 expected.m_data = identityRef_{"pizza"};
470 }
Václav Kubernát6a8d1d92019-04-24 20:30:36 +0200471 }
Jan Kundrát379bb572020-05-07 03:23:13 +0200472 SECTION("empty")
473 {
474 input = "set mod:dummy ";
Václav Kubernátfaacd022020-07-08 16:44:38 +0200475 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("dummy"));
Jan Kundrát379bb572020-05-07 03:23:13 +0200476 expected.m_data = empty_{};
477 }
Václav Kubernátdab73ca2020-10-26 23:44:43 +0100478
479 SECTION("bits")
480 {
481 input = "set mod:flags ";
482 decltype(bits_::m_bits) bits;
Václav Kubernátb4e5b182020-11-16 19:55:09 +0100483 SECTION("<nothing>")
484 {
Václav Kubernátdab73ca2020-10-26 23:44:43 +0100485 bits = {};
486 }
Václav Kubernátb4e5b182020-11-16 19:55:09 +0100487 SECTION("carry")
488 {
Václav Kubernátdab73ca2020-10-26 23:44:43 +0100489 input += "carry";
490 bits = {"carry"};
491 }
Václav Kubernátb4e5b182020-11-16 19:55:09 +0100492 SECTION("sign")
493 {
Václav Kubernátdab73ca2020-10-26 23:44:43 +0100494 input += "sign";
495 bits = {"sign"};
496 }
Václav Kubernátb4e5b182020-11-16 19:55:09 +0100497 SECTION("carry sign")
498 {
Václav Kubernátdab73ca2020-10-26 23:44:43 +0100499 input += "carry sign";
500 bits = {"carry", "sign"};
501 }
Václav Kubernátb4e5b182020-11-16 19:55:09 +0100502 SECTION("sign carry")
503 {
Václav Kubernátdab73ca2020-10-26 23:44:43 +0100504 input += "sign carry";
505 bits = {"sign", "carry"};
506 }
507 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("flags"));
508 expected.m_data = bits_{bits};
509 }
Václav Kubernát07204242018-06-04 18:12:09 +0200510 }
511
Jan Kundrát03c77a12023-08-28 14:23:05 +0200512 parser.changeNode(cwd);
Václav Kubernát07204242018-06-04 18:12:09 +0200513 command_ command = parser.parseCommand(input, errorStream);
514 REQUIRE(command.type() == typeid(set_));
515 REQUIRE(boost::get<set_>(command) == expected);
516 }
517
518 SECTION("invalid input")
519 {
Václav Kubernát777704d2020-01-15 18:48:06 +0100520 std::string expectedError;
Jan Kundrát03c77a12023-08-28 14:23:05 +0200521 dataPath_ cwd;
522
Václav Kubernát07204242018-06-04 18:12:09 +0200523 SECTION("missing space between a command and its arguments")
524 {
Václav Kubernát777704d2020-01-15 18:48:06 +0100525 SECTION("setmod:leafString some_data")
Václav Kubernát07204242018-06-04 18:12:09 +0200526 {
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100527 input = "setmod:leafString 'some_data'";
Václav Kubernát07204242018-06-04 18:12:09 +0200528 }
529 }
530
531 SECTION("missing space between arguments")
532 {
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100533 SECTION("set mod:leafString'lol'")
Václav Kubernát07204242018-06-04 18:12:09 +0200534 {
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100535 input = "set mod:leafString'lol'";
Václav Kubernát07204242018-06-04 18:12:09 +0200536 }
537 }
538
539 SECTION("non-leaf identifiers")
540 {
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100541 SECTION("set mod:nonexistent 'blabla'")
Václav Kubernát07204242018-06-04 18:12:09 +0200542 {
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100543 input = "set mod:nonexistent 'blabla'";
Václav Kubernát07204242018-06-04 18:12:09 +0200544 }
545
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100546 SECTION("set mod:contA 'abde'")
Václav Kubernát07204242018-06-04 18:12:09 +0200547 {
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100548 input = "set mod:contA 'abde'";
Václav Kubernát07204242018-06-04 18:12:09 +0200549 }
550 }
551
Václav Kubernátebca2552018-06-08 19:06:02 +0200552 SECTION("wrong types")
553 {
Václav Kubernát777704d2020-01-15 18:48:06 +0100554 expectedError = "leaf data type mismatch";
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100555 SECTION("set mod:leafBool 'blabla'")
Václav Kubernátebca2552018-06-08 19:06:02 +0200556 {
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100557 input = "set mod:leafBool 'blabla'";
Václav Kubernátebca2552018-06-08 19:06:02 +0200558 }
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100559 SECTION("set mod:leafUint8 'blabla'")
Václav Kubernátebca2552018-06-08 19:06:02 +0200560 {
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100561 input = "set mod:leafUint8 'blabla'";
Václav Kubernátebca2552018-06-08 19:06:02 +0200562 }
Václav Kubernát777704d2020-01-15 18:48:06 +0100563 SECTION("set mod:leafUint8 -5")
Václav Kubernátebca2552018-06-08 19:06:02 +0200564 {
Václav Kubernát777704d2020-01-15 18:48:06 +0100565 input = "set mod:leafUint8 -5";
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200566 }
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100567 SECTION("set mod:leafInt8 'blabla'")
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200568 {
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100569 input = "set mod:leafInt8 'blabla'";
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200570 }
Václav Kubernát777704d2020-01-15 18:48:06 +0100571 SECTION("set mod:leafInt8 130")
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200572 {
Václav Kubernát777704d2020-01-15 18:48:06 +0100573 input = "set mod:leafInt8 130";
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200574 }
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100575 SECTION("set mod:leafUint16 'blabla'")
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200576 {
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100577 input = "set mod:leafUint16 'blabla'";
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200578 }
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100579 SECTION("set mod:leafInt16 'blabla'")
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200580 {
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100581 input = "set mod:leafInt16 'blabla'";
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200582 }
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100583 SECTION("set mod:leafUint32 'blabla'")
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200584 {
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100585 input = "set mod:leafUint32 'blabla'";
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200586 }
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100587 SECTION("set mod:leafInt32 'blabla'")
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200588 {
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100589 input = "set mod:leafInt32 'blabla'";
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200590 }
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100591 SECTION("set mod:leafUint64 'blabla'")
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200592 {
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100593 input = "set mod:leafUint64 'blabla'";
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200594 }
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100595 SECTION("set mod:leafInt64 'blabla'")
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200596 {
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100597 input = "set mod:leafInt64 'blabla'";
Václav Kubernátebca2552018-06-08 19:06:02 +0200598 }
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100599 SECTION("set mod:leafEnum 'blabla'")
Václav Kubernátebca2552018-06-08 19:06:02 +0200600 {
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100601 input = "set mod:leafEnum 'blabla'";
Václav Kubernátebca2552018-06-08 19:06:02 +0200602 }
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100603 SECTION("set mod:refToInt8 'blabla'")
Václav Kubernát6a8d1d92019-04-24 20:30:36 +0200604 {
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100605 input = "set mod:refToInt8 'blabla'";
Václav Kubernát6a8d1d92019-04-24 20:30:36 +0200606 }
Václav Kubernátebca2552018-06-08 19:06:02 +0200607 }
608
Václav Kubernátab538992019-03-06 15:30:50 +0100609 SECTION("wrong base64 strings")
610 {
611 SECTION("invalid character")
Václav Kubernátb4e5b182020-11-16 19:55:09 +0100612 {
Václav Kubernát777704d2020-01-15 18:48:06 +0100613 input = "set mod:leafBinary dbahj-";
Václav Kubernátb4e5b182020-11-16 19:55:09 +0100614 }
Václav Kubernátab538992019-03-06 15:30:50 +0100615 SECTION("equal sign in the middle")
Václav Kubernátb4e5b182020-11-16 19:55:09 +0100616 {
Václav Kubernát777704d2020-01-15 18:48:06 +0100617 input = "set mod:leafBinary db=ahj";
Václav Kubernátb4e5b182020-11-16 19:55:09 +0100618 }
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100619 SECTION("enclosing in quotes")
Václav Kubernátb4e5b182020-11-16 19:55:09 +0100620 {
Václav Kubernát1bbac7c2020-01-15 17:45:41 +0100621 input = "set mod:leafBinary 'dbahj'";
Václav Kubernátb4e5b182020-11-16 19:55:09 +0100622 }
Václav Kubernátab538992019-03-06 15:30:50 +0100623 }
624
Václav Kubernáteeb38842019-03-20 19:46:05 +0100625 SECTION("non-existing identity")
626 {
627 input = "set mod:foodIdentRef identityBLABLA";
628 }
629
Václav Kubernátf365ecf2020-06-09 16:22:43 +0200630 SECTION("identity with non-existing module")
631 {
632 expectedError = "Invalid module name";
633 input = "set mod:foodIdentRef xd:haha";
634 }
635
Václav Kubernáteeb38842019-03-20 19:46:05 +0100636 SECTION("setting identities with wrong bases")
637 {
638 SECTION("set mod:foodIdentRef mod:vehicle")
639 {
640 input = "set mod:foodIdentRef mod:vehicle";
641 }
642 SECTION("set mod:pizzaIdentRef mod:food")
643 {
644 input = "set mod:pizzaIdentRef mod:food";
645 }
646 }
647 SECTION("setting different module identities without prefix")
648 {
649 input = "set mod:pizzaIdentRef hawaii";
650 }
651 SECTION("identity prefix without name")
652 {
653 input = "set mod:contA/identInCont pizza-module:";
654 }
655
Václav Kubernát2984f442020-02-20 17:43:35 +0100656 SECTION("set a union path to a wrong type")
657 {
658 input = "set mod:intOrString true";
659 }
660
Jan Kundrát379bb572020-05-07 03:23:13 +0200661 SECTION("no space for empty data")
662 {
663 input = "set mod:dummy";
664 }
665
Václav Kubernát0d42c512020-05-20 21:18:39 +0200666 SECTION("empty path")
667 {
668 input = "set ";
669 }
670
Václav Kubernátabf52802020-05-19 01:31:17 +0200671 SECTION("setting readonly data")
672 {
673 input = "set mod:readonly 123";
674 }
675
Václav Kubernátdab73ca2020-10-26 23:44:43 +0100676 SECTION("nonexistent bits")
677 {
678 input = "set mod:flags daw";
679 }
680
681 SECTION("same bit more than once")
682 {
683 input = "set mod:flags carry carry";
684 }
685
Jan Kundrát03c77a12023-08-28 14:23:05 +0200686 parser.changeNode(cwd);
Jan Kundrátc381e632019-03-14 13:39:11 +0100687 REQUIRE_THROWS_AS(parser.parseCommand(input, errorStream), InvalidCommandException);
Václav Kubernát777704d2020-01-15 18:48:06 +0100688 REQUIRE(errorStream.str().find(expectedError) != std::string::npos);
Václav Kubernát07204242018-06-04 18:12:09 +0200689 }
Jan Kundrátb7206ad2020-06-18 21:08:14 +0200690
691 SECTION("deleting a leaf")
692 {
693 delete_ expected;
694 input = "delete mod:leafString";
Václav Kubernátfaacd022020-07-08 16:44:38 +0200695 expected.m_path.m_nodes.emplace_back(module_{"mod"}, leaf_("leafString"));
Jan Kundrátb7206ad2020-06-18 21:08:14 +0200696
697 command_ command = parser.parseCommand(input, errorStream);
698 REQUIRE(command.type() == typeid(delete_));
699 REQUIRE(boost::get<delete_>(command) == expected);
700 }
Václav Kubernát07204242018-06-04 18:12:09 +0200701}