-
Notifications
You must be signed in to change notification settings - Fork 1
/
test.ml
121 lines (108 loc) · 3.9 KB
/
test.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
open Flex_array
let eqint = Alcotest.(check int)
let pp = pp Format.pp_print_int
let fa : int t Alcotest.testable = Alcotest.testable pp (=)
let eq_fa = Alcotest.(check fa)
let raises = Alcotest.check_raises
let test0 () =
raises "make" (Invalid_argument "make") (fun () -> ignore (make (-1) 0));
let a = empty in
raises "get" (Invalid_argument "get") (fun () -> get a 0);
raises "set" (Invalid_argument "set") (fun () -> ignore (set a 0 1));
raises "tail" (Invalid_argument "tail") (fun () -> ignore (tail a));
raises "liat" (Invalid_argument "liat") (fun () -> ignore (liat a));
let a = make 10 0 in
raises "get" (Invalid_argument "get") (fun () -> ignore (get a (-1)));
raises "get" (Invalid_argument "get") (fun () -> ignore (get a 10));
raises "set" (Invalid_argument "set") (fun () -> ignore (set a (-1) 1));
raises "set" (Invalid_argument "set") (fun () -> ignore (set a 10 1));
()
let test1 m =
let rec fill a i = if i = m then a else fill (snoc a i) (i + 1) in
let a = fill empty 0 in
eqint "length" m (length a);
let a = cons 0 a in
eqint "length cons" (m + 1) (length a);
let a = tail a in
eqint "length tail" m (length a);
let a = snoc a m in
eqint "length snoc" (m + 1) (length a);
let a = liat a in
eqint "length snoc" m (length a);
for i = 0 to m - 1 do eqint "get" i (get a i) done;
let next = ref 0 in
(iter (fun j -> eqint "iter" !next j; incr next)) a;
next := 0;
(iteri (fun i j ->
eqint "iteri" !next i; eqint "iteri" !next j; incr next)) a;
let l = fold (fun acc x -> x :: acc) [] a in
eqint "fold length" (List.length l) m;
if m > 0 then eqint "fold order" (List.hd l) (m - 1);
let l = foldi (fun acc i x -> eqint "foldi" i x; x :: acc) [] a in
eqint "foldi length" (List.length l) m;
if m > 0 then eqint "foldi order" (List.hd l) (m - 1);
let b = mapi (fun i x -> i + x) a in
eqint "mapi length" (length b) m;
for i = 0 to m - 1 do eqint "get" (2*i) (get b i) done
let test1 () =
for m = 0 to 42 do test1 m done
let test2 () =
let a = make 0 42 in
eqint "length make" 0 (length a);
let a = make 1729 42 in
eqint "length make" 1729 (length a);
for i = 0 to 1728 do eqint "get" 42 (get a i) done;
let b = cons 1 (snoc a 2) in
eqint "length cons snoc" 1731 (length b);
eqint "get cons" 1 (get b 0);
eqint "get snoc" 2 (get b 1730);
eq_fa "liat tail" (liat (tail b)) a;
()
let test3 () =
for n = 0 to 100 do
let a = Array.init n (fun _ -> Random.int (2 * n + 1)) in
let fa = of_array a in
eqint "length" n (length fa);
for i = 0 to n - 1 do eqint "get" a.(i) (get fa i) done
done
let test4 () =
let arr = Array.make 21 0 in
arr.(1) <- 1; for i = 2 to 20 do arr.(i) <- arr.(i-2) + arr.(i-1) done;
let fib = Array.to_list arr in
let rec build n = function
| [] -> [] | _ when n = 0 -> [] | x :: l -> x :: build (n-1) l in
for n = 0 to 20 do
let l = build n fib in
let a = of_list l in
eqint "length" n (length a);
for i = 0 to n-1 do eqint "get" arr.(i) (get a i) done
done
let testl1 () =
let n = 1_000_000 in
let rec loop a i = if i = n then a else loop (set a i i) (i + 1) in
let a = loop (make n 0) 0 in
eqint "length" n (length a);
let s = ref 0 in
iter (fun x -> s := !s + x) a;
eqint "sum" (n*(n-1)/2) !s
let testl2 () =
let n = 1_000_000 in
let rec make acc i = if i < 0 then acc else make (i :: acc) (i - 1) in
let l = make [] (n - 1) in
let a = of_list l in
eqint "length" n (length a);
for i = 0 to n - 1 do eqint "get" i (get a i) done
let () =
Alcotest.run "Flex_array"
["quick tests",
[Alcotest.test_case "test0" `Quick test0;
Alcotest.test_case "test1" `Quick test1;
Alcotest.test_case "test2" `Quick test2;
Alcotest.test_case "test3" `Quick test3;
Alcotest.test_case "test4" `Quick test4;
];
"long tests",
[Alcotest.test_case "test1" `Slow testl1;
Alcotest.test_case "test2" `Slow testl2;
];
]