OLD | NEW |
| (Empty) |
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | |
2 // for details. All rights reserved. Use of this source code is governed by a | |
3 // BSD-style license that can be found in the LICENSE file. | |
4 // Dart test program to test arithmetic operations. | |
5 | |
6 class ArithmeticTest { | |
7 | |
8 static bool exceptionCaughtParseInt(String s) { | |
9 try { | |
10 Math.parseInt(s); | |
11 return false; | |
12 } catch (BadNumberFormatException e) { | |
13 return true; | |
14 } | |
15 } | |
16 | |
17 static bool exceptionCaughtParseDouble(String s) { | |
18 try { | |
19 Math.parseDouble(s); | |
20 return false; | |
21 } catch (BadNumberFormatException e) { | |
22 return true; | |
23 } | |
24 } | |
25 | |
26 static bool toIntThrowsBadNumberFormatException(String str) { | |
27 // No exception allowed for parse double. | |
28 double d = Math.parseDouble(str); | |
29 try { | |
30 var a = d.toInt(); | |
31 return false; | |
32 } catch (BadNumberFormatException e) { | |
33 return true; | |
34 } | |
35 } | |
36 | |
37 static runOne() { | |
38 var a = 22; | |
39 var b = 4; | |
40 // Smi & smi. | |
41 Expect.equals(26, a + b); | |
42 Expect.equals(18, a - b); | |
43 Expect.equals(88, a * b); | |
44 Expect.equals(5, a ~/ b); | |
45 Expect.equals(5.5, a / b); | |
46 Expect.equals(2.0, 10 / 5); | |
47 Expect.equals(2, a % b); | |
48 Expect.equals(2, a.remainder(b)); | |
49 // Smi corner cases. | |
50 for (int i = 0; i < 80; i++) { | |
51 a = -(1 << i); | |
52 b = -1; | |
53 Expect.equals(1 << i, a ~/ b); | |
54 } | |
55 a = 22; | |
56 b = 4.0; | |
57 // Smi & double. | |
58 Expect.equals(26.0, a + b); | |
59 Expect.equals(18.0, a - b); | |
60 Expect.equals(88.0, a * b); | |
61 Expect.equals(5.0, a ~/ b); | |
62 Expect.equals(5.5, a / b); | |
63 Expect.equals(2.0, a % b); | |
64 Expect.equals(2.0, a.remainder(b)); | |
65 a = 22.0; | |
66 b = 4; | |
67 // Double & smi. | |
68 Expect.equals(26.0, a + b); | |
69 Expect.equals(18.0, a - b); | |
70 Expect.equals(88.0, a * b); | |
71 Expect.equals(5.0, a ~/ b); | |
72 Expect.equals(5.5, a / b); | |
73 Expect.equals(2.0, a % b); | |
74 Expect.equals(2.0, a.remainder(b)); | |
75 a = 22.0; | |
76 b = 4.0; | |
77 // Double & double. | |
78 Expect.equals(26.0, a + b); | |
79 Expect.equals(18.0, a - b); | |
80 Expect.equals(88.0, a * b); | |
81 Expect.equals(5.0, a ~/ b); | |
82 Expect.equals(5.5, a / b); | |
83 Expect.equals(2.0, a % b); | |
84 Expect.equals(2.0, a.remainder(b)); | |
85 | |
86 // Special int operations. | |
87 Expect.equals(2, (2).floor()); | |
88 Expect.equals(2, (2).ceil()); | |
89 Expect.equals(2, (2).round()); | |
90 Expect.equals(2, (2).truncate()); | |
91 | |
92 Expect.equals(-2, (-2).floor()); | |
93 Expect.equals(-2, (-2).ceil()); | |
94 Expect.equals(-2, (-2).round()); | |
95 Expect.equals(-2, (-2).truncate()); | |
96 | |
97 // Note that this number fits into 53 bits of a double. | |
98 int big = 123456789012345; | |
99 | |
100 Expect.equals(big, big.floor()); | |
101 Expect.equals(big, big.ceil()); | |
102 Expect.equals(big, big.round()); | |
103 Expect.equals(big, big.truncate()); | |
104 big = -big; | |
105 Expect.equals(big, big.floor()); | |
106 Expect.equals(big, big.ceil()); | |
107 Expect.equals(big, big.round()); | |
108 Expect.equals(big, big.truncate()); | |
109 | |
110 // Test if double is contagious. The assignment will check the type. | |
111 { double d = 1 + 1.0; } | |
112 { double d = 1.0 + 1; } | |
113 { double d = 1 * 1.0; } | |
114 { double d = 0 * 1.0; } | |
115 { double d = 1.0 * 0; } | |
116 { double d = 1 / 1.0; } | |
117 { double d = 1.0 / 0; } | |
118 { double d = 1 - 1.0; } | |
119 { double d = 1.0 - 1; } | |
120 { double d = big * 1.0; } | |
121 { double d = 1.0 * big; } | |
122 | |
123 // Reset big to positive value. | |
124 big = 123456789012345; | |
125 // -- isNegative --. | |
126 // Smi. | |
127 Expect.equals(false, (0).isNegative()); | |
128 Expect.equals(false, (1).isNegative()); | |
129 Expect.equals(true, (-1).isNegative()); | |
130 // Big. | |
131 Expect.equals(false, big.isNegative()); | |
132 Expect.equals(true, (-big).isNegative()); | |
133 // Double. | |
134 // TODO(srdjan): enable the following test once isNegative works. | |
135 // Expect.equals(true, (-0.0).isNegative()); | |
136 Expect.equals(false, (0.0).isNegative()); | |
137 Expect.equals(false, (2.0).isNegative()); | |
138 Expect.equals(true, (-2.0).isNegative()); | |
139 | |
140 double negateDouble(double x) { | |
141 return -x; | |
142 } | |
143 | |
144 Expect.isTrue(negateDouble(0.0).isNegative()); | |
145 Expect.isFalse(negateDouble(-0.0).isNegative()); | |
146 Expect.isTrue(negateDouble(3.5e3).isNegative()); | |
147 Expect.isFalse(negateDouble(-3.5e3).isNegative()); | |
148 | |
149 | |
150 // Constants. | |
151 final nan = 0.0/0.0; | |
152 final infinity = 1.0/0.0; | |
153 | |
154 // -- isInfinite --. | |
155 // Smi. | |
156 Expect.equals(false, (0).isInfinite()); | |
157 Expect.equals(false, (1).isInfinite()); | |
158 Expect.equals(false, (-1).isInfinite()); | |
159 // Big. | |
160 Expect.equals(false, big.isInfinite()); | |
161 Expect.equals(false, (-big).isInfinite()); | |
162 // Double. | |
163 Expect.equals(false, (0.0).isInfinite()); | |
164 Expect.equals(true, infinity.isInfinite()); | |
165 Expect.equals(true, (-infinity).isInfinite()); | |
166 Expect.equals(false, (12.0).isInfinite()); | |
167 Expect.equals(false, (-12.0).isInfinite()); | |
168 Expect.equals(false, nan.isInfinite()); | |
169 | |
170 // -- isNaN --. | |
171 // Smi. | |
172 Expect.equals(false, (0).isNaN()); | |
173 Expect.equals(false, (1).isNaN()); | |
174 Expect.equals(false, (-1).isNaN()); | |
175 // Big. | |
176 Expect.equals(false, big.isNaN()); | |
177 Expect.equals(false, (-big).isNaN()); | |
178 // Double. | |
179 Expect.equals(true, nan.isNaN()); | |
180 Expect.equals(false, (12.0).isNaN()); | |
181 Expect.equals(false, infinity.isNaN()); | |
182 | |
183 // -- abs --. | |
184 // Smi. | |
185 Expect.equals(0, (0).abs()); | |
186 Expect.equals(2, (2).abs()); | |
187 Expect.equals(2, (-2).abs()); | |
188 // Big. | |
189 Expect.equals(big, big.abs()); | |
190 Expect.equals(big, (-big).abs()); | |
191 // Double. | |
192 Expect.equals(false, (0.0).abs().isNegative()); | |
193 Expect.equals(false, (-0.0).abs().isNegative()); | |
194 Expect.equals(2.0, (2.0).abs()); | |
195 Expect.equals(2.0, (-2.0).abs()); | |
196 | |
197 // -- ceil --. | |
198 // Smi. | |
199 Expect.equals(0, (0).ceil()); | |
200 Expect.equals(1, (1).ceil()); | |
201 Expect.equals(-1, (-1).ceil()); | |
202 // Big. | |
203 Expect.equals(big, big.ceil()); | |
204 Expect.equals(-big, (-big).ceil()); | |
205 // Double. | |
206 Expect.equals(0.0, (0.0).ceil()); | |
207 Expect.equals(false, (0.0).ceil().isNegative()); | |
208 Expect.equals(1.0, (0.1).ceil()); | |
209 Expect.equals(-0.0, (-0.0).ceil()); | |
210 Expect.equals(-0.0, (-0.3).ceil()); | |
211 // TODO(srdjan): enable the following tests once isNegative works. | |
212 // Expect.equals(true, (-0.0).ceil().isNegative()); | |
213 // Expect.equals(true, (-0.3).ceil().isNegative()); | |
214 Expect.equals(3.0, (2.1).ceil()); | |
215 Expect.equals(-2.0, (-2.1).ceil()); | |
216 | |
217 // -- floor --. | |
218 // Smi. | |
219 Expect.equals(0, (0).floor()); | |
220 Expect.equals(1, (1).floor()); | |
221 Expect.equals(-1, (-1).floor()); | |
222 // Big. | |
223 Expect.equals(big, big.floor()); | |
224 Expect.equals(-big, (-big).floor()); | |
225 // Double. | |
226 Expect.equals(0.0, (0.0).floor()); | |
227 Expect.equals(0.0, (0.1).floor()); | |
228 Expect.equals(false, (0.0).floor().isNegative()); | |
229 Expect.equals(false, (0.1).floor().isNegative()); | |
230 Expect.equals(-0.0, (-0.0).floor()); | |
231 // TODO(srdjan): enable the following tests once isNegative works. | |
232 // Expect.equals(true, (-0.0).floor().isNegative()); | |
233 Expect.equals(-1.0, (-0.1).floor()); | |
234 Expect.equals(2.0, (2.1).floor()); | |
235 Expect.equals(-3.0, (-2.1).floor()); | |
236 | |
237 // -- truncate --. | |
238 // Smi. | |
239 Expect.equals(0, (0).truncate()); | |
240 Expect.equals(1, (1).truncate()); | |
241 Expect.equals(-1, (-1).truncate()); | |
242 // Big. | |
243 Expect.equals(big, big.truncate()); | |
244 Expect.equals(-big, (-big).truncate()); | |
245 // Double. | |
246 Expect.equals(0.0, (0.0).truncate()); | |
247 Expect.equals(0.0, (0.1).truncate()); | |
248 Expect.equals(false, (0.0).truncate().isNegative()); | |
249 Expect.equals(false, (0.1).truncate().isNegative()); | |
250 Expect.equals(-0.0, (-0.0).truncate()); | |
251 Expect.equals(-0.0, (-0.3).truncate()); | |
252 // TODO(srdjan): enable the following tests once isNegative works. | |
253 // Expect.equals(true, (-0.0).truncate().isNegative()); | |
254 // Expect.equals(true, (-0.3).truncate().isNegative()); | |
255 Expect.equals(2.0, (2.1).truncate()); | |
256 Expect.equals(-2.0, (-2.1).truncate()); | |
257 | |
258 double b1 = (1234567890123.0).truncate(); | |
259 double b2 = (1234567890124.0).truncate(); | |
260 Expect.equals(b2, b1 + 1.0); | |
261 | |
262 // -- round --. | |
263 // Smi. | |
264 Expect.equals(0, (0).round()); | |
265 Expect.equals(1, (1).round()); | |
266 Expect.equals(-1, (-1).round()); | |
267 // Big. | |
268 Expect.equals(big, big.round()); | |
269 Expect.equals(-big, (-big).round()); | |
270 // Double. | |
271 Expect.equals(3.0, (2.6).round()); | |
272 Expect.equals(-3.0, (-2.6).round()); | |
273 Expect.equals(0.0, (0.0).round()); | |
274 Expect.equals(0.0, (0.1).round()); | |
275 Expect.equals(false, (0.0).round().isNegative()); | |
276 Expect.equals(false, (0.1).round().isNegative()); | |
277 Expect.equals(-0.0, (-0.0).round()); | |
278 Expect.equals(-0.0, (-0.3).round()); | |
279 Expect.equals(2.0, (2.1).round()); | |
280 Expect.equals(-2.0, (-2.1).round()); | |
281 Expect.equals(1.0, (0.5).round()); | |
282 // TODO(floitsch): enable or adapt test, once we reached conclusion on | |
283 // b/4539188. | |
284 // Expect.equals(-0.0, (-0.5).round()); | |
285 // TODO(srdjan): enable the following tests once isNegative works. | |
286 // Expect.equals(true, (-0.0).round().isNegative()); | |
287 // Expect.equals(true, (-0.3).round().isNegative()); | |
288 // Expect.equals(true, (-0.5).round().isNegative()); | |
289 Expect.equals(2.0, (1.5).round()); | |
290 // TODO(floitsch): enable or adapt test, once we reached conclusion on | |
291 // b/4539188. | |
292 // Expect.equals(-1.0, (-1.5).round()); | |
293 Expect.equals(1.0, (0.99).round()); | |
294 | |
295 // -- toInt --. | |
296 // Smi. | |
297 Expect.equals(0, (0).toInt()); | |
298 Expect.equals(1, (1).toInt()); | |
299 Expect.equals(-1, (-1).toInt()); | |
300 // Type checks. | |
301 { int i = (0).toInt(); } | |
302 { int i = (1).toInt(); } | |
303 { int i = (-1).toInt(); } | |
304 // Big. | |
305 Expect.equals(big, big.toInt()); | |
306 Expect.equals(-big, (-big).toInt()); | |
307 { int i = big.toInt(); } | |
308 { int i = (-big).toInt(); } | |
309 // Double. | |
310 Expect.equals(1234567890123, (1234567890123.0).toInt()); | |
311 Expect.equals(-1234567890123, (-1234567890123.0).toInt()); | |
312 { int i = (1234567890123.0).toInt(); } | |
313 { int i = (-1234567890123.0).toInt(); } | |
314 // 32bit Smi border cases. | |
315 Expect.equals(-1073741824, (-1073741824.0).toInt()); | |
316 Expect.equals(-1073741825, (-1073741825.0).toInt()); | |
317 Expect.equals(1073741823, (1073741823.0).toInt()); | |
318 Expect.equals(1073741824, (1073741824.0).toInt()); | |
319 { int i = (-1073741824.0).toInt(); } | |
320 { int i = (-1073741825.0).toInt(); } | |
321 { int i = (1073741823.0).toInt(); } | |
322 { int i = (1073741824.0).toInt(); } | |
323 | |
324 // -- toDouble --. | |
325 // Smi. | |
326 Expect.equals(0.0, (0).toDouble()); | |
327 Expect.equals(1.0, (1).toDouble()); | |
328 Expect.equals(-1.0, (-1).toDouble()); | |
329 // Type checks. | |
330 { double d = (0).toDouble(); } | |
331 { double d = (1).toDouble(); } | |
332 { double d = (-1).toDouble(); } | |
333 // Big. | |
334 Expect.equals(big, big.toInt()); | |
335 Expect.equals(-big, (-big).toInt()); | |
336 { int i = big.toInt(); } | |
337 { int i = (-big).toInt(); } | |
338 | |
339 // Math functions. | |
340 Expect.equals(2.0, Math.sqrt(4.0)); | |
341 Expect.approxEquals(1.0, Math.sin(3.14159265 / 2.0)); | |
342 Expect.approxEquals(-1.0, Math.cos(3.14159265)); | |
343 | |
344 Expect.equals(12, Math.parseInt("12")); | |
345 Expect.equals(-12, Math.parseInt("-12")); | |
346 Expect.equals(12345678901234567890, | |
347 Math.parseInt("12345678901234567890")); | |
348 Expect.equals(-12345678901234567890, | |
349 Math.parseInt("-12345678901234567890")); | |
350 // Type checks. | |
351 { int i = Math.parseInt("12"); } | |
352 { int i = Math.parseInt("-12"); } | |
353 { int i = Math.parseInt("12345678901234567890"); } | |
354 { int i = Math.parseInt("-12345678901234567890"); } | |
355 | |
356 Expect.equals(1.2, Math.parseDouble("1.2")); | |
357 Expect.equals(-1.2, Math.parseDouble("-1.2")); | |
358 // Type checks. | |
359 { double d = Math.parseDouble("1.2"); } | |
360 { double d = Math.parseDouble("-1.2"); } | |
361 { double d = Math.parseDouble("0"); } | |
362 | |
363 // Random | |
364 { double d = Math.random(); } | |
365 | |
366 Expect.equals(false, exceptionCaughtParseInt("22")); | |
367 Expect.equals(true, exceptionCaughtParseInt("alpha")); | |
368 Expect.equals(true, exceptionCaughtParseInt("-alpha")); | |
369 Expect.equals(false, exceptionCaughtParseDouble("22.2")); | |
370 Expect.equals(true, exceptionCaughtParseDouble("alpha")); | |
371 Expect.equals(true, exceptionCaughtParseDouble("-alpha")); | |
372 | |
373 Expect.equals(false, Math.parseDouble("1.2").isNaN()); | |
374 Expect.equals(false, Math.parseDouble("1.2").isInfinite()); | |
375 | |
376 Expect.equals(true, Math.parseDouble("NaN").isNaN()); | |
377 Expect.equals(true, Math.parseDouble("Infinity").isInfinite()); | |
378 Expect.equals(true, Math.parseDouble("-Infinity").isInfinite()); | |
379 | |
380 Expect.equals(false, Math.parseDouble("NaN").isNegative()); | |
381 Expect.equals(false, Math.parseDouble("Infinity").isNegative()); | |
382 Expect.equals(true, Math.parseDouble("-Infinity").isNegative()); | |
383 | |
384 Expect.equals("NaN", Math.parseDouble("NaN").toString()); | |
385 Expect.equals("Infinity", Math.parseDouble("Infinity").toString()); | |
386 Expect.equals("-Infinity", Math.parseDouble("-Infinity").toString()); | |
387 | |
388 Expect.equals(false, toIntThrowsBadNumberFormatException("1.2")); | |
389 Expect.equals(true, toIntThrowsBadNumberFormatException("Infinity")); | |
390 Expect.equals(true, toIntThrowsBadNumberFormatException("-Infinity")); | |
391 Expect.equals(true, toIntThrowsBadNumberFormatException("NaN")); | |
392 | |
393 // Min/max | |
394 Expect.equals(1, Math.min(1, 12)); | |
395 Expect.equals(12, Math.max(1, 12)); | |
396 Expect.equals(1.0, Math.min(1.0, 12.0)); | |
397 Expect.equals(12.0, Math.max(1.0, 12.0)); | |
398 Expect.equals(false, 1.0 < Math.min(1.0, 12.0)); | |
399 Expect.equals(true, 1.0 < Math.max(1.0, 12.0)); | |
400 | |
401 // Hashcode | |
402 Expect.equals(false, (3.4).hashCode() == (1.2).hashCode()); | |
403 Expect.equals(true, (1.2).hashCode() == (1.2).hashCode()); | |
404 Expect.equals(false, (3).hashCode() == (1).hashCode()); | |
405 Expect.equals(true, (10).hashCode() == (10).hashCode()); | |
406 } | |
407 | |
408 static testMain() { | |
409 for (int i = 0; i < 1500; i++) { | |
410 runOne(); | |
411 } | |
412 } | |
413 } | |
414 | |
415 main() { | |
416 ArithmeticTest.testMain(); | |
417 } | |
OLD | NEW |