diff options
author | Daniil Baturin <daniil@baturin.org> | 2015-04-26 17:49:28 +0600 |
---|---|---|
committer | Daniil Baturin <daniil@baturin.org> | 2015-04-26 17:49:28 +0600 |
commit | de448723e5a9443f5df7f367e70990c58a9a04e3 (patch) | |
tree | acf564a093b9fce649f6d4d4651364084395a176 | |
parent | 3891244d49d3c65ef6da6b8644cfb9097b0d51b0 (diff) | |
download | vyconf-de448723e5a9443f5df7f367e70990c58a9a04e3.tar.gz vyconf-de448723e5a9443f5df7f367e70990c58a9a04e3.zip |
Add config tree module.
-rw-r--r-- | _oasis | 19 | ||||
-rw-r--r-- | src/config_tree.ml | 36 | ||||
-rw-r--r-- | src/config_tree.mli | 25 | ||||
-rw-r--r-- | test/config_tree_test.ml | 42 |
4 files changed, 122 insertions, 0 deletions
@@ -27,6 +27,11 @@ Library "reference_tree" FindlibParent: vyconf BuildDepends: xml-light, pcre +Library "config_tree" + Path: src + Modules: Config_tree + FindlibParent: vyconf + Library "value_checker" Path: src Modules: Value_checker @@ -60,6 +65,14 @@ Executable "reference_tree_test" Install: false BuildDepends: oUnit, xml-light, pcre, vyconf +Executable "config_tree_test" + Path: test + MainIs: config_tree_test.ml + Build$: flag(tests) + CompiledObject: best + Install: false + BuildDepends: oUnit, vyconf + Executable "vylist_test" Path: test MainIs: vylist_test.ml @@ -96,6 +109,12 @@ Test "reference_tree_test" Command: $reference_tree_test WorkingDirectory: test +Test "config_tree_test" + Run$: flag(tests) + TestTools: config_tree_test + Command: $config_tree_test + WorkingDirectory: test + Test "vylist_test" Run$: flag(tests) TestTools: vylist_test diff --git a/src/config_tree.ml b/src/config_tree.ml new file mode 100644 index 0000000..289cf7e --- /dev/null +++ b/src/config_tree.ml @@ -0,0 +1,36 @@ +exception Duplicate_value + +type config_node_data = { + values: string list; + comment: string; + node_type: Vytree.node_type; +} + +type t = config_node_data Vytree.t + +let default_data = { + values = []; + comment = ""; + node_type = Vytree.Other; +} + +let make = Vytree.make default_data + +let set_value node path value = + let data = { default_data with values=[value] } in + Vytree.update node path data + +let add_value node path value = + let node' = Vytree.get node path in + let data = Vytree.data_of_node node' in + let values = data.values in + match (Vylist.find (fun x -> x = value) values) with + | Some _ -> raise Duplicate_value + | None -> + let values = values @ [value] in + Vytree.update node path ({data with values=values}) + +let get_values node path = + let node' = Vytree.get node path in + let data = Vytree.data_of_node node' in + data.values diff --git a/src/config_tree.mli b/src/config_tree.mli new file mode 100644 index 0000000..93a8b76 --- /dev/null +++ b/src/config_tree.mli @@ -0,0 +1,25 @@ +exception Duplicate_value + +type config_node_data = { + values : string list; + comment : string; + node_type : Vytree.node_type; +} + +type t = config_node_data Vytree.t + +val default_data : config_node_data + +val make : string -> config_node_data Vytree.t + +val set_value : + config_node_data Vytree.t -> + string list -> string -> config_node_data Vytree.t + +val add_value : + config_node_data Vytree.t -> + string list -> string -> config_node_data Vytree.t + +val get_values : + config_node_data Vytree.t -> + string list -> string list diff --git a/test/config_tree_test.ml b/test/config_tree_test.ml new file mode 100644 index 0000000..625bd2b --- /dev/null +++ b/test/config_tree_test.ml @@ -0,0 +1,42 @@ +open OUnit2 + +module VT = Vytree +open Config_tree + +let test_set_value test_ctxt = + let node = make "root" in + let node = VT.insert node ["foo"] default_data in + let node = set_value node ["foo"] "bar" in + let data = VT.data_of_node (VT.get node ["foo"]) in + assert_equal data.values ["bar"] + +let test_get_values test_ctxt = + let node = make "root" in + let node = VT.insert node ["foo"] default_data in + let node = set_value node ["foo"] "bar" in + assert_equal (get_values node ["foo"]) ["bar"] + +let test_add_value test_ctxt = + let node = make "root" in + let node = VT.insert node ["foo"] default_data in + let node = add_value node ["foo"] "bar" in + let node = add_value node ["foo"] "baz" in + assert_equal (get_values node ["foo"]) ["bar"; "baz"] + +let test_add_value_duplicate test_ctxt = + let node = make "root" in + let node = VT.insert node ["foo"] default_data in + let node = set_value node ["foo"] "bar" in + assert_raises Duplicate_value (fun () -> add_value node ["foo"] "bar") + +let suite = + "VyConf config tree tests" >::: [ + "test_set_value" >:: test_set_value; + "test_get_values" >:: test_get_values; + "test_add_value" >:: test_add_value; + "test_add_value_duplicate" >:: test_add_value_duplicate; + ] + +let () = + run_test_tt_main suite + |