Backport from sid to buster
[hcoop/debian/mlton.git] / regression / array.sml
1 (* Auxiliary functions for test cases *)
2
3 infix 1 seq
4 fun e1 seq e2 = e2;
5 fun check b = if b then "OK" else "WRONG";
6 fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN";
7
8 fun range (from, to) p =
9 let open Int
10 in
11 (from > to) orelse (p from) andalso (range (from+1, to) p)
12 end;
13
14 fun checkrange bounds = check o range bounds;
15
16 fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n");
17 fun tst s b = tst0 s (check b);
18 fun tst' s f = tst0 s (check' f);
19
20 fun tstrange s bounds = (tst s) o range bounds
21
22 (* test/array.sml -- some test cases for Array
23 PS 1994-12-10, 1995-06-14, 1995-11-07 *)
24
25 val _ = print "Testing Array...\n"
26
27 local
28 open Array
29 infix 9 sub
30 val array0 : int array = fromList []
31 fun extract (arr, s, l) = ArraySlice.vector (ArraySlice.slice (arr, s, l))
32 val copy = fn {src, si, len, dst, di} =>
33 ArraySlice.copy {src = ArraySlice.slice (src, si, len),
34 dst = dst, di = di}
35 fun foldli f b (arr, s, l) =
36 ArraySlice.foldli (fn (i,x,y) => f (i+s,x,y)) b (ArraySlice.slice (arr, s, l))
37 fun foldri f b (arr, s, l) =
38 ArraySlice.foldri (fn (i,x,y) => f (i+s,x,y)) b (ArraySlice.slice (arr, s, l))
39 fun appi f (arr, s, l) =
40 ArraySlice.appi (fn (i,x) => f (i+s,x)) (ArraySlice.slice (arr, s, l))
41 fun modifyi f (arr, s, l) =
42 ArraySlice.modifyi (fn (i,x) => f (i+s,x)) (ArraySlice.slice (arr, s, l))
43 fun findi f (arr, s, l) =
44 ArraySlice.findi (fn (i,x) => f (i+s,x)) (ArraySlice.slice (arr, s, l))
45 in
46
47 val a = fromList [1,11,21,31,41,51,61];
48 val b = fromList [441,551,661];
49 val c = fromList [1,11,21,31,41,51,61];
50
51 val test1 = tst' "test1" (fn () => a<>c);
52
53 val test2 =
54 tst' "test2" (fn () =>
55 array(0, 11) <> array0
56 andalso array(0,()) <> tabulate(0, fn _ => ())
57 andalso tabulate(0, fn _ => ()) <> fromList []
58 andalso fromList [] <> fromList []
59 andalso array(0, ()) <> array(0, ())
60 andalso tabulate(0, fn _ => ()) <> tabulate(0, fn _ => ()));
61
62 val d = tabulate(100, fn i => i mod 7 * 10 + 1);
63
64 val test3 =
65 tst' "test3" (fn () => d sub 27 = 61);
66
67 val test4a = tst0 "test4a"
68 ((tabulate(maxLen+1, fn i => i) seq "WRONG")
69 handle Overflow => "OK" | Size => "OK" | _ => "WRONG");
70
71 val test4b = tst0 "test4b"
72 ((tabulate(~1, fn i => i) seq "WRONG")
73 handle Size => "OK" | _ => "WRONG");
74
75 val test4c =
76 tst' "test4c" (fn () => length (tabulate(0, fn i => i div 0)) = 0);
77
78 val test5a =
79 tst' "test5a" (fn () => length (fromList []) = 0 andalso length a = 7);
80 val test5b =
81 tst' "test5b" (fn () => length array0 = 0);
82
83 val test6a = tst0 "test6a" ((c sub ~1 seq "WRONG") handle Subscript => "OK" | _ => "WRONG");
84 val test6b = tst0 "test6b" ((c sub 7 seq "WRONG") handle Subscript => "OK" | _ => "WRONG");
85 val test6c = tst' "test6c" (fn () => c sub 0 = 1);
86
87 val e = array(203, 0);
88 val _ = (copy{src=d, si=0, dst=e, di=0, len=NONE};
89 copy{src=b, si=0, dst=e, di=length d, len=NONE};
90 copy{src=d, si=0, dst=e, di=length d + length b, len=NONE});
91
92 fun a2v a = extract(a, 0, NONE);
93 val ev = Vector.concat [a2v d, a2v b, a2v d]; (* length e = 203 *)
94
95 val test7 = tst' "test7" (fn () => length e = 203);
96
97 val test8a = tst0 "test8a" ((update(e, ~1, 99) seq "WRONG")
98 handle Subscript => "OK" | _ => "WRONG");
99 val test8b = tst0 "test8b" ((update(e, length e, 99) seq "WRONG")
100 handle Subscript => "OK" | _ => "WRONG");
101
102 val f = extract (e, 100, SOME 3);
103
104 val test9 = tst' "test9" (fn () => f = a2v b);
105
106 val test9a =
107 tst' "test9a" (fn () => ev = extract(e, 0, SOME (length e))
108 andalso ev = extract(e, 0, NONE));
109 val test9b =
110 tst' "test9b" (fn () => Vector.fromList [] = extract(e, 100, SOME 0));
111 val test9c = (extract(e, ~1, SOME (length e)) seq "WRONG")
112 handle Subscript => "OK" | _ => "WRONG"
113 val test9d = (extract(e, length e+1, SOME 0) seq "WRONG")
114 handle Subscript => "OK" | _ => "WRONG"
115 val test9e = (extract(e, 0, SOME (length e+1)) seq "WRONG")
116 handle Subscript => "OK" | _ => "WRONG"
117 val test9f = (extract(e, 20, SOME ~1) seq "WRONG")
118 handle Subscript => "OK" | _ => "WRONG"
119 val test9g = (extract(e, ~1, NONE) seq "WRONG")
120 handle Subscript => "OK" | _ => "WRONG"
121 val test9h = (extract(e, length e+1, NONE) seq "WRONG")
122 handle Subscript => "OK" | _ => "WRONG"
123 val test9i =
124 tst' "test9i" (fn () => a2v (fromList []) = extract(e, length e, SOME 0)
125 andalso a2v (fromList []) = extract(e, length e, NONE));
126 val test9j =
127 tst' "test9j" (fn () => extract(e, 3, SOME(length e - 3)) = extract(e, 3, NONE));
128
129 val _ = copy{src=e, si=0, dst=e, di=0, len=NONE};
130 val g = array(203, 9999999);
131 val _ = copy{src=e, si=0, dst=g, di=0, len=NONE};
132
133 val test10a = tst' "test10a" (fn () => ev = extract(e, 0, SOME (length e))
134 andalso ev = extract(e, 0, NONE));
135 val test10b = tst' "test10b" (fn () => ev = extract(g, 0, SOME (length g))
136 andalso ev = extract(g, 0, NONE));
137
138 val _ = copy{src=g, si=203, dst=g, di=0, len=SOME 0};
139 val test10c = tst' "test10c" (fn () => ev = extract(g, 0, SOME (length g)));
140
141 val _ = copy{src=g, si=0, dst=g, di=203, len=SOME 0};
142 val test10d = tst' "test10d" (fn () => ev = extract(g, 0, SOME (length g)));
143
144 val _ = copy{src=g, si=0, dst=g, di=1, len=SOME (length g-1)};
145 val test10e = tst' "test10e" (fn () => a2v b = extract(g, 101, SOME 3));
146
147 val _ = copy{src=g, si=1, dst=g, di=0, len=SOME (length g-1)};
148 val test10f = tst' "test10f" (fn () => a2v b = extract(g, 100, SOME 3));
149
150 val _ = copy{src=g, si=202, dst=g, di=202, len=SOME 1};
151
152 val test10g =
153 tst' "test10g" (fn () => g sub 202 = 10 * (202-1-103) mod 7 + 1);
154 val test10h =
155 tst' "test10h" (fn () => (copy{src=array0, si=0, dst=array0, di=0, len=SOME 0};
156 array0 <> array(0, 999999)));
157 val test10i =
158 tst' "test10i" (fn () => (copy{src=array0, si=0, dst=array0, di=0, len=NONE};
159 array0 <> array(0, 999999)));
160
161 val test11a = tst0 "test11a" ((copy{src=g, si= ~1, dst=g, di=0, len=NONE}; "WRONG")
162 handle Subscript => "OK" | _ => "WRONG")
163 val test11b = tst0 "test11b" ((copy{src=g, si=0, dst=g, di= ~1, len=NONE}; "WRONG")
164 handle Subscript => "OK" | _ => "WRONG")
165 val test11c = tst0 "test11c" ((copy{src=g, si=1, dst=g, di=0, len=NONE}; "OK")
166 handle _ => "WRONG")
167 val test11d = tst0 "test11d" ((copy{src=g, si=0, dst=g, di=1, len=NONE}; "WRONG")
168 handle Subscript => "OK" | _ => "WRONG")
169 val test11e = tst0 "test11e" ((copy{src=g, si=203, dst=g, di=0, len=NONE}; "OK")
170 handle _ => "WRONG")
171
172 val test11f = tst0 "test11f" ((copy{src=g, si= ~1, dst=g, di=0, len=SOME (length g)}; "WRONG")
173 handle Subscript => "OK" | _ => "WRONG")
174 val test11g = tst0 "test11g" ((copy{src=g, si=0, dst=g, di= ~1, len=SOME (length g)}; "WRONG")
175 handle Subscript => "OK" | _ => "WRONG")
176 val test11h = tst0 "test11h" ((copy{src=g, si=1, dst=g, di=0, len=SOME (length g)}; "WRONG")
177 handle Subscript => "OK" | _ => "WRONG")
178 val test11i = tst0 "test11i" ((copy{src=g, si=0, dst=g, di=1, len=SOME (length g)}; "WRONG")
179 handle Subscript => "OK" | _ => "WRONG")
180 val test11j = tst0 "test11j" ((copy{src=g, si=0, dst=g, di=0, len=SOME (length g+1)}; "WRONG")
181 handle Subscript => "OK" | _ => "WRONG")
182 val test11k = tst0 "test11k" ((copy{src=g, si=203, dst=g, di=0, len=SOME 1}; "WRONG")
183 handle Subscript => "OK" | _ => "WRONG")
184
185 local
186 val v = ref 0
187 fun setv c = v := c;
188 fun addv c = v := c + !v;
189 fun setvi (i, c) = v := c + i;
190 fun addvi (i, c) = v := c + i + !v;
191 fun cons (x,r) = x :: r
192 fun consi (i,x,r) = (i,x) :: r
193 val inplist = [7,9,13];
194 val inp = fromList inplist
195 val pni = fromList (rev inplist)
196 fun copyinp a =
197 copy{src=inp, si=0, dst=a, di=0, len=NONE}
198 in
199
200 val array0 = fromList [] : int array;
201
202 val test12a =
203 tst' "test12a" (fn _ =>
204 foldl cons [1,2] array0 = [1,2]
205 andalso foldl cons [1,2] inp = [13,9,7,1,2]
206 andalso (foldl (fn (x, _) => setv x) () inp; !v = 13));
207
208 val test12b =
209 tst' "test12b" (fn _ =>
210 foldr cons [1,2] array0 = [1,2]
211 andalso foldr cons [1,2] inp = [7,9,13,1,2]
212 andalso (foldr (fn (x, _) => setv x) () inp; !v = 7));
213
214 val test12c =
215 tst' "test12c" (fn _ =>
216 find (fn _ => true) array0 = NONE
217 andalso find (fn _ => false) inp = NONE
218 andalso find (fn x => x=7) inp = SOME 7
219 andalso find (fn x => x=9) inp = SOME 9
220 andalso (setv 0; find (fn x => (addv x; x=9)) inp; !v = 7+9));
221
222 val test12d =
223 tst' "test12d" (fn _ =>
224 (setv 117; app setv array0; !v = 117)
225 andalso (setv 0; app addv inp; !v = 7+9+13)
226 andalso (app setv inp; !v = 13));
227
228 val test12e =
229 let val a = array(length inp, inp sub 0)
230 in
231 tst' "test12e" (fn _ =>
232 (modify (~ : int -> int) array0; true)
233 andalso (copyinp a; modify ~ a; foldr (op::) [] a = map ~ inplist)
234 andalso (setv 117; modify (fn x => (setv x; 37)) a; !v = ~13))
235 end
236
237 val test13a =
238 tst' "test13a" (fn _ =>
239 foldli consi [] (array0, 0, NONE) = []
240 andalso foldri consi [] (array0, 0, NONE) = []
241 andalso foldli consi [] (inp, 0, NONE) = [(2,13),(1,9),(0,7)]
242 andalso foldri consi [] (inp, 0, NONE) = [(0,7),(1,9),(2,13)])
243
244 val test13b =
245 tst' "test13b" (fn _ =>
246 foldli consi [] (array0, 0, SOME 0) = []
247 andalso foldri consi [] (array0, 0, SOME 0) = []
248 andalso foldli consi [] (inp, 0, SOME 0) = []
249 andalso foldri consi [] (inp, 0, SOME 0) = []
250 andalso foldli consi [] (inp, 3, SOME 0) = []
251 andalso foldri consi [] (inp, 3, SOME 0) = []
252 andalso foldli consi [] (inp, 0, SOME 3) = [(2,13),(1,9),(0,7)]
253 andalso foldri consi [] (inp, 0, SOME 3) = [(0,7),(1,9),(2,13)]
254 andalso foldli consi [] (inp, 0, SOME 2) = [(1,9),(0,7)]
255 andalso foldri consi [] (inp, 0, SOME 2) = [(0,7),(1,9)]
256 andalso foldli consi [] (inp, 1, SOME 2) = [(2,13),(1,9)]
257 andalso foldri consi [] (inp, 1, SOME 2) = [(1,9),(2,13)]
258 andalso foldli consi [] (inp, 2, SOME 1) = [(2,13)]
259 andalso foldri consi [] (inp, 2, SOME 1) = [(2,13)]);
260
261 val test13c = tst0 "test13c" ((foldli consi [] (inp, ~1, NONE) seq "WRONG")
262 handle Subscript => "OK" | _ => "WRONG");
263 val test13d = tst0 "test13d" ((foldli consi [] (inp, 4, NONE) seq "WRONG")
264 handle Subscript => "OK" | _ => "WRONG");
265 val test13e = tst0 "test13e" ((foldli consi [] (inp, ~1, SOME 2) seq "WRONG")
266 handle Subscript => "OK" | _ => "WRONG");
267 val test13f = tst0 "test13f" ((foldli consi [] (inp, 4, SOME 0) seq "WRONG")
268 handle Subscript => "OK" | _ => "WRONG");
269 val test13g = tst0 "test13g" ((foldli consi [] (inp, 0, SOME 4) seq "WRONG")
270 handle Subscript => "OK" | _ => "WRONG");
271 val test13h = tst0 "test13h" ((foldli consi [] (inp, 2, SOME ~1) seq "WRONG")
272 handle Subscript => "OK" | _ => "WRONG");
273
274 val test13i = tst0 "test13i" ((foldri consi [] (inp, ~1, NONE) seq "WRONG")
275 handle Subscript => "OK" | _ => "WRONG");
276 val test13j = tst0 "test13j" ((foldri consi [] (inp, 4, NONE) seq "WRONG")
277 handle Subscript => "OK" | _ => "WRONG");
278 val test13k = tst0 "test13k" ((foldri consi [] (inp, ~1, SOME 2) seq "WRONG")
279 handle Subscript => "OK" | _ => "WRONG");
280 val test13l = tst0 "test13l" ((foldri consi [] (inp, 4, SOME 0) seq "WRONG")
281 handle Subscript => "OK" | _ => "WRONG");
282 val test13m = tst0 "test13m" ((foldri consi [] (inp, 0, SOME 4) seq "WRONG")
283 handle Subscript => "OK" | _ => "WRONG");
284 val test13n = tst0 "test13n" ((foldri consi [] (inp, 2, SOME ~1) seq "WRONG")
285 handle Subscript => "OK" | _ => "WRONG");
286
287 val test14a =
288 tst' "test14a" (fn _ =>
289 findi (fn _ => true) (array0, 0, NONE) = NONE
290 andalso findi (fn _ => false) (inp, 0, NONE) = NONE
291 andalso findi (fn (i, x) => x=9 orelse 117 div (2-i) = 0) (inp, 0, NONE)
292 = SOME (1,9));
293
294 val test14b =
295 tst' "test14b" (fn _ =>
296 findi (fn _ => true) (array0, 0, SOME 0) = NONE
297 andalso findi (fn _ => false) (inp, 0, NONE) = NONE
298 andalso findi (fn (i, x) => x=9 orelse 117 div (2-i) = 0) (inp, 0, NONE)
299 = SOME (1,9));
300
301 val test14c = (findi (fn _ => true) (inp, ~1, NONE) seq "WRONG")
302 handle Subscript => "OK" | _ => "WRONG";
303 val test14d = (findi (fn _ => true) (inp, 4, NONE) seq "WRONG")
304 handle Subscript => "OK" | _ => "WRONG";
305 val test14e = (findi (fn _ => true) (inp, ~1, SOME 2) seq "WRONG")
306 handle Subscript => "OK" | _ => "WRONG";
307 val test14f = (findi (fn _ => true) (inp, 4, SOME 0) seq "WRONG")
308 handle Subscript => "OK" | _ => "WRONG";
309 val test14g = (findi (fn _ => true) (inp, 0, SOME 4) seq "WRONG")
310 handle Subscript => "OK" | _ => "WRONG";
311 val test14h = (findi (fn _ => true) (inp, 2, SOME ~1) seq "WRONG")
312 handle Subscript => "OK" | _ => "WRONG";
313
314 val test15a =
315 tst' "test15a" (fn _ =>
316 (setvi (0,117); appi setvi (array0, 0, NONE); !v = 117)
317 andalso (setvi (0,0); appi addvi (inp, 0, NONE); !v = 0+7+1+9+2+13)
318 andalso (appi setvi (inp, 0, NONE); !v = 2+13));
319 val test15b =
320 tst' "test15b" (fn _ =>
321 (setvi (0,117); appi setvi (array0, 0, SOME 0); !v = 117)
322 andalso (setvi (0,0); appi addvi (inp, 0, SOME 0); !v = 0)
323 andalso (setvi (0,0); appi addvi (inp, 3, SOME 0); !v = 0)
324 andalso (setvi (0,0); appi addvi (inp, 0, SOME 2); !v = 0+7+1+9)
325 andalso (setvi (0,0); appi addvi (inp, 1, SOME 2); !v = 1+9+2+13)
326 andalso (setvi (0,0); appi addvi (inp, 0, SOME 3); !v = 0+7+1+9+2+13)
327 andalso (appi setvi (inp, 1, SOME 2); !v = 2+13)
328 andalso (appi setvi (inp, 0, SOME 2); !v = 1+9)
329 andalso (appi setvi (inp, 0, SOME 1); !v = 0+7)
330 andalso (appi setvi (inp, 0, SOME 3); !v = 2+13));
331
332 val test15c = tst0 "test15c" ((appi setvi (inp, ~1, NONE) seq "WRONG")
333 handle Subscript => "OK" | _ => "WRONG");
334 val test15d = tst0 "test15d" ((appi setvi (inp, 4, NONE) seq "WRONG")
335 handle Subscript => "OK" | _ => "WRONG");
336 val test15e = tst0 "test15e" ((appi setvi (inp, ~1, SOME 2) seq "WRONG")
337 handle Subscript => "OK" | _ => "WRONG");
338 val test15f = tst0 "test15f" ((appi setvi (inp, 4, SOME 0) seq "WRONG")
339 handle Subscript => "OK" | _ => "WRONG");
340 val test15g = tst0 "test15g" ((appi setvi (inp, 0, SOME 4) seq "WRONG")
341 handle Subscript => "OK" | _ => "WRONG");
342 val test15h = tst0 "test15h" ((appi setvi (inp, 2, SOME ~1) seq "WRONG")
343 handle Subscript => "OK" | _ => "WRONG");
344
345 val test16a =
346 let val a = array(length inp, inp sub 0)
347 in
348 tst' "test16a" (fn _ =>
349 (modifyi (op +) (array0, 0, NONE); true)
350 andalso (modifyi (op +) (array0, 0, SOME 0); true)
351 andalso (copyinp a; modifyi (op -) (a, 0, SOME 0);
352 foldr (op::) [] a = [7,9,13])
353 andalso (copyinp a; modifyi (op -) (a, 3, SOME 0);
354 foldr (op::) [] a = [7,9,13])
355 andalso (copyinp a; modifyi (op -) (a, 0, NONE);
356 foldr (op::) [] a = [~7,~8,~11])
357 andalso (copyinp a; modifyi (op -) (a, 0, SOME 3);
358 foldr (op::) [] a = [~7,~8,~11])
359 andalso (copyinp a; modifyi (op -) (a, 0, SOME 2);
360 foldr (op::) [] a = [~7,~8,13])
361 andalso (copyinp a; modifyi (op -) (a, 1, SOME 2);
362 foldr (op::) [] a = [7,~8,~11])
363 andalso (copyinp a; setv 117;
364 modifyi (fn x => (setvi x; 37)) (a, 0, NONE); !v = 2+13)
365 andalso (copyinp a; setv 117;
366 modifyi (fn x => (setvi x; 37)) (a, 0, SOME 3); !v = 2+13)
367 andalso (copyinp a; setv 117;
368 modifyi (fn x => (setvi x; 37)) (a, 1, SOME 2); !v = 2+13)
369 andalso (copyinp a; setv 117;
370 modifyi (fn x => (setvi x; 37)) (a, 0, SOME 2); !v = 1+9)
371 andalso (copyinp a; setv 117;
372 modifyi (fn x => (setvi x; 37)) (a, 0, SOME 0); !v = 117)
373 andalso (copyinp a; setv 117;
374 modifyi (fn x => (setvi x; 37)) (a, 3, SOME 0); !v = 117))
375 end
376
377 val test16b = tst0 "test16b" ((modifyi (op+) (inp, ~1, NONE) seq "WRONG")
378 handle Subscript => "OK" | _ => "WRONG");
379 val test16c = tst0 "test16c" ((modifyi (op+) (inp, 4, NONE) seq "WRONG")
380 handle Subscript => "OK" | _ => "WRONG");
381 val test16d = tst0 "test16d" ((modifyi (op+) (inp, ~1, SOME 2) seq "WRONG")
382 handle Subscript => "OK" | _ => "WRONG");
383 val test16e = tst0 "test16e" ((modifyi (op+) (inp, 4, SOME 0) seq "WRONG")
384 handle Subscript => "OK" | _ => "WRONG");
385 val test16f = tst0 "test16f" ((modifyi (op+) (inp, 0, SOME 4) seq "WRONG")
386 handle Subscript => "OK" | _ => "WRONG");
387 val test16g = tst0 "test16g" ((modifyi (op+) (inp, 2, SOME ~1) seq "WRONG")
388 handle Subscript => "OK" | _ => "WRONG");
389 end
390
391 end
392