summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/vytree/vytree.ml18
-rw-r--r--test/vyconf_tree_test.ml19
2 files changed, 37 insertions, 0 deletions
diff --git a/src/vytree/vytree.ml b/src/vytree/vytree.ml
index 6a97211..7ee3e65 100644
--- a/src/vytree/vytree.ml
+++ b/src/vytree/vytree.ml
@@ -78,3 +78,21 @@ let rec delete_child node path =
| Some next_child' ->
let new_node = delete_child next_child' names in
replace_child node new_node
+
+let rec get_child node path =
+ match path with
+ | [] -> raise Empty_path
+ | [name] ->
+ begin
+ let child = find_child node name in
+ match child with
+ | None -> raise Nonexistent_path
+ | Some child' -> child'
+ end
+ | name :: names ->
+ begin
+ let next_child = find_child node name in
+ match next_child with
+ | None -> raise Nonexistent_path
+ | Some child' -> get_child child' names
+ end
diff --git a/test/vyconf_tree_test.ml b/test/vyconf_tree_test.ml
index 69efcfc..2bf40be 100644
--- a/test/vyconf_tree_test.ml
+++ b/test/vyconf_tree_test.ml
@@ -73,6 +73,23 @@ let test_delete_nonexistent test_ctxt =
let node = make "root" () in
assert_raises Nonexistent_path (fun () -> delete_child node ["foo"; "bar"])
+(* get_child works with immediate children *)
+let test_get_immediate_child test_ctxt =
+ let node = make "root" () in
+ let node' = insert_child () node ["foo"] () in
+ assert_equal (name_of_node (get_child node' ["foo"])) "foo"
+
+(* get_child works with multi-level paths *)
+let test_get_child_multilevel test_ctxt =
+ let node = make "root" () in
+ let node' = insert_child () node ["foo"; "bar"] () in
+ assert_equal (name_of_node (get_child node' ["foo"; "bar"])) "bar"
+
+(* get_child raises Nonexistent_path for non-existent paths *)
+let test_get_child_nonexistent test_ctxt =
+ let node = make "root" () in
+ assert_raises Nonexistent_path (fun () -> get_child node ["foo"; "bar"])
+
let suite =
"VyConf tree tests" >::: [
"test_make_node" >:: test_make_node;
@@ -84,6 +101,8 @@ let suite =
"test_delete_immediate_child" >:: test_delete_immediate_child;
"test_delete_multi_level" >:: test_delete_multi_level;
"test_delete_nonexistent" >:: test_delete_nonexistent;
+ "test_get_immediate_child" >:: test_get_immediate_child;
+ "test_get_child_multilevel" >:: test_get_child_multilevel;
]
let () =