ocaml-containers/tests/core/t_vector.ml
2022-07-02 00:29:25 -04:00

361 lines
13 KiB
OCaml

module T = (val Containers_testlib.make ~__FILE__ ())
include T;;
open CCVector;;
t @@ fun () -> (create_with ~capacity:200 1 |> capacity) >= 200;;
t @@ fun () -> return 42 |> to_list = [42];;
t @@ fun () -> return 42 |> length = 1;;
t @@ fun () ->
let v = create_with ~capacity:10 1 in
ensure v 200;
capacity v >= 200;;
t @@ fun () -> let v = create() in push v 0.; push v 1.; push v 2.; 3=length v;;
t @@ fun () -> let v = create() in push v 1.; push v 2.; push v 3.;
6. = (get v 0 +. get v 1 +. get v 2);;
t @@ fun () -> let v = create() in push v 0; push v 1; push v 2; 3=length v;;
t @@ fun () -> let v = create() in push v 1; push v 2; push v 3;
6 = (get v 0 + get v 1 + get v 2);;
t @@ fun () -> let v = create() in push v "a"; push v "b"; push v "c"; 3=length v;;
t @@ fun () -> let v = create() in push v "a"; push v "b"; push v "c";
"abc" = String.concat "" (to_list v);;
t @@ fun () ->
let v = create() in
push v 0.; push v 1.;
clear v;
push v 0.; push v 1.; push v 7.; push v 10.; push v 12.;
truncate v 2;
assert_equal 1. (fold (+.) 0. v);
clear v;
assert_equal 0 (size v);
push v 0.; push v 1.; push v 7.; push v 10.; push v 12.;
assert_equal (1. +. 7. +. 10. +. 12.) (fold (+.) 0. v);
true;;
t @@ fun () ->
let v = of_iter Iter.(1 -- 10) in
assert_equal 10 (size v);
clear v;
assert_equal 0 (size v);
assert (Iter.is_empty (to_iter v));
true;;
t @@ fun () -> let v = create () in push v 1; to_list v = [1];;
t @@ fun () -> let v = of_list [1;2;3] in push v 4; to_list v = [1;2;3;4];;
t @@ fun () -> let v = make 1 0 in resize_with v (fun i -> i) 5; to_list v = [0;1;2;3;4];;
t @@ fun () -> let v = make 1 0 in resize_with v (fun i -> i) 5; CCList.length (to_list v) = 5;;
t @@ fun () -> let v = create_with ~capacity:2 0 in resize_with v (fun i -> i) 5; to_list v = [0;1;2;3;4];;
t @@ fun () -> let v = make 5 0 in resize_with v (fun i -> i) 5; to_list v = [0;0;0;0;0];;
t @@ fun () -> let v = make 5 0 in resize_with v (fun i -> i) 6; to_list v = [0;0;0;0;0;5];;
t @@ fun () -> let v = make 5 0 in
try resize_with v (fun i -> i) (-1); false
with Invalid_argument _ -> true;;
t @@ fun () -> let v = make 5 0 in resize_with v (fun i -> i) 5; List.length (to_list v) = 5;;
t @@ fun () -> let v = make 1 0 in resize_with_init v ~init:1 5; to_list v = [0;1;1;1;1];;
t @@ fun () -> let v = make 1 0 in resize_with_init v ~init:1 5; List.length (to_list v) = 5;;
t @@ fun () ->
let v = create_with ~capacity:2 0 in
resize_with_init v ~init:1 5; to_list v = [1;1;1;1;1];;
t @@ fun () -> let v = make 5 0 in resize_with_init v ~init:1 5; to_list v = [0;0;0;0;0];;
t @@ fun () -> let v = make 3 0 in resize_with_init v ~init:1 5; to_list v = [0;0;0;1;1];;
t @@ fun () -> let v = make 5 0 in
try resize_with_init v ~init:1 (-1); false
with Invalid_argument _ -> true;;
t @@ fun () -> let v = make 5 0 in resize_with_init v ~init:1 5; List.length (to_list v) = 5;;
(* test for asymptotic behavior *)
t @@ fun () -> let v =make 1 0 in
for i=0 to 100_000 do resize_with_init v ~init:10 i; done; true;;
t @@ fun () -> let v1 = init 5 (fun i->i) and v2 = init 5 (fun i->i+5) in
append v1 v2; to_list v1 = CCList.(0--9);;
t @@ fun () -> let empty = create () and v2 = init 5 (fun i->i) in
append empty v2; to_list empty = CCList.(0--4);;
t @@ fun () -> let v1 = init 5 (fun i->i) and empty = create () in
append v1 empty; to_list v1 = CCList.(0--4);;
t @@ fun () -> let v = init 3 (fun i->i) in
append v v; to_list v = [0; 1; 2; 0; 1; 2];;
t @@ fun () -> let empty = create () in
append empty empty; to_list empty = [];;
t @@ fun () ->
let a = of_iter Iter.(1 -- 5) in
let b = of_iter Iter.(6 -- 10) in
append a b;
assert_equal 10 (size a);
assert_equal (Iter.to_array Iter.(1 -- 10)) (to_array a);
assert_equal (Iter.to_array Iter.(6 -- 10)) (to_array b);
true;;
q Q.(list_of_size (Gen.int_range 10 10) small_int) (fun l ->
let v1 = of_list l and v2 = of_list l in
remove_and_shift v1 9;
remove_unordered v2 9;
to_list v1 = (to_list v2));;
q Q.(list_of_size (Gen.int_range 10 10) small_int) (fun l ->
let l = List.sort CCInt.compare l in
let v = of_list l in
remove_and_shift v 3;
to_list v = (List.sort CCInt.compare (to_list v)));;
q Q.(list_of_size (Gen.int_range 10 10) small_int) (fun l ->
let l = List.sort CCInt.compare l in
let v1 = of_list l and v2 = of_list l in
remove_and_shift v1 3;
remove_unordered v2 3;
to_list v1 = (List.sort CCInt.compare (to_list v2)));;
t @@ fun () -> let v = (1 -- 5) in insert v 3 9; to_list v = [1;2;3;9;4;5];;
t @@ fun () -> let v = create () in insert v 0 2; to_list v = [2];;
t @@ fun () -> let v = (1 -- 3) in remove_and_shift v 1; insert v 1 5; to_list v = [1;5;3];;
t @@ fun () -> let v = (1 -- 3) in remove_and_shift v 0; insert v 2 5; to_list v = [2;3;5];;
t @@ fun () -> let v = (1 -- 3) in insert v 3 5; to_list v = [1;2;3;5];;
t @@ fun () ->
let v1 = init 5 (fun i->i) and v2 = Array.init 5 (fun i->i+5) in
append_array v1 v2; to_list v1 = CCList.(0--9);;
t @@ fun () -> let empty = create () in
append_array empty CCArray.(0--5); to_list empty = CCList.(0--5);;
t @@ fun () -> let v1 = init 5 (fun i->i) in
append_array v1 [| |]; to_list v1 = CCList.(0--4);;
t @@ fun () -> let empty = create () in
append_array empty [| |]; to_list empty = [];;
q Q.(pair (list int)(list int)) (fun (l1,l2) ->
let v = of_list l1 in append_list v l2;
to_list v = (l1 @ l2)) ;;
q Q.(pair (list int)(list int)) (fun (l1,l2) ->
let v = of_list l1 in append_list v l2;
length v = List.length l1 + List.length l2);;
q Q.(pair (list int)(list int)) (fun (l1,l2) ->
let v = of_list l1 in append_gen v (Gen.of_list l2);
to_list v = (l1 @ l2));;
q Q.(pair (list int)(list int)) (fun (l1,l2) ->
let v = of_list l1 in append_gen v (Gen.of_list l2);
length v = List.length l1 + List.length l2);;
let gen x =
let small = length in
let print = CCOption.map (fun p x -> Q.Print.list p (CCVector.to_list x)) x.Q.print in
Q.make ?print ~small Q.Gen.(list x.Q.gen >|= of_list);;
q (Q.pair (gen Q.int) (gen Q.int)) (fun (v1,v2) ->
let l1 = to_list v1 in
append v1 v2;
Iter.to_list (to_iter v1) =
Iter.(to_list (append (of_list l1) (to_iter v2)))
);;
t @@ fun () -> equal (=) (create ()) (create ());;
t @@ fun () -> equal (=) (return 42) (return 42);;
t @@ fun () -> not (equal (=) (create ()) (return 42));;
t @@ fun () -> not (equal (=) (return 42) (create ()));;
q Q.(let g = list_of_size Gen.(0--10) small_int in pair g g) (fun (l1,l2) ->
equal (=) (of_list l1) (of_list l2) = (l1=l2));;
q Q.(pair (small_list small_int)(small_list small_int)) (fun (l1,l2) ->
let v1 = of_list l1 in
let v2 = of_list l2 in
equal (=) v1 v2 = (l1=l2));;
q Q.(pair (small_list small_int)(small_list small_int)) (fun (l1,l2) ->
let v1 = of_list l1 in
let v2 = of_list l2 in
compare Stdlib.compare v1 v2 = CCList.compare Stdlib.compare l1 l2) ;;
t @@ fun () -> 1 -- 10 |> top = Some 10;;
t @@ fun () -> create () |> top = None;;
t @@ fun () -> 1 -- 10 |> top_exn = 10;;
t @@ fun () -> (let v = of_list [1;2;3] in let v' = copy v in to_list v' = [1;2;3]);;
t @@ fun () -> create () |> copy |> is_empty;;
t @@ fun () ->
let v = of_iter Iter.(1 -- 100) in
assert_equal 100 (size v);
let v' = copy v in
assert_equal 100 (size v');
clear v';
assert (is_empty v');
assert (not (is_empty v));
true;;
q Q.(small_list small_int) (fun l ->
let v = of_list l in
let v' = copy v in
equal (=) v v');;
t @@ fun () ->
let v = of_iter Iter.(1 -- 10) in
truncate v 5;
assert_equal [1;2;3;4;5] (to_list v);
true ;;
q (gen Q.small_int) (fun v ->
let n = size v / 2 in
let l = to_list v in
let h = Iter.(to_list (take n (of_list l))) in
let v' = copy v in
truncate v' n;
h = to_list v'
) ;;
q (gen Q.small_int) (fun v ->
let v' = copy v in
shrink_to_fit v;
to_list v = to_list v'
) ;;
q (gen Q.small_int) (fun v ->
let v' = copy v in
sort' Stdlib.compare v';
let l = to_list v' in
List.sort Stdlib.compare l = l
);;
t @@ fun () -> let v = of_list [1;4;5;3;2;4;1] in
uniq_sort Stdlib.compare v; to_list v = [1;2;3;4;5];;
q ~long_factor:10
Q.(small_list small_int) (fun l ->
let v = of_list l in
uniq_sort Stdlib.compare v;
to_list v = (CCList.sort_uniq ~cmp:Stdlib.compare l));;
t @@ fun () -> let v = (0--6) in
iteri (fun i _ -> if i = 3 then remove_unordered v i) v; length v = 6;;
t @@ fun () ->
let v = create() in push v 1; push v 2; push v 3;
to_list (map string_of_int v) = ["1"; "2"; "3"];;
q Q.(pair (fun1 Observable.int small_int) (small_list small_int)) (fun (Q.Fun (_,f),l) ->
let v = of_list l in
to_list (map f v) = List.map f l);;
t @@ fun () ->
let v = create() in push v 1; push v 2; push v 3;
to_list (mapi (fun i e -> Printf.sprintf "%i %i" i e) v) = ["0 1"; "1 2"; "2 3"];;
q Q.(pair (fun2 Observable.int Observable.int small_int) (small_list small_int))
(fun (Q.Fun (_,f),l) ->
let v = of_list l in
to_list (mapi f v) = List.mapi f l);;
q Q.(pair (fun1 Observable.int small_int) (small_list small_int)) (fun (Q.Fun (_,f),l) ->
let v = of_list l in
map_in_place f v;
to_list v = List.map f l);;
t @@ fun () ->
let v = 1 -- 10 in filter_in_place (fun x->x<4) v;
to_list v = [1;2;3];;
q Q.(pair (fun1 Observable.int bool) (small_list small_int)) (fun (Q.Fun (_,f),l) ->
let v = of_list l in
filter_in_place f v;
to_list v = List.filter f l) ;;
t @@ fun () -> filter (fun x-> x mod 2=0) (of_list [1;2;3;4;5]) |> to_list = [2;4];;
t @@ fun () -> filter (fun x-> x mod 2=0) (1 -- 1_000_000) |> length = 500_000;;
q Q.(pair (fun1 Observable.int bool) (small_list small_int)) (fun (Q.Fun (_,f),l) ->
let v = of_list l in
to_list (filter f v) = List.filter f l);;
t @@ fun () -> fold (+) 0 (of_list [1;2;3;4;5]) = 15;;
t @@ fun () -> fold (+) 0 (create ()) = 0;;
q Q.(pair (fun2 Observable.int Observable.int small_int) (small_list small_int))
(fun (Q.Fun (_,f),l) ->
let v = of_list l in
fold f 0 v = List.fold_left f 0 l);;
q Q.(pair (fun1 Observable.int bool) (small_list small_int)) (fun (Q.Fun (_,f),l) ->
let v = of_list l in
exists f v = List.exists f l);;
q Q.(pair (fun1 Observable.int bool) (small_list small_int))
(fun (Q.Fun (_,f),l) ->
let v = of_list l in
for_all f v = List.for_all f l);;
q Q.(pair (fun1 Observable.int bool) (small_list small_int)) (fun (Q.Fun (_,f),l) ->
let v = of_list l in
find f v = CCList.find_pred f l);;
q Q.(list small_int) (fun l ->
let v = of_list l in
let f x = x>30 && x < 35 in
find_map (fun x -> if f x then Some x else None) v = find f v);;
q Q.(pair (fun1 Observable.int (option bool)) (small_list small_int)) (fun (Q.Fun (_,f),l) ->
let v = of_list l in
to_list (filter_map f v) = CCList.filter_map f l);;
q Q.(pair (fun1 Observable.int (option small_int)) (small_list small_int)) (fun (Q.Fun (_,f),l) ->
let v = of_list l in
filter_map_in_place f v;
to_list v = CCList.filter_map f l);;
(* check it frees memory properly *)
t @@ fun () ->
let s = "coucou" ^ "lol" in
let w = Weak.create 1 in
Weak.set w 0 (Some s);
let v = of_list ["a"; s] in
filter_in_place (fun s -> String.length s <= 1) v;
assert_equal 1 (length v);
assert_equal "a" (get v 0);
Gc.full_major();
assert_equal None (Weak.get w 0);
true;;
eq ~cmp:(=) ~printer:Q.Print.(list int)
[ 11; 12; 21; 22 ] (List.sort CCInt.compare @@
to_list @@ monoid_product (+) (of_list [10; 20]) (of_list [1; 2]));;
eq ~cmp:(=) ~printer:Q.Print.(list int)
[ 11; 12; 13; 14 ] (List.sort CCInt.compare @@
to_list @@ monoid_product (+) (of_list [10]) (of_list [1; 2; 3; 4]));;
q Q.(small_list small_int) (fun l ->
let v = of_list l in
rev_in_place v;
to_list v = List.rev l);;
t @@ fun () -> rev (of_list [1;2;3;4]) |> to_list = [4;3;2;1];;
t @@ fun () -> rev (of_list [1;2;3;4;5]) |> to_list = [5;4;3;2;1];;
t @@ fun () -> rev (create ()) |> to_list = [];;
q Q.(small_list small_int) (fun l ->
let v = of_list l in
to_list (rev v) = List.rev l);;
t @@ fun () -> let v = of_list [1;2;3] in (fun f->rev_iter f v) |> Iter.to_list = [3;2;1];;
q Q.(list int) (fun l ->
let v = of_list l in
(fun f->rev_iter f v) |> Iter.to_list = List.rev l);;
t @@ fun () -> of_iter Iter.(1 -- 10) |> to_list = CCList.(1 -- 10);;
q Q.(list int) (fun l ->
let v= of_list l in v |> to_iter_rev |> Iter.to_rev_list = l);;
t @@ fun () -> slice_iter (of_list [0;1;2;3;4]) 1 3 |> CCList.of_iter = [1;2;3];;
t @@ fun () -> slice_iter (of_list [0;1;2;3;4]) 1 4 |> CCList.of_iter = [1;2;3;4];;
t @@ fun () -> slice_iter (of_list [0;1;2;3;4]) 0 5 |> CCList.of_iter = [0;1;2;3;4];;
t @@ fun () -> (1 -- 4) |> to_list = [1;2;3;4];;
t @@ fun () -> (4 -- 1) |> to_list = [4;3;2;1];;
t @@ fun () -> (0 -- 0) |> to_list = [0];;
q Q.(pair small_int small_int) (fun (a,b) ->
(a -- b) |> to_list = CCList.(a -- b));;
q Q.(pair small_int small_int) (fun (a,b) ->
(a --^ b) |> to_list = CCList.(a --^ b));;
t @@ fun () -> of_list CCList.(1--300_000) |> to_list = CCList.(1--300_000);;
t @@ fun () -> let v = (1--10) in to_list v = Gen.to_list (to_gen v);;