Commit | Line | Data |
---|---|---|
7f918cf1 CE |
1 | (*testdyn1.sml*) |
2 | ||
3 | (* ------------------------------------------------------------------- *) | |
4 | (* testdyn1, 08/02/1995 19:17, Martin *) | |
5 | (* Dynamic test of primitives... except for input/output *) | |
6 | (* ------------------------------------------------------------------- *) | |
7 | ||
8 | (* | |
9 | MEMO : 'sin', 'cos', 'arctan', 'ln' and 'exp' are not checked yet. | |
10 | ||
11 | *) | |
12 | ||
13 | infix == | |
14 | val epsilon = 0.000666 | |
15 | fun r1 == r2 = abs (r1 - r2) < epsilon (*no perfect world*) | |
16 | ||
17 | fun digit n = chr(ord #"0" + n) | |
18 | fun digits(n,acc) = | |
19 | if n >=0 andalso n<=9 then digit n:: acc | |
20 | else digits (n div 10, digit(n mod 10) :: acc) | |
21 | ||
22 | fun int_to_string(n) = if n >= 0 then implode(digits(n,[])) | |
23 | else "~" ^ int_to_string(~n) | |
24 | ||
25 | fun error b s = print ((if b then "Ok - " else "Error - ") ^ s ^ "...\n") | |
26 | ||
27 | (* testing stuff *) | |
28 | val _ = | |
29 | let | |
30 | val _ = print "Testing list operations:\n\ | |
31 | \ [rev, @, map]...\n" | |
32 | in | |
33 | error (rev [3,34,2,23] = [23,2,34,3]) "rev"; | |
34 | error (map (fn a:int => 2 * a) [3,34,2] = [6,68,4]) "map"; | |
35 | error ([34,56] @ [12,67] = [34,56,12,67]) "@" | |
36 | end | |
37 | ||
38 | val _ = | |
39 | let | |
40 | val _ = print "Testing string operations:\n\ | |
41 | \ [implode, explode, chr, ord, size]...\n" | |
42 | fun hds [] = #"-" | |
43 | | hds (x::_) = x | |
44 | in | |
45 | error (int_to_string 232 = "232") "int_to_string"; | |
46 | error (implode [#"h", #"e", #"l", #"l", #" "] = "hell ") "implode"; | |
47 | error (hds (explode "hello") = #"h") "explode"; | |
48 | error (chr 66 = #"B") "chr"; | |
49 | error (ord #"B" = 66) "ord"; | |
50 | error (((chr 1000) handle Chr => #"h") = #"h") "Chr"; | |
51 | error (((chr 1000) handle Div => #"h" | |
52 | | Chr => #"k") = #"k") "Chr2"; | |
53 | error (size "hello I'm 19 long.." = 19) "size" | |
54 | end | |
55 | ||
56 | val _ = | |
57 | let | |
58 | val _ = print "Testing ref [ref, :=, !]...\n" | |
59 | val a = ref "hello" | |
60 | val g = ref 45 | |
61 | in | |
62 | error (!a = "hello") "!1"; | |
63 | error ((a := "hej") = ()) ":=1"; | |
64 | error (!a = "hej") "!2"; | |
65 | error ((g := !g + 1) = ()) ":=2"; | |
66 | error (!g = 46) "!3" | |
67 | end | |
68 | ||
69 | val _ = | |
70 | let | |
71 | val _ = print "Testing polymorphic equality...\n" | |
72 | val a = [(34,"hejsa"), (4, "bw")] | |
73 | val b = [[3,23], [~34,23]] | |
74 | val c = (56, ref "hello") | |
75 | val d = ref "hej" | |
76 | datatype k = A of int * string | B | C of k * k | |
77 | val k1 = C (A(5,"hello"), B) | |
78 | val k2 = C (A(5,"hello2"), B) | |
79 | val k3 = C (A(5,"hello2"), B) | |
80 | in | |
81 | error (a = [(34,"hejsa"), (4, "bw")]) "equal"; | |
82 | error ((a = [(34,"hejsa"), (4, "cw")]) = false) "equal2"; | |
83 | error (b = [[3,23], [~34,23]]) "equal3"; | |
84 | error ((b = [[3,23], [~34,21]]) = false) "equal4"; | |
85 | error ((c = (56, ref "hello")) = false) "equal5 (ref1)"; | |
86 | error ((34,d) = (34,d)) "equal5 (ref2)"; | |
87 | error (k1 <> k2) "equal6 (dat k)"; | |
88 | error (k2 = k3) "equal7 (dat k)" | |
89 | end | |
90 | ||
91 | val _ = | |
92 | let | |
93 | val _ = print "Testing arithmetic integer operations:\n\ | |
94 | \ [~, abs, floor, +, -, *, div, mod, <, >, <=, >=] ...\n" | |
95 | fun checkdivmod (i, d) = | |
96 | let | |
97 | val (r, q) = (i mod d, i div d) | |
98 | val gt_zero = fn a => a > 0 | |
99 | in | |
100 | error (gt_zero r = gt_zero d andalso d * q + r = i) | |
101 | ("intdivmod - " ^ int_to_string i ^ " mod " ^ int_to_string d ^ | |
102 | " = " ^ int_to_string r ^ ", " ^ int_to_string i ^ " div " | |
103 | ^ int_to_string d ^ " = " ^ int_to_string q) | |
104 | end | |
105 | in | |
106 | error (~ 5 = ~5) "~1"; | |
107 | error (~ (~2) = 2) "~2"; | |
108 | error (abs 5 = 5) "abs1"; | |
109 | error (abs (~23) = 23) "abs2"; | |
110 | error (floor (23.23) = 23) "floor1"; | |
111 | error (floor (~23.23) = ~24) "floor2"; | |
112 | error (((floor (23.0E23)) handle Overflow => 4) = 4) "floor3"; | |
113 | error (23 + 12 = 35 andalso ~4 + 5 = 1) "+"; | |
114 | error (34 - 12 = 22 andalso ~23 - 15 = ~38) "-"; | |
115 | error (12 * 3 = 36 andalso ~23 * 2 = ~46) "*"; | |
116 | map checkdivmod [(2,3), (34, ~3), (5, ~2), (~7, 3)]; | |
117 | error (((3 div 0) handle Div => 60) = 60) "Div1"; | |
118 | error (((3 mod 0) handle Div => 45) = 45) "Div2"; | |
119 | error ((23 < 40) = true) "<1"; | |
120 | error ((54 < 40) = false) "<2"; | |
121 | error ((40 < 40) = false) "<3"; | |
122 | error ((23 > 40) = false) ">1"; | |
123 | error ((54 > 40) = true) ">2"; | |
124 | error ((40 > 40) = false) ">3"; | |
125 | error ((23 <= 40) = true) "<=1"; | |
126 | error ((54 <= 40) = false) "<=2"; | |
127 | error ((40 <= 40) = true) "<=3"; | |
128 | error ((23 >= 40) = false) ">=1"; | |
129 | error ((54 >= 40) = true) ">=2"; | |
130 | error ((40 >= 40) = true) ">=3" | |
131 | end | |
132 | ||
133 | val _ = | |
134 | let | |
135 | val _ = print "Testing arithmetic real operations:\n\ | |
136 | \ [+, -, *, /, ~, abs, real, sqrt, <, >, <=, >=] ...\n" | |
137 | in | |
138 | error (4.0 + 3.0 == 7.0) "+"; | |
139 | error (4.0 - 1.0 == 3.0) "-"; | |
140 | error (4.0 * 3.0 == 12.0) "*"; | |
141 | error (9.0 / 2.0 == 4.5) "/"; | |
142 | error (~ 5.3 == ~5.3) "~1"; | |
143 | error (~ (~2.23) == 2.23) "~2"; | |
144 | error (abs 5.23 == 5.23) "abs1"; | |
145 | error (abs (~23.12) == 23.12) "abs2"; | |
146 | error (real 5 == 5.0) "real1"; | |
147 | error (real ~5 == ~5.0) "real2"; | |
148 | error (Math.sqrt 0.0 == 0.0) "sqrt1"; | |
149 | error (Math.sqrt 2.0 > 1.4) "sqrt2"; | |
150 | error (Math.sqrt 2.0 < 1.5) "sqrt3"; | |
151 | ||
152 | error ((23.34 < 40.23) = true) "<1"; | |
153 | error ((54.12 < 40.45) = false) "<2"; | |
154 | error ((40.12 < 40.12) = false) "<3"; | |
155 | error ((23.34 > 40.12) = false) ">1"; | |
156 | error ((54.45 > 40.23) = true) ">2"; | |
157 | error ((40.23 > 40.23) = false) ">3"; | |
158 | error ((23.12 <= 40.34) = true) "<=1"; | |
159 | error ((54.23 <= 40.23) = false) "<=2"; | |
160 | error ((40.23 <= 40.23) = true) "<=3"; | |
161 | error ((23.75 >= 40.75) = false) ">=1"; | |
162 | error ((54.57 >= 40.57) = true) ">=2"; | |
163 | error ((40.23 >= 40.23) = true) ">=3" | |
164 | end | |
165 | ||
166 | val _ = | |
167 | let | |
168 | val _ = print "Testing composition o:\n" | |
169 | fun f x = 3 + x | |
170 | fun g y = (y, 2*y) | |
171 | in | |
172 | error ((g o f) 7 = (10,20)) "o" | |
173 | end | |
174 | ||
175 | val _ = | |
176 | let | |
177 | val _ = print "Testing generative exceptions:\n" | |
178 | fun g a = | |
179 | let | |
180 | fun f x = | |
181 | let | |
182 | exception E | |
183 | in | |
184 | if x < 1 then raise E | |
185 | else ((f (x-1)) handle E => 7) (* should not handle this.. *) | |
186 | end | |
187 | in | |
188 | (f a) handle _ => a | |
189 | end (* a *) | |
190 | in | |
191 | error (g 10 = 10) "exn - generative" | |
192 | end | |
193 | ||
194 | fun etst b s = if b then () else print ("Error - " ^ s ^ "...\n"); | |
195 | ||
196 | val _ = etst ("\u0041\u000a\\u0041\n" = "A\n\092" ^ "u0041\010") | |
197 | "backslash u does not work or somepin"; | |
198 | ||
199 | val _ = etst (map ord [#"a", #"A", #" ", chr 42, #"\117"] = | |
200 | [97, 65, 32, 42, 117]) "char problem, maybe #" | |
201 | ||
202 | val _ = print "End of test.\n" |