mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-07 11:45:31 -05:00
162 lines
3.9 KiB
OCaml
162 lines
3.9 KiB
OCaml
|
|
|
|
module Test = (val Containers_testlib.make ~__FILE__())
|
|
open Test
|
|
open CCPersistentHashtbl;;
|
|
|
|
module H = Make(CCInt)
|
|
|
|
let my_list =
|
|
[ 1, "a";
|
|
2, "b";
|
|
3, "c";
|
|
4, "d";
|
|
]
|
|
|
|
let my_iter = Iter.of_list my_list
|
|
|
|
let _list_uniq = CCList.sort_uniq
|
|
~cmp:(fun a b -> Stdlib.compare (fst a) (fst b))
|
|
|
|
let _list_int_int = Q.(
|
|
map_same_type _list_uniq
|
|
(list_of_size Gen.(0 -- 40) (pair small_int small_int))
|
|
);;
|
|
|
|
t @@ fun () ->
|
|
let h = H.of_iter my_iter in
|
|
assert_equal "a" (H.find h 1);
|
|
assert_raises ((=)Not_found) (fun () -> H.find h 5);
|
|
let h' = H.replace h 5 "e" in
|
|
assert_equal "a" (H.find h' 1);
|
|
assert_equal "e" (H.find h' 5);
|
|
assert_equal "a" (H.find h 1);
|
|
assert_raises ((=)Not_found) (fun () -> H.find h 5);
|
|
true;;
|
|
|
|
t @@ fun () ->
|
|
let n = 10000 in
|
|
let seq = Iter.map (fun i -> i, string_of_int i) Iter.(0--n) in
|
|
let h = H.of_iter seq in
|
|
Iter.iter
|
|
(fun (k,v) ->
|
|
assert_equal ~printer:(fun x -> x) v (H.find h k))
|
|
seq;
|
|
assert_raises ((=)Not_found) (fun () -> H.find h (n+1));
|
|
true;;
|
|
|
|
q _list_int_int
|
|
(fun l ->
|
|
let h = H.of_list l in
|
|
List.for_all
|
|
(fun (k,v) ->
|
|
try
|
|
H.find h k = v
|
|
with Not_found -> false)
|
|
l
|
|
);;
|
|
|
|
t @@ fun () ->
|
|
let h = H.of_iter
|
|
Iter.(map (fun i -> i, string_of_int i)
|
|
(0 -- 200)) in
|
|
assert_equal 201 (H.length h);
|
|
true;;
|
|
|
|
q _list_int_int (fun l ->
|
|
let h = H.of_list l in
|
|
H.length h = List.length l
|
|
);;
|
|
|
|
t @@ fun () ->
|
|
let h = H.of_iter my_iter in
|
|
assert_equal "a" (H.find h 1);
|
|
assert_raises ((=)Not_found) (fun () -> H.find h 5);
|
|
let h1 = H.add h 5 "e" in
|
|
assert_equal "a" (H.find h1 1);
|
|
assert_equal "e" (H.find h1 5);
|
|
assert_equal "a" (H.find h 1);
|
|
let h2 = H.add h1 5 "ee" in
|
|
assert_equal "ee" (H.find h2 5);
|
|
assert_raises ((=)Not_found) (fun () -> H.find h 5);
|
|
let h3 = H.remove h2 1 in
|
|
assert_equal "ee" (H.find h3 5);
|
|
assert_raises ((=)Not_found) (fun () -> H.find h3 1);
|
|
let h4 = H.remove h3 5 in
|
|
assert_equal "e" (H.find h4 5);
|
|
assert_equal "ee" (H.find h3 5);
|
|
true;;
|
|
|
|
t @@ fun () ->
|
|
let h = H.of_iter my_iter in
|
|
assert_equal (H.find h 2) "b";
|
|
assert_equal (H.find h 3) "c";
|
|
assert_equal (H.find h 4) "d";
|
|
assert_equal (H.length h) 4;
|
|
let h = H.remove h 2 in
|
|
assert_equal (H.find h 3) "c";
|
|
assert_equal (H.length h) 3;
|
|
assert_raises ((=)Not_found) (fun () -> H.find h 2);
|
|
true;;
|
|
|
|
t @@ fun () ->
|
|
let open Iter.Infix in
|
|
let n = 10000 in
|
|
let seq = Iter.map (fun i -> i, string_of_int i) (0 -- n) in
|
|
let h = H.of_iter seq in
|
|
assert_equal (n+1) (H.length h);
|
|
let h = Iter.fold (fun h i -> H.remove h i) h (0 -- 500) in
|
|
assert_equal (n-500) (H.length h);
|
|
assert_bool "is_empty" (H.is_empty (H.create 16));
|
|
true;;
|
|
|
|
q _list_int_int (fun l ->
|
|
let h = H.of_list l in
|
|
let h = List.fold_left (fun h (k,_) -> H.remove h k) h l in
|
|
H.is_empty h);;
|
|
|
|
t @@ fun () ->
|
|
let t1 = H.of_list [1, "a"; 2, "b1"] in
|
|
let t2 = H.of_list [2, "b2"; 3, "c"] in
|
|
let t = H.merge
|
|
~f:(fun _ -> function
|
|
| `Right v2 -> Some v2
|
|
| `Left v1 -> Some v1
|
|
| `Both (s1,s2) -> if s1 < s2 then Some s1 else Some s2)
|
|
t1 t2
|
|
in
|
|
assert_equal ~printer:string_of_int 3 (H.length t);
|
|
assert_equal "a" (H.find t 1);
|
|
assert_equal "b1" (H.find t 2);
|
|
assert_equal "c" (H.find t 3);
|
|
true;;
|
|
|
|
q _list_int_int (fun l ->
|
|
let l1, l2 = List.partition (fun (x,_) -> x mod 2 = 0) l in
|
|
let h1 = H.of_list l1 in
|
|
let h2 = H.add_list h1 l2 in
|
|
List.for_all
|
|
(fun (k,v) -> H.find h2 k = v)
|
|
l
|
|
&&
|
|
List.for_all
|
|
(fun (k,v) -> H.find h1 k = v)
|
|
l1
|
|
&&
|
|
List.length l1 = H.length h1
|
|
&&
|
|
List.length l = H.length h2
|
|
);;
|
|
|
|
t @@ fun () ->
|
|
let h = H.of_iter my_iter in
|
|
let l = Iter.to_list (H.to_iter h) in
|
|
assert_equal my_list (List.sort compare l);
|
|
true;;
|
|
|
|
t @@ fun () ->
|
|
let h = H.of_iter my_iter in
|
|
assert_equal "b" (H.find h 2);
|
|
assert_equal "a" (H.find h 1);
|
|
assert_raises ((=)Not_found) (fun () -> H.find h 42);
|
|
true;;
|