data tree FEATURE support for lists with duplicate instances
Changes mainly in diff processing.
Refs #1483
diff --git a/tests/utests/data/test_new.c b/tests/utests/data/test_new.c
index 314bed4..eee02f0 100644
--- a/tests/utests/data/test_new.c
+++ b/tests/utests/data/test_new.c
@@ -40,12 +40,16 @@
" }\n"
" container c {\n"
" leaf-list x {\n"
- " type string;\n"
+ " type string;\n"
" }\n"
" }\n"
" anydata any {\n"
" config false;\n"
" }\n"
+ " leaf-list ll2 {\n"
+ " config false;\n"
+ " type string;\n"
+ " }\n"
" list l2 {\n"
" config false;\n"
" container c {\n"
@@ -54,6 +58,17 @@
" }\n"
" }\n"
" }\n"
+ " container c2 {\n"
+ " config false;\n"
+ " list l3 {\n"
+ " leaf x {\n"
+ " type string;\n"
+ " }\n"
+ " leaf y {\n"
+ " type string;\n"
+ " }\n"
+ " }\n"
+ " }\n"
" rpc oper {\n"
" input {\n"
" leaf param {\n"
@@ -185,8 +200,10 @@
{
LY_ERR ret;
struct lyd_node *root, *node, *parent;
+ const struct lys_module *mod;
+ char *str;
- UTEST_ADD_MODULE(schema_a, LYS_IN_YANG, NULL, NULL);
+ UTEST_ADD_MODULE(schema_a, LYS_IN_YANG, NULL, &mod);
/* create 2 nodes */
ret = lyd_new_path2(NULL, UTEST_LYCTX, "/a:c/x[.='val']", "vvv", 0, 0, &root, &node);
@@ -236,27 +253,95 @@
lyd_free_tree(root);
- /* try LYD_NEWOPT_UPDATE */
- ret = lyd_new_path2(NULL, UTEST_LYCTX, "/a:l2[1]/c/x", "val", 0, 0, &root, &node);
+ /* key-less list */
+ ret = lyd_new_path2(NULL, UTEST_LYCTX, "/a:c2/l3/x", "val1", 0, 0, &root, &node);
assert_int_equal(ret, LY_SUCCESS);
assert_non_null(root);
assert_string_equal(node->schema->name, "x");
- assert_string_equal("val", LYD_CANON_VALUE(node));
+ assert_string_equal("val1", LYD_CANON_VALUE(node));
- ret = lyd_new_path2(root, NULL, "/a:l2[1]/c/x", "val", 0, 0, NULL, &node);
+ ret = lyd_new_path2(root, NULL, "/a:c2/l3[1]", NULL, 0, 0, NULL, &node);
assert_int_equal(ret, LY_EEXIST);
- ret = lyd_new_path2(root, NULL, "/a:l2[1]/c/x", "val", 0, LYD_NEW_PATH_UPDATE, NULL, &node);
+ ret = lyd_new_path2(root, NULL, "/a:c2/l3[2]/x", "val2", 0, 0, NULL, &node);
assert_int_equal(ret, LY_SUCCESS);
- assert_null(node);
- ret = lyd_new_path2(root, NULL, "/a:l2[1]/c/x", "val2", 0, LYD_NEW_PATH_UPDATE, NULL, &node);
+ ret = lyd_new_path2(root, NULL, "/a:c2/l3/x", "val3", 0, 0, NULL, &node);
assert_int_equal(ret, LY_SUCCESS);
assert_non_null(node);
- assert_string_equal(node->schema->name, "x");
- assert_string_equal("val2", LYD_CANON_VALUE(node));
- lyd_free_tree(root);
+ ret = lyd_new_path2(root, NULL, "/a:c2/l3[4]/x", "empty", 0, 0, NULL, &node);
+ assert_int_equal(ret, LY_SUCCESS);
+ assert_non_null(node);
+
+ ret = lyd_new_path2(root, NULL, "/a:c2/l3[4]/x", "val4", 0, LYD_NEW_PATH_UPDATE, NULL, &node);
+ assert_int_equal(ret, LY_SUCCESS);
+ assert_non_null(node);
+
+ ret = lyd_new_path2(root, NULL, "/a:c2/l3[5]/x", "val5", 0, 0, NULL, &node);
+ assert_int_equal(ret, LY_SUCCESS);
+ assert_non_null(node);
+
+ ret = lyd_new_path2(root, NULL, "/a:c2/l3[6]/x", "val6", 0, 0, NULL, &node);
+ assert_int_equal(ret, LY_SUCCESS);
+ assert_non_null(node);
+
+ lyd_print_mem(&str, root, LYD_XML, LYD_PRINT_WITHSIBLINGS);
+ assert_string_equal(str,
+ "<c2 xmlns=\"urn:tests:a\">\n"
+ " <l3>\n"
+ " <x>val1</x>\n"
+ " </l3>\n"
+ " <l3>\n"
+ " <x>val2</x>\n"
+ " </l3>\n"
+ " <l3>\n"
+ " <x>val3</x>\n"
+ " </l3>\n"
+ " <l3>\n"
+ " <x>val4</x>\n"
+ " </l3>\n"
+ " <l3>\n"
+ " <x>val5</x>\n"
+ " </l3>\n"
+ " <l3>\n"
+ " <x>val6</x>\n"
+ " </l3>\n"
+ "</c2>\n");
+ free(str);
+ lyd_free_siblings(root);
+
+ /* state leaf-list */
+ ret = lyd_new_path2(NULL, UTEST_LYCTX, "/a:ll2", "val_first", 0, 0, &root, &node);
+ assert_int_equal(ret, LY_SUCCESS);
+ assert_non_null(root);
+ assert_string_equal(node->schema->name, "ll2");
+ assert_string_equal("val_first", LYD_CANON_VALUE(node));
+
+ ret = lyd_new_path2(root, NULL, "/a:ll2[1]", "", 0, 0, NULL, &node);
+ assert_int_equal(ret, LY_EEXIST);
+
+ ret = lyd_new_path2(root, NULL, "/a:ll2[2]", "val2", 0, 0, NULL, &node);
+ assert_int_equal(ret, LY_SUCCESS);
+
+ ret = lyd_new_path2(root, NULL, "/a:ll2[1]", "val", 0, LYD_NEW_PATH_UPDATE, NULL, &node);
+ assert_int_equal(ret, LY_SUCCESS);
+ assert_non_null(node);
+
+ ret = lyd_new_path2(root, UTEST_LYCTX, "/a:ll2", "val3", 0, 0, NULL, &node);
+ assert_int_equal(ret, LY_SUCCESS);
+ assert_non_null(node);
+
+ ret = lyd_new_path2(root, NULL, "/a:ll2[3][.='val3']", NULL, 0, 0, NULL, &node);
+ assert_int_equal(ret, LY_EVALID);
+
+ lyd_print_mem(&str, root, LYD_XML, LYD_PRINT_WITHSIBLINGS);
+ assert_string_equal(str,
+ "<ll2 xmlns=\"urn:tests:a\">val</ll2>\n"
+ "<ll2 xmlns=\"urn:tests:a\">val2</ll2>\n"
+ "<ll2 xmlns=\"urn:tests:a\">val3</ll2>\n");
+ free(str);
+ lyd_free_siblings(root);
}
static void