Backport from sid to buster
[hcoop/debian/mlton.git] / regression / substring.sml
CommitLineData
7f918cf1
CE
1(* test/substring.sml 1995-04-27, 1997-06-03 *)
2
3infix 1 seq
4fun e1 seq e2 = e2;
5fun check b = if b then "OK" else "WRONG";
6fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN";
7
8fun 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
14fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n");
15fun tst s b = tst0 s (check b);
16fun tst' s f = tst0 s (check' f);
17
18fun checkrange bounds = check o range bounds;
19
20
21local
22 open Char Substring
23 val all = full
24 fun base2 (a, b) = (base a, base b)
25
26 val s1 = "" (* String.size s1 = 0 *)
27 and s2 = "ABCDE\tFGHI"; (* String.size s2 = 10 *)
28 val ss1 = all s1 (* size s1 = 0 *)
29 and ss2 = all s2; (* size s2 = 10 *)
30
31 val sa = "AAAAaAbAABBBB"; (* String.size sa = 14 *)
32 (* 45678 *)
33
34 val ssa1 = extract(sa, 4, SOME 0) (* size ssa1 = 0 *)
35 val ssa2 = extract(sa, 4, SOME 5) (* size ssa2 = 5 *)
36
37 val ss3 = extract("junk this is a (clear)textjunk", 4, SOME 24);
38 (* 456789012345678901234567 *)
39
40in
41
42
43val test1a = tst' "test1a"
44 (fn _ =>
45 (s2, 10, 0) = base(extract(s2, 10, SOME 0))
46 andalso (s2, 10, 0) = base(extract(s2, 10, NONE))
47 andalso (s2, 0, 0) = base(extract(s2, 0, SOME 0))
48 andalso (s2, 4, 3) = base(extract(s2, 4, SOME 3))
49 andalso (s2, 4, 6) = base(extract(s2, 4, SOME 6))
50 andalso (s2, 4, 6) = base(extract(s2, 4, NONE))
51 andalso (s2, 0, 10) = base(extract(s2, 0, SOME 10))
52 andalso (s2, 0, 10) = base(extract(s2, 0, NONE)));
53
54val test1b = tst0 "test1b" ((extract(s2, ~1, SOME 0) seq "WRONG")
55 handle Subscript => "OK" | _ => "WRONG")
56val test1c = tst0 "test1c" ((extract(s2, 11, SOME 0) seq "WRONG")
57 handle Subscript => "OK" | _ => "WRONG")
58val test1d = tst0 "test1d" ((extract(s2, 0, SOME 11) seq "WRONG")
59 handle Subscript => "OK" | _ => "WRONG")
60val test1e = tst0 "test1e" ((extract(s2, 10, SOME 1) seq "WRONG")
61 handle Subscript => "OK" | _ => "WRONG")
62val test1f = tst0 "test1f" ((extract(s2, ~1, NONE) seq "WRONG")
63 handle Subscript => "OK" | _ => "WRONG")
64val test1g = tst0 "test1g" ((extract(s2, 11, NONE) seq "WRONG")
65 handle Subscript => "OK" | _ => "WRONG")
66
67val test1h = tst' "test1h"
68 (fn _ =>
69 string ssa1 = ""
70 andalso string ssa2 = "aAbAA"
71 andalso s1 = string (all s1)
72 andalso s2 = string (all s2));
73
74val test2a = tst' "test2a"
75 (fn _ =>
76 string(triml 6 ss2) = "FGHI"
77 andalso s2 = string(triml 0 ss2)
78 andalso s1 = string(triml 0 ss1)
79 andalso (s2, 10, 0) = base(triml 10 ss2)
80 andalso (s2, 10, 0) = base(triml 11 ss2)
81 andalso (sa, 6, 3) = base(triml 2 ssa2)
82 andalso (sa, 9, 0) = base(triml 5 ssa2)
83 andalso (sa, 9, 0) = base(triml 6 ssa2));
84
85val test2b = tst0 "test2b" ((triml ~1 ss2 seq "WRONG")
86 handle Subscript => "OK" | _ => "WRONG")
87val test2c = tst0 "test2c" ((triml ~1 ssa2 seq "WRONG")
88 handle Subscript => "OK" | _ => "WRONG")
89
90val test3a = tst' "test3a"
91 (fn _ =>
92 string(trimr 6 ss2) = "ABCD"
93 andalso s2 = string(trimr 0 ss2)
94 andalso s1 = string(trimr 0 ss1)
95 andalso (s2, 0, 0) = base(trimr 10 ss2)
96 andalso (s2, 0, 0) = base(trimr 11 ss2)
97 andalso (sa, 4, 3) = base(trimr 2 ssa2)
98 andalso (sa, 4, 0) = base(trimr 5 ssa2)
99 andalso (sa, 4, 0) = base(trimr 6 ssa2));
100
101val test3b = tst0 "test3b" ((trimr ~1 ss2 seq "WRONG")
102 handle Subscript => "OK" | _ => "WRONG")
103val test3c = tst0 "test3c" ((trimr ~1 ssa2 seq "WRONG")
104 handle Subscript => "OK" | _ => "WRONG")
105
106val test4 = tst' "test4"
107 (fn _ =>
108 isEmpty ss1
109 andalso not (isEmpty ss2)
110 andalso isEmpty ssa1
111 andalso not (isEmpty ssa2));
112
113val test5a = tst' "test5a"
114 (fn _ =>
115 case getc ssa1 of NONE => true | _ => false);
116
117val test5b = tst' "test5b"
118 (fn _ =>
119 case getc ssa2 of
120 NONE => false
121 | SOME(#"a", rest) => "AbAA" = string rest
122 | _ => false);
123
124val test6 = tst' "test6"
125 (fn _ =>
126 first ssa1 = NONE
127 andalso first ssa2 = SOME #"a")
128
129val test7 = tst' "test7"
130 (fn _ => (size ss1 = 0 andalso size ss2 = 10
131 andalso size ssa1 = 0 andalso size ssa2 = 5));
132
133val test8a = tst' "test8a"
134 (fn _ => (sub(ss2,6) = chr 70 andalso sub(ss2,9) = chr 73
135 andalso sub(ssa2, 1) = chr 65));
136val test8b = tst0 "test8b"
137 ((sub(ss1, 0) seq "WRONG") handle Subscript => "OK" | _ => "WRONG")
138val test8c = tst0 "test8c"
139 ((sub(ss2, ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG")
140val test8d = tst0 "test8d"
141 ((sub(ss2, 10) seq "WRONG") handle Subscript => "OK" | _ => "WRONG")
142val test8e = tst0 "test8e"
143 ((sub(ssa2, ~1) seq "WRONG") handle Subscript => "OK" | _ => "WRONG")
144val test8f = tst0 "test8f"
145 ((sub(ssa2, 5) seq "WRONG") handle Subscript => "OK" | _ => "WRONG")
146
147val test9a = tst' "test9a"
148 (fn _ =>
149 base ss2 = base(slice(ss2, 0, SOME (size ss2)))
150 andalso base ss2 = base(slice(ss2, 0, NONE))
151 andalso (s2, 10, 0) = base(slice(ss2, size ss2, SOME 0))
152 andalso (s2, 10, 0) = base(slice(ss2, size ss2, NONE))
153 andalso base ss1 = base(slice(ss1, 0, SOME 0))
154 andalso base ss1 = base(slice(ss1, 0, NONE)));
155
156val test9b = tst' "test9b"
157 (fn _ =>
158 (sa, 4, 5) = base(slice(ssa2, 0, SOME 5))
159 andalso (sa, 4, 5) = base(slice(ssa2, 0, NONE))
160 andalso (sa, 4, 0) = base(slice(ssa2, 0, SOME 0))
161 andalso (sa, 9, 0) = base(slice(ssa2, 5, SOME 0))
162 andalso (sa, 9, 0) = base(slice(ssa2, 5, NONE))
163 andalso (sa, 5, 3) = base(slice(ssa2, 1, SOME 3))
164 andalso (sa, 5, 4) = base(slice(ssa2, 1, SOME 4))
165 andalso (sa, 5, 4) = base(slice(ssa2, 1, NONE)));
166
167val test9c = tst0 "test9c" ((slice(ssa2, ~1, SOME 0) seq "WRONG")
168 handle Subscript => "OK" | _ => "WRONG")
169val test9d = tst0 "test9d" ((slice(ssa2, 6, SOME 0) seq "WRONG")
170 handle Subscript => "OK" | _ => "WRONG")
171val test9e = tst0 "test9e" ((slice(ssa2, 0, SOME 6) seq "WRONG")
172 handle Subscript => "OK" | _ => "WRONG")
173val test9f = tst0 "test9f" ((slice(ssa2, 5, SOME 1) seq "WRONG")
174 handle Subscript => "OK" | _ => "WRONG")
175val test9g = tst0 "test9g" ((slice(ssa2, ~1, NONE) seq "WRONG")
176 handle Subscript => "OK" | _ => "WRONG")
177val test9h = tst0 "test9h" ((slice(ssa2, 6, NONE) seq "WRONG")
178 handle Subscript => "OK" | _ => "WRONG")
179
180val test12 = tst' "test12"
181 (fn _ =>
182 concat [] = ""
183 andalso concat [ssa1, ssa1, ssa1] = ""
184 andalso concat [ssa2, ssa2, ssa2] = "aAbAAaAbAAaAbAA"
185 andalso concat [ssa2, ssa1, ss2, ss1] = "aAbAAABCDE\tFGHI");
186
187val test13 = tst' "test13"
188 (fn _ =>
189 explode ss1 = []
190 andalso explode ssa1 = []
191 andalso explode ssa2 = [#"a", #"A", #"b", #"A", #"A"]);
192
193val test14 = tst' "test14"
194 (fn _ =>
195 EQUAL = compare(ssa1,ssa1) andalso EQUAL = compare(ssa2,ssa2)
196 andalso LESS = compare(triml 1 ssa2, ssa2)
197 andalso GREATER = compare(ssa2, triml 1 ssa2)
198 andalso LESS = compare(trimr 1 ssa2, ssa2)
199 andalso GREATER = compare(ssa2, trimr 1 ssa2)
200 andalso LESS = compare(all "AB", ssa2)
201 andalso GREATER = compare(ssa2, all "AB"));
202
203fun finda c = c <> #"A";
204fun findb c = c <> #"B";
205
206val test15 = tst' "test15"
207 (fn _ =>
208 (sa, 5, 4) = base(dropl finda ssa2)
209 andalso (sa, 9, 0) = base(dropl findb ssa2)
210 andalso base ssa1 = base(dropl finda ssa1));
211
212val test16 = tst' "test16"
213 (fn _ =>
214 (sa, 4, 5) = base(dropr finda ssa2)
215 andalso (sa, 4, 0) = base(dropr findb ssa2)
216 andalso base ssa1 = base(dropr finda ssa1));
217
218val test17 = tst' "test17"
219 (fn _ =>
220 (sa, 4, 1) = base(takel finda ssa2)
221 andalso (sa, 4, 5) = base(takel findb ssa2)
222 andalso base ssa1 = base(takel finda ssa1));
223
224val test18 = tst' "test18"
225 (fn _ =>
226 (sa, 9, 0) = base(taker finda ssa2)
227 andalso (sa, 4, 5) = base(taker findb ssa2)
228 andalso base ssa1 = base(taker finda ssa1));
229
230val test19 = tst' "test19"
231 (fn _ =>
232 ((sa, 4, 1), (sa, 5, 4)) = base2(splitl finda ssa2)
233 andalso ((sa, 4, 5), (sa, 9, 0)) = base2(splitl findb ssa2)
234 andalso base2(ssa1, ssa1) = base2(splitl finda ssa1));
235
236val test20 = tst' "test20"
237 (fn _ =>
238 ((sa, 4, 5), (sa, 9, 0)) = base2(splitr finda ssa2)
239 andalso ((sa, 4, 0), (sa, 4, 5)) = base2(splitr findb ssa2)
240 andalso base2(ssa1, ssa1) = base2 (splitr finda ssa1));
241
242val test21 = tst' "test21"
243 (fn _ =>
244 ((sa, 4, 0), (sa, 4, 5)) = base2(position "" ssa2)
245 andalso ((sa, 4, 1), (sa, 5, 4)) = base2(position "Ab" ssa2)
246 andalso ((sa, 4, 5), (sa, 9, 0)) = base2(position "B" ssa2)
247 andalso ((sa, 4, 5), (sa, 9, 0)) = base2(position "AAB" ssa2)
248 andalso ((sa, 4, 0), (sa, 4, 5)) = base2(position "aA" ssa2)
249 andalso ((sa, 4, 2), (sa, 6, 3)) = base2(position "bAA" ssa2)
250 andalso (base ssa1, base ssa1) = base2(position "A" ssa1)
251 andalso (base ssa1, base ssa1) = base2(position "" ssa1));
252
253(* For the pre-November 1995 version of position:
254val test21 = tst' "test21"
255 (fn _ =>
256 (sa, 4, 5) = base(position "" ssa2)
257 andalso (sa, 5, 4) = base(position "Ab" ssa2)
258 andalso (sa, 9, 0) = base(position "B" ssa2)
259 andalso (sa, 9, 0) = base(position "AAB" ssa2)
260 andalso (sa, 4, 5) = base(position "aA" ssa2)
261 andalso (sa, 6, 3) = base(position "bAA" ssa2)
262 andalso base ssa1 = base(position "A" ssa1)
263 andalso base ssa1 = base(position "" ssa1));
264*)
265
266val test22a = tst' "test22a"
267 (fn _ =>
268 (translate (fn _ => "") ssa2 = ""
269 andalso translate (fn x => str x) ssa1 = ""
270 andalso translate (fn x => str x) ssa2 = string ssa2));
271
272val test22b = tst' "test22b"
273 (fn _ =>
274 (translate (fn c => if c = #"b" then "XYZ " else str c) ssa2
275 = "aAXYZ AA"));
276
277val test23 = tst' "test23"
278 (fn _ =>
279 (null(tokens isSpace ssa1)
280 andalso null(tokens (Char.contains "Aab") ssa2)
281 andalso map string (tokens (fn c => c = #"A") ssa2) = ["a","b"]));
282
283val test24 = tst' "test24"
284 (fn _ =>
285 (map base (fields isSpace ssa1) = [base ssa1]
286 andalso map base (fields (contains "Aab") ssa2)
287 = [(sa,4,0),(sa,5,0),(sa,6,0),(sa,7,0),(sa,8,0),(sa,9,0)]
288 andalso map string (fields (fn c => c = #"A") ssa2)
289 = ["a","b","",""]));
290
291val test25 = tst' "test25"
292 (fn _ =>
293 null(tokens (fn _ => true) ss3)
294 andalso null(tokens (fn _ => false) (all ""))
295 andalso null(tokens (contains " ()") (all "(()())(( ()"))
296 andalso ["this","is","a","clear","text"] =
297 map string (tokens (contains " ()") ss3));
298
299local
300 val v = ref 0
301 fun setv c = v := ord c;
302in
303
304val test26a = tst' "test26a"
305 (fn _ =>
306 (v := 0;
307 foldl (fn (x, _) => setv x) () ssa2;
308 !v = 65));
309
310val test26b = tst' "test26b"
311 (fn _ =>
312 implode(foldl (op ::) [] ssa2) = "AAbAa");
313
314val test27a = tst' "test27a"
315 (fn _ =>
316 (v := 0;
317 foldr (fn (x, _) => setv x) () ssa2;
318 !v = 97));
319
320val test27b = tst' "test27b"
321 (fn _ =>
322 implode(foldr (op ::) [] ssa2) = "aAbAA");
323
324val test28 = tst' "test28"
325 (fn _ =>
326 (v := 0;
327 app setv ssa2;
328 !v = 65));
329end
330
331val test29a = tst' "test29a"
332 (fn _ =>
333 base2(splitAt(ssa1, 0)) = ((sa, 4, 0), (sa, 4, 0))
334 andalso base2(splitAt(ssa2, 0)) = ((sa, 4, 0), (sa, 4, 5))
335 andalso base2(splitAt(ssa2, 1)) = ((sa, 4, 1), (sa, 5, 4))
336 andalso base2(splitAt(ssa2, 4)) = ((sa, 4, 4), (sa, 8, 1))
337 andalso base2(splitAt(ssa2, 5)) = ((sa, 4, 5), (sa, 9, 0)));
338val test29b = tst0 "test29b" ((splitAt(ssa2, ~1) seq "WRONG")
339 handle Subscript => "OK" | _ => "WRONG")
340val test29c = tst0 "test29c" ((splitAt(ssa2, 6) seq "WRONG")
341 handle Subscript => "OK" | _ => "WRONG")
342
343val test30a = tst' "test30a"
344 (fn _ =>
345 (s2, 10, 0) = base(substring(s2, 10, 0))
346 andalso (s2, 0, 0) = base(substring(s2, 0, 0))
347 andalso (s2, 4, 3) = base(substring(s2, 4, 3))
348 andalso (s2, 4, 6) = base(substring(s2, 4, 6))
349 andalso (s2, 0, 10) = base(substring(s2, 0, 10)));
350
351val test30b = tst0 "test30b" ((substring(s2, ~1, 0) seq "WRONG")
352 handle Subscript => "OK" | _ => "WRONG")
353val test30c = tst0 "test30c" ((substring(s2, 11, 0) seq "WRONG")
354 handle Subscript => "OK" | _ => "WRONG")
355val test30d = tst0 "test30d" ((substring(s2, 0, 11) seq "WRONG")
356 handle Subscript => "OK" | _ => "WRONG")
357val test30e = tst0 "test30e" ((substring(s2, 10, 1) seq "WRONG")
358 handle Subscript => "OK" | _ => "WRONG")
359val test30f = tst0 "test30f"
360 ((case (Int.minInt, Int.maxInt) of
361 (SOME min, SOME max) =>
362 ((substring("", max, max); "WRONG")
363 handle Subscript =>
364 ((substring("", min, min); "WRONG")
365 handle Subscript => "OK" | _ => "WRONG"))
366 | _ => "OK")
367 handle _ => "EXN")
368
369(* val sa = "AAAAaAbAABBBB"; *)
370val test31 = tst' "test31"
371 (fn _ =>
372 isPrefix "" (substring(sa, 0, 0))
373 andalso isPrefix "" (substring(sa, 13, 0))
374 andalso isPrefix "" ssa1
375 andalso isPrefix "aAbAA" ssa2
376 andalso isPrefix "aAbA" ssa2
377 andalso not (isPrefix "aAbAAB" ssa2)
378 andalso not (isPrefix "aAbAAB" ssa1))
379
380fun eqspan(sus1, sus2, res) = base(span(sus1, sus2)) = base res
381
382val test32a = tst' "test32a" (fn _ =>
383 eqspan(substring(sa, 0, 0), substring(sa, 0, 13), all sa)
384 andalso eqspan(substring(sa, 0, 13), substring(sa, 13, 0), all sa)
385 andalso eqspan(substring(sa, 5, 0), substring(sa, 5, 0), substring(sa, 5,0))
386 andalso eqspan(substring(sa, 0, 5), substring(sa, 5, 8), all sa)
387 andalso eqspan(substring(sa, 0, 13), substring(sa, 0, 13), all sa)
388 andalso eqspan(substring(sa, 5, 4), substring(sa, 2, 4), substring(sa,5,1))
389 andalso eqspan(substring(sa, 2, 5), substring(sa, 6, 3), substring(sa, 2,7))
390 andalso eqspan(substring("abcd", 1, 0), substring("abcd", 1, 2),
391 substring("abcd", 1, 2))
392 andalso eqspan(substring("", 0, 0), substring("", 0, 0), all ""))
393
394val test32b = tst0 "test32b" ((span(substring("a", 0, 0), substring("b", 0, 0)) seq "WRONG")
395 handle Span => "OK" | _ => "WRONG")
396
397val test32c = tst0 "test32c" ((span(substring(sa, 1, 0), substring(sa, 0, 0)) seq "WRONG")
398 handle Span => "OK" | _ => "WRONG")
399
400val test32d = tst0 "test32d" ((span(substring(sa, 3, 2), substring("abcd", 2, 1)) seq "WRONG")
401 handle Span => "OK" | _ => "WRONG")
402
403val test32e = tst0 "test32e" ((span(substring("a", 0, 0), substring("b", 0, 0)) seq "WRONG")
404 handle Span => "OK" | _ => "WRONG")
405
406end;