forked from rescript-lang/rescript
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathounit_bal_tree_tests.ml
155 lines (140 loc) · 4.73 KB
/
ounit_bal_tree_tests.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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
let ((>::),
(>:::)) = OUnit.((>::),(>:::))
let (=~) = OUnit.assert_equal
module Set_poly = struct
include Set_int
let of_sorted_list xs = Array.of_list xs |> of_sorted_array
let of_array l =
Ext_array.fold_left l empty add
end
let suites =
__FILE__ >:::
[
__LOC__ >:: begin fun _ ->
OUnit.assert_bool __LOC__
(Set_poly.invariant
(Set_poly.of_array (Array.init 1000 (fun n -> n))))
end;
__LOC__ >:: begin fun _ ->
OUnit.assert_bool __LOC__
(Set_poly.invariant
(Set_poly.of_array (Array.init 1000 (fun n -> 1000-n))))
end;
__LOC__ >:: begin fun _ ->
OUnit.assert_bool __LOC__
(Set_poly.invariant
(Set_poly.of_array (Array.init 1000 (fun _ -> Random.int 1000))))
end;
__LOC__ >:: begin fun _ ->
OUnit.assert_bool __LOC__
(Set_poly.invariant
(Set_poly.of_sorted_list (Array.to_list (Array.init 1000 (fun n -> n)))))
end;
__LOC__ >:: begin fun _ ->
let arr = Array.init 1000 (fun n -> n) in
let set = (Set_poly.of_sorted_array arr) in
OUnit.assert_bool __LOC__
(Set_poly.invariant set );
OUnit.assert_equal 1000 (Set_poly.cardinal set)
end;
__LOC__ >:: begin fun _ ->
for i = 0 to 200 do
let arr = Array.init i (fun n -> n) in
let set = (Set_poly.of_sorted_array arr) in
OUnit.assert_bool __LOC__
(Set_poly.invariant set );
OUnit.assert_equal i (Set_poly.cardinal set)
done
end;
__LOC__ >:: begin fun _ ->
let arr_size = 200 in
let arr_sets = Array.make 200 Set_poly.empty in
for i = 0 to arr_size - 1 do
let size = Random.int 1000 in
let arr = Array.init size (fun n -> n) in
arr_sets.(i)<- (Set_poly.of_sorted_array arr)
done;
let large = Array.fold_left Set_poly.union Set_poly.empty arr_sets in
OUnit.assert_bool __LOC__ (Set_poly.invariant large)
end;
__LOC__ >:: begin fun _ ->
let arr_size = 1_00_000 in
let v = ref Set_int.empty in
for _ = 0 to arr_size - 1 do
let size = Random.int 0x3FFFFFFF in
v := Set_int.add !v size
done;
OUnit.assert_bool __LOC__ (Set_int.invariant !v)
end;
]
type ident = { stamp : int ; name : string ; mutable flags : int}
module Set_ident = Set.Make(struct type t = ident
let compare = Pervasives.compare end)
let compare_ident x y =
let a = compare (x.stamp : int) y.stamp in
if a <> 0 then a
else
let b = compare (x.name : string) y.name in
if b <> 0 then b
else compare (x.flags : int) y.flags
let rec add (tree : _ Set_gen.t) x = match tree with
| Empty -> Set_gen.singleton x
| Leaf v ->
let c = compare_ident x v in
if c = 0 then tree else
if c < 0 then
Set_gen.unsafe_two_elements x v
else
Set_gen.unsafe_two_elements v x
| Node {l; v; r} as t ->
let c = compare_ident x v in
if c = 0 then t else
if c < 0 then Set_gen.bal (add l x ) v r else Set_gen.bal l v (add r x )
let rec mem (tree : _ Set_gen.t) x = match tree with
| Empty -> false
| Leaf v -> compare_ident x v = 0
| Node{l; v; r} ->
let c = compare_ident x v in
c = 0 || mem (if c < 0 then l else r) x
module Ident_set2 = Set.Make(struct type t = ident
let compare = compare_ident
end)
let bench () =
let times = 1_000_000 in
Ounit_tests_util.time "functor set" begin fun _ ->
let v = ref Set_ident.empty in
for i = 0 to times do
v := Set_ident.add {stamp = i ; name = "name"; flags = -1 } !v
done;
for i = 0 to times do
ignore @@ Set_ident.mem {stamp = i; name = "name" ; flags = -1} !v
done
end ;
Ounit_tests_util.time "functor set (specialized)" begin fun _ ->
let v = ref Ident_set2.empty in
for i = 0 to times do
v := Ident_set2.add {stamp = i ; name = "name"; flags = -1 } !v
done;
for i = 0 to times do
ignore @@ Ident_set2.mem {stamp = i; name = "name" ; flags = -1} !v
done
end ;
Ounit_tests_util.time "poly set" begin fun _ ->
let module Set_poly = Set_ident in
let v = ref Set_poly.empty in
for i = 0 to times do
v := Set_poly.add {stamp = i ; name = "name"; flags = -1 } !v
done;
for i = 0 to times do
ignore @@ Set_poly.mem {stamp = i; name = "name" ; flags = -1} !v
done;
end;
Ounit_tests_util.time "poly set (specialized)" begin fun _ ->
let v = ref Set_gen.empty in
for i = 0 to times do
v := add !v {stamp = i ; name = "name"; flags = -1 }
done;
for i = 0 to times do
ignore @@ mem !v {stamp = i; name = "name" ; flags = -1}
done
end ;