blob: eebc8b54241ed47410027d5fa95368ff5461e32f [file] [log] [blame]
aPiecek20ddf8b2021-01-08 11:50:37 +01001/*
2 * @file test_printer_tree.c
3 * @author: Adam Piecek <piecek@cesnet.cz>
4 * @brief unit tests for functions from printer_tree.c
5 *
6 * Copyright (c) 2019-2021 CESNET, z.s.p.o.
7 *
8 * This source code is licensed under BSD 3-Clause License (the "License").
9 * You may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * https://opensource.org/licenses/BSD-3-Clause
13 */
14#define _UTEST_MAIN_
15#include "utests.h"
16
17#include "common.h"
18#include "context.h"
19#include "out.h"
20#include "printer_schema.h"
21#include "tree_schema.h"
22
23#define TEST_LOCAL_SETUP \
24 char *printed; \
aPiecek20ddf8b2021-01-08 11:50:37 +010025 const struct lys_module *mod; \
26 const char *orig; \
aPieceke376b922021-04-19 08:08:14 +020027 const char *expect; \
28 assert_int_equal(LY_SUCCESS, ly_out_new_memory(&printed, 0, &UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +010029
aPieceke376b922021-04-19 08:08:14 +020030#define TEST_LOCAL_PRINT(MOD, LINE_LENGTH) \
31 assert_int_equal(LY_SUCCESS, lys_print_module(UTEST_OUT, MOD, LYS_OUT_TREE, LINE_LENGTH, 0));
aPiecek20ddf8b2021-01-08 11:50:37 +010032
33#define TEST_LOCAL_TEARDOWN \
aPieceke376b922021-04-19 08:08:14 +020034 ly_out_free(UTEST_OUT, NULL, 1);
aPiecek20ddf8b2021-01-08 11:50:37 +010035
36static void
37base_sections(void **state)
38{
39 TEST_LOCAL_SETUP;
aPiecekdc8fd572021-04-19 10:47:23 +020040
41 orig =
42 "module a01xx {\n"
43 " yang-version 1.1;\n"
44 " namespace \"xx:y\";\n"
45 " prefix xx;\n"
46 " container c;\n"
47 " container d;\n"
48 "}\n";
49
50 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
51
52 /* module with import statement */
aPiecek20ddf8b2021-01-08 11:50:37 +010053 orig =
54 "module a01 {\n"
55 " yang-version 1.1;\n"
56 " namespace \"x:y\";\n"
57 " prefix x;\n"
58 "\n"
aPiecekdc8fd572021-04-19 10:47:23 +020059 " import a01xx {\n"
60 " prefix xx;\n"
61 " }\n"
62 "\n"
aPiecek20ddf8b2021-01-08 11:50:37 +010063 " grouping g1;\n"
64 "\n"
65 " grouping g2;\n"
aPiecekdc8fd572021-04-19 10:47:23 +020066 " container g;\n"
67 " augment \"/xx:c\" {\n"
68 " container e;\n"
aPiecek20ddf8b2021-01-08 11:50:37 +010069 " }\n"
aPiecekdc8fd572021-04-19 10:47:23 +020070 " augment \"/xx:d\" {\n"
71 " container f;\n"
aPiecek20ddf8b2021-01-08 11:50:37 +010072 " }\n"
73 " rpc rpc1;\n"
74 " rpc rpc2;\n"
75 " notification n1;\n"
76 " notification n2;\n"
77 "}\n";
78
aPiecekdc8fd572021-04-19 10:47:23 +020079 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
80
81 /* from pyang */
aPiecek20ddf8b2021-01-08 11:50:37 +010082 expect =
83 "module: a01\n"
aPiecekdc8fd572021-04-19 10:47:23 +020084 " +--rw g\n"
85 "\n"
86 " augment /xx:c:\n"
87 " +--rw e\n"
88 " augment /xx:d:\n"
89 " +--rw f\n"
aPiecek20ddf8b2021-01-08 11:50:37 +010090 "\n"
91 " rpcs:\n"
92 " +---x rpc1\n"
93 " +---x rpc2\n"
94 "\n"
95 " notifications:\n"
96 " +---n n1\n"
aPiecekdc8fd572021-04-19 10:47:23 +020097 " +---n n2\n"
98 "\n"
99 " grouping g1\n"
100 " grouping g2\n";
aPiecek20ddf8b2021-01-08 11:50:37 +0100101
aPieceke376b922021-04-19 08:08:14 +0200102 TEST_LOCAL_PRINT(mod, 72);
103 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +0100104 assert_string_equal(printed, expect);
aPiecek9e505922021-04-19 13:45:08 +0200105
106 ly_out_reset(UTEST_OUT);
107
108 /* from pyang */
109 expect =
110 "module: a01\n"
111 " +--rw g\n"
112 "\n"
113 " augment /xx:c:\n"
114 " +--rw e\n"
115 " augment /xx:d:\n"
116 " +--rw f\n"
117 "\n"
118 " rpcs:\n"
119 " +---x rpc1\n"
120 " +---x rpc2\n"
121 "\n"
122 " notifications:\n"
123 " +---n n1\n"
124 " +---n n2\n";
125
126 /* using lysc tree */
127 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
128 TEST_LOCAL_PRINT(mod, 72);
129 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
130 assert_string_equal(printed, expect);
131 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
132
aPiecek20ddf8b2021-01-08 11:50:37 +0100133 TEST_LOCAL_TEARDOWN;
134}
135
136static void
137node_status(void **state)
138{
139 TEST_LOCAL_SETUP;
140 orig =
141 "module a02 {\n"
142 " yang-version 1.1;\n"
143 " namespace \"x:y\";\n"
144 " prefix x;\n"
145 " container l {\n"
146 " status current;\n"
147 " }\n"
148 " container m {\n"
149 " status deprecated;\n"
150 " }\n"
151 " container n {\n"
152 " status obsolete;\n"
153 " }\n"
154 "}\n";
155
156 /* from pyang */
157 expect =
158 "module: a02\n"
159 " +--rw l\n"
160 " x--rw m\n"
161 " o--rw n\n";
162
aPieceke376b922021-04-19 08:08:14 +0200163 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
164 TEST_LOCAL_PRINT(mod, 72);
165 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +0100166 assert_string_equal(printed, expect);
aPiecek9e505922021-04-19 13:45:08 +0200167
168 ly_out_reset(UTEST_OUT);
169 /* using lysc tree */
170 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
171 TEST_LOCAL_PRINT(mod, 72);
172 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
173 assert_string_equal(printed, expect);
174 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
175
aPiecek20ddf8b2021-01-08 11:50:37 +0100176 TEST_LOCAL_TEARDOWN;
177}
178
179static void
180node_config_flags(void **state)
181{
182 TEST_LOCAL_SETUP;
183 orig =
184 "module a03 {\n"
185 " yang-version 1.1;\n"
186 " namespace \"x:y\";\n"
187 " prefix x;\n"
188 " container l {\n"
189 " config true;\n"
190 " }\n"
191 " container m {\n"
192 " config false;\n"
193 " }\n"
194 "}\n";
195
196 /* from pyang */
197 expect =
198 "module: a03\n"
199 " +--rw l\n"
200 " +--ro m\n";
201
aPieceke376b922021-04-19 08:08:14 +0200202 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
203 TEST_LOCAL_PRINT(mod, 72);
204 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +0100205 assert_string_equal(printed, expect);
aPiecek9e505922021-04-19 13:45:08 +0200206
207 ly_out_reset(UTEST_OUT);
208 /* using lysc tree */
209 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
210 TEST_LOCAL_PRINT(mod, 72);
211 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
212 assert_string_equal(printed, expect);
213 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
214
aPiecek20ddf8b2021-01-08 11:50:37 +0100215 TEST_LOCAL_TEARDOWN;
216}
217
218static void
219node_rpcs_flags(void **state)
220{
221 TEST_LOCAL_SETUP;
222 orig =
223 "module a04 {\n"
224 " yang-version 1.1;\n"
225 " namespace \"x:y\";\n"
226 " prefix x;\n"
227 " container cont {\n"
228 " action rpc1 {\n"
229 "\n"
230 " input {\n"
231 " leaf in {\n"
232 " type string;\n"
233 " }\n"
234 " }\n"
aPiecek9e505922021-04-19 13:45:08 +0200235 "\n"
236 " output {\n"
237 " leaf out {\n"
238 " type string;\n"
239 " }\n"
240 " }\n"
aPiecek20ddf8b2021-01-08 11:50:37 +0100241 " }\n"
242 " }\n"
243 "}\n";
244
245 /* from pyang */
246 expect =
247 "module: a04\n"
248 " +--rw cont\n"
249 " +---x rpc1\n"
250 " +---w input\n"
aPiecek9e505922021-04-19 13:45:08 +0200251 " | +---w in? string\n"
252 " +--ro output\n"
253 " +--ro out? string\n";
aPiecek20ddf8b2021-01-08 11:50:37 +0100254
aPieceke376b922021-04-19 08:08:14 +0200255 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
256 TEST_LOCAL_PRINT(mod, 72);
257 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +0100258 assert_string_equal(printed, expect);
aPiecek9e505922021-04-19 13:45:08 +0200259
260 ly_out_reset(UTEST_OUT);
261 /* using lysc tree */
262 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
263 TEST_LOCAL_PRINT(mod, 72);
264 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
265 assert_string_equal(printed, expect);
266 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
267
aPiecek20ddf8b2021-01-08 11:50:37 +0100268 TEST_LOCAL_TEARDOWN;
269}
270
271static void
272node_grouping_flags(void **state)
273{
274 TEST_LOCAL_SETUP;
275 orig =
276 "module a05 {\n"
277 " yang-version 1.1;\n"
278 " namespace \"x:y\";\n"
279 " prefix x;\n"
280 "\n"
281 " grouping g {\n"
aPiecekdc8fd572021-04-19 10:47:23 +0200282 " leaf a {\n"
283 " type string;\n"
284 " config true;\n"
285 " }\n"
286 " leaf b {\n"
287 " type string;\n"
288 " config false;\n"
289 " }\n"
290 " leaf c {\n"
291 " type string;\n"
292 " }\n"
293 " container d {\n"
294 " config false;\n"
295 " leaf e {\n"
296 " type string;\n"
297 " }\n"
298 " }\n"
299 " container f {\n"
300 " leaf g {\n"
301 " type string;\n"
302 " }\n"
303 " }\n"
aPiecek20ddf8b2021-01-08 11:50:37 +0100304 " }\n"
305 " container d {\n"
306 " uses g;\n"
307 " }\n"
308 "}\n";
309
aPiecekdc8fd572021-04-19 10:47:23 +0200310 /* from yanglint1 */
aPiecek20ddf8b2021-01-08 11:50:37 +0100311 expect =
312 "module: a05\n"
313 " +--rw d\n"
314 " +---u g\n"
315 "\n"
316 " grouping g:\n"
aPiecekdc8fd572021-04-19 10:47:23 +0200317 " +--rw a? string\n"
318 " +--ro b? string\n"
319 " +---- c? string\n"
320 " +--ro d\n"
321 " | +--ro e? string\n"
322 " +---- f\n"
323 " +---- g? string\n";
324
aPieceke376b922021-04-19 08:08:14 +0200325 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
326 TEST_LOCAL_PRINT(mod, 72);
327 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +0100328 assert_string_equal(printed, expect);
aPiecek9e505922021-04-19 13:45:08 +0200329
330 /* from pyang */
331 expect =
332 "module: a05\n"
333 " +--rw d\n"
334 " +--rw a? string\n"
335 " +--ro b? string\n"
336 " +--rw c? string\n"
337 " +--ro d\n"
338 " | +--ro e? string\n"
339 " +--rw f\n"
340 " +--rw g? string\n";
341
342 ly_out_reset(UTEST_OUT);
343 /* using lysc tree */
344 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
345 TEST_LOCAL_PRINT(mod, 72);
346 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
347 assert_string_equal(printed, expect);
348 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
349
aPiecek20ddf8b2021-01-08 11:50:37 +0100350 TEST_LOCAL_TEARDOWN;
351}
352
353static void
354notif_inside_container(void **state)
355{
356 TEST_LOCAL_SETUP;
357 orig =
358 "module a06 {\n"
359 " yang-version 1.1;\n"
360 " namespace \"x:y\";\n"
361 " prefix x;\n"
362 " container c {\n"
363 " notification notif;\n"
364 " }\n"
365 "}\n";
366
367 /* from pyang */
368 expect =
369 "module: a06\n"
370 " +--rw c\n"
371 " +---n notif\n";
372
aPieceke376b922021-04-19 08:08:14 +0200373 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
374 TEST_LOCAL_PRINT(mod, 72);
375 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +0100376 assert_string_equal(printed, expect);
aPiecek9e505922021-04-19 13:45:08 +0200377
378 ly_out_reset(UTEST_OUT);
379 /* using lysc tree */
380 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
381 TEST_LOCAL_PRINT(mod, 72);
382 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
383 assert_string_equal(printed, expect);
384 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
385
aPiecek20ddf8b2021-01-08 11:50:37 +0100386 TEST_LOCAL_TEARDOWN;
387}
388
389static void
390node_choice(void **state)
391{
392 TEST_LOCAL_SETUP;
393 orig =
394 "module a07 {\n"
395 " yang-version 1.1;\n"
396 " namespace \"x:y\";\n"
397 " prefix x;\n"
398 " choice my_choice;\n"
399 "}\n";
400
401 /* from pyang */
402 expect =
403 "module: a07\n"
404 " +--rw (my_choice)?\n";
405
aPieceke376b922021-04-19 08:08:14 +0200406 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
407 TEST_LOCAL_PRINT(mod, 72);
408 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +0100409 assert_string_equal(printed, expect);
aPiecek9e505922021-04-19 13:45:08 +0200410
411 ly_out_reset(UTEST_OUT);
412 /* using lysc tree */
413 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
414 TEST_LOCAL_PRINT(mod, 72);
415 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
416 assert_string_equal(printed, expect);
417 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
418
aPiecek20ddf8b2021-01-08 11:50:37 +0100419 TEST_LOCAL_TEARDOWN;
420}
421
422static void
423node_case(void **state)
424{
425 TEST_LOCAL_SETUP;
426 orig =
427 "module a08 {\n"
428 " yang-version 1.1;\n"
429 " namespace \"x:y\";\n"
430 " prefix x;\n"
aPiecek7a28e2f2021-05-21 07:27:03 +0200431 "\n"
432 " feature foo;\n"
aPiecek20ddf8b2021-01-08 11:50:37 +0100433 " choice my_choice {\n"
434 " case my_case;\n"
435 " }\n"
aPiecek082c7dc2021-05-20 08:55:07 +0200436 " choice shorthand {\n"
aPiecek7a28e2f2021-05-21 07:27:03 +0200437 " container cont1 {\n"
438 " if-feature \"foo\";\n"
439 " }\n"
aPiecek082c7dc2021-05-20 08:55:07 +0200440 " container cont2 {\n"
441 " container cont3;\n"
442 " }\n"
443 " }\n"
444 " container top {\n"
445 " choice shorthand1 {\n"
446 " container cont1;\n"
447 " }\n"
448 " choice shorthand2 {\n"
449 " container cont2 {\n"
450 " container cont3;\n"
451 " }\n"
452 " }\n"
453 " }\n"
aPiecek20ddf8b2021-01-08 11:50:37 +0100454 "}\n";
455
456 /* from pyang */
457 expect =
458 "module: a08\n"
459 " +--rw (my_choice)?\n"
aPiecek082c7dc2021-05-20 08:55:07 +0200460 " | +--:(my_case)\n"
461 " +--rw (shorthand)?\n"
462 " | +--:(cont1)\n"
aPiecek7a28e2f2021-05-21 07:27:03 +0200463 " | | +--rw cont1 {foo}?\n"
aPiecek082c7dc2021-05-20 08:55:07 +0200464 " | +--:(cont2)\n"
465 " | +--rw cont2\n"
466 " | +--rw cont3\n"
467 " +--rw top\n"
468 " +--rw (shorthand1)?\n"
469 " | +--:(cont1)\n"
470 " | +--rw cont1\n"
471 " +--rw (shorthand2)?\n"
472 " +--:(cont2)\n"
473 " +--rw cont2\n"
474 " +--rw cont3\n";
aPiecek20ddf8b2021-01-08 11:50:37 +0100475
aPiecek7a28e2f2021-05-21 07:27:03 +0200476 const char *feats[] = {"foo", NULL};
477
478 UTEST_ADD_MODULE(orig, LYS_IN_YANG, feats, &mod);
aPieceke376b922021-04-19 08:08:14 +0200479 TEST_LOCAL_PRINT(mod, 72);
480 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +0100481 assert_string_equal(printed, expect);
aPiecek9e505922021-04-19 13:45:08 +0200482
483 ly_out_reset(UTEST_OUT);
484 /* using lysc tree */
485 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
486 TEST_LOCAL_PRINT(mod, 72);
487 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
488 assert_string_equal(printed, expect);
489 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
490
aPiecek20ddf8b2021-01-08 11:50:37 +0100491 TEST_LOCAL_TEARDOWN;
492}
493
494static void
495optional_opts(void **state)
496{
497 TEST_LOCAL_SETUP;
498 /* throws libyang warn: Use of anydata to define configuration data is not recommended... */
499 orig =
500 "module a09 {\n"
501 " yang-version 1.1;\n"
502 " namespace \"x:y\";\n"
503 " prefix x;\n"
504 " leaf l1 {\n"
505 " type string;\n"
506 " mandatory true;\n"
507 " }\n"
508 " leaf l2 {\n"
509 " type string;\n"
510 " mandatory false;\n"
511 " }\n"
512 " choice c1 {\n"
513 " mandatory true;\n"
514 " }\n"
515 " choice c2 {\n"
516 " mandatory false;\n"
517 " }\n"
518 " anydata a1 {\n"
519 " mandatory true;\n"
520 " }\n"
521 " anydata a2 {\n"
522 " mandatory false;\n"
523 " }\n"
524 " anyxml x1 {\n"
525 " mandatory true;\n"
526 " }\n"
527 " anyxml x2 {\n"
528 " mandatory false;\n"
529 " }\n"
530 "}\n";
531
532 /* from yanglint 1 */
533 expect =
534 "module: a09\n"
535 " +--rw l1 string\n"
536 " +--rw l2? string\n"
537 " +--rw (c1)\n"
538 " +--rw (c2)?\n"
539 " +--rw a1 anydata\n"
540 " +--rw a2? anydata\n"
541 " +--rw x1 anyxml\n"
542 " +--rw x2? anyxml\n";
543
aPieceke376b922021-04-19 08:08:14 +0200544 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
545 TEST_LOCAL_PRINT(mod, 72);
546 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +0100547 assert_string_equal(printed, expect);
aPiecek9e505922021-04-19 13:45:08 +0200548
549 ly_out_reset(UTEST_OUT);
550 /* using lysc tree */
551 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
552 TEST_LOCAL_PRINT(mod, 72);
553 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
554 assert_string_equal(printed, expect);
555 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
556
aPiecek20ddf8b2021-01-08 11:50:37 +0100557 TEST_LOCAL_TEARDOWN;
558}
559
560static void
561presence_container(void **state)
562{
563 TEST_LOCAL_SETUP;
564 orig =
565 "module a10 {\n"
566 " yang-version 1.1;\n"
567 " namespace \"x:y\";\n"
568 " prefix x;\n"
569 " container c;\n"
570 " container d {\n"
571 " presence \"str1\";\n"
572 " }\n"
573 "}\n";
574
575 /* from pyang */
576 expect =
577 "module: a10\n"
578 " +--rw c\n"
579 " +--rw d!\n";
580
aPieceke376b922021-04-19 08:08:14 +0200581 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
582 TEST_LOCAL_PRINT(mod, 72);
583 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +0100584 assert_string_equal(printed, expect);
aPiecek9e505922021-04-19 13:45:08 +0200585
586 ly_out_reset(UTEST_OUT);
587 /* using lysc tree */
588 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
589 TEST_LOCAL_PRINT(mod, 72);
590 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
591 assert_string_equal(printed, expect);
592 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
593
aPiecek20ddf8b2021-01-08 11:50:37 +0100594 TEST_LOCAL_TEARDOWN;
595}
596
597static void
598node_keys(void **state)
599{
600 TEST_LOCAL_SETUP;
601 orig =
602 "module a11 {\n"
603 " yang-version 1.1;\n"
604 " namespace \"x:y\";\n"
605 " prefix x;\n"
606 " list l1 {\n"
607 " key \"a\";\n"
608 " leaf a {\n"
609 " type string;\n"
610 " }\n"
611 " }\n"
612 " list l2 {\n"
613 " key \"a b\";\n"
614 " leaf a {\n"
615 " type string;\n"
616 " }\n"
617 " leaf b {\n"
618 " type string;\n"
619 " }\n"
620 " }\n"
621 " leaf-list ll {\n"
622 " type string;\n"
623 " }\n"
624 "}\n";
625
626 /* from pyang */
627 expect =
628 "module: a11\n"
629 " +--rw l1* [a]\n"
630 " | +--rw a string\n"
631 " +--rw l2* [a b]\n"
632 " | +--rw a string\n"
633 " | +--rw b string\n"
634 " +--rw ll* string\n";
635
aPieceke376b922021-04-19 08:08:14 +0200636 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
637 TEST_LOCAL_PRINT(mod, 72);
638 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +0100639 assert_string_equal(printed, expect);
aPiecek9e505922021-04-19 13:45:08 +0200640
641 ly_out_reset(UTEST_OUT);
642 /* using lysc tree */
643 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
644 TEST_LOCAL_PRINT(mod, 72);
645 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
646 assert_string_equal(printed, expect);
647 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
648
aPiecek20ddf8b2021-01-08 11:50:37 +0100649 TEST_LOCAL_TEARDOWN;
650}
651
652static void
653node_type_target(void **state)
654{
655 TEST_LOCAL_SETUP;
656 orig =
657 "module a12 {\n"
658 " yang-version 1.1;\n"
659 " namespace \"x:y\";\n"
660 " prefix x;\n"
661 " leaf a {\n"
662 " type leafref {\n"
663 " path \"/x:b\";\n"
664 " }\n"
665 " }\n"
666 " leaf b {\n"
667 " type string;\n"
668 " }\n"
669 "}\n";
670
671 /* from yanglint 1 */
672 expect =
673 "module: a12\n"
674 " +--rw a? -> /x:b\n"
675 " +--rw b? string\n";
676
aPieceke376b922021-04-19 08:08:14 +0200677 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
678 TEST_LOCAL_PRINT(mod, 72);
679 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +0100680 assert_string_equal(printed, expect);
aPiecek9e505922021-04-19 13:45:08 +0200681
682 ly_out_reset(UTEST_OUT);
683 /* using lysc tree */
684 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
685 TEST_LOCAL_PRINT(mod, 72);
686 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
687 assert_string_equal(printed, expect);
688 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
689
aPiecek20ddf8b2021-01-08 11:50:37 +0100690 TEST_LOCAL_TEARDOWN;
691}
692
693static void
694node_type_leafref(void **state)
695{
696 TEST_LOCAL_SETUP;
697 orig =
698 "module a13 {\n"
699 " yang-version 1.1;\n"
700 " namespace \"x:y\";\n"
701 " prefix x;\n"
702 " leaf pretty-long-identifier-name-which-should-exceed-the-limit-of-72-characters {\n"
703 " type string;\n"
704 " }\n"
705 " leaf a {\n"
706 " type leafref {\n"
707 " path \"/x:pretty-long-identifier-name-which-should-exceed-the-limit-of-72-characters\";\n"
708 " }\n"
709 " }\n"
710 "}\n";
711
712 /* yanglint --tree-no-leafref-target --tree-line-length=72 */
713 expect =
714 "module: a13\n"
715 " +--rw pretty-long-identifier-name-which-should-exceed-the-limit-of-72-characters?\n"
716 " | string\n"
717 " +--rw a?\n"
718 " leafref\n";
719
aPieceke376b922021-04-19 08:08:14 +0200720 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
721 TEST_LOCAL_PRINT(mod, 72);
722 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +0100723 assert_string_equal(printed, expect);
aPiecek9e505922021-04-19 13:45:08 +0200724
725 ly_out_reset(UTEST_OUT);
726 /* using lysc tree */
727 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
728 TEST_LOCAL_PRINT(mod, 72);
729 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
730 assert_string_equal(printed, expect);
731 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
732
aPiecek20ddf8b2021-01-08 11:50:37 +0100733 TEST_LOCAL_TEARDOWN;
734}
735
736static void
737node_iffeatures(void **state)
738{
739 TEST_LOCAL_SETUP;
740 orig =
741 "module a14 {\n"
742 " yang-version 1.1;\n"
743 " namespace \"x:y\";\n"
744 " prefix x;\n"
745 "\n"
746 " feature foo;\n"
747 "\n"
748 " feature bar;\n"
749 " container c {\n"
750 " if-feature \"foo or bar\";\n"
751 " }\n"
752 "}\n";
753
754 /* from pyang */
755 expect =
756 "module: a14\n"
757 " +--rw c {foo or bar}?\n";
758
aPieceke376b922021-04-19 08:08:14 +0200759 const char *feats[] = {"foo", NULL};
760
761 UTEST_ADD_MODULE(orig, LYS_IN_YANG, feats, &mod);
762 TEST_LOCAL_PRINT(mod, 72);
763 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +0100764 assert_string_equal(printed, expect);
aPiecek9e505922021-04-19 13:45:08 +0200765
766 ly_out_reset(UTEST_OUT);
767 /* using lysc tree */
768 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
769 TEST_LOCAL_PRINT(mod, 72);
770 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
771 assert_string_equal(printed, expect);
772 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
773
aPiecek20ddf8b2021-01-08 11:50:37 +0100774 TEST_LOCAL_TEARDOWN;
775}
776
777static void
778indent_wrapper(void **state)
779{
780 TEST_LOCAL_SETUP;
781 orig =
782 "module a15 {\n"
783 " yang-version 1.1;\n"
784 " namespace \"x:y\";\n"
785 " prefix x;\n"
786 " container a {\n"
787 " container b;\n"
788 " }\n"
789 " container c {\n"
790 " container d {\n"
791 " container e;\n"
792 " }\n"
793 " container f {\n"
794 " container g;\n"
795 " }\n"
796 " }\n"
797 " container h;\n"
798 " container i {\n"
799 " container j;\n"
800 " container k;\n"
801 " }\n"
802 "}\n";
803
804 /* from pyang */
805 expect =
806 "module: a15\n"
807 " +--rw a\n"
808 " | +--rw b\n"
809 " +--rw c\n"
810 " | +--rw d\n"
811 " | | +--rw e\n"
812 " | +--rw f\n"
813 " | +--rw g\n"
814 " +--rw h\n"
815 " +--rw i\n"
816 " +--rw j\n"
817 " +--rw k\n";
818
aPieceke376b922021-04-19 08:08:14 +0200819 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
820 TEST_LOCAL_PRINT(mod, 72);
821 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +0100822 assert_string_equal(printed, expect);
aPiecek9e505922021-04-19 13:45:08 +0200823
824 ly_out_reset(UTEST_OUT);
825 /* using lysc tree */
826 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
827 TEST_LOCAL_PRINT(mod, 72);
828 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
829 assert_string_equal(printed, expect);
830 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
831
aPiecek20ddf8b2021-01-08 11:50:37 +0100832 TEST_LOCAL_TEARDOWN;
833}
834
835static void
836line_length_twiddling(void **state)
837{
838 TEST_LOCAL_SETUP;
839 /* node_fits_tight */
840
841 orig =
842 "module a16 {\n"
843 " yang-version 1.1;\n"
844 " namespace \"x:y\";\n"
845 " prefix x;\n"
846 "\n"
847 " feature f;\n"
848 "\n"
849 " typedef some-long-type {\n"
850 " type string;\n"
851 " }\n"
852 " list my-list-name {\n"
853 " key \"key\";\n"
854 " leaf key {\n"
855 " type string;\n"
856 " }\n"
857 " leaf nod-leaf {\n"
858 " if-feature \"f\";\n"
859 " type some-long-type;\n"
860 " }\n"
861 " leaf nos-leaf {\n"
862 " if-feature \"f\";\n"
863 " type int32;\n"
864 " }\n"
865 " }\n"
866 "}\n";
867
868 /* pyang --tree-line-length 42 */
869 expect =
870 "module: a16\n"
871 " +--rw my-list-name* [key]\n"
872 " +--rw key string\n"
873 " +--rw nod-leaf? some-long-type {f}?\n"
874 " +--rw nos-leaf? int32 {f}?\n";
875
aPieceke376b922021-04-19 08:08:14 +0200876 const char *feats[] = {"f", NULL};
877
878 UTEST_ADD_MODULE(orig, LYS_IN_YANG, feats, &mod);
879 TEST_LOCAL_PRINT(mod, 42);
880 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +0100881 assert_string_equal(printed, expect);
882
aPieceke376b922021-04-19 08:08:14 +0200883 ly_out_reset(UTEST_OUT);
aPiecek9e505922021-04-19 13:45:08 +0200884 /* using lysc tree */
885 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
886 TEST_LOCAL_PRINT(mod, 42);
887 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
888 assert_string_equal(printed, expect);
889 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
890
891 ly_out_reset(UTEST_OUT);
aPiecek20ddf8b2021-01-08 11:50:37 +0100892 /* break_before_iffeature */
893
894 /* pyang --tree-line-length 41 */
895 expect =
896 "module: a16\n"
897 " +--rw my-list-name* [key]\n"
898 " +--rw key string\n"
899 " +--rw nod-leaf? some-long-type\n"
900 " | {f}?\n"
901 " +--rw nos-leaf? int32 {f}?\n";
902
aPieceke376b922021-04-19 08:08:14 +0200903 UTEST_ADD_MODULE(orig, LYS_IN_YANG, feats, &mod);
904 TEST_LOCAL_PRINT(mod, 41);
905 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +0100906 assert_string_equal(printed, expect);
907
aPieceke376b922021-04-19 08:08:14 +0200908 ly_out_reset(UTEST_OUT);
aPiecek9e505922021-04-19 13:45:08 +0200909 /* using lysc tree */
910 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
911 TEST_LOCAL_PRINT(mod, 41);
912 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
913 assert_string_equal(printed, expect);
914 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
915
916 ly_out_reset(UTEST_OUT);
aPiecek20ddf8b2021-01-08 11:50:37 +0100917 /* break_before_type */
918
919 /* pyang --tree-line-length 29 */
920 expect =
921 "module: a16\n"
922 " +--rw my-list-name* [key]\n"
923 " +--rw key string\n"
924 " +--rw nod-leaf?\n"
925 " | some-long-type\n"
926 " | {f}?\n"
927 " +--rw nos-leaf? int32\n"
928 " {f}?\n";
929
aPieceke376b922021-04-19 08:08:14 +0200930 UTEST_ADD_MODULE(orig, LYS_IN_YANG, feats, &mod);
931 TEST_LOCAL_PRINT(mod, 29);
932 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +0100933 assert_string_equal(printed, expect);
934
aPieceke376b922021-04-19 08:08:14 +0200935 ly_out_reset(UTEST_OUT);
aPiecek9e505922021-04-19 13:45:08 +0200936 /* using lysc tree */
937 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
938 TEST_LOCAL_PRINT(mod, 29);
939 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
940 assert_string_equal(printed, expect);
941 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
942
943 ly_out_reset(UTEST_OUT);
aPiecek20ddf8b2021-01-08 11:50:37 +0100944 /* break_before_keys */
945
946 /* pyang --tree-line-length 23 */
947 expect =
948 "module: a16\n"
949 " +--rw my-list-name*\n"
950 " [key]\n"
951 " +--rw key\n"
952 " | string\n"
953 " +--rw nod-leaf?\n"
954 " | some-long-type\n"
955 " | {f}?\n"
956 " +--rw nos-leaf?\n"
957 " int32 {f}?\n";
958
aPieceke376b922021-04-19 08:08:14 +0200959 UTEST_ADD_MODULE(orig, LYS_IN_YANG, feats, &mod);
960 TEST_LOCAL_PRINT(mod, 23);
961 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +0100962 assert_string_equal(printed, expect);
963
aPieceke376b922021-04-19 08:08:14 +0200964 ly_out_reset(UTEST_OUT);
aPiecek9e505922021-04-19 13:45:08 +0200965 /* using lysc tree */
966 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
967 TEST_LOCAL_PRINT(mod, 23);
968 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
969 assert_string_equal(printed, expect);
970 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
971
972 ly_out_reset(UTEST_OUT);
aPiecek20ddf8b2021-01-08 11:50:37 +0100973 /* every_node_name_is_too_long */
974
975 /* pyang --tree-line-length 14 */
976 expect =
977 "module: a16\n"
978 " +--rw my-list-name*\n"
979 " [key]\n"
980 " +--rw key\n"
981 " | string\n"
982 " +--rw nod-leaf?\n"
983 " | some-long-type\n"
984 " | {f}?\n"
985 " +--rw nos-leaf?\n"
986 " int32\n"
987 " {f}?\n";
988
aPieceke376b922021-04-19 08:08:14 +0200989 UTEST_ADD_MODULE(orig, LYS_IN_YANG, feats, &mod);
990 TEST_LOCAL_PRINT(mod, 14);
991 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +0100992 assert_string_equal(printed, expect);
993
aPiecek9e505922021-04-19 13:45:08 +0200994 ly_out_reset(UTEST_OUT);
995 /* using lysc tree */
996 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
997 TEST_LOCAL_PRINT(mod, 14);
998 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
999 assert_string_equal(printed, expect);
1000 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1001
aPiecek20ddf8b2021-01-08 11:50:37 +01001002 TEST_LOCAL_TEARDOWN;
1003}
1004
1005static void
1006break_before_leafref(void **state)
1007{
1008 TEST_LOCAL_SETUP;
1009 orig =
1010 "module a17 {\n"
1011 " yang-version 1.1;\n"
1012 " namespace \"x:y\";\n"
1013 " prefix x;\n"
1014 " leaf e {\n"
1015 " type string;\n"
1016 " }\n"
1017 " leaf abcd {\n"
1018 " type leafref {\n"
1019 " path \"/x:e\";\n"
1020 " }\n"
1021 " }\n"
1022 "}\n";
1023
1024 /* yanglint --tree-line-length 14 */
1025 expect =
1026 "module: a17\n"
1027 " +--rw e?\n"
1028 " | string\n"
1029 " +--rw abcd?\n"
1030 " -> /x:e\n";
1031
aPieceke376b922021-04-19 08:08:14 +02001032 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
1033 TEST_LOCAL_PRINT(mod, 14);
1034 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +01001035 assert_string_equal(printed, expect);
aPiecek9e505922021-04-19 13:45:08 +02001036
1037 ly_out_reset(UTEST_OUT);
1038 /* using lysc tree */
1039 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1040 TEST_LOCAL_PRINT(mod, 14);
1041 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
1042 assert_string_equal(printed, expect);
1043 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1044
aPiecek20ddf8b2021-01-08 11:50:37 +01001045 TEST_LOCAL_TEARDOWN;
1046}
1047
1048static void
1049break_before_leafref_and_iffeature(void **state)
1050{
1051 TEST_LOCAL_SETUP;
1052 orig =
1053 "module a18 {\n"
1054 " yang-version 1.1;\n"
1055 " namespace \"x:y\";\n"
1056 " prefix x;\n"
1057 "\n"
1058 " feature f;\n"
1059 " leaf some-long-id {\n"
1060 " type string;\n"
1061 " }\n"
1062 " leaf a {\n"
1063 " if-feature \"f\";\n"
1064 " type leafref {\n"
1065 " path \"/x:some-long-id\";\n"
1066 " }\n"
1067 " }\n"
1068 "}\n";
1069
1070 /* yanglint --tree-no-leafref-target --tree-line-length=20 */
1071 expect =
1072 "module: a18\n"
1073 " +--rw some-long-id?\n"
1074 " | string\n"
1075 " +--rw a?\n"
1076 " leafref\n"
1077 " {f}?\n";
1078
aPieceke376b922021-04-19 08:08:14 +02001079 const char *feats[] = {"f", NULL};
1080
1081 UTEST_ADD_MODULE(orig, LYS_IN_YANG, feats, &mod);
1082 TEST_LOCAL_PRINT(mod, 20);
1083 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +01001084 assert_string_equal(printed, expect);
aPiecek9e505922021-04-19 13:45:08 +02001085
1086 ly_out_reset(UTEST_OUT);
1087 /* using lysc tree */
1088 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1089 TEST_LOCAL_PRINT(mod, 20);
1090 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
1091 assert_string_equal(printed, expect);
1092 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1093
aPiecek20ddf8b2021-01-08 11:50:37 +01001094 TEST_LOCAL_TEARDOWN;
1095}
1096
1097static void
1098basic_unified_indent_before_type(void **state)
1099{
1100 TEST_LOCAL_SETUP;
1101 orig =
1102 "module a19 {\n"
1103 " yang-version 1.1;\n"
1104 " namespace \"x:y\";\n"
1105 " prefix x;\n"
1106 "\n"
1107 " typedef longType {\n"
1108 " type string;\n"
1109 " }\n"
1110 " container A {\n"
1111 " leaf Bnode {\n"
1112 " type int8;\n"
1113 " }\n"
1114 " leaf Cnode {\n"
1115 " type int8;\n"
1116 " mandatory true;\n"
1117 " }\n"
1118 " leaf Dnode {\n"
1119 " type int8;\n"
1120 " mandatory true;\n"
1121 " }\n"
1122 " leaf E {\n"
1123 " type longType;\n"
1124 " mandatory true;\n"
1125 " }\n"
1126 " leaf G {\n"
1127 " type int8;\n"
1128 " }\n"
1129 " }\n"
1130 "}\n";
1131
1132 /* from pyang */
1133 expect =
1134 "module: a19\n"
1135 " +--rw A\n"
1136 " +--rw Bnode? int8\n"
1137 " +--rw Cnode int8\n"
1138 " +--rw Dnode int8\n"
1139 " +--rw E longType\n"
1140 " +--rw G? int8\n";
1141
aPieceke376b922021-04-19 08:08:14 +02001142 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
1143 TEST_LOCAL_PRINT(mod, 72);
1144 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +01001145 assert_string_equal(printed, expect);
aPiecek9e505922021-04-19 13:45:08 +02001146
1147 ly_out_reset(UTEST_OUT);
1148 /* using lysc tree */
1149 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1150 TEST_LOCAL_PRINT(mod, 72);
1151 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
1152 assert_string_equal(printed, expect);
1153 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1154
aPiecek20ddf8b2021-01-08 11:50:37 +01001155 TEST_LOCAL_TEARDOWN;
1156}
1157
1158static void
1159twiddling_unified_indent_before_type(void **state)
1160{
1161 TEST_LOCAL_SETUP;
1162 /* basic_functionality */
1163
1164 orig =
1165 "module a20 {\n"
1166 " yang-version 1.1;\n"
1167 " namespace \"x:y\";\n"
1168 " prefix x;\n"
1169 "\n"
1170 " typedef longType {\n"
1171 " type string;\n"
1172 " }\n"
1173 " container A {\n"
1174 " leaf Bnode {\n"
1175 " type int8;\n"
1176 " }\n"
1177 " leaf CnodeIsBigger {\n"
1178 " type int8;\n"
1179 " mandatory true;\n"
1180 " }\n"
1181 " leaf Dnode {\n"
1182 " type int8;\n"
1183 " mandatory true;\n"
1184 " }\n"
1185 " leaf E {\n"
1186 " type longType;\n"
1187 " mandatory true;\n"
1188 " }\n"
1189 " leaf G {\n"
1190 " type int8;\n"
1191 " }\n"
1192 " }\n"
1193 "}\n";
1194
1195 /* pyang --tree-line-length 36 */
1196 expect =
1197 "module: a20\n"
1198 " +--rw A\n"
1199 " +--rw Bnode? int8\n"
1200 " +--rw CnodeIsBigger int8\n"
1201 " +--rw Dnode int8\n"
1202 " +--rw E longType\n"
1203 " +--rw G? int8\n";
1204
aPieceke376b922021-04-19 08:08:14 +02001205 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
1206 TEST_LOCAL_PRINT(mod, 36);
1207 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +01001208 assert_string_equal(printed, expect);
1209
aPieceke376b922021-04-19 08:08:14 +02001210 ly_out_reset(UTEST_OUT);
aPiecek9e505922021-04-19 13:45:08 +02001211 /* using lysc tree */
1212 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1213 TEST_LOCAL_PRINT(mod, 36);
1214 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
1215 assert_string_equal(printed, expect);
1216 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1217
1218 ly_out_reset(UTEST_OUT);
aPiecek20ddf8b2021-01-08 11:50:37 +01001219 /* unified_indent_before_type_long_node_name */
1220
1221 /* pyang --tree-line-length 32 */
1222 expect =
1223 "module: a20\n"
1224 " +--rw A\n"
1225 " +--rw Bnode? int8\n"
1226 " +--rw CnodeIsBigger int8\n"
1227 " +--rw Dnode int8\n"
1228 " +--rw E\n"
1229 " | longType\n"
1230 " +--rw G? int8\n";
1231
aPieceke376b922021-04-19 08:08:14 +02001232 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
1233 TEST_LOCAL_PRINT(mod, 32);
1234 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +01001235 assert_string_equal(printed, expect);
1236
aPieceke376b922021-04-19 08:08:14 +02001237 ly_out_reset(UTEST_OUT);
aPiecek9e505922021-04-19 13:45:08 +02001238 /* using lysc tree */
1239 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1240 TEST_LOCAL_PRINT(mod, 32);
1241 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
1242 assert_string_equal(printed, expect);
1243 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1244
1245 ly_out_reset(UTEST_OUT);
aPiecek20ddf8b2021-01-08 11:50:37 +01001246 /* unified_indent_before_type_long_node_type */
1247
1248 /* pyang --tree-line-length 31 */
1249 expect =
1250 "module: a20\n"
1251 " +--rw A\n"
1252 " +--rw Bnode?\n"
1253 " | int8\n"
1254 " +--rw CnodeIsBigger\n"
1255 " | int8\n"
1256 " +--rw Dnode\n"
1257 " | int8\n"
1258 " +--rw E\n"
1259 " | longType\n"
1260 " +--rw G?\n"
1261 " int8\n";
1262
aPieceke376b922021-04-19 08:08:14 +02001263 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
1264 TEST_LOCAL_PRINT(mod, 31);
1265 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +01001266 assert_string_equal(printed, expect);
1267
aPiecek9e505922021-04-19 13:45:08 +02001268 ly_out_reset(UTEST_OUT);
1269 /* using lysc tree */
1270 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1271 TEST_LOCAL_PRINT(mod, 31);
1272 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
1273 assert_string_equal(printed, expect);
1274 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1275
aPiecek20ddf8b2021-01-08 11:50:37 +01001276 TEST_LOCAL_TEARDOWN;
1277}
1278
1279static void
1280inheritance_of_config_flag(void **state)
1281{
1282 TEST_LOCAL_SETUP;
1283 orig =
1284 "module a21 {\n"
1285 " yang-version 1.1;\n"
1286 " namespace \"x:y\";\n"
1287 " prefix x;\n"
1288 " container a {\n"
1289 " config false;\n"
1290 " leaf b {\n"
1291 " type string;\n"
1292 " }\n"
1293 " }\n"
1294 "}\n";
1295
1296 /* from pyang */
1297 expect =
1298 "module: a21\n"
1299 " +--ro a\n"
1300 " +--ro b? string\n";
1301
aPieceke376b922021-04-19 08:08:14 +02001302 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
1303 TEST_LOCAL_PRINT(mod, 72);
1304 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +01001305 assert_string_equal(printed, expect);
aPiecek9e505922021-04-19 13:45:08 +02001306
1307 ly_out_reset(UTEST_OUT);
1308 /* using lysc tree */
1309 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1310 TEST_LOCAL_PRINT(mod, 72);
1311 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
1312 assert_string_equal(printed, expect);
1313 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1314
aPiecek20ddf8b2021-01-08 11:50:37 +01001315 TEST_LOCAL_TEARDOWN;
1316}
1317
1318static void
1319inheritance_of_status_flag(void **state)
1320{
1321 TEST_LOCAL_SETUP;
1322 /* throws libyang warn: Missing explicit "..." status that was already specified in parent, inheriting. */
1323 orig =
1324 "module a22 {\n"
1325 " yang-version 1.1;\n"
1326 " namespace \"x:y\";\n"
1327 " prefix x;\n"
1328 " container a {\n"
1329 " status current;\n"
1330 " container b {\n"
1331 " status deprecated;\n"
1332 " leaf f {\n"
1333 " type string;\n"
1334 " }\n"
1335 " }\n"
1336 " container c {\n"
1337 " status obsolete;\n"
1338 " leaf g {\n"
1339 " type string;\n"
1340 " }\n"
1341 " }\n"
1342 " }\n"
1343 " container d {\n"
1344 " status deprecated;\n"
1345 " container h {\n"
1346 " status obsolete;\n"
1347 " leaf e {\n"
1348 " type string;\n"
1349 " }\n"
1350 " }\n"
1351 " }\n"
1352 "}\n";
1353
1354 /* from yanglint 1 */
1355 expect =
1356 "module: a22\n"
1357 " +--rw a\n"
1358 " | x--rw b\n"
1359 " | | x--rw f? string\n"
1360 " | o--rw c\n"
1361 " | o--rw g? string\n"
1362 " x--rw d\n"
1363 " o--rw h\n"
1364 " o--rw e? string\n";
1365
aPieceke376b922021-04-19 08:08:14 +02001366 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
1367 TEST_LOCAL_PRINT(mod, 72);
1368 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +01001369 assert_string_equal(printed, expect);
aPiecek9e505922021-04-19 13:45:08 +02001370
1371 ly_out_reset(UTEST_OUT);
1372 /* using lysc tree */
1373 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1374 TEST_LOCAL_PRINT(mod, 72);
1375 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
1376 assert_string_equal(printed, expect);
1377 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1378
aPiecek20ddf8b2021-01-08 11:50:37 +01001379 TEST_LOCAL_TEARDOWN;
1380}
1381
1382static void
1383key_leaf_is_always_mandatory_true(void **state)
1384{
1385 TEST_LOCAL_SETUP;
1386 orig =
1387 "module a23 {\n"
1388 " yang-version 1.1;\n"
1389 " namespace \"x:y\";\n"
1390 " prefix x;\n"
1391 " list a {\n"
1392 " key \"k1\";\n"
1393 " list b {\n"
1394 " key \"k2\";\n"
1395 " leaf k1 {\n"
1396 " type string;\n"
1397 " }\n"
1398 " leaf k2 {\n"
1399 " type string;\n"
1400 " }\n"
1401 " }\n"
1402 " leaf k1 {\n"
1403 " type string;\n"
1404 " }\n"
1405 " }\n"
1406 "}\n";
1407
1408 /* from pyang */
1409 expect =
1410 "module: a23\n"
1411 " +--rw a* [k1]\n"
1412 " +--rw b* [k2]\n"
1413 " | +--rw k1? string\n"
1414 " | +--rw k2 string\n"
1415 " +--rw k1 string\n";
1416
aPieceke376b922021-04-19 08:08:14 +02001417 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
1418 TEST_LOCAL_PRINT(mod, 72);
1419 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +01001420 assert_string_equal(printed, expect);
aPiecek9e505922021-04-19 13:45:08 +02001421
1422 ly_out_reset(UTEST_OUT);
1423
1424 /* from pyang but with some swapped lines */
1425 expect =
1426 "module: a23\n"
1427 " +--rw a* [k1]\n"
1428 " +--rw k1 string\n"
1429 " +--rw b* [k2]\n"
1430 " +--rw k2 string\n"
1431 " +--rw k1? string\n";
1432
1433 /* using lysc tree */
1434 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1435 TEST_LOCAL_PRINT(mod, 72);
1436 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
1437 assert_string_equal(printed, expect);
1438 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1439
aPiecek20ddf8b2021-01-08 11:50:37 +01001440 TEST_LOCAL_TEARDOWN;
1441}
1442
1443static void
1444transition_between_rpc_and_notif(void **state)
1445{
1446 TEST_LOCAL_SETUP;
1447 orig =
1448 "module a24 {\n"
1449 " yang-version 1.1;\n"
1450 " namespace \"x:y\";\n"
1451 " prefix x;\n"
1452 " container top {\n"
aPiecek9e505922021-04-19 13:45:08 +02001453 " leaf g {\n"
1454 " type string;\n"
1455 " }\n"
aPiecek20ddf8b2021-01-08 11:50:37 +01001456 " action rpc1 {\n"
1457 "\n"
1458 " input {\n"
1459 " leaf in {\n"
1460 " type string;\n"
1461 " }\n"
1462 " }\n"
1463 " }\n"
1464 " action rpc2 {\n"
1465 "\n"
1466 " input {\n"
1467 " leaf in {\n"
1468 " type string;\n"
1469 " }\n"
1470 " }\n"
1471 "\n"
1472 " output {\n"
1473 " leaf out {\n"
1474 " type string;\n"
1475 " }\n"
1476 " }\n"
1477 " }\n"
1478 " notification n1;\n"
1479 " notification n2;\n"
1480 " }\n"
1481 "}\n";
1482
1483 /* from pyang but edited -> n1 node is moved to n2 */
1484 expect =
1485 "module: a24\n"
1486 " +--rw top\n"
aPiecek9e505922021-04-19 13:45:08 +02001487 " +--rw g? string\n"
aPiecek20ddf8b2021-01-08 11:50:37 +01001488 " +---x rpc1\n"
1489 " | +---w input\n"
1490 " | +---w in? string\n"
1491 " +---x rpc2\n"
1492 " | +---w input\n"
1493 " | | +---w in? string\n"
1494 " | +--ro output\n"
1495 " | +--ro out? string\n"
1496 " +---n n1\n"
1497 " +---n n2\n";
1498
aPieceke376b922021-04-19 08:08:14 +02001499 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
1500 TEST_LOCAL_PRINT(mod, 72);
1501 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
aPiecek20ddf8b2021-01-08 11:50:37 +01001502 assert_string_equal(printed, expect);
aPiecek9e505922021-04-19 13:45:08 +02001503
1504 ly_out_reset(UTEST_OUT);
1505 /* using lysc tree */
1506 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1507 TEST_LOCAL_PRINT(mod, 72);
1508 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
1509 assert_string_equal(printed, expect);
1510 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1511
1512 TEST_LOCAL_TEARDOWN;
1513}
1514
1515static void
1516local_augment(void **state)
1517{
1518 TEST_LOCAL_SETUP;
1519
1520 orig =
1521 "module a25 {\n"
1522 " yang-version 1.1;\n"
1523 " namespace \"x:y\";\n"
1524 " prefix x;\n"
1525 " container g;\n"
1526 " augment \"/x:g\" {\n"
1527 " container e;\n"
1528 " }\n"
1529 "}\n";
1530
1531 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
1532
1533 /* from pyang */
1534 expect =
1535 "module: a25\n"
1536 " +--rw g\n"
1537 " +--rw e\n";
1538
1539 /* using lysc tree */
1540 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1541 TEST_LOCAL_PRINT(mod, 72);
1542 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
1543 assert_string_equal(printed, expect);
1544 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1545
aPiecek20ddf8b2021-01-08 11:50:37 +01001546 TEST_LOCAL_TEARDOWN;
1547}
1548
aPiecek7745b282021-04-20 13:54:52 +02001549static void
1550print_compiled_node(void **state)
1551{
1552 TEST_LOCAL_SETUP;
1553 const struct lysc_node *node;
1554
1555 orig =
1556 "module a26 {\n"
1557 " yang-version 1.1;\n"
1558 " namespace \"x:y\";\n"
1559 " prefix x;\n"
1560 " container g {\n"
1561 " leaf a {\n"
1562 " type string;\n"
1563 " }\n"
1564 " container h {\n"
1565 " leaf b {\n"
1566 " type string;\n"
1567 " mandatory true;\n"
1568 " }\n"
1569 " leaf c {\n"
1570 " type string;\n"
1571 " }\n"
1572 " }\n"
1573 " }\n"
1574 "}\n";
1575
1576 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
1577
1578 /* pyang -f tree --tree-path /g/h/c */
1579 expect =
1580 "module: a26\n"
1581 " +--rw g\n"
1582 " +--rw h\n"
1583 " +--rw c? string\n";
1584
1585 /* using lysc tree */
1586 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1587
1588 node = lys_find_path(UTEST_LYCTX, NULL, "/a26:g/h/c", 0);
1589 CHECK_POINTER(node, 1);
1590 assert_int_equal(LY_SUCCESS, lys_print_node(UTEST_OUT, node, LYS_OUT_TREE, 72, 0));
1591 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
1592 assert_string_equal(printed, expect);
1593
1594 ly_out_reset(UTEST_OUT);
1595
1596 /* pyang -f tree --tree-path /g/h */
1597 expect =
1598 "module: a26\n"
1599 " +--rw g\n"
1600 " +--rw h\n"
1601 " +--rw b string\n"
1602 " +--rw c? string\n";
1603
1604 node = lys_find_path(UTEST_LYCTX, NULL, "/a26:g/h", 0);
1605 CHECK_POINTER(node, 1);
1606 assert_int_equal(LY_SUCCESS, lys_print_node(UTEST_OUT, node, LYS_OUT_TREE, 72, 0));
1607 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
1608 assert_string_equal(printed, expect);
1609
1610 ly_out_reset(UTEST_OUT);
1611
1612 /* pyang whose output is adjusted manually */
1613 expect =
1614 "module: a26\n"
1615 " +--rw g\n"
1616 " +--rw h\n";
1617
1618 node = lys_find_path(UTEST_LYCTX, NULL, "/a26:g/h", 0);
1619 CHECK_POINTER(node, 1);
1620 assert_int_equal(LY_SUCCESS, lys_print_node(UTEST_OUT, node, LYS_OUT_TREE, 72, LYS_PRINT_NO_SUBSTMT));
1621 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
1622 assert_string_equal(printed, expect);
1623
1624 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1625
1626 TEST_LOCAL_TEARDOWN;
1627}
1628
aPiecekaecf7512021-04-21 08:34:35 +02001629static LY_ERR
1630local_imp_clb(const char *UNUSED(mod_name), const char *UNUSED(mod_rev), const char *UNUSED(submod_name),
1631 const char *UNUSED(sub_rev), void *user_data, LYS_INFORMAT *format,
1632 const char **module_data, void (**free_module_data)(void *model_data, void *user_data))
1633{
1634 *module_data = user_data;
1635 *format = LYS_IN_YANG;
1636 *free_module_data = NULL;
1637 return LY_SUCCESS;
1638}
1639
1640static void
1641print_parsed_submodule(void **state)
1642{
1643 TEST_LOCAL_SETUP;
1644
1645 orig = "module a27 {\n"
1646 " yang-version 1.1;\n"
1647 " namespace \"x:y\";\n"
1648 " prefix x;\n"
1649 "\n"
1650 " include \"a27-sub\";\n"
1651 "}\n";
1652
1653 char *submodule =
1654 "submodule a27-sub {\n"
1655 " yang-version 1.1;\n"
1656 " belongs-to a27 {\n"
1657 " prefix x;\n"
1658 " }\n"
1659 "\n"
1660 " container h {\n"
1661 " leaf b {\n"
1662 " type string;\n"
1663 " }\n"
1664 " }\n"
1665 "}\n";
1666
1667 /* edited pyang output */
1668 expect =
1669 "submodule: a27-sub\n"
1670 " +--rw h\n"
1671 " +--rw b? string\n";
1672
1673 ly_ctx_set_module_imp_clb(UTEST_LYCTX, local_imp_clb, submodule);
1674 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
1675 assert_int_equal(LY_SUCCESS, lys_print_submodule(UTEST_OUT, mod->parsed->includes[0].submodule, LYS_OUT_TREE, 72, 0));
1676 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
1677 assert_string_equal(printed, expect);
1678
1679 TEST_LOCAL_TEARDOWN;
1680}
1681
aPiecekb8e43f12021-04-23 12:52:22 +02001682static void
1683yang_data(void **state)
1684{
1685 TEST_LOCAL_SETUP;
1686
1687 assert_int_equal(LY_SUCCESS, ly_ctx_set_searchdir(UTEST_LYCTX, TESTS_DIR_MODULES_YANG));
1688 assert_non_null(ly_ctx_load_module(UTEST_LYCTX, "ietf-restconf", "2017-01-26", NULL));
1689
1690 orig =
1691 "module a28 {\n"
1692 " yang-version 1.1;\n"
1693 " namespace \"x:y\";\n"
1694 " prefix x;\n"
1695 "\n"
1696 " import ietf-restconf {\n"
1697 " prefix rc;\n"
1698 " revision-date 2017-01-26;\n"
1699 " }\n"
1700 "\n"
1701 " rc:yang-data \"tmp1\" {\n"
1702 " container cont1 {\n"
1703 " leaf lf {\n"
1704 " type string;\n"
1705 " }\n"
1706 " list l2 {\n"
1707 " key\n"
1708 " \"a b\";\n"
1709 " leaf a {\n"
1710 " type string;\n"
1711 " }\n"
1712 " leaf b {\n"
1713 " type string;\n"
1714 " }\n"
1715 " }\n"
1716 " }\n"
1717 " }\n"
1718 " rc:yang-data \"tmp2\" {\n"
1719 " container con2 {\n"
1720 " leaf lf {\n"
1721 " type string;\n"
1722 " }\n"
1723 " }\n"
1724 " }\n"
1725 " rc:yang-data \"tmp3\" {\n"
1726 " uses g1;\n"
1727 " uses g2;\n"
1728 " }\n"
1729 " rc:yang-data \"tmp4\" {\n"
1730 " choice x {\n"
1731 " case a {\n"
1732 " container z;\n"
1733 " }\n"
1734 " case b {\n"
1735 " container y;\n"
1736 " }\n"
1737 " }\n"
1738 " }\n"
1739 "\n"
1740 " grouping g1 {\n"
1741 " description\n"
1742 " \"Some Text\";\n"
1743 " }\n"
1744 "\n"
1745 " grouping g2 {\n"
1746 " container cont3;\n"
1747 " }\n"
1748 " container mont;\n"
1749 "}\n";
1750
1751 /* from pyang but with these adjustments:
1752 * - <flags> is always '--' for yang-data nodes
1753 * - yang-data tmp3 has two 'uses' nodes
1754 * - grouping g2 has ':' character at the end
1755 */
1756 expect =
1757 "module: a28\n"
1758 " +--rw mont\n"
1759 "\n"
1760 " grouping g1\n"
1761 " grouping g2:\n"
1762 " +---- cont3\n"
1763 "\n"
1764 " yang-data tmp1:\n"
1765 " +---- cont1\n"
1766 " +---- lf? string\n"
1767 " +---- l2* [a b]\n"
1768 " +---- a string\n"
1769 " +---- b string\n"
1770 " yang-data tmp2:\n"
1771 " +---- con2\n"
1772 " +---- lf? string\n"
1773 " yang-data tmp3:\n"
1774 " +---u g1\n"
1775 " +---u g2\n"
1776 " yang-data tmp4:\n"
1777 " +---- (x)?\n"
1778 " +--:(a)\n"
1779 " | +---- z\n"
1780 " +--:(b)\n"
1781 " +---- y\n";
1782
1783 UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
1784 TEST_LOCAL_PRINT(mod, 72);
1785 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
1786 assert_string_equal(printed, expect);
1787
1788 ly_out_reset(UTEST_OUT);
1789
1790 /* from pyang but with these adjustments:
1791 * <flags> is always '--' for yang-data nodes
1792 */
1793 expect =
1794 "module: a28\n"
1795 " +--rw mont\n"
1796 "\n"
1797 " yang-data tmp1:\n"
1798 " +---- cont1\n"
1799 " +---- lf? string\n"
1800 " +---- l2* [a b]\n"
1801 " +---- a string\n"
1802 " +---- b string\n"
1803 " yang-data tmp2:\n"
1804 " +---- con2\n"
1805 " +---- lf? string\n"
1806 " yang-data tmp3:\n"
1807 " +---- cont3\n"
1808 " yang-data tmp4:\n"
1809 " +---- (x)?\n"
1810 " +--:(a)\n"
1811 " | +---- z\n"
1812 " +--:(b)\n"
1813 " +---- y\n";
1814
1815 /* using lysc tree */
1816 ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1817 TEST_LOCAL_PRINT(mod, 72);
1818 assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
1819 assert_string_equal(printed, expect);
1820 ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
1821
1822 TEST_LOCAL_TEARDOWN;
1823}
1824
aPiecek20ddf8b2021-01-08 11:50:37 +01001825int
1826main(void)
1827{
1828 const struct CMUnitTest tests[] = {
1829 UTEST(base_sections),
1830 UTEST(node_status),
1831 UTEST(node_config_flags),
1832 UTEST(node_rpcs_flags),
1833 UTEST(node_grouping_flags),
1834 UTEST(notif_inside_container),
1835 UTEST(node_choice),
1836 UTEST(node_case),
1837 UTEST(optional_opts),
1838 UTEST(presence_container),
1839 UTEST(node_keys),
1840 UTEST(node_type_target),
1841 UTEST(node_type_leafref),
1842 UTEST(node_iffeatures),
1843 UTEST(indent_wrapper),
1844 UTEST(line_length_twiddling),
1845 UTEST(break_before_leafref),
1846 UTEST(break_before_leafref_and_iffeature),
1847 UTEST(basic_unified_indent_before_type),
1848 UTEST(twiddling_unified_indent_before_type),
1849 UTEST(inheritance_of_config_flag),
1850 UTEST(inheritance_of_status_flag),
1851 UTEST(key_leaf_is_always_mandatory_true),
1852 UTEST(transition_between_rpc_and_notif),
aPiecek9e505922021-04-19 13:45:08 +02001853 UTEST(local_augment),
aPiecek7745b282021-04-20 13:54:52 +02001854 UTEST(print_compiled_node),
aPiecekaecf7512021-04-21 08:34:35 +02001855 UTEST(print_parsed_submodule),
aPiecekb8e43f12021-04-23 12:52:22 +02001856 UTEST(yang_data),
aPiecek20ddf8b2021-01-08 11:50:37 +01001857 };
1858
1859 return cmocka_run_group_tests(tests, NULL, NULL);
1860}