blob: ee207561d44ad9332a2eb4ba56e8c322a2f6e4b9 [file] [log] [blame]
/*
* @file test_printer_tree.c
* @author: Adam Piecek <piecek@cesnet.cz>
* @brief unit tests for functions from printer_tree.c
*
* Copyright (c) 2019-2021 CESNET, z.s.p.o.
*
* This source code is licensed under BSD 3-Clause License (the "License").
* You may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://opensource.org/licenses/BSD-3-Clause
*/
#define _UTEST_MAIN_
#include "utests.h"
#include "common.h"
#include "context.h"
#include "out.h"
#include "printer_schema.h"
#include "tree_schema.h"
#define TEST_LOCAL_SETUP \
char *printed; \
const struct lys_module *mod; \
const char *orig; \
const char *expect; \
assert_int_equal(LY_SUCCESS, ly_out_new_memory(&printed, 0, &UTEST_OUT));
#define TEST_LOCAL_PRINT(MOD, LINE_LENGTH) \
assert_int_equal(LY_SUCCESS, lys_print_module(UTEST_OUT, MOD, LYS_OUT_TREE, LINE_LENGTH, 0));
#define TEST_LOCAL_TEARDOWN \
ly_out_free(UTEST_OUT, NULL, 1);
static void
base_sections(void **state)
{
TEST_LOCAL_SETUP;
orig =
"module a01xx {\n"
" yang-version 1.1;\n"
" namespace \"xx:y\";\n"
" prefix xx;\n"
" container c;\n"
" container d;\n"
"}\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
/* module with import statement */
orig =
"module a01 {\n"
" yang-version 1.1;\n"
" namespace \"x:y\";\n"
" prefix x;\n"
"\n"
" import a01xx {\n"
" prefix xx;\n"
" }\n"
"\n"
" grouping g1;\n"
"\n"
" grouping g2;\n"
" container g;\n"
" augment \"/xx:c\" {\n"
" container e;\n"
" }\n"
" augment \"/xx:d\" {\n"
" container f;\n"
" }\n"
" rpc rpc1;\n"
" rpc rpc2;\n"
" notification n1;\n"
" notification n2;\n"
"}\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
/* from pyang */
expect =
"module: a01\n"
" +--rw g\n"
"\n"
" augment /xx:c:\n"
" +--rw e\n"
" augment /xx:d:\n"
" +--rw f\n"
"\n"
" rpcs:\n"
" +---x rpc1\n"
" +---x rpc2\n"
"\n"
" notifications:\n"
" +---n n1\n"
" +---n n2\n"
"\n"
" grouping g1\n"
" grouping g2\n";
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* from pyang */
expect =
"module: a01\n"
" +--rw g\n"
"\n"
" augment /xx:c:\n"
" +--rw e\n"
" augment /xx:d:\n"
" +--rw f\n"
"\n"
" rpcs:\n"
" +---x rpc1\n"
" +---x rpc2\n"
"\n"
" notifications:\n"
" +---n n1\n"
" +---n n2\n";
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_TEARDOWN;
}
static void
node_status(void **state)
{
TEST_LOCAL_SETUP;
orig =
"module a02 {\n"
" yang-version 1.1;\n"
" namespace \"x:y\";\n"
" prefix x;\n"
" container l {\n"
" status current;\n"
" }\n"
" container m {\n"
" status deprecated;\n"
" }\n"
" container n {\n"
" status obsolete;\n"
" }\n"
"}\n";
/* from pyang */
expect =
"module: a02\n"
" +--rw l\n"
" x--rw m\n"
" o--rw n\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_TEARDOWN;
}
static void
node_config_flags(void **state)
{
TEST_LOCAL_SETUP;
orig =
"module a03 {\n"
" yang-version 1.1;\n"
" namespace \"x:y\";\n"
" prefix x;\n"
" container l {\n"
" config true;\n"
" }\n"
" container m {\n"
" config false;\n"
" }\n"
"}\n";
/* from pyang */
expect =
"module: a03\n"
" +--rw l\n"
" +--ro m\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_TEARDOWN;
}
static void
node_rpcs_flags(void **state)
{
TEST_LOCAL_SETUP;
orig =
"module a04 {\n"
" yang-version 1.1;\n"
" namespace \"x:y\";\n"
" prefix x;\n"
" container cont {\n"
" action rpc1 {\n"
"\n"
" input {\n"
" leaf in {\n"
" type string;\n"
" }\n"
" }\n"
"\n"
" output {\n"
" leaf out {\n"
" type string;\n"
" }\n"
" }\n"
" }\n"
" }\n"
"}\n";
/* from pyang */
expect =
"module: a04\n"
" +--rw cont\n"
" +---x rpc1\n"
" +---w input\n"
" | +---w in? string\n"
" +--ro output\n"
" +--ro out? string\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_TEARDOWN;
}
static void
node_grouping_flags(void **state)
{
TEST_LOCAL_SETUP;
orig =
"module a05 {\n"
" yang-version 1.1;\n"
" namespace \"x:y\";\n"
" prefix x;\n"
"\n"
" grouping g {\n"
" leaf a {\n"
" type string;\n"
" config true;\n"
" }\n"
" leaf b {\n"
" type string;\n"
" config false;\n"
" }\n"
" leaf c {\n"
" type string;\n"
" }\n"
" container d {\n"
" config false;\n"
" leaf e {\n"
" type string;\n"
" }\n"
" }\n"
" container f {\n"
" leaf g {\n"
" type string;\n"
" }\n"
" }\n"
" }\n"
" container d {\n"
" uses g;\n"
" }\n"
"}\n";
/* from yanglint1 */
expect =
"module: a05\n"
" +--rw d\n"
" +---u g\n"
"\n"
" grouping g:\n"
" +--rw a? string\n"
" +--ro b? string\n"
" +---- c? string\n"
" +--ro d\n"
" | +--ro e? string\n"
" +---- f\n"
" +---- g? string\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
/* from pyang */
expect =
"module: a05\n"
" +--rw d\n"
" +--rw a? string\n"
" +--ro b? string\n"
" +--rw c? string\n"
" +--ro d\n"
" | +--ro e? string\n"
" +--rw f\n"
" +--rw g? string\n";
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_TEARDOWN;
}
static void
notif_inside_container(void **state)
{
TEST_LOCAL_SETUP;
orig =
"module a06 {\n"
" yang-version 1.1;\n"
" namespace \"x:y\";\n"
" prefix x;\n"
" container c {\n"
" notification notif;\n"
" }\n"
"}\n";
/* from pyang */
expect =
"module: a06\n"
" +--rw c\n"
" +---n notif\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_TEARDOWN;
}
static void
node_choice(void **state)
{
TEST_LOCAL_SETUP;
orig =
"module a07 {\n"
" yang-version 1.1;\n"
" namespace \"x:y\";\n"
" prefix x;\n"
" choice my_choice;\n"
"}\n";
/* from pyang */
expect =
"module: a07\n"
" +--rw (my_choice)?\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_TEARDOWN;
}
static void
node_case(void **state)
{
TEST_LOCAL_SETUP;
orig =
"module a08 {\n"
" yang-version 1.1;\n"
" namespace \"x:y\";\n"
" prefix x;\n"
" choice my_choice {\n"
" case my_case;\n"
" }\n"
"}\n";
/* from pyang */
expect =
"module: a08\n"
" +--rw (my_choice)?\n"
" +--:(my_case)\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_TEARDOWN;
}
static void
optional_opts(void **state)
{
TEST_LOCAL_SETUP;
/* throws libyang warn: Use of anydata to define configuration data is not recommended... */
orig =
"module a09 {\n"
" yang-version 1.1;\n"
" namespace \"x:y\";\n"
" prefix x;\n"
" leaf l1 {\n"
" type string;\n"
" mandatory true;\n"
" }\n"
" leaf l2 {\n"
" type string;\n"
" mandatory false;\n"
" }\n"
" choice c1 {\n"
" mandatory true;\n"
" }\n"
" choice c2 {\n"
" mandatory false;\n"
" }\n"
" anydata a1 {\n"
" mandatory true;\n"
" }\n"
" anydata a2 {\n"
" mandatory false;\n"
" }\n"
" anyxml x1 {\n"
" mandatory true;\n"
" }\n"
" anyxml x2 {\n"
" mandatory false;\n"
" }\n"
"}\n";
/* from yanglint 1 */
expect =
"module: a09\n"
" +--rw l1 string\n"
" +--rw l2? string\n"
" +--rw (c1)\n"
" +--rw (c2)?\n"
" +--rw a1 anydata\n"
" +--rw a2? anydata\n"
" +--rw x1 anyxml\n"
" +--rw x2? anyxml\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_TEARDOWN;
}
static void
presence_container(void **state)
{
TEST_LOCAL_SETUP;
orig =
"module a10 {\n"
" yang-version 1.1;\n"
" namespace \"x:y\";\n"
" prefix x;\n"
" container c;\n"
" container d {\n"
" presence \"str1\";\n"
" }\n"
"}\n";
/* from pyang */
expect =
"module: a10\n"
" +--rw c\n"
" +--rw d!\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_TEARDOWN;
}
static void
node_keys(void **state)
{
TEST_LOCAL_SETUP;
orig =
"module a11 {\n"
" yang-version 1.1;\n"
" namespace \"x:y\";\n"
" prefix x;\n"
" list l1 {\n"
" key \"a\";\n"
" leaf a {\n"
" type string;\n"
" }\n"
" }\n"
" list l2 {\n"
" key \"a b\";\n"
" leaf a {\n"
" type string;\n"
" }\n"
" leaf b {\n"
" type string;\n"
" }\n"
" }\n"
" leaf-list ll {\n"
" type string;\n"
" }\n"
"}\n";
/* from pyang */
expect =
"module: a11\n"
" +--rw l1* [a]\n"
" | +--rw a string\n"
" +--rw l2* [a b]\n"
" | +--rw a string\n"
" | +--rw b string\n"
" +--rw ll* string\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_TEARDOWN;
}
static void
node_type_target(void **state)
{
TEST_LOCAL_SETUP;
orig =
"module a12 {\n"
" yang-version 1.1;\n"
" namespace \"x:y\";\n"
" prefix x;\n"
" leaf a {\n"
" type leafref {\n"
" path \"/x:b\";\n"
" }\n"
" }\n"
" leaf b {\n"
" type string;\n"
" }\n"
"}\n";
/* from yanglint 1 */
expect =
"module: a12\n"
" +--rw a? -> /x:b\n"
" +--rw b? string\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_TEARDOWN;
}
static void
node_type_leafref(void **state)
{
TEST_LOCAL_SETUP;
orig =
"module a13 {\n"
" yang-version 1.1;\n"
" namespace \"x:y\";\n"
" prefix x;\n"
" leaf pretty-long-identifier-name-which-should-exceed-the-limit-of-72-characters {\n"
" type string;\n"
" }\n"
" leaf a {\n"
" type leafref {\n"
" path \"/x:pretty-long-identifier-name-which-should-exceed-the-limit-of-72-characters\";\n"
" }\n"
" }\n"
"}\n";
/* yanglint --tree-no-leafref-target --tree-line-length=72 */
expect =
"module: a13\n"
" +--rw pretty-long-identifier-name-which-should-exceed-the-limit-of-72-characters?\n"
" | string\n"
" +--rw a?\n"
" leafref\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_TEARDOWN;
}
static void
node_iffeatures(void **state)
{
TEST_LOCAL_SETUP;
orig =
"module a14 {\n"
" yang-version 1.1;\n"
" namespace \"x:y\";\n"
" prefix x;\n"
"\n"
" feature foo;\n"
"\n"
" feature bar;\n"
" container c {\n"
" if-feature \"foo or bar\";\n"
" }\n"
"}\n";
/* from pyang */
expect =
"module: a14\n"
" +--rw c {foo or bar}?\n";
const char *feats[] = {"foo", NULL};
UTEST_ADD_MODULE(orig, LYS_IN_YANG, feats, &mod);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_TEARDOWN;
}
static void
indent_wrapper(void **state)
{
TEST_LOCAL_SETUP;
orig =
"module a15 {\n"
" yang-version 1.1;\n"
" namespace \"x:y\";\n"
" prefix x;\n"
" container a {\n"
" container b;\n"
" }\n"
" container c {\n"
" container d {\n"
" container e;\n"
" }\n"
" container f {\n"
" container g;\n"
" }\n"
" }\n"
" container h;\n"
" container i {\n"
" container j;\n"
" container k;\n"
" }\n"
"}\n";
/* from pyang */
expect =
"module: a15\n"
" +--rw a\n"
" | +--rw b\n"
" +--rw c\n"
" | +--rw d\n"
" | | +--rw e\n"
" | +--rw f\n"
" | +--rw g\n"
" +--rw h\n"
" +--rw i\n"
" +--rw j\n"
" +--rw k\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_TEARDOWN;
}
static void
line_length_twiddling(void **state)
{
TEST_LOCAL_SETUP;
/* node_fits_tight */
orig =
"module a16 {\n"
" yang-version 1.1;\n"
" namespace \"x:y\";\n"
" prefix x;\n"
"\n"
" feature f;\n"
"\n"
" typedef some-long-type {\n"
" type string;\n"
" }\n"
" list my-list-name {\n"
" key \"key\";\n"
" leaf key {\n"
" type string;\n"
" }\n"
" leaf nod-leaf {\n"
" if-feature \"f\";\n"
" type some-long-type;\n"
" }\n"
" leaf nos-leaf {\n"
" if-feature \"f\";\n"
" type int32;\n"
" }\n"
" }\n"
"}\n";
/* pyang --tree-line-length 42 */
expect =
"module: a16\n"
" +--rw my-list-name* [key]\n"
" +--rw key string\n"
" +--rw nod-leaf? some-long-type {f}?\n"
" +--rw nos-leaf? int32 {f}?\n";
const char *feats[] = {"f", NULL};
UTEST_ADD_MODULE(orig, LYS_IN_YANG, feats, &mod);
TEST_LOCAL_PRINT(mod, 42);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 42);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
ly_out_reset(UTEST_OUT);
/* break_before_iffeature */
/* pyang --tree-line-length 41 */
expect =
"module: a16\n"
" +--rw my-list-name* [key]\n"
" +--rw key string\n"
" +--rw nod-leaf? some-long-type\n"
" | {f}?\n"
" +--rw nos-leaf? int32 {f}?\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, feats, &mod);
TEST_LOCAL_PRINT(mod, 41);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 41);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
ly_out_reset(UTEST_OUT);
/* break_before_type */
/* pyang --tree-line-length 29 */
expect =
"module: a16\n"
" +--rw my-list-name* [key]\n"
" +--rw key string\n"
" +--rw nod-leaf?\n"
" | some-long-type\n"
" | {f}?\n"
" +--rw nos-leaf? int32\n"
" {f}?\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, feats, &mod);
TEST_LOCAL_PRINT(mod, 29);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 29);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
ly_out_reset(UTEST_OUT);
/* break_before_keys */
/* pyang --tree-line-length 23 */
expect =
"module: a16\n"
" +--rw my-list-name*\n"
" [key]\n"
" +--rw key\n"
" | string\n"
" +--rw nod-leaf?\n"
" | some-long-type\n"
" | {f}?\n"
" +--rw nos-leaf?\n"
" int32 {f}?\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, feats, &mod);
TEST_LOCAL_PRINT(mod, 23);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 23);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
ly_out_reset(UTEST_OUT);
/* every_node_name_is_too_long */
/* pyang --tree-line-length 14 */
expect =
"module: a16\n"
" +--rw my-list-name*\n"
" [key]\n"
" +--rw key\n"
" | string\n"
" +--rw nod-leaf?\n"
" | some-long-type\n"
" | {f}?\n"
" +--rw nos-leaf?\n"
" int32\n"
" {f}?\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, feats, &mod);
TEST_LOCAL_PRINT(mod, 14);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 14);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_TEARDOWN;
}
static void
break_before_leafref(void **state)
{
TEST_LOCAL_SETUP;
orig =
"module a17 {\n"
" yang-version 1.1;\n"
" namespace \"x:y\";\n"
" prefix x;\n"
" leaf e {\n"
" type string;\n"
" }\n"
" leaf abcd {\n"
" type leafref {\n"
" path \"/x:e\";\n"
" }\n"
" }\n"
"}\n";
/* yanglint --tree-line-length 14 */
expect =
"module: a17\n"
" +--rw e?\n"
" | string\n"
" +--rw abcd?\n"
" -> /x:e\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
TEST_LOCAL_PRINT(mod, 14);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 14);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_TEARDOWN;
}
static void
break_before_leafref_and_iffeature(void **state)
{
TEST_LOCAL_SETUP;
orig =
"module a18 {\n"
" yang-version 1.1;\n"
" namespace \"x:y\";\n"
" prefix x;\n"
"\n"
" feature f;\n"
" leaf some-long-id {\n"
" type string;\n"
" }\n"
" leaf a {\n"
" if-feature \"f\";\n"
" type leafref {\n"
" path \"/x:some-long-id\";\n"
" }\n"
" }\n"
"}\n";
/* yanglint --tree-no-leafref-target --tree-line-length=20 */
expect =
"module: a18\n"
" +--rw some-long-id?\n"
" | string\n"
" +--rw a?\n"
" leafref\n"
" {f}?\n";
const char *feats[] = {"f", NULL};
UTEST_ADD_MODULE(orig, LYS_IN_YANG, feats, &mod);
TEST_LOCAL_PRINT(mod, 20);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 20);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_TEARDOWN;
}
static void
basic_unified_indent_before_type(void **state)
{
TEST_LOCAL_SETUP;
orig =
"module a19 {\n"
" yang-version 1.1;\n"
" namespace \"x:y\";\n"
" prefix x;\n"
"\n"
" typedef longType {\n"
" type string;\n"
" }\n"
" container A {\n"
" leaf Bnode {\n"
" type int8;\n"
" }\n"
" leaf Cnode {\n"
" type int8;\n"
" mandatory true;\n"
" }\n"
" leaf Dnode {\n"
" type int8;\n"
" mandatory true;\n"
" }\n"
" leaf E {\n"
" type longType;\n"
" mandatory true;\n"
" }\n"
" leaf G {\n"
" type int8;\n"
" }\n"
" }\n"
"}\n";
/* from pyang */
expect =
"module: a19\n"
" +--rw A\n"
" +--rw Bnode? int8\n"
" +--rw Cnode int8\n"
" +--rw Dnode int8\n"
" +--rw E longType\n"
" +--rw G? int8\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_TEARDOWN;
}
static void
twiddling_unified_indent_before_type(void **state)
{
TEST_LOCAL_SETUP;
/* basic_functionality */
orig =
"module a20 {\n"
" yang-version 1.1;\n"
" namespace \"x:y\";\n"
" prefix x;\n"
"\n"
" typedef longType {\n"
" type string;\n"
" }\n"
" container A {\n"
" leaf Bnode {\n"
" type int8;\n"
" }\n"
" leaf CnodeIsBigger {\n"
" type int8;\n"
" mandatory true;\n"
" }\n"
" leaf Dnode {\n"
" type int8;\n"
" mandatory true;\n"
" }\n"
" leaf E {\n"
" type longType;\n"
" mandatory true;\n"
" }\n"
" leaf G {\n"
" type int8;\n"
" }\n"
" }\n"
"}\n";
/* pyang --tree-line-length 36 */
expect =
"module: a20\n"
" +--rw A\n"
" +--rw Bnode? int8\n"
" +--rw CnodeIsBigger int8\n"
" +--rw Dnode int8\n"
" +--rw E longType\n"
" +--rw G? int8\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
TEST_LOCAL_PRINT(mod, 36);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 36);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
ly_out_reset(UTEST_OUT);
/* unified_indent_before_type_long_node_name */
/* pyang --tree-line-length 32 */
expect =
"module: a20\n"
" +--rw A\n"
" +--rw Bnode? int8\n"
" +--rw CnodeIsBigger int8\n"
" +--rw Dnode int8\n"
" +--rw E\n"
" | longType\n"
" +--rw G? int8\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
TEST_LOCAL_PRINT(mod, 32);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 32);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
ly_out_reset(UTEST_OUT);
/* unified_indent_before_type_long_node_type */
/* pyang --tree-line-length 31 */
expect =
"module: a20\n"
" +--rw A\n"
" +--rw Bnode?\n"
" | int8\n"
" +--rw CnodeIsBigger\n"
" | int8\n"
" +--rw Dnode\n"
" | int8\n"
" +--rw E\n"
" | longType\n"
" +--rw G?\n"
" int8\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
TEST_LOCAL_PRINT(mod, 31);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 31);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_TEARDOWN;
}
static void
inheritance_of_config_flag(void **state)
{
TEST_LOCAL_SETUP;
orig =
"module a21 {\n"
" yang-version 1.1;\n"
" namespace \"x:y\";\n"
" prefix x;\n"
" container a {\n"
" config false;\n"
" leaf b {\n"
" type string;\n"
" }\n"
" }\n"
"}\n";
/* from pyang */
expect =
"module: a21\n"
" +--ro a\n"
" +--ro b? string\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_TEARDOWN;
}
static void
inheritance_of_status_flag(void **state)
{
TEST_LOCAL_SETUP;
/* throws libyang warn: Missing explicit "..." status that was already specified in parent, inheriting. */
orig =
"module a22 {\n"
" yang-version 1.1;\n"
" namespace \"x:y\";\n"
" prefix x;\n"
" container a {\n"
" status current;\n"
" container b {\n"
" status deprecated;\n"
" leaf f {\n"
" type string;\n"
" }\n"
" }\n"
" container c {\n"
" status obsolete;\n"
" leaf g {\n"
" type string;\n"
" }\n"
" }\n"
" }\n"
" container d {\n"
" status deprecated;\n"
" container h {\n"
" status obsolete;\n"
" leaf e {\n"
" type string;\n"
" }\n"
" }\n"
" }\n"
"}\n";
/* from yanglint 1 */
expect =
"module: a22\n"
" +--rw a\n"
" | x--rw b\n"
" | | x--rw f? string\n"
" | o--rw c\n"
" | o--rw g? string\n"
" x--rw d\n"
" o--rw h\n"
" o--rw e? string\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_TEARDOWN;
}
static void
key_leaf_is_always_mandatory_true(void **state)
{
TEST_LOCAL_SETUP;
orig =
"module a23 {\n"
" yang-version 1.1;\n"
" namespace \"x:y\";\n"
" prefix x;\n"
" list a {\n"
" key \"k1\";\n"
" list b {\n"
" key \"k2\";\n"
" leaf k1 {\n"
" type string;\n"
" }\n"
" leaf k2 {\n"
" type string;\n"
" }\n"
" }\n"
" leaf k1 {\n"
" type string;\n"
" }\n"
" }\n"
"}\n";
/* from pyang */
expect =
"module: a23\n"
" +--rw a* [k1]\n"
" +--rw b* [k2]\n"
" | +--rw k1? string\n"
" | +--rw k2 string\n"
" +--rw k1 string\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* from pyang but with some swapped lines */
expect =
"module: a23\n"
" +--rw a* [k1]\n"
" +--rw k1 string\n"
" +--rw b* [k2]\n"
" +--rw k2 string\n"
" +--rw k1? string\n";
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_TEARDOWN;
}
static void
transition_between_rpc_and_notif(void **state)
{
TEST_LOCAL_SETUP;
orig =
"module a24 {\n"
" yang-version 1.1;\n"
" namespace \"x:y\";\n"
" prefix x;\n"
" container top {\n"
" leaf g {\n"
" type string;\n"
" }\n"
" action rpc1 {\n"
"\n"
" input {\n"
" leaf in {\n"
" type string;\n"
" }\n"
" }\n"
" }\n"
" action rpc2 {\n"
"\n"
" input {\n"
" leaf in {\n"
" type string;\n"
" }\n"
" }\n"
"\n"
" output {\n"
" leaf out {\n"
" type string;\n"
" }\n"
" }\n"
" }\n"
" notification n1;\n"
" notification n2;\n"
" }\n"
"}\n";
/* from pyang but edited -> n1 node is moved to n2 */
expect =
"module: a24\n"
" +--rw top\n"
" +--rw g? string\n"
" +---x rpc1\n"
" | +---w input\n"
" | +---w in? string\n"
" +---x rpc2\n"
" | +---w input\n"
" | | +---w in? string\n"
" | +--ro output\n"
" | +--ro out? string\n"
" +---n n1\n"
" +---n n2\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_out_reset(UTEST_OUT);
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_TEARDOWN;
}
static void
local_augment(void **state)
{
TEST_LOCAL_SETUP;
orig =
"module a25 {\n"
" yang-version 1.1;\n"
" namespace \"x:y\";\n"
" prefix x;\n"
" container g;\n"
" augment \"/x:g\" {\n"
" container e;\n"
" }\n"
"}\n";
UTEST_ADD_MODULE(orig, LYS_IN_YANG, NULL, &mod);
/* from pyang */
expect =
"module: a25\n"
" +--rw g\n"
" +--rw e\n";
/* using lysc tree */
ly_ctx_set_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_PRINT(mod, 72);
assert_int_equal(strlen(expect), ly_out_printed(UTEST_OUT));
assert_string_equal(printed, expect);
ly_ctx_unset_options(UTEST_LYCTX, LY_CTX_SET_PRIV_PARSED);
TEST_LOCAL_TEARDOWN;
}
int
main(void)
{
const struct CMUnitTest tests[] = {
UTEST(base_sections),
UTEST(node_status),
UTEST(node_config_flags),
UTEST(node_rpcs_flags),
UTEST(node_grouping_flags),
UTEST(notif_inside_container),
UTEST(node_choice),
UTEST(node_case),
UTEST(optional_opts),
UTEST(presence_container),
UTEST(node_keys),
UTEST(node_type_target),
UTEST(node_type_leafref),
UTEST(node_iffeatures),
UTEST(indent_wrapper),
UTEST(line_length_twiddling),
UTEST(break_before_leafref),
UTEST(break_before_leafref_and_iffeature),
UTEST(basic_unified_indent_before_type),
UTEST(twiddling_unified_indent_before_type),
UTEST(inheritance_of_config_flag),
UTEST(inheritance_of_status_flag),
UTEST(key_leaf_is_always_mandatory_true),
UTEST(transition_between_rpc_and_notif),
UTEST(local_augment),
};
return cmocka_run_group_tests(tests, NULL, NULL);
}