diff --git a/src/out.c b/src/out.c index 9eed077d9..081abf588 100644 --- a/src/out.c +++ b/src/out.c @@ -55,6 +55,20 @@ lyd_node_should_print(const struct lyd_node *node, uint32_t options) /* explicit default node */ return 0; } + } else if (lysc_is_np_cont(node->schema)) { + if (options & LYD_PRINT_KEEPEMPTYCONT) { + /* explicit request to print, redundant to check */ + return 1; + } + + LY_LIST_FOR(lyd_child(node), elem) { + if (lyd_node_should_print(elem, options)) { + return 1; + } + } + + /* NP container without any printed children (such as other NP containers with only nodes set to their default values) */ + return 0; } } else if ((node->flags & LYD_DEFAULT) && (node->schema->nodetype == LYS_CONTAINER)) { if (options & LYD_PRINT_KEEPEMPTYCONT) { diff --git a/tests/utests/data/test_printer_json.c b/tests/utests/data/test_printer_json.c index 85ace73d1..65539f09d 100644 --- a/tests/utests/data/test_printer_json.c +++ b/tests/utests/data/test_printer_json.c @@ -1,4 +1,4 @@ -/* +/** * @file test_printer_json.c * @author: Radek Krejci * @brief unit tests for functions from printer_yang.c @@ -21,9 +21,20 @@ setup(void **state) "revision 2014-05-08;" "anydata data;" "}"; + const char *schema2 = "module schema2 {namespace urn:tests:schema2;prefix s2;yang-version 1.1;" + " container a {" + " container b {" + " leaf c {" + " type string;" + " default \"dflt\";" + " }" + " }" + " }" + "}"; UTEST_SETUP; UTEST_ADD_MODULE(schema1, LYS_IN_YANG, NULL, NULL); + UTEST_ADD_MODULE(schema2, LYS_IN_YANG, NULL, NULL); return 0; } @@ -41,11 +52,31 @@ test_container_presence(void **state) lyd_free_all(tree); } +static void +test_empty_container_wd_trim(void **state) +{ + struct lyd_node *tree; + char *buffer = NULL; + const char *data = "{\"schema2:a\":{\"b\":{\"c\":\"dflt\"}}}"; + + CHECK_PARSE_LYD_PARAM(data, LYD_JSON, 0, LYD_VALIDATE_PRESENT, LY_SUCCESS, tree); + assert_int_equal(LY_SUCCESS, lyd_print_mem(&buffer, tree, LYD_JSON, LYD_PRINT_SHRINK | LYD_PRINT_WD_TRIM)); + CHECK_STRING(buffer, "{}"); + free(buffer); + + assert_int_equal(LY_SUCCESS, lyd_print_mem(&buffer, tree, LYD_JSON, LYD_PRINT_SHRINK | LYD_PRINT_WD_TRIM | LYD_PRINT_KEEPEMPTYCONT)); + CHECK_STRING(buffer, "{\"schema2:a\":{\"b\":{}}}"); + free(buffer); + + lyd_free_all(tree); +} + int main(void) { const struct CMUnitTest tests[] = { UTEST(test_container_presence, setup), + UTEST(test_empty_container_wd_trim, setup), }; return cmocka_run_group_tests(tests, NULL, NULL);