blob: cee9e9ac063532a43f7df687c9eadafeb50b6834 [file] [log] [blame]
Václav Kubernát0d4db442018-07-18 17:18:43 +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át47a3f672019-11-08 15:42:43 +01009#include <experimental/iterator>
Václav Kubernát3a99f002020-03-31 02:27:41 +020010#include "leaf_data_helpers.hpp"
Václav Kubernát1e09bd62020-02-17 15:13:38 +010011#include "pretty_printers.hpp"
Václav Kubernát26b56082020-02-03 18:28:56 +010012#include "trompeloeil_doctest.hpp"
Václav Kubernát0d4db442018-07-18 17:18:43 +020013#include "yang_schema.hpp"
14
Václav Kubernát4f77a252019-02-19 16:51:30 +010015const char* second_schema = R"(
16module second-schema {
17 namespace "http://example.com/nevim";
18 prefix second;
19
20 import example-schema {
21 prefix "example";
22 }
23
Václav Kubernáteeb38842019-03-20 19:46:05 +010024 identity pineapple {
25 base "example:fruit";
26 }
27
Václav Kubernát4f77a252019-02-19 16:51:30 +010028 augment /example:a {
29 container augmentedContainer {
30 }
31 }
32
33 container bla {
34 container bla2 {
35 }
36 }
37}
38)";
39
Václav Kubernát82d74632020-05-11 15:59:53 +020040const char* included_submodule = R"(
41submodule sub-module {
42 yang-version 1.1;
43
44 belongs-to example-schema {
45 prefix sub;
46 }
47
48 leaf subLeaf {
49 type string;
50 }
51}
52)";
53
Václav Kubernát4f77a252019-02-19 16:51:30 +010054const char* example_schema = R"(
Václav Kubernát0d4db442018-07-18 17:18:43 +020055module example-schema {
Václav Kubernát6a713d62018-10-03 18:47:34 +020056 yang-version 1.1;
Václav Kubernát0d4db442018-07-18 17:18:43 +020057 namespace "http://example.com/example-sports";
58 prefix coze;
59
Václav Kubernát82d74632020-05-11 15:59:53 +020060 include sub-module;
61
Václav Kubernáteeb38842019-03-20 19:46:05 +010062 identity drink {
63 }
64
65 identity voda {
66 base "drink";
67 }
68
69 identity food {
70 }
71
72 identity fruit {
73 base "food";
74 }
75
76 identity pizza {
77 base "food";
78 }
79
80 identity hawaii {
81 base "pizza";
82 }
83
Václav Kubernát0d4db442018-07-18 17:18:43 +020084 container a {
85 container a2 {
86 container a3 {
87 presence true;
88 }
89 }
90
91 leaf leafa {
92 type string;
93 }
94 }
95
96 container b {
97 container b2 {
98 presence true;
99 container b3 {
100 }
101 }
102 }
103
104 leaf leafString {
105 type string;
106 }
107
108 leaf leafDecimal {
109 type decimal64 {
110 fraction-digits 5;
111 }
112 }
113
114 leaf leafBool {
115 type boolean;
116 }
117
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200118 leaf leafInt8 {
119 type int8;
120 }
121
122 leaf leafUint8 {
123 type uint8;
124 }
125
126 leaf leafInt16 {
127 type int16;
128 }
129
130 leaf leafUint16 {
131 type uint16;
132 }
133
134 leaf leafInt32 {
Václav Kubernát1e09bd62020-02-17 15:13:38 +0100135 description "A 32-bit integer leaf.";
Václav Kubernát0d4db442018-07-18 17:18:43 +0200136 type int32;
137 }
138
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200139 leaf leafUint32 {
Václav Kubernát0d4db442018-07-18 17:18:43 +0200140 type uint32;
141 }
142
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200143 leaf leafInt64 {
144 type int64;
145 }
146
147 leaf leafUint64 {
148 type uint64;
Václav Kubernátb1a75c62020-04-21 15:20:16 +0200149 default 9001;
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200150 }
151
Václav Kubernát0d4db442018-07-18 17:18:43 +0200152 leaf leafEnum {
153 type enumeration {
154 enum lol;
155 enum data;
156 enum coze;
157 }
158 }
159
Václav Kubernát6a713d62018-10-03 18:47:34 +0200160 typedef enumTypedef {
161 type enumeration {
162 enum lol;
163 enum data;
164 enum coze;
165 }
Václav Kubernátb1a75c62020-04-21 15:20:16 +0200166 default data;
Václav Kubernát6a713d62018-10-03 18:47:34 +0200167 }
168
169 typedef enumTypedefRestricted {
170 type enumTypedef {
171 enum lol;
172 enum data;
173 }
174 }
175
176 leaf leafEnumTypedef {
177 type enumTypedef;
178 }
179
180 leaf leafEnumTypedefRestricted {
181 type enumTypedef {
182 enum data;
183 enum coze;
184 }
185 }
186
187 leaf leafEnumTypedefRestricted2 {
188 type enumTypedefRestricted;
189 }
190
Václav Kubernáteeb38842019-03-20 19:46:05 +0100191 leaf foodIdentLeaf {
192 type identityref {
193 base "food";
194 }
195 }
196
197 leaf pizzaIdentLeaf {
198 type identityref {
199 base "pizza";
200 }
201 }
202
203 leaf foodDrinkIdentLeaf {
204 type identityref {
205 base "food";
206 base "drink";
207 }
208 }
209
Václav Kubernát0d4db442018-07-18 17:18:43 +0200210 list _list {
211 key number;
212
213 leaf number {
214 type int32;
215 }
216
217 container contInList {
218 presence true;
219 }
220 }
221
222 list twoKeyList {
223 key "name number";
224
225 leaf number {
226 type int32;
227 }
228
229 leaf name {
230 type string;
231 }
232 }
Václav Kubernát7d82da72019-04-11 15:16:38 +0200233
234 grouping arithmeticFlags {
235 leaf carry {
236 type boolean;
237 }
238 leaf zero {
239 type boolean;
240 }
241 }
242
243 grouping flags {
244 leaf direction {
245 type boolean;
246 }
247 leaf interrupt {
248 type boolean;
249 }
250
251 uses arithmeticFlags;
252 }
253
254 uses flags;
Václav Kubernát280df4a2019-11-01 14:46:34 +0100255
256 choice interface {
257 case caseLoopback {
258 container loopback {
259 leaf ip {
260 type string;
261 }
262 }
263 }
264
265 case caseEthernet {
266 container ethernet {
267 leaf ip {
268 type string;
269 }
270 }
271 }
272 }
273
Václav Kubernáta38d4172019-11-04 12:36:39 +0100274 feature bigPizzas;
275
276 leaf pizzaSize {
277 type enumeration {
278 enum large {
279 if-feature "bigPizzas";
280 }
281 enum medium;
282 enum small;
283 }
284 }
285
Václav Kubernát1e09bd62020-02-17 15:13:38 +0100286 leaf length {
287 type int32;
288 units "m";
289 }
290
291 leaf wavelength {
292 type decimal64 {
293 fraction-digits 10;
294 }
295 units "nm";
296 }
297
298 typedef seconds {
299 type int32;
300 units "s";
301 }
302
303 leaf duration {
304 type seconds;
305 }
306
307 leaf another-duration {
308 type seconds;
309 units "vt";
310 }
311
Václav Kubernátbd5e3c22020-02-19 15:22:00 +0100312 leaf activeNumber {
313 type leafref {
314 path "/_list/number";
315 }
316 }
317
Václav Kubernátfa81c8c2020-02-13 17:22:46 +0100318 rpc myRpc {}
319
Václav Kubernát2984f442020-02-20 17:43:35 +0100320 leaf numberOrString {
321 type union {
322 type int32;
323 type string;
324 }
325 description "Can be an int32 or a string.";
326 }
327
328 list portSettings {
329 key "port";
330 leaf port {
331 type enumeration {
332 enum eth0;
333 enum eth1;
334 enum eth2;
335 }
336 }
337 }
338
339 feature weirdPortNames;
340
341 list portMapping {
342 key "port";
343 leaf port {
344 type enumeration {
345 enum WEIRD {
346 if-feature "weirdPortNames";
347 }
348 enum utf2;
349 enum utf3;
350 }
351 }
352 }
353
354 leaf activeMappedPort {
355 type leafref {
356 path "../portMapping/port";
357 }
358 }
359
360 leaf activePort {
361 type union {
362 type enumeration {
363 enum wlan0;
364 enum wlan1;
365 }
366 type leafref {
367 path "../portSettings/port";
368 }
369 type leafref {
370 path "../activeMappedPort";
371 }
Jan Kundrát379bb572020-05-07 03:23:13 +0200372 type empty;
Václav Kubernát2984f442020-02-20 17:43:35 +0100373 }
374 }
375
Jan Kundrát379bb572020-05-07 03:23:13 +0200376 leaf dummyLeaf {
377 type empty;
378 }
379
Václav Kubernát0599e9f2020-04-21 09:51:33 +0200380 leaf clockSpeed {
381 type int64;
382 config false;
383 }
384
385 container systemStats {
386 config false;
387 leaf upTime {
388 type uint64;
389 }
390 }
391
Václav Kubernáta1c4c9e2020-04-22 00:37:52 +0200392 leaf obsoleteLeaf {
393 type int32;
394 status obsolete;
395 }
396
397 leaf deprecatedLeaf {
398 type int32;
399 status deprecated;
400 }
401
402 typedef deprecatedType {
403 type int32;
404 status deprecated;
405 }
406
407 leaf obsoleteLeafWithDeprecatedType {
408 type deprecatedType;
409 status obsolete;
410 }
411
412 typedef obsoleteType {
413 type int32;
414 status obsolete;
415 }
416
417 leaf obsoleteLeafWithObsoleteType {
418 type deprecatedType;
419 status obsolete;
420 }
421
Václav Kubernát5b8a8f32020-05-20 00:57:22 +0200422 leaf-list addresses {
423 type string;
424 }
Václav Kubernát0d4db442018-07-18 17:18:43 +0200425})";
426
427TEST_CASE("yangschema")
428{
Václav Kubernát82d74632020-05-11 15:59:53 +0200429 using namespace std::string_literals;
Václav Kubernát4f77a252019-02-19 16:51:30 +0100430 using namespace std::string_view_literals;
Václav Kubernát0d4db442018-07-18 17:18:43 +0200431 YangSchema ys;
Václav Kubernát82d74632020-05-11 15:59:53 +0200432 ys.registerModuleCallback([]([[maybe_unused]] auto modName, auto, auto subModule, auto) {
433 if (modName != "example-schema"sv) {
434 throw std::logic_error("unrecognized module "s + modName);
435 }
436 if (subModule == nullptr) {
437 return example_schema;
438 }
439 if (subModule == "sub-module"sv) {
440 return included_submodule;
441 }
442
443 throw std::logic_error("unrecognized submodule "s + subModule);
Václav Kubernát4f77a252019-02-19 16:51:30 +0100444 });
445 ys.addSchemaString(second_schema);
446
Václav Kubernátefcac932020-01-10 15:26:32 +0100447 schemaPath_ path{Scope::Absolute, {}};
Václav Kubernát0d4db442018-07-18 17:18:43 +0200448 ModuleNodePair node;
449
450 SECTION("positive")
451 {
Václav Kubernát0d4db442018-07-18 17:18:43 +0200452 SECTION("isModule")
453 {
Václav Kubernát75877de2019-11-20 17:43:02 +0100454 REQUIRE(ys.isModule("example-schema"));
Václav Kubernát0d4db442018-07-18 17:18:43 +0200455 }
Václav Kubernáteeb38842019-03-20 19:46:05 +0100456
Václav Kubernát0d4db442018-07-18 17:18:43 +0200457 SECTION("listHasKey")
458 {
459 std::string key;
460
461 SECTION("_list")
462 {
Václav Kubernátfaacd022020-07-08 16:44:38 +0200463 path.m_nodes.emplace_back(module_{"example-schema"}, list_{"_list"});
Václav Kubernát0d4db442018-07-18 17:18:43 +0200464 SECTION("number")
Václav Kubernát912b9492020-05-29 02:03:40 +0200465 {
466 key = "number";
467 }
Václav Kubernát0d4db442018-07-18 17:18:43 +0200468 }
469
470 SECTION("twoKeyList")
471 {
Václav Kubernátfaacd022020-07-08 16:44:38 +0200472 path.m_nodes.emplace_back(module_{"example-schema"}, list_{"twoKeyList"});
Václav Kubernát0d4db442018-07-18 17:18:43 +0200473 SECTION("number")
Václav Kubernát912b9492020-05-29 02:03:40 +0200474 {
475 key = "number";
476 }
Václav Kubernát0d4db442018-07-18 17:18:43 +0200477 SECTION("name")
Václav Kubernát912b9492020-05-29 02:03:40 +0200478 {
479 key = "name";
480 }
Václav Kubernát0d4db442018-07-18 17:18:43 +0200481 }
482
Václav Kubernát912b9492020-05-29 02:03:40 +0200483 REQUIRE(ys.listHasKey(path, key));
Václav Kubernát0d4db442018-07-18 17:18:43 +0200484 }
485 SECTION("listKeys")
486 {
487 std::set<std::string> set;
488
489 SECTION("_list")
490 {
Václav Kubernátfaacd022020-07-08 16:44:38 +0200491 path.m_nodes.emplace_back(module_{"example-schema"}, list_{"_list"});
Václav Kubernát0d4db442018-07-18 17:18:43 +0200492 set = {"number"};
Václav Kubernát0d4db442018-07-18 17:18:43 +0200493 }
494
495 SECTION("twoKeyList")
496 {
Václav Kubernátfaacd022020-07-08 16:44:38 +0200497 path.m_nodes.emplace_back(module_{"example-schema"}, list_{"twoKeyList"});
Václav Kubernát0d4db442018-07-18 17:18:43 +0200498 set = {"number", "name"};
Václav Kubernát0d4db442018-07-18 17:18:43 +0200499 }
500
Václav Kubernát912b9492020-05-29 02:03:40 +0200501 REQUIRE(ys.listKeys(path) == set);
Václav Kubernát0d4db442018-07-18 17:18:43 +0200502 }
503 SECTION("leafType")
504 {
Václav Kubernát3a99f002020-03-31 02:27:41 +0200505 yang::LeafDataType type;
Václav Kubernát0d4db442018-07-18 17:18:43 +0200506
507 SECTION("leafString")
508 {
509 node.first = "example-schema";
510 node.second = "leafString";
Václav Kubernát3a99f002020-03-31 02:27:41 +0200511 type = yang::String{};
Václav Kubernát0d4db442018-07-18 17:18:43 +0200512 }
513
514 SECTION("leafDecimal")
515 {
516 node.first = "example-schema";
517 node.second = "leafDecimal";
Václav Kubernát3a99f002020-03-31 02:27:41 +0200518 type = yang::Decimal{};
Václav Kubernát0d4db442018-07-18 17:18:43 +0200519 }
520
521 SECTION("leafBool")
522 {
523 node.first = "example-schema";
524 node.second = "leafBool";
Václav Kubernát3a99f002020-03-31 02:27:41 +0200525 type = yang::Bool{};
Václav Kubernát0d4db442018-07-18 17:18:43 +0200526 }
527
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200528 SECTION("leafInt8")
Václav Kubernát0d4db442018-07-18 17:18:43 +0200529 {
530 node.first = "example-schema";
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200531 node.second = "leafInt8";
Václav Kubernát3a99f002020-03-31 02:27:41 +0200532 type = yang::Int8{};
Václav Kubernát0d4db442018-07-18 17:18:43 +0200533 }
534
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200535 SECTION("leafUint8")
Václav Kubernát0d4db442018-07-18 17:18:43 +0200536 {
537 node.first = "example-schema";
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200538 node.second = "leafUint8";
Václav Kubernát3a99f002020-03-31 02:27:41 +0200539 type = yang::Uint8{};
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200540 }
541
Václav Kubernátb6d02752020-04-03 00:25:10 +0200542 SECTION("leafInt16")
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200543 {
544 node.first = "example-schema";
545 node.second = "leafInt16";
Václav Kubernát3a99f002020-03-31 02:27:41 +0200546 type = yang::Int16{};
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200547 }
548
549 SECTION("leafUint16")
550 {
551 node.first = "example-schema";
552 node.second = "leafUint16";
Václav Kubernát3a99f002020-03-31 02:27:41 +0200553 type = yang::Uint16{};
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200554 }
555
556 SECTION("leafInt32")
557 {
558 node.first = "example-schema";
559 node.second = "leafInt32";
Václav Kubernát3a99f002020-03-31 02:27:41 +0200560 type = yang::Int32{};
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200561 }
562
563 SECTION("leafUint32")
564 {
565 node.first = "example-schema";
566 node.second = "leafUint32";
Václav Kubernát3a99f002020-03-31 02:27:41 +0200567 type = yang::Uint32{};
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200568 }
569
570 SECTION("leafInt64")
571 {
572 node.first = "example-schema";
573 node.second = "leafInt64";
Václav Kubernát3a99f002020-03-31 02:27:41 +0200574 type = yang::Int64{};
Ivona Oboňová88c78ca2019-07-02 18:40:07 +0200575 }
576
577 SECTION("leafUint64")
578 {
579 node.first = "example-schema";
580 node.second = "leafUint64";
Václav Kubernát3a99f002020-03-31 02:27:41 +0200581 type = yang::Uint64{};
Václav Kubernát0d4db442018-07-18 17:18:43 +0200582 }
583
584 SECTION("leafEnum")
585 {
586 node.first = "example-schema";
587 node.second = "leafEnum";
Václav Kubernát3a99f002020-03-31 02:27:41 +0200588 type = createEnum({"lol", "data", "coze"});
589 }
590
591 SECTION("leafEnumTypedef")
592 {
593 node.first = "example-schema";
594 node.second = "leafEnumTypedef";
595 type = createEnum({"lol", "data", "coze"});
596 }
597
598 SECTION("leafEnumTypedefRestricted")
599 {
600 node.first = "example-schema";
601 node.second = "leafEnumTypedefRestricted";
602 type = createEnum({"data", "coze"});
603 }
604
605 SECTION("leafEnumTypedefRestricted2")
606 {
607 node.first = "example-schema";
608 node.second = "leafEnumTypedefRestricted2";
609 type = createEnum({"lol", "data"});
610 }
611
612 SECTION("pizzaSize")
613 {
614 node.first = "example-schema";
615 node.second = "pizzaSize";
616
617 SECTION("bigPizzas disabled")
618 {
619 type = createEnum({"small", "medium"});
620 }
621 SECTION("bigPizzas enabled")
622 {
623 ys.enableFeature("example-schema", "bigPizzas");
624 type = createEnum({"small", "medium", "large"});
625 }
626 }
627
628 SECTION("foodIdentLeaf")
629 {
630 node.first = "example-schema";
631 node.second = "foodIdentLeaf";
632 type = yang::IdentityRef{{{"second-schema", "pineapple"},
633 {"example-schema", "food"},
634 {"example-schema", "pizza"},
635 {"example-schema", "hawaii"},
636 {"example-schema", "fruit"}}};
637 }
638
639 SECTION("pizzaIdentLeaf")
640 {
641 node.first = "example-schema";
642 node.second = "pizzaIdentLeaf";
643
644 type = yang::IdentityRef{{
645 {"example-schema", "pizza"},
646 {"example-schema", "hawaii"},
647 }};
648 }
649
650 SECTION("foodDrinkIdentLeaf")
651 {
652 node.first = "example-schema";
653 node.second = "foodDrinkIdentLeaf";
654
655 type = yang::IdentityRef{{
656 {"example-schema", "food"},
657 {"example-schema", "drink"},
658 {"example-schema", "fruit"},
659 {"example-schema", "hawaii"},
660 {"example-schema", "pizza"},
661 {"example-schema", "voda"},
662 {"second-schema", "pineapple"},
663 }};
Václav Kubernát0d4db442018-07-18 17:18:43 +0200664 }
665
Václav Kubernátb6d02752020-04-03 00:25:10 +0200666 SECTION("activeNumber")
667 {
668 node.first = "example-schema";
669 node.second = "activeNumber";
Václav Kubernát3a99f002020-03-31 02:27:41 +0200670 type.emplace<yang::LeafRef>(
671 "/example-schema:_list/number",
Václav Kubernát13b23d72020-04-16 21:49:51 +0200672 std::make_unique<yang::TypeInfo>(ys.leafType("/example-schema:_list/number"))
Václav Kubernát3a99f002020-03-31 02:27:41 +0200673 );
Václav Kubernátb6d02752020-04-03 00:25:10 +0200674 }
675
Václav Kubernát2984f442020-02-20 17:43:35 +0100676 SECTION("activePort")
677 {
678 node.first = "example-schema";
679 node.second = "activePort";
680
Václav Kubernát1dc9e3e2020-06-09 15:22:39 +0200681 yang::Enum enums({});
682 SECTION("weird ports disabled")
683 {
684 enums = createEnum({"utf2", "utf3"});
685 }
686 SECTION("weird ports enabled")
687 {
688 ys.enableFeature("example-schema", "weirdPortNames");
689 enums = createEnum({"WEIRD", "utf2", "utf3"});
690 }
Václav Kubernát2984f442020-02-20 17:43:35 +0100691
692 type = yang::Union{{
Václav Kubernát13b23d72020-04-16 21:49:51 +0200693 yang::TypeInfo{createEnum({"wlan0", "wlan1"})},
694 yang::TypeInfo{yang::LeafRef{
Václav Kubernát2984f442020-02-20 17:43:35 +0100695 "/example-schema:portSettings/port",
Václav Kubernát13b23d72020-04-16 21:49:51 +0200696 std::make_unique<yang::TypeInfo>(createEnum({"eth0", "eth1", "eth2"}))
697 }},
698 yang::TypeInfo{yang::LeafRef{
Václav Kubernát2984f442020-02-20 17:43:35 +0100699 "/example-schema:activeMappedPort",
Václav Kubernát13b23d72020-04-16 21:49:51 +0200700 std::make_unique<yang::TypeInfo>(yang::LeafRef{
Václav Kubernát2984f442020-02-20 17:43:35 +0100701 "/example-schema:portMapping/port",
Václav Kubernát13b23d72020-04-16 21:49:51 +0200702 std::make_unique<yang::TypeInfo>(enums)
703 })
704 }},
Jan Kundrát379bb572020-05-07 03:23:13 +0200705 yang::TypeInfo{yang::Empty{}},
Václav Kubernát2984f442020-02-20 17:43:35 +0100706 }};
707 }
708
Václav Kubernát5b8a8f32020-05-20 00:57:22 +0200709 SECTION("addresses")
710 {
711 node.first = "example-schema";
712 node.second = "addresses";
713 type.emplace<yang::String>();
714 }
715
716
Václav Kubernát0d4db442018-07-18 17:18:43 +0200717 REQUIRE(ys.leafType(path, node) == type);
718 }
Václav Kubernát3a823f42020-04-29 23:40:21 +0200719 SECTION("availableNodes")
Václav Kubernát0d4db442018-07-18 17:18:43 +0200720 {
Václav Kubernát3a823f42020-04-29 23:40:21 +0200721 // TODO: merge "path" and "module" sections and add recursive versions to the path section
722 SECTION("paths")
Václav Kubernát0d4db442018-07-18 17:18:43 +0200723 {
Václav Kubernát95b08872020-04-28 01:04:17 +0200724 std::set<ModuleNodePair> set;
Václav Kubernát3a823f42020-04-29 23:40:21 +0200725
Václav Kubernát95b08872020-04-28 01:04:17 +0200726 using namespace std::string_literals;
Václav Kubernát3a823f42020-04-29 23:40:21 +0200727 SECTION("<root>")
728 {
Václav Kubernát95b08872020-04-28 01:04:17 +0200729 set = {{"example-schema"s, "a"}, {"example-schema"s, "b"}, {"example-schema"s, "leafString"},
730 {"example-schema"s, "leafDecimal"}, {"example-schema"s, "leafBool"},
731 {"example-schema"s, "leafInt8"}, {"example-schema"s, "leafUint8"},
732 {"example-schema"s, "leafInt16"}, {"example-schema"s, "leafUint16"},
733 {"example-schema"s, "leafInt32"}, {"example-schema"s, "leafUint32"},
734 {"example-schema"s, "leafInt64"}, {"example-schema"s, "leafUint64"},
735 {"example-schema"s, "leafEnum"}, {"example-schema"s, "leafEnumTypedef"},
736 {"example-schema"s, "leafEnumTypedefRestricted"}, {"example-schema"s, "leafEnumTypedefRestricted2"},
737 {"example-schema"s, "foodIdentLeaf"}, {"example-schema"s, "pizzaIdentLeaf"}, {"example-schema"s, "foodDrinkIdentLeaf"},
738 {"example-schema"s, "_list"}, {"example-schema"s, "twoKeyList"}, {"second-schema"s, "bla"},
739 {"example-schema"s, "carry"}, {"example-schema"s, "zero"}, {"example-schema"s, "direction"},
740 {"example-schema"s, "interrupt"},
741 {"example-schema"s, "ethernet"}, {"example-schema"s, "loopback"},
742 {"example-schema"s, "pizzaSize"},
743 {"example-schema"s, "length"}, {"example-schema"s, "wavelength"},
744 {"example-schema"s, "duration"}, {"example-schema"s, "another-duration"},
745 {"example-schema"s, "activeNumber"},
746 {"example-schema"s, "numberOrString"},
747 {"example-schema"s, "portSettings"},
748 {"example-schema"s, "portMapping"},
749 {"example-schema"s, "activeMappedPort"},
750 {"example-schema"s, "activePort"},
751 {"example-schema"s, "clockSpeed"},
752 {"example-schema"s, "deprecatedLeaf"},
753 {"example-schema"s, "obsoleteLeaf"},
754 {"example-schema"s, "obsoleteLeafWithDeprecatedType"},
755 {"example-schema"s, "obsoleteLeafWithObsoleteType"},
Václav Kubernátaaafeae2020-05-05 15:41:45 +0200756 {"example-schema"s, "myRpc"},
Václav Kubernát82d74632020-05-11 15:59:53 +0200757 {"example-schema"s, "systemStats"},
Jan Kundrát379bb572020-05-07 03:23:13 +0200758 {"example-schema"s, "dummyLeaf"},
Václav Kubernát5b8a8f32020-05-20 00:57:22 +0200759 {"example-schema"s, "addresses"},
Václav Kubernát82d74632020-05-11 15:59:53 +0200760 {"example-schema"s, "subLeaf"}};
Václav Kubernát3a823f42020-04-29 23:40:21 +0200761 }
762
763 SECTION("example-schema:a")
764 {
Václav Kubernátfaacd022020-07-08 16:44:38 +0200765 path.m_nodes.emplace_back(module_{"example-schema"}, container_("a"));
Václav Kubernát95b08872020-04-28 01:04:17 +0200766 set = {
767 {boost::none, "a2"},
768 {boost::none, "leafa"},
769 {"second-schema"s, "augmentedContainer"}
770 };
Václav Kubernát3a823f42020-04-29 23:40:21 +0200771 }
772
773 SECTION("example-schema:ethernet")
774 {
Václav Kubernátfaacd022020-07-08 16:44:38 +0200775 path.m_nodes.emplace_back(module_{"example-schema"}, container_("ethernet"));
Václav Kubernát95b08872020-04-28 01:04:17 +0200776 set = {{boost::none, "ip"}};
777 }
778
779 SECTION("second-schema:bla")
780 {
Václav Kubernátfaacd022020-07-08 16:44:38 +0200781 path.m_nodes.emplace_back(module_{"second-schema"}, container_("bla"));
Václav Kubernát95b08872020-04-28 01:04:17 +0200782 set = {{boost::none, "bla2"}};
Václav Kubernát3a823f42020-04-29 23:40:21 +0200783 }
784
785 REQUIRE(ys.availableNodes(path, Recursion::NonRecursive) == set);
Václav Kubernát0d4db442018-07-18 17:18:43 +0200786 }
787
Václav Kubernát3a823f42020-04-29 23:40:21 +0200788 SECTION("modules")
Václav Kubernát0d4db442018-07-18 17:18:43 +0200789 {
Václav Kubernát3a823f42020-04-29 23:40:21 +0200790 std::string module;
Václav Kubernát95b08872020-04-28 01:04:17 +0200791 std::set<ModuleNodePair> expectedNonRecursive;
792 std::set<ModuleNodePair> expectedRecursive;
793 using namespace std::string_literals;
Václav Kubernát3a823f42020-04-29 23:40:21 +0200794 SECTION("example-schema")
795 {
796 module = "example-schema";
797 expectedNonRecursive = {
Václav Kubernát95b08872020-04-28 01:04:17 +0200798 {"example-schema"s, "_list"},
799 {"example-schema"s, "a"},
800 {"example-schema"s, "activeMappedPort"},
801 {"example-schema"s, "activeNumber"},
802 {"example-schema"s, "activePort"},
Václav Kubernát5b8a8f32020-05-20 00:57:22 +0200803 {"example-schema"s, "addresses"},
Václav Kubernát95b08872020-04-28 01:04:17 +0200804 {"example-schema"s, "another-duration"},
805 {"example-schema"s, "b"},
806 {"example-schema"s, "carry"},
807 {"example-schema"s, "clockSpeed"},
808 {"example-schema"s, "deprecatedLeaf"},
809 {"example-schema"s, "direction"},
Jan Kundrát379bb572020-05-07 03:23:13 +0200810 {"example-schema"s, "dummyLeaf"},
Václav Kubernát95b08872020-04-28 01:04:17 +0200811 {"example-schema"s, "duration"},
812 {"example-schema"s, "ethernet"},
813 {"example-schema"s, "foodDrinkIdentLeaf"},
814 {"example-schema"s, "foodIdentLeaf"},
815 {"example-schema"s, "interrupt"},
816 {"example-schema"s, "leafBool"},
817 {"example-schema"s, "leafDecimal"},
818 {"example-schema"s, "leafEnum"},
819 {"example-schema"s, "leafEnumTypedef"},
820 {"example-schema"s, "leafEnumTypedefRestricted"},
821 {"example-schema"s, "leafEnumTypedefRestricted2"},
822 {"example-schema"s, "leafInt16"},
823 {"example-schema"s, "leafInt32"},
824 {"example-schema"s, "leafInt64"},
825 {"example-schema"s, "leafInt8"},
826 {"example-schema"s, "leafString"},
827 {"example-schema"s, "leafUint16"},
828 {"example-schema"s, "leafUint32"},
829 {"example-schema"s, "leafUint64"},
830 {"example-schema"s, "leafUint8"},
831 {"example-schema"s, "length"},
832 {"example-schema"s, "loopback"},
Václav Kubernátaaafeae2020-05-05 15:41:45 +0200833 {"example-schema"s, "myRpc"},
Václav Kubernát95b08872020-04-28 01:04:17 +0200834 {"example-schema"s, "numberOrString"},
835 {"example-schema"s, "obsoleteLeaf"},
836 {"example-schema"s, "obsoleteLeafWithDeprecatedType"},
837 {"example-schema"s, "obsoleteLeafWithObsoleteType"},
838 {"example-schema"s, "pizzaIdentLeaf"},
839 {"example-schema"s, "pizzaSize"},
840 {"example-schema"s, "portMapping"},
841 {"example-schema"s, "portSettings"},
842 {"example-schema"s, "systemStats"},
843 {"example-schema"s, "twoKeyList"},
844 {"example-schema"s, "wavelength"},
Václav Kubernát82d74632020-05-11 15:59:53 +0200845 {"example-schema"s, "zero"},
846 {"example-schema"s, "subLeaf"}
Václav Kubernát3a823f42020-04-29 23:40:21 +0200847 };
848 expectedRecursive = {
Václav Kubernát95b08872020-04-28 01:04:17 +0200849 {boost::none, "/example-schema:_list"},
850 {boost::none, "/example-schema:_list/contInList"},
851 {boost::none, "/example-schema:_list/number"},
852 {boost::none, "/example-schema:a"},
Václav Kubernát5b8a8f32020-05-20 00:57:22 +0200853 {boost::none, "/example-schema:addresses"},
Václav Kubernát95b08872020-04-28 01:04:17 +0200854 {boost::none, "/example-schema:a/a2"},
855 {boost::none, "/example-schema:a/a2/a3"},
856 {boost::none, "/example-schema:a/leafa"},
857 {boost::none, "/example-schema:a/second-schema:augmentedContainer"},
858 {boost::none, "/example-schema:activeMappedPort"},
859 {boost::none, "/example-schema:activeNumber"},
860 {boost::none, "/example-schema:activePort"},
861 {boost::none, "/example-schema:another-duration"},
862 {boost::none, "/example-schema:b"},
863 {boost::none, "/example-schema:b/b2"},
864 {boost::none, "/example-schema:b/b2/b3"},
865 {boost::none, "/example-schema:carry"},
866 {boost::none, "/example-schema:clockSpeed"},
867 {boost::none, "/example-schema:deprecatedLeaf"},
868 {boost::none, "/example-schema:direction"},
869 {boost::none, "/example-schema:duration"},
Jan Kundrát379bb572020-05-07 03:23:13 +0200870 {boost::none, "/example-schema:dummyLeaf"},
Václav Kubernát95b08872020-04-28 01:04:17 +0200871 {boost::none, "/example-schema:foodDrinkIdentLeaf"},
872 {boost::none, "/example-schema:foodIdentLeaf"},
873 {boost::none, "/example-schema:interface/caseEthernet/ethernet"},
874 {boost::none, "/example-schema:interface/caseEthernet/ethernet/ip"},
875 {boost::none, "/example-schema:interface/caseLoopback/loopback"},
876 {boost::none, "/example-schema:interface/caseLoopback/loopback/ip"},
877 {boost::none, "/example-schema:interrupt"},
878 {boost::none, "/example-schema:leafBool"},
879 {boost::none, "/example-schema:leafDecimal"},
880 {boost::none, "/example-schema:leafEnum"},
881 {boost::none, "/example-schema:leafEnumTypedef"},
882 {boost::none, "/example-schema:leafEnumTypedefRestricted"},
883 {boost::none, "/example-schema:leafEnumTypedefRestricted2"},
884 {boost::none, "/example-schema:leafInt16"},
885 {boost::none, "/example-schema:leafInt32"},
886 {boost::none, "/example-schema:leafInt64"},
887 {boost::none, "/example-schema:leafInt8"},
888 {boost::none, "/example-schema:leafString"},
889 {boost::none, "/example-schema:leafUint16"},
890 {boost::none, "/example-schema:leafUint32"},
891 {boost::none, "/example-schema:leafUint64"},
892 {boost::none, "/example-schema:leafUint8"},
893 {boost::none, "/example-schema:length"},
Václav Kubernátaaafeae2020-05-05 15:41:45 +0200894 {boost::none, "/example-schema:myRpc"},
895 {boost::none, "/example-schema:myRpc/input"},
896 {boost::none, "/example-schema:myRpc/output"},
Václav Kubernát95b08872020-04-28 01:04:17 +0200897 {boost::none, "/example-schema:numberOrString"},
898 {boost::none, "/example-schema:obsoleteLeaf"},
899 {boost::none, "/example-schema:obsoleteLeafWithDeprecatedType"},
900 {boost::none, "/example-schema:obsoleteLeafWithObsoleteType"},
901 {boost::none, "/example-schema:pizzaIdentLeaf"},
902 {boost::none, "/example-schema:pizzaSize"},
903 {boost::none, "/example-schema:portMapping"},
904 {boost::none, "/example-schema:portMapping/port"},
905 {boost::none, "/example-schema:portSettings"},
906 {boost::none, "/example-schema:portSettings/port"},
907 {boost::none, "/example-schema:systemStats"},
908 {boost::none, "/example-schema:systemStats/upTime"},
Václav Kubernát82d74632020-05-11 15:59:53 +0200909 {boost::none, "/example-schema:subLeaf"},
Václav Kubernát95b08872020-04-28 01:04:17 +0200910 {boost::none, "/example-schema:twoKeyList"},
911 {boost::none, "/example-schema:twoKeyList/name"},
912 {boost::none, "/example-schema:twoKeyList/number"},
913 {boost::none, "/example-schema:wavelength"},
914 {boost::none, "/example-schema:zero"}
Václav Kubernát3a823f42020-04-29 23:40:21 +0200915 };
916 }
Václav Kubernát3a823f42020-04-29 23:40:21 +0200917 SECTION("second-schema")
918 {
919 module = "second-schema";
920 expectedNonRecursive = {
Václav Kubernát95b08872020-04-28 01:04:17 +0200921 {"second-schema"s, "bla"}
Václav Kubernát3a823f42020-04-29 23:40:21 +0200922 };
923 expectedRecursive = {
Václav Kubernát95b08872020-04-28 01:04:17 +0200924 {boost::none, "/second-schema:bla"},
925 {boost::none, "/second-schema:bla/bla2"}
Václav Kubernát3a823f42020-04-29 23:40:21 +0200926 };
927 }
Václav Kubernát0d4db442018-07-18 17:18:43 +0200928
Václav Kubernát3a823f42020-04-29 23:40:21 +0200929 REQUIRE(ys.availableNodes(module_{module}, Recursion::NonRecursive) == expectedNonRecursive);
930 REQUIRE(ys.availableNodes(module_{module}, Recursion::Recursive) == expectedRecursive);
Václav Kubernát47a3f672019-11-08 15:42:43 +0100931 }
Václav Kubernát0d4db442018-07-18 17:18:43 +0200932 }
Václav Kubernát34ee85a2020-02-18 17:12:12 +0100933 SECTION("nodeType")
934 {
935 yang::NodeTypes expected;
936 SECTION("leafInt32")
937 {
Václav Kubernátfaacd022020-07-08 16:44:38 +0200938 path.m_nodes.emplace_back(module_{"example-schema"}, leaf_("leafInt32"));
Václav Kubernát34ee85a2020-02-18 17:12:12 +0100939 expected = yang::NodeTypes::Leaf;
940 }
941
942 SECTION("a")
943 {
Václav Kubernátfaacd022020-07-08 16:44:38 +0200944 path.m_nodes.emplace_back(module_{"example-schema"}, container_("a"));
Václav Kubernát34ee85a2020-02-18 17:12:12 +0100945 expected = yang::NodeTypes::Container;
946 }
947
948 SECTION("a/a2/a3")
949 {
Václav Kubernátfaacd022020-07-08 16:44:38 +0200950 path.m_nodes.emplace_back(module_{"example-schema"}, container_("a"));
951 path.m_nodes.emplace_back(container_("a2"));
952 path.m_nodes.emplace_back(container_("a3"));
Václav Kubernát34ee85a2020-02-18 17:12:12 +0100953 expected = yang::NodeTypes::PresenceContainer;
954 }
955
956 SECTION("_list")
957 {
Václav Kubernátfaacd022020-07-08 16:44:38 +0200958 path.m_nodes.emplace_back(module_{"example-schema"}, list_("_list"));
Václav Kubernát34ee85a2020-02-18 17:12:12 +0100959 expected = yang::NodeTypes::List;
960 }
961
Václav Kubernát82d74632020-05-11 15:59:53 +0200962 SECTION("subLeaf")
963 {
Václav Kubernátfaacd022020-07-08 16:44:38 +0200964 path.m_nodes.emplace_back(module_{"example-schema"}, leaf_("subLeaf"));
Václav Kubernát82d74632020-05-11 15:59:53 +0200965 expected = yang::NodeTypes::Leaf;
966 }
967
Václav Kubernát34ee85a2020-02-18 17:12:12 +0100968 REQUIRE(ys.nodeType(pathToSchemaString(path, Prefixes::WhenNeeded)) == expected);
969 }
Václav Kubernát1e09bd62020-02-17 15:13:38 +0100970
971 SECTION("description")
972 {
973 std::optional<std::string> expected;
974 SECTION("leafInt32")
975 {
Václav Kubernátfaacd022020-07-08 16:44:38 +0200976 path.m_nodes.emplace_back(module_{"example-schema"}, leaf_("leafInt32"));
Václav Kubernát1e09bd62020-02-17 15:13:38 +0100977 expected = "A 32-bit integer leaf.";
978 }
979
980 SECTION("leafString")
981 {
Václav Kubernátfaacd022020-07-08 16:44:38 +0200982 path.m_nodes.emplace_back(module_{"example-schema"}, leaf_("leafString"));
Václav Kubernát1e09bd62020-02-17 15:13:38 +0100983 }
984
Václav Kubernát2984f442020-02-20 17:43:35 +0100985 SECTION("numberOrString")
986 {
Václav Kubernátfaacd022020-07-08 16:44:38 +0200987 path.m_nodes.emplace_back(module_{"example-schema"}, leaf_("numberOrString"));
Václav Kubernát2984f442020-02-20 17:43:35 +0100988 expected = "Can be an int32 or a string.";
989 }
990
Václav Kubernát1e09bd62020-02-17 15:13:38 +0100991 REQUIRE(ys.description(pathToSchemaString(path, Prefixes::WhenNeeded)) == expected);
992 }
993
Václav Kubernáta1c4c9e2020-04-22 00:37:52 +0200994 SECTION("status")
995 {
996 REQUIRE(ys.status("/example-schema:leafUint64") == yang::Status::Current);
997 REQUIRE(ys.status("/example-schema:obsoleteLeaf") == yang::Status::Obsolete);
998 REQUIRE(ys.status("/example-schema:deprecatedLeaf") == yang::Status::Deprecated);
999 REQUIRE(ys.status("/example-schema:obsoleteLeafWithDeprecatedType") == yang::Status::Obsolete);
1000 REQUIRE(ys.status("/example-schema:obsoleteLeafWithObsoleteType") == yang::Status::Obsolete);
1001 }
1002
Václav Kubernát1e09bd62020-02-17 15:13:38 +01001003 SECTION("units")
1004 {
Václav Kubernát13b23d72020-04-16 21:49:51 +02001005 yang::LeafDataType expectedType;
1006 std::optional<std::string> expectedUnits;
Václav Kubernát1e09bd62020-02-17 15:13:38 +01001007 SECTION("length")
1008 {
Václav Kubernátfaacd022020-07-08 16:44:38 +02001009 path.m_nodes.emplace_back(module_{"example-schema"}, leaf_("length"));
Václav Kubernát13b23d72020-04-16 21:49:51 +02001010 expectedType.emplace<yang::Int32>();
1011 expectedUnits = "m";
Václav Kubernát1e09bd62020-02-17 15:13:38 +01001012 }
1013
1014 SECTION("wavelength")
1015 {
Václav Kubernátfaacd022020-07-08 16:44:38 +02001016 path.m_nodes.emplace_back(module_{"example-schema"}, leaf_("wavelength"));
Václav Kubernát13b23d72020-04-16 21:49:51 +02001017 expectedType.emplace<yang::Decimal>();
1018 expectedUnits = "nm";
Václav Kubernát1e09bd62020-02-17 15:13:38 +01001019 }
1020
1021 SECTION("leafInt32")
1022 {
Václav Kubernátfaacd022020-07-08 16:44:38 +02001023 path.m_nodes.emplace_back(module_{"example-schema"}, leaf_("leafInt32"));
Václav Kubernát13b23d72020-04-16 21:49:51 +02001024 expectedType.emplace<yang::Int32>();
Václav Kubernát1e09bd62020-02-17 15:13:38 +01001025 }
1026
1027 SECTION("duration")
1028 {
Václav Kubernátfaacd022020-07-08 16:44:38 +02001029 path.m_nodes.emplace_back(module_{"example-schema"}, leaf_("duration"));
Václav Kubernát13b23d72020-04-16 21:49:51 +02001030 expectedType.emplace<yang::Int32>();
1031 expectedUnits = "s";
Václav Kubernát1e09bd62020-02-17 15:13:38 +01001032 }
1033
1034 SECTION("another-duration")
1035 {
Václav Kubernátfaacd022020-07-08 16:44:38 +02001036 path.m_nodes.emplace_back(module_{"example-schema"}, leaf_("another-duration"));
Václav Kubernát13b23d72020-04-16 21:49:51 +02001037 expectedType.emplace<yang::Int32>();
1038 expectedUnits = "vt";
Václav Kubernát1e09bd62020-02-17 15:13:38 +01001039 }
Václav Kubernát5b8a8f32020-05-20 00:57:22 +02001040 auto nodeType = ys.nodeType(pathToSchemaString(path, Prefixes::WhenNeeded));
1041 REQUIRE((nodeType == yang::NodeTypes::Leaf || nodeType == yang::NodeTypes::LeafList));
Václav Kubernát13b23d72020-04-16 21:49:51 +02001042 REQUIRE(ys.leafType(pathToSchemaString(path, Prefixes::WhenNeeded)) == yang::TypeInfo{expectedType, expectedUnits});
Václav Kubernát1e09bd62020-02-17 15:13:38 +01001043 }
1044
1045 SECTION("nodeType")
1046 {
1047 yang::NodeTypes expected;
1048 SECTION("leafInt32")
1049 {
Václav Kubernátfaacd022020-07-08 16:44:38 +02001050 path.m_nodes.emplace_back(module_{"example-schema"}, leaf_("leafInt32"));
Václav Kubernát1e09bd62020-02-17 15:13:38 +01001051 expected = yang::NodeTypes::Leaf;
1052 }
1053
1054 SECTION("a")
1055 {
Václav Kubernátfaacd022020-07-08 16:44:38 +02001056 path.m_nodes.emplace_back(module_{"example-schema"}, container_("a"));
Václav Kubernát1e09bd62020-02-17 15:13:38 +01001057 expected = yang::NodeTypes::Container;
1058 }
1059
1060 SECTION("a/a2/a3")
1061 {
Václav Kubernátfaacd022020-07-08 16:44:38 +02001062 path.m_nodes.emplace_back(module_{"example-schema"}, container_("a"));
1063 path.m_nodes.emplace_back(container_("a2"));
1064 path.m_nodes.emplace_back(container_("a3"));
Václav Kubernát1e09bd62020-02-17 15:13:38 +01001065 expected = yang::NodeTypes::PresenceContainer;
1066 }
1067
1068 SECTION("_list")
1069 {
Václav Kubernátfaacd022020-07-08 16:44:38 +02001070 path.m_nodes.emplace_back(module_{"example-schema"}, list_("_list"));
Václav Kubernát1e09bd62020-02-17 15:13:38 +01001071 expected = yang::NodeTypes::List;
1072 }
1073
1074 REQUIRE(ys.nodeType(pathToSchemaString(path, Prefixes::WhenNeeded)) == expected);
1075 }
Václav Kubernátbd5e3c22020-02-19 15:22:00 +01001076
1077 SECTION("leafrefPath")
1078 {
1079 REQUIRE(ys.leafrefPath("/example-schema:activeNumber") == "/example-schema:_list/number");
1080 }
Václav Kubernát0599e9f2020-04-21 09:51:33 +02001081
1082 SECTION("isConfig")
1083 {
1084 REQUIRE(ys.isConfig("/example-schema:leafInt32"));
1085 REQUIRE_FALSE(ys.isConfig("/example-schema:clockSpeed"));
1086 REQUIRE_FALSE(ys.isConfig("/example-schema:systemStats"));
1087 REQUIRE_FALSE(ys.isConfig("/example-schema:systemStats/upTime"));
1088 }
Václav Kubernátbd0d5c82020-04-21 10:22:03 +02001089
Václav Kubernátb1a75c62020-04-21 15:20:16 +02001090 SECTION("defaultValue")
1091 {
1092 REQUIRE(ys.defaultValue("/example-schema:leafUint64") == "9001");
1093 REQUIRE(ys.defaultValue("/example-schema:leafEnumTypedefRestricted") == "data");
1094 REQUIRE(ys.defaultValue("/example-schema:leafInt32") == std::nullopt);
1095 }
1096
Václav Kubernát76ba4ec2020-05-18 13:26:56 +02001097 SECTION("leafTypeName")
1098 {
1099 REQUIRE(ys.leafTypeName("/example-schema:leafEnumTypedefRestricted") == "enumTypedef");
1100 REQUIRE(ys.leafTypeName("/example-schema:leafInt32") == std::nullopt);
1101 }
Václav Kubernát0d4db442018-07-18 17:18:43 +02001102 }
1103
1104 SECTION("negative")
1105 {
1106 SECTION("nonexistent nodes")
1107 {
1108 SECTION("example-schema:coze")
1109 {
1110 node.first = "example-schema";
1111 node.second = "coze";
1112 }
1113
1114 SECTION("example-schema:a/nevim")
1115 {
Václav Kubernátfaacd022020-07-08 16:44:38 +02001116 path.m_nodes.emplace_back(module_{"example-schema"}, container_("a"));
Václav Kubernát0d4db442018-07-18 17:18:43 +02001117 node.second = "nevim";
1118 }
1119
1120 SECTION("modul:a/nevim")
1121 {
Václav Kubernátfaacd022020-07-08 16:44:38 +02001122 path.m_nodes.emplace_back(module_{"modul"}, container_("a"));
Václav Kubernát0d4db442018-07-18 17:18:43 +02001123 node.second = "nevim";
1124 }
1125
Václav Kubernáte811bfa2020-05-29 02:25:20 +02001126 REQUIRE_THROWS(ys.nodeType(path, node));
Václav Kubernát0d4db442018-07-18 17:18:43 +02001127 }
1128
1129 SECTION("nodetype-specific methods called with different nodetypes")
1130 {
Václav Kubernátfaacd022020-07-08 16:44:38 +02001131 path.m_nodes.emplace_back(module_{"example-schema"}, container_("a"));
1132 path.m_nodes.emplace_back(container_("a2"));
Václav Kubernát0d4db442018-07-18 17:18:43 +02001133
Václav Kubernát912b9492020-05-29 02:03:40 +02001134 REQUIRE(!ys.listHasKey(path, "chacha"));
Václav Kubernát0d4db442018-07-18 17:18:43 +02001135 }
1136
1137 SECTION("nonexistent module")
1138 {
Václav Kubernát75877de2019-11-20 17:43:02 +01001139 REQUIRE(!ys.isModule("notAModule"));
Václav Kubernát0d4db442018-07-18 17:18:43 +02001140 }
Václav Kubernáteeb38842019-03-20 19:46:05 +01001141
Václav Kubernát7d82da72019-04-11 15:16:38 +02001142 SECTION("grouping is not a node")
1143 {
1144 SECTION("example-schema:arithmeticFlags")
1145 {
1146 node.first = "example-schema";
1147 node.second = "arithmeticFlags";
1148 }
1149
1150 SECTION("example-schema:flags")
1151 {
1152 node.first = "example-schema";
1153 node.second = "startAndStop";
1154 }
1155
Václav Kubernáte811bfa2020-05-29 02:25:20 +02001156 REQUIRE_THROWS(ys.nodeType(path, node));
Václav Kubernát7d82da72019-04-11 15:16:38 +02001157 }
Václav Kubernát280df4a2019-11-01 14:46:34 +01001158
1159 SECTION("choice is not a node")
1160 {
1161 SECTION("example-schema:interface")
1162 {
1163 node.first = "example-schema";
1164 node.second = "interface";
1165 }
1166
Václav Kubernáte811bfa2020-05-29 02:25:20 +02001167 REQUIRE_THROWS(ys.nodeType(path, node));
Václav Kubernát280df4a2019-11-01 14:46:34 +01001168 }
1169
1170 SECTION("case is not a node")
1171 {
1172 SECTION("example-schema:caseLoopback")
1173 {
1174 node.first = "example-schema";
1175 node.second = "caseLoopback";
1176 }
1177
1178 SECTION("example-schema:caseEthernet")
1179 {
1180 node.first = "example-schema";
1181 node.second = "caseEthernet";
1182 }
1183
Václav Kubernáte811bfa2020-05-29 02:25:20 +02001184 REQUIRE_THROWS(ys.nodeType(path, node));
Václav Kubernát280df4a2019-11-01 14:46:34 +01001185 }
Václav Kubernátf44bdda2020-06-22 15:58:41 +02001186
1187 SECTION("enableFeature - non existing module")
1188 {
1189 REQUIRE_THROWS_AS(ys.enableFeature("non-existing", "just-no"), std::runtime_error);
1190 }
Václav Kubernát7aaf6dc2020-06-26 18:03:57 +02001191
1192 SECTION("enableFeature - non existing feature")
1193 {
1194 REQUIRE_THROWS_AS(ys.enableFeature("example-schema", "just-no"), std::runtime_error);
1195 }
Václav Kubernát0d4db442018-07-18 17:18:43 +02001196 }
1197}