mirror of
https://github.com/c-cube/ocaml-containers.git
synced 2025-12-06 03:05:28 -05:00
299 lines
6.7 KiB
OCaml
299 lines
6.7 KiB
OCaml
open CCArray
|
|
module T = (val Containers_testlib.make ~__FILE__ ())
|
|
include T;;
|
|
|
|
t @@ fun () ->
|
|
let st = Random.State.make [||] in
|
|
let a = 0 -- 10000 in
|
|
let b = Array.copy a in
|
|
shuffle_with st a;
|
|
a <> b
|
|
;;
|
|
|
|
eq (Some 1) (get_safe [| 1; 2; 3 |] 0);;
|
|
eq (Some 2) (get_safe [| 1; 2; 3 |] 1);;
|
|
eq (Some 3) (get_safe [| 1; 2; 3 |] 2);;
|
|
eq None (get_safe [| 1; 2; 3 |] 4);;
|
|
eq None (get_safe [| 1; 2; 3 |] max_int);;
|
|
eq None (get_safe [| 1; 2; 3 |] ~-1);;
|
|
eq None (get_safe [| 1; 2; 3 |] ~-42);;
|
|
|
|
q
|
|
Q.(array int)
|
|
(fun a ->
|
|
let b = map (( + ) 1) a in
|
|
map_inplace (( + ) 1) a;
|
|
b = a)
|
|
;;
|
|
|
|
t @@ fun () ->
|
|
fold_while
|
|
(fun acc b ->
|
|
if b then
|
|
acc + 1, `Continue
|
|
else
|
|
acc, `Stop)
|
|
0
|
|
(Array.of_list [ true; true; false; true ])
|
|
= 2
|
|
;;
|
|
|
|
eq
|
|
(6, [| "1"; "2"; "3" |])
|
|
(fold_map (fun acc x -> acc + x, string_of_int x) 0 [| 1; 2; 3 |])
|
|
;;
|
|
|
|
q
|
|
Q.(array int)
|
|
(fun a ->
|
|
fold_map (fun acc x -> x :: acc, x) [] a = (List.rev @@ Array.to_list a, a))
|
|
;;
|
|
|
|
eq
|
|
~printer:Q.Print.(array int)
|
|
[| 0; 1; 3; 6 |]
|
|
(scan_left ( + ) 0 [| 1; 2; 3 |])
|
|
;;
|
|
|
|
eq ~printer:Q.Print.(array int) [| 0 |] (scan_left ( + ) 0 [||]);;
|
|
|
|
t @@ fun () ->
|
|
reverse_in_place [||];
|
|
true
|
|
;;
|
|
|
|
t @@ fun () ->
|
|
reverse_in_place [| 1 |];
|
|
true
|
|
;;
|
|
|
|
t @@ fun () ->
|
|
let a = [| 1; 2; 3; 4; 5 |] in
|
|
reverse_in_place a;
|
|
a = [| 5; 4; 3; 2; 1 |]
|
|
;;
|
|
|
|
t @@ fun () ->
|
|
let a = [| 1; 2; 3; 4; 5; 6 |] in
|
|
reverse_in_place a;
|
|
a = [| 6; 5; 4; 3; 2; 1 |]
|
|
;;
|
|
|
|
eq ~cmp:( = ) ~printer:Q.Print.(array int) [||] (sorted Stdlib.compare [||]);;
|
|
|
|
eq ~cmp:( = )
|
|
~printer:Q.Print.(array int)
|
|
[| 0; 1; 2; 3; 4 |]
|
|
(sorted Stdlib.compare [| 3; 2; 1; 4; 0 |])
|
|
;;
|
|
|
|
q
|
|
Q.(array int)
|
|
(fun a ->
|
|
let b = Array.copy a in
|
|
Array.sort Stdlib.compare b;
|
|
b = sorted Stdlib.compare a)
|
|
;;
|
|
|
|
eq ~cmp:( = )
|
|
~printer:Q.Print.(array int)
|
|
[||]
|
|
(sort_indices Stdlib.compare [||])
|
|
;;
|
|
|
|
eq ~cmp:( = )
|
|
~printer:Q.Print.(array int)
|
|
[| 4; 2; 1; 0; 3 |]
|
|
(sort_indices Stdlib.compare [| "d"; "c"; "b"; "e"; "a" |])
|
|
;;
|
|
|
|
q
|
|
Q.(array_of_size Gen.(0 -- 30) printable_string)
|
|
(fun a ->
|
|
let b = sort_indices String.compare a in
|
|
sorted String.compare a = Array.map (Array.get a) b)
|
|
;;
|
|
|
|
eq ~cmp:( = )
|
|
~printer:Q.Print.(array int)
|
|
[||]
|
|
(sort_ranking Stdlib.compare [||])
|
|
;;
|
|
|
|
eq ~cmp:( = )
|
|
~printer:Q.Print.(array int)
|
|
[| 3; 2; 1; 4; 0 |]
|
|
(sort_ranking Stdlib.compare [| "d"; "c"; "b"; "e"; "a" |])
|
|
;;
|
|
|
|
q
|
|
Q.(array_of_size Gen.(0 -- 50) printable_string)
|
|
(fun a ->
|
|
let b = sort_ranking String.compare a in
|
|
let a_sorted = sorted String.compare a in
|
|
a = Array.map (Array.get a_sorted) b)
|
|
;;
|
|
|
|
q Q.(array small_int) (fun a -> rev (rev a) = a);;
|
|
t @@ fun () -> rev [| 1; 2; 3 |] = [| 3; 2; 1 |];;
|
|
t @@ fun () -> rev [| 1; 2 |] = [| 2; 1 |];;
|
|
t @@ fun () -> rev [||] = [||];;
|
|
q Q.(array small_int) (fun a -> mem 1 a = Array.mem 1 a);;
|
|
|
|
t @@ fun () ->
|
|
filter_map
|
|
(fun x ->
|
|
if x mod 2 = 0 then
|
|
Some (string_of_int x)
|
|
else
|
|
None)
|
|
[| 1; 2; 3; 4 |]
|
|
= [| "2"; "4" |]
|
|
;;
|
|
|
|
t @@ fun () ->
|
|
filter_map
|
|
(fun x ->
|
|
if x mod 2 = 0 then
|
|
Some (string_of_int x)
|
|
else
|
|
None)
|
|
[| 1; 2; 3; 4; 5; 6 |]
|
|
= [| "2"; "4"; "6" |]
|
|
;;
|
|
|
|
t @@ fun () ->
|
|
let a = [| 1; 3; 5 |] in
|
|
let a' = flat_map (fun x -> [| x; x + 1 |]) a in
|
|
a' = [| 1; 2; 3; 4; 5; 6 |]
|
|
;;
|
|
|
|
eq ~cmp:( = )
|
|
~printer:Q.Print.(array int)
|
|
[| 11; 12; 21; 22 |]
|
|
(sorted CCInt.compare @@ monoid_product ( + ) [| 10; 20 |] [| 1; 2 |])
|
|
;;
|
|
|
|
eq ~cmp:( = )
|
|
~printer:Q.Print.(array int)
|
|
[| 11; 12; 13; 14 |]
|
|
(sorted CCInt.compare @@ monoid_product ( + ) [| 10 |] [| 1; 2; 3; 4 |])
|
|
;;
|
|
|
|
t @@ fun () -> lookup ~cmp:CCInt.compare 2 [| 0; 1; 2; 3; 4; 5 |] = Some 2;;
|
|
t @@ fun () -> lookup ~cmp:CCInt.compare 4 [| 0; 1; 2; 3; 4; 5 |] = Some 4;;
|
|
t @@ fun () -> lookup ~cmp:CCInt.compare 0 [| 1; 2; 3; 4; 5 |] = None;;
|
|
t @@ fun () -> lookup ~cmp:CCInt.compare 6 [| 1; 2; 3; 4; 5 |] = None;;
|
|
t @@ fun () -> lookup ~cmp:CCInt.compare 3 [||] = None;;
|
|
t @@ fun () -> lookup ~cmp:CCInt.compare 1 [| 1 |] = Some 0;;
|
|
t @@ fun () -> lookup ~cmp:CCInt.compare 2 [| 1 |] = None;;
|
|
t @@ fun () -> bsearch ~cmp:CCInt.compare 3 [| 1; 2; 2; 3; 4; 10 |] = `At 3;;
|
|
|
|
t @@ fun () ->
|
|
bsearch ~cmp:CCInt.compare 5 [| 1; 2; 2; 3; 4; 10 |] = `Just_after 4
|
|
;;
|
|
|
|
t @@ fun () -> bsearch ~cmp:CCInt.compare 1 [| 1; 2; 5; 5; 11; 12 |] = `At 0;;
|
|
t @@ fun () -> bsearch ~cmp:CCInt.compare 12 [| 1; 2; 5; 5; 11; 12 |] = `At 5;;
|
|
t @@ fun () -> bsearch ~cmp:CCInt.compare 10 [| 1; 2; 2; 3; 4; 9 |] = `All_lower
|
|
;;
|
|
t @@ fun () -> bsearch ~cmp:CCInt.compare 0 [| 1; 2; 2; 3; 4; 9 |] = `All_bigger
|
|
;;
|
|
t @@ fun () -> bsearch ~cmp:CCInt.compare 3 [||] = `Empty;;
|
|
t @@ fun () -> 1 -- 4 |> Array.to_list = [ 1; 2; 3; 4 ];;
|
|
t @@ fun () -> 4 -- 1 |> Array.to_list = [ 4; 3; 2; 1 ];;
|
|
t @@ fun () -> 0 -- 0 |> Array.to_list = [ 0 ];;
|
|
|
|
q
|
|
Q.(pair small_int small_int)
|
|
(fun (a, b) -> a -- b |> Array.to_list = CCList.(a -- b))
|
|
;;
|
|
|
|
q
|
|
Q.(pair small_int small_int)
|
|
(fun (a, b) -> a --^ b |> Array.to_list = CCList.(a --^ b))
|
|
;;
|
|
|
|
q
|
|
Q.(pair (array small_int) (array small_int))
|
|
(fun (a, b) -> equal ( = ) a b = equal ( = ) b a)
|
|
;;
|
|
|
|
t @@ fun () -> equal ( = ) [| 1 |] [| 1 |];;
|
|
t @@ fun () -> compare CCOrd.poly [| 1; 2; 3 |] [| 1; 2; 3 |] = 0;;
|
|
t @@ fun () -> compare CCOrd.poly [| 1; 2; 3 |] [| 2; 2; 3 |] < 0;;
|
|
t @@ fun () -> compare CCOrd.poly [| 1; 2 |] [| 1; 2; 3 |] < 0;;
|
|
t @@ fun () -> compare CCOrd.poly [| 1; 2; 3 |] [| 1; 2 |] > 0;;
|
|
|
|
t @@ fun () ->
|
|
let a = [| 1; 2; 3 |] in
|
|
swap a 0 1;
|
|
a = [| 2; 1; 3 |]
|
|
;;
|
|
|
|
t @@ fun () ->
|
|
let a = [| 1; 2; 3 |] in
|
|
swap a 0 2;
|
|
a = [| 3; 2; 1 |]
|
|
;;
|
|
|
|
q
|
|
Q.(array_of_size Gen.(0 -- 100) small_int)
|
|
(fun a ->
|
|
let b = Array.copy a in
|
|
for i = 0 to Array.length a - 1 do
|
|
for j = i + 1 to Array.length a - 1 do
|
|
swap a i j
|
|
done
|
|
done;
|
|
for i = 0 to Array.length a - 1 do
|
|
for j = i + 1 to Array.length a - 1 do
|
|
swap a i j
|
|
done
|
|
done;
|
|
a = b)
|
|
;;
|
|
|
|
eq
|
|
~printer:(fun s -> s)
|
|
(to_string string_of_int [| 1; 2; 3; 4; 5; 6 |])
|
|
"1, 2, 3, 4, 5, 6"
|
|
;;
|
|
|
|
eq ~printer:(fun s -> s) (to_string string_of_int [||]) "";;
|
|
|
|
eq
|
|
~printer:(fun s -> s)
|
|
(to_string ~sep:" " string_of_int [| 1; 2; 3; 4; 5; 6 |])
|
|
"1 2 3 4 5 6"
|
|
;;
|
|
|
|
eq ~printer:(fun s -> s) (to_string string_of_int [| 1 |]) "1";;
|
|
eq [] (to_seq [||] |> CCList.of_seq);;
|
|
eq [ 1; 2; 3 ] (to_seq [| 1; 2; 3 |] |> CCList.of_seq);;
|
|
eq CCList.(1 -- 1000) (to_seq (1 -- 1000) |> CCList.of_seq)
|
|
|
|
module IA = struct
|
|
let get = Array.get
|
|
let set = Array.set
|
|
let length = Array.length
|
|
|
|
type elt = int
|
|
type t = int array
|
|
end
|
|
|
|
let gen_arr = Q.Gen.(array_size (1 -- 100) small_int)
|
|
|
|
let arr_arbitrary =
|
|
Q.make
|
|
~print:Q.Print.(array int)
|
|
~small:Array.length
|
|
~shrink:Q.Shrink.(array ?shrink:None)
|
|
gen_arr
|
|
;;
|
|
|
|
q ~count:300 arr_arbitrary (fun a ->
|
|
let a1 = Array.copy a and a2 = Array.copy a in
|
|
Array.sort CCInt.compare a1;
|
|
sort_generic (module IA) ~cmp:CCInt.compare a2;
|
|
a1 = a2)
|