diff options
| author | Daniil Baturin <daniil@baturin.org> | 2015-04-28 22:38:06 +0600 |
|---|---|---|
| committer | Daniil Baturin <daniil@baturin.org> | 2015-04-28 22:38:06 +0600 |
| commit | f5b79e1f0c86bcd151d41d1dba31bfdf3e84c140 (patch) | |
| tree | 51a7d77f49fb74458c6e6653b8aef498f97062bf /test/vytree_test.ml | |
| parent | e2156cbf273d774a43fd3515cab87ac9c4c64c4f (diff) | |
| download | vyconf-f5b79e1f0c86bcd151d41d1dba31bfdf3e84c140.tar.gz vyconf-f5b79e1f0c86bcd151d41d1dba31bfdf3e84c140.zip | |
Rename vyconf_tree_test to just vytree_test.
Diffstat (limited to 'test/vytree_test.ml')
| -rw-r--r-- | test/vytree_test.ml | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/test/vytree_test.ml b/test/vytree_test.ml new file mode 100644 index 0000000..24a6d1e --- /dev/null +++ b/test/vytree_test.ml @@ -0,0 +1,144 @@ +open OUnit2 +open Vytree + +(* Destructuting a freshly made node gives us what + we made it from *) +let test_make_node test_ctxt = + let node = make () "root" in + assert_equal (name_of_node node) "root"; + assert_equal (data_of_node node) (); + assert_equal (children_of_node node) [] + +(* XXX: these comparisons are awkward, but this is + probably the only way to track the problem + down to insert if insert breaks *) + +(* Inserting at single-item path adds a child to + children list *) +let test_insert_immediate_child test_ctxt = + let node = make () "root" in + let node' = insert node ["foo"] () in + assert_equal (children_of_node node') + [make () "foo"] + +(* Inserting one child after another adds it to the + end of the children list *) +let test_insert_multiple_children test_ctxt = + let node = make () "root" in + let node' = insert node ["foo"] () in + let node'' = insert node' ["bar"] () in + assert_equal (children_of_node node'') + [make () "bar"; make () "foo"] + +(* Inserting a child at a two-item path creates a tree + two levels deep *) +let test_insert_multi_level test_ctxt = + let node = make () "root" in + let node = insert node ["foo"] () in + let node = insert node ["foo"; "bar"] () in + let bar = make () "bar" in + let foo = make_full () "foo" [bar] in + let root = make_full () "root" [foo] in + assert_equal root node + +(* Inserting duplicate child fails *) +let test_insert_duplicate_child test_ctxt = + let node = make () "root" in + let node = insert node ["foo"] () in + assert_raises Duplicate_child (fun () -> insert node ["foo"] ()) + +(* list_children correctly returns a list of children names *) +let test_list_children test_ctxt = + let node = make () "root" in + let node = insert node ["foo"] () in + let node = insert node ["bar"] () in + assert_equal (list_children node) ["bar"; "foo"] + +(* Deleting a child, well, deletes it *) +let test_delete_immediate_child test_ctxt = + let node = make () "root" in + let node' = insert node ["foo"] () in + let node' = delete node' ["foo"] in + assert_equal node node' + +(* Deleting a child at multi-level path works *) +let test_delete_multi_level test_ctxt = + let node = make () "root" in + let node' = insert node ["foo"] () in + let node' = insert node' ["foo"; "bar"] () in + let foo_node = insert node ["foo"] () in + let node' = delete node' ["foo"; "bar"] in + assert_equal node' foo_node + +(* Attempt to delete a node at non-existent path raises an exception *) +let test_delete_nonexistent test_ctxt = + let node = make () "root" in + assert_raises Nonexistent_path (fun () -> delete node ["foo"; "bar"]) + +(* get_child works with immediate children *) +let test_get_immediate_child test_ctxt = + let node = make () "root" in + let node' = insert node ["foo"] () in + assert_equal (name_of_node (get 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 node ["foo"] () in + let node = insert node ["foo"; "bar"] () in + assert_equal (name_of_node (get 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 node ["foo"; "bar"]) + +(* update works *) +let test_update test_ctxt = + let node = make 0 "root" in + let node = insert node ["foo"] 1 in + assert_equal (data_of_node (get (update node ["foo"] 9) ["foo"])) 9 + +(* get_existent_path works *) +let test_get_existent_path test_ctxt = + let node = make () "root" in + let node = insert node ["foo"] () in + let node = insert node ["foo"; "bar"] () in + assert_equal (get_existent_path node ["foo"; "bar"; "baz"]) ["foo"; "bar"] + +let test_exists_existent test_ctxt = + let node = make () "root" in + let node = insert node ["foo"] () in + let node = insert node ["foo"; "bar"] () in + assert_equal (exists node ["foo"; "bar"]) true + +let test_exists_nonexistent test_ctxt = + let node = make () "root" in + let node = insert node ["foo"] () in + let node = insert node ["foo"; "bar"] () in + assert_equal (exists node ["foo"; "bar"; "baz"]) false + + +let suite = + "VyConf tree tests" >::: [ + "test_make_node" >:: test_make_node; + "test_insert_immediate_child" >:: test_insert_immediate_child; + "test_insert_multiple_children" >:: test_insert_multiple_children; + "test_insert_multi_level" >:: test_insert_multi_level; + "test_insert_duplicate_child" >:: test_insert_duplicate_child; + "test_list_children" >:: test_list_children; + "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; + "test_get_child_nonexistent" >:: test_get_child_nonexistent; + "test_update" >:: test_update; + "test_get_existent_path" >:: test_get_existent_path; + "test_exists_existent" >:: test_exists_existent; + "test_exists_nonexistent" >:: test_exists_nonexistent; + ] + +let () = + run_test_tt_main suite + |
