* tests/numbers.test: added tests (some simple) for various funcs.
[bpt/guile.git] / test-suite / tests / numbers.test
1 ;;;; numbers.test --- tests guile's numbers -*- scheme -*-
2 ;;;; Copyright (C) 2000, 2001 Free Software Foundation, Inc.
3 ;;;;
4 ;;;; This program is free software; you can redistribute it and/or modify
5 ;;;; it under the terms of the GNU General Public License as published by
6 ;;;; the Free Software Foundation; either version 2, or (at your option)
7 ;;;; any later version.
8 ;;;;
9 ;;;; This program is distributed in the hope that it will be useful,
10 ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 ;;;; GNU General Public License for more details.
13 ;;;;
14 ;;;; You should have received a copy of the GNU General Public License
15 ;;;; along with this software; see the file COPYING. If not, write to
16 ;;;; the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
17 ;;;; Boston, MA 02111-1307 USA
18 ;;;;
19 ;;;; As a special exception, the Free Software Foundation gives permission
20 ;;;; for additional uses of the text contained in its release of GUILE.
21 ;;;;
22 ;;;; The exception is that, if you link the GUILE library with other files
23 ;;;; to produce an executable, this does not by itself cause the
24 ;;;; resulting executable to be covered by the GNU General Public License.
25 ;;;; Your use of that executable is in no way restricted on account of
26 ;;;; linking the GUILE library code into it.
27 ;;;;
28 ;;;; This exception does not however invalidate any other reasons why
29 ;;;; the executable file might be covered by the GNU General Public License.
30 ;;;;
31 ;;;; This exception applies only to the code released by the
32 ;;;; Free Software Foundation under the name GUILE. If you copy
33 ;;;; code from other Free Software Foundation releases into a copy of
34 ;;;; GUILE, as the General Public License permits, the exception does
35 ;;;; not apply to the code that you add in this way. To avoid misleading
36 ;;;; anyone as to the status of such modified files, you must delete
37 ;;;; this exception notice from them.
38 ;;;;
39 ;;;; If you write modifications of your own for GUILE, it is your choice
40 ;;;; whether to permit this exception to apply to your modifications.
41 ;;;; If you do not wish that, delete this exception notice.
42
43 (use-modules (ice-9 documentation))
44
45 ;;;
46 ;;; miscellaneous
47 ;;;
48
49 (define exception:numerical-overflow
50 (cons 'numerical-overflow "^Numerical overflow"))
51
52 (define (documented? object)
53 (not (not (object-documentation object))))
54
55 (define fixnum-bit
56 (inexact->exact (+ (/ (log (+ most-positive-fixnum 1)) (log 2)) 1)))
57
58 (define fixnum-min most-negative-fixnum)
59 (define fixnum-max most-positive-fixnum)
60
61 ;;;
62 ;;; exact?
63 ;;;
64
65 (with-test-prefix "exact?"
66
67 (pass-if "documented?"
68 (documented? exact?))
69
70 (with-test-prefix "integers"
71
72 (pass-if "0"
73 (exact? 0))
74
75 (pass-if "fixnum-max"
76 (exact? fixnum-max))
77
78 (pass-if "fixnum-max + 1"
79 (exact? (+ fixnum-max 1)))
80
81 (pass-if "fixnum-min"
82 (exact? fixnum-min))
83
84 (pass-if "fixnum-min - 1"
85 (exact? (- fixnum-min 1))))
86
87 (with-test-prefix "reals"
88
89 ;; (FIXME: need better examples.)
90
91 (pass-if "sqrt (fixnum-max^2 - 1)"
92 (eq? #f (exact? (sqrt (- (expt fixnum-max 2) 1)))))
93
94 (pass-if "sqrt ((fixnum-max+1)^2 - 1)"
95 (eq? #f (exact? (sqrt (- (expt (+ fixnum-max 1) 2) 1)))))))
96
97 ;;;
98 ;;; odd?
99 ;;;
100
101 (with-test-prefix "odd?"
102 (pass-if (documented? odd?))
103 (pass-if (odd? 1))
104 (pass-if (odd? -1))
105 (expect-fail (odd? 0))
106 (expect-fail (odd? 2))
107 (expect-fail (odd? -2))
108 (pass-if (odd? (+ (* 2 fixnum-max) 1)))
109 (expect-fail (odd? (* 2 fixnum-max)))
110 (pass-if (odd? (- (* 2 fixnum-min) 1)))
111 (expect-fail (odd? (* 2 fixnum-min))))
112
113 ;;;
114 ;;; even?
115 ;;;
116
117 (with-test-prefix "even?"
118 (pass-if (documented? even?))
119 (pass-if (even? 2))
120 (pass-if (even? -2))
121 (pass-if (even? 0))
122 (expect-fail (even? 1))
123 (expect-fail (even? -1))
124 (expect-fail (even? (+ (* 2 fixnum-max) 1)))
125 (pass-if (even? (* 2 fixnum-max)))
126 (expect-fail (even? (- (* 2 fixnum-min) 1)))
127 (pass-if (even? (* 2 fixnum-min))))
128
129 ;;;
130 ;;; inf? and inf
131 ;;;
132
133 (with-test-prefix "inf?"
134 (pass-if (documented? inf?))
135 (pass-if (inf? (inf)))
136 ;; FIXME: what are the expected behaviors?
137 ;; (pass-if (inf? (/ 1.0 0.0))
138 ;; (pass-if (inf? (/ 1 0.0))
139 (expect-fail (inf? 0))
140 (expect-fail (inf? 42.0))
141 (expect-fail (inf? (+ fixnum-max 1)))
142 (expect-fail (inf? (- fixnum-min 1))))
143
144 ;;;
145 ;;; nan? and nan
146 ;;;
147
148 (with-test-prefix "nan?"
149 (pass-if (documented? nan?))
150 (pass-if (nan? (nan)))
151 ;; FIXME: other ways we should be able to generate NaN?
152 (expect-fail (nan? 0))
153 (expect-fail (nan? 42.0))
154 (expect-fail (nan? (+ fixnum-max 1)))
155 (expect-fail (nan? (- fixnum-min 1))))
156
157 ;;;
158 ;;; abs
159 ;;;
160
161 (with-test-prefix "abs"
162 (pass-if (documented? abs))
163 (pass-if (zero? (abs 0)))
164 (pass-if (= 1 (abs 1)))
165 (pass-if (= 1 (abs -1)))
166 (pass-if (= (+ fixnum-max 1) (abs (+ fixnum-max 1))))
167 (pass-if (= (+ (- fixnum-min) 1) (abs (- fixnum-min 1))))
168 (pass-if (positive? (abs 1.0)))
169 (pass-if (positive? (abs -1.0))))
170
171 ;;;
172 ;;; quotient
173 ;;;
174
175 (with-test-prefix "quotient"
176
177 (expect-fail "documented?"
178 (documented? quotient))
179
180 (with-test-prefix "0 / n"
181
182 (pass-if "n = 1"
183 (eqv? 0 (quotient 0 1)))
184
185 (pass-if "n = -1"
186 (eqv? 0 (quotient 0 -1)))
187
188 (pass-if "n = 2"
189 (eqv? 0 (quotient 0 2)))
190
191 (pass-if "n = fixnum-max"
192 (eqv? 0 (quotient 0 fixnum-max)))
193
194 (pass-if "n = fixnum-max + 1"
195 (eqv? 0 (quotient 0 (+ fixnum-max 1))))
196
197 (pass-if "n = fixnum-min"
198 (eqv? 0 (quotient 0 fixnum-min)))
199
200 (pass-if "n = fixnum-min - 1"
201 (eqv? 0 (quotient 0 (- fixnum-min 1)))))
202
203 (with-test-prefix "1 / n"
204
205 (pass-if "n = 1"
206 (eqv? 1 (quotient 1 1)))
207
208 (pass-if "n = -1"
209 (eqv? -1 (quotient 1 -1)))
210
211 (pass-if "n = 2"
212 (eqv? 0 (quotient 1 2)))
213
214 (pass-if "n = fixnum-max"
215 (eqv? 0 (quotient 1 fixnum-max)))
216
217 (pass-if "n = fixnum-max + 1"
218 (eqv? 0 (quotient 1 (+ fixnum-max 1))))
219
220 (pass-if "n = fixnum-min"
221 (eqv? 0 (quotient 1 fixnum-min)))
222
223 (pass-if "n = fixnum-min - 1"
224 (eqv? 0 (quotient 1 (- fixnum-min 1)))))
225
226 (with-test-prefix "-1 / n"
227
228 (pass-if "n = 1"
229 (eqv? -1 (quotient -1 1)))
230
231 (pass-if "n = -1"
232 (eqv? 1 (quotient -1 -1)))
233
234 (pass-if "n = 2"
235 (eqv? 0 (quotient -1 2)))
236
237 (pass-if "n = fixnum-max"
238 (eqv? 0 (quotient -1 fixnum-max)))
239
240 (pass-if "n = fixnum-max + 1"
241 (eqv? 0 (quotient -1 (+ fixnum-max 1))))
242
243 (pass-if "n = fixnum-min"
244 (eqv? 0 (quotient -1 fixnum-min)))
245
246 (pass-if "n = fixnum-min - 1"
247 (eqv? 0 (quotient -1 (- fixnum-min 1)))))
248
249 (with-test-prefix "fixnum-max / n"
250
251 (pass-if "n = 1"
252 (eqv? fixnum-max (quotient fixnum-max 1)))
253
254 (pass-if "n = -1"
255 (eqv? (- fixnum-max) (quotient fixnum-max -1)))
256
257 (pass-if "n = 2"
258 (eqv? fixnum-max (+ (* (quotient fixnum-max 2) 2) 1)))
259
260 (pass-if "n = fixnum-max"
261 (eqv? 1 (quotient fixnum-max fixnum-max)))
262
263 (pass-if "n = fixnum-max + 1"
264 (eqv? 0 (quotient fixnum-max (+ fixnum-max 1))))
265
266 (pass-if "n = fixnum-min"
267 (eqv? 0 (quotient fixnum-max fixnum-min)))
268
269 (pass-if "n = fixnum-min - 1"
270 (eqv? 0 (quotient fixnum-max (- fixnum-min 1)))))
271
272 (with-test-prefix "(fixnum-max + 1) / n"
273
274 (pass-if "n = 1"
275 (eqv? (+ fixnum-max 1) (quotient (+ fixnum-max 1) 1)))
276
277 (pass-if "n = -1"
278 (eqv? (- (+ fixnum-max 1)) (quotient (+ fixnum-max 1) -1)))
279
280 (pass-if "n = 2"
281 (eqv? (+ fixnum-max 1) (* (quotient (+ fixnum-max 1) 2) 2)))
282
283 (pass-if "n = fixnum-max"
284 (eqv? 1 (quotient (+ fixnum-max 1) fixnum-max)))
285
286 (pass-if "n = fixnum-max + 1"
287 (eqv? 1 (quotient (+ fixnum-max 1) (+ fixnum-max 1))))
288
289 (pass-if "n = fixnum-min"
290 (eqv? -1 (quotient (+ fixnum-max 1) fixnum-min)))
291
292 (pass-if "n = fixnum-min - 1"
293 (eqv? 0 (quotient (+ fixnum-max 1) (- fixnum-min 1)))))
294
295 (with-test-prefix "fixnum-min / n"
296
297 (pass-if "n = 1"
298 (eqv? fixnum-min (quotient fixnum-min 1)))
299
300 (pass-if "n = -1"
301 (eqv? (- fixnum-min) (quotient fixnum-min -1)))
302
303 (pass-if "n = 2"
304 (eqv? fixnum-min (* (quotient fixnum-min 2) 2)))
305
306 (pass-if "n = fixnum-max"
307 (eqv? -1 (quotient fixnum-min fixnum-max)))
308
309 (pass-if "n = fixnum-max + 1"
310 (eqv? -1 (quotient fixnum-min (+ fixnum-max 1))))
311
312 (pass-if "n = fixnum-min"
313 (eqv? 1 (quotient fixnum-min fixnum-min)))
314
315 (pass-if "n = fixnum-min - 1"
316 (eqv? 0 (quotient fixnum-min (- fixnum-min 1)))))
317
318 (with-test-prefix "(fixnum-min - 1) / n"
319
320 (pass-if "n = 1"
321 (eqv? (- fixnum-min 1) (quotient (- fixnum-min 1) 1)))
322
323 (pass-if "n = -1"
324 (eqv? (- (- fixnum-min 1)) (quotient (- fixnum-min 1) -1)))
325
326 (pass-if "n = 2"
327 (eqv? fixnum-min (* (quotient (- fixnum-min 1) 2) 2)))
328
329 (pass-if "n = fixnum-max"
330 (eqv? -1 (quotient (- fixnum-min 1) fixnum-max)))
331
332 (pass-if "n = fixnum-max + 1"
333 (eqv? -1 (quotient (- fixnum-min 1) (+ fixnum-max 1))))
334
335 (pass-if "n = fixnum-min"
336 (eqv? 1 (quotient (- fixnum-min 1) fixnum-min)))
337
338 (pass-if "n = fixnum-min - 1"
339 (eqv? 1 (quotient (- fixnum-min 1) (- fixnum-min 1)))))
340
341 ;; Positive dividend and divisor
342
343 (pass-if "35 / 7"
344 (eqv? 5 (quotient 35 7)))
345
346 ;; Negative dividend, positive divisor
347
348 (pass-if "-35 / 7"
349 (eqv? -5 (quotient -35 7)))
350
351 ;; Positive dividend, negative divisor
352
353 (pass-if "35 / -7"
354 (eqv? -5 (quotient 35 -7)))
355
356 ;; Negative dividend and divisor
357
358 (pass-if "-35 / -7"
359 (eqv? 5 (quotient -35 -7)))
360
361 ;; Are numerical overflows detected correctly?
362
363 (with-test-prefix "division by zero"
364
365 (pass-if-exception "(quotient 1 0)"
366 exception:numerical-overflow
367 (quotient 1 0))
368
369 (pass-if-exception "(quotient bignum 0)"
370 exception:numerical-overflow
371 (quotient (+ fixnum-max 1) 0)))
372
373 ;; Are wrong type arguments detected correctly?
374
375 )
376
377 ;;;
378 ;;; remainder
379 ;;;
380
381 (with-test-prefix "remainder"
382
383 (expect-fail "documented?"
384 (documented? remainder))
385
386 (with-test-prefix "0 / n"
387
388 (pass-if "n = 1"
389 (eqv? 0 (remainder 0 1)))
390
391 (pass-if "n = -1"
392 (eqv? 0 (remainder 0 -1)))
393
394 (pass-if "n = fixnum-max"
395 (eqv? 0 (remainder 0 fixnum-max)))
396
397 (pass-if "n = fixnum-max + 1"
398 (eqv? 0 (remainder 0 (+ fixnum-max 1))))
399
400 (pass-if "n = fixnum-min"
401 (eqv? 0 (remainder 0 fixnum-min)))
402
403 (pass-if "n = fixnum-min - 1"
404 (eqv? 0 (remainder 0 (- fixnum-min 1)))))
405
406 (with-test-prefix "1 / n"
407
408 (pass-if "n = 1"
409 (eqv? 0 (remainder 1 1)))
410
411 (pass-if "n = -1"
412 (eqv? 0 (remainder 1 -1)))
413
414 (pass-if "n = fixnum-max"
415 (eqv? 1 (remainder 1 fixnum-max)))
416
417 (pass-if "n = fixnum-max + 1"
418 (eqv? 1 (remainder 1 (+ fixnum-max 1))))
419
420 (pass-if "n = fixnum-min"
421 (eqv? 1 (remainder 1 fixnum-min)))
422
423 (pass-if "n = fixnum-min - 1"
424 (eqv? 1 (remainder 1 (- fixnum-min 1)))))
425
426 (with-test-prefix "-1 / n"
427
428 (pass-if "n = 1"
429 (eqv? 0 (remainder -1 1)))
430
431 (pass-if "n = -1"
432 (eqv? 0 (remainder -1 -1)))
433
434 (pass-if "n = fixnum-max"
435 (eqv? -1 (remainder -1 fixnum-max)))
436
437 (pass-if "n = fixnum-max + 1"
438 (eqv? -1 (remainder -1 (+ fixnum-max 1))))
439
440 (pass-if "n = fixnum-min"
441 (eqv? -1 (remainder -1 fixnum-min)))
442
443 (pass-if "n = fixnum-min - 1"
444 (eqv? -1 (remainder -1 (- fixnum-min 1)))))
445
446 (with-test-prefix "fixnum-max / n"
447
448 (pass-if "n = 1"
449 (eqv? 0 (remainder fixnum-max 1)))
450
451 (pass-if "n = -1"
452 (eqv? 0 (remainder fixnum-max -1)))
453
454 (pass-if "n = fixnum-max"
455 (eqv? 0 (remainder fixnum-max fixnum-max)))
456
457 (pass-if "n = fixnum-max + 1"
458 (eqv? fixnum-max (remainder fixnum-max (+ fixnum-max 1))))
459
460 (pass-if "n = fixnum-min"
461 (eqv? fixnum-max (remainder fixnum-max fixnum-min)))
462
463 (pass-if "n = fixnum-min - 1"
464 (eqv? fixnum-max (remainder fixnum-max (- fixnum-min 1)))))
465
466 (with-test-prefix "(fixnum-max + 1) / n"
467
468 (pass-if "n = 1"
469 (eqv? 0 (remainder (+ fixnum-max 1) 1)))
470
471 (pass-if "n = -1"
472 (eqv? 0 (remainder (+ fixnum-max 1) -1)))
473
474 (pass-if "n = fixnum-max"
475 (eqv? 1 (remainder (+ fixnum-max 1) fixnum-max)))
476
477 (pass-if "n = fixnum-max + 1"
478 (eqv? 0 (remainder (+ fixnum-max 1) (+ fixnum-max 1))))
479
480 (pass-if "n = fixnum-min"
481 (eqv? 0 (remainder (+ fixnum-max 1) fixnum-min)))
482
483 (pass-if "n = fixnum-min - 1"
484 (eqv? (+ fixnum-max 1) (remainder (+ fixnum-max 1) (- fixnum-min 1)))))
485
486 (with-test-prefix "fixnum-min / n"
487
488 (pass-if "n = 1"
489 (eqv? 0 (remainder fixnum-min 1)))
490
491 (pass-if "n = -1"
492 (eqv? 0 (remainder fixnum-min -1)))
493
494 (pass-if "n = fixnum-max"
495 (eqv? -1 (remainder fixnum-min fixnum-max)))
496
497 (pass-if "n = fixnum-max + 1"
498 (eqv? 0 (remainder fixnum-min (+ fixnum-max 1))))
499
500 (pass-if "n = fixnum-min"
501 (eqv? 0 (remainder fixnum-min fixnum-min)))
502
503 (pass-if "n = fixnum-min - 1"
504 (eqv? fixnum-min (remainder fixnum-min (- fixnum-min 1)))))
505
506 (with-test-prefix "(fixnum-min - 1) / n"
507
508 (pass-if "n = 1"
509 (eqv? 0 (remainder (- fixnum-min 1) 1)))
510
511 (pass-if "n = -1"
512 (eqv? 0 (remainder (- fixnum-min 1) -1)))
513
514 (pass-if "n = fixnum-max"
515 (eqv? -2 (remainder (- fixnum-min 1) fixnum-max)))
516
517 (pass-if "n = fixnum-max + 1"
518 (eqv? -1 (remainder (- fixnum-min 1) (+ fixnum-max 1))))
519
520 (pass-if "n = fixnum-min"
521 (eqv? -1 (remainder (- fixnum-min 1) fixnum-min)))
522
523 (pass-if "n = fixnum-min - 1"
524 (eqv? 0 (remainder (- fixnum-min 1) (- fixnum-min 1)))))
525
526 ;; Positive dividend and divisor
527
528 (pass-if "35 / 7"
529 (eqv? 0 (remainder 35 7)))
530
531 ;; Negative dividend, positive divisor
532
533 (pass-if "-35 / 7"
534 (eqv? 0 (remainder -35 7)))
535
536 ;; Positive dividend, negative divisor
537
538 (pass-if "35 / -7"
539 (eqv? 0 (remainder 35 -7)))
540
541 ;; Negative dividend and divisor
542
543 (pass-if "-35 / -7"
544 (eqv? 0 (remainder -35 -7)))
545
546 ;; Are numerical overflows detected correctly?
547
548 (with-test-prefix "division by zero"
549
550 (pass-if-exception "(remainder 1 0)"
551 exception:numerical-overflow
552 (remainder 1 0))
553
554 (pass-if-exception "(remainder bignum 0)"
555 exception:numerical-overflow
556 (remainder (+ fixnum-max 1) 0)))
557
558 ;; Are wrong type arguments detected correctly?
559
560 )
561
562 ;;;
563 ;;; modulo
564 ;;;
565
566 (with-test-prefix "modulo"
567
568 (expect-fail "documented?"
569 (documented? modulo))
570
571 (with-test-prefix "0 % n"
572
573 (pass-if "n = 1"
574 (eqv? 0 (modulo 0 1)))
575
576 (pass-if "n = -1"
577 (eqv? 0 (modulo 0 -1)))
578
579 (pass-if "n = fixnum-max"
580 (eqv? 0 (modulo 0 fixnum-max)))
581
582 (pass-if "n = fixnum-max + 1"
583 (eqv? 0 (modulo 0 (+ fixnum-max 1))))
584
585 (pass-if "n = fixnum-min"
586 (eqv? 0 (modulo 0 fixnum-min)))
587
588 (pass-if "n = fixnum-min - 1"
589 (eqv? 0 (modulo 0 (- fixnum-min 1)))))
590
591 (with-test-prefix "1 % n"
592
593 (pass-if "n = 1"
594 (eqv? 0 (modulo 1 1)))
595
596 (pass-if "n = -1"
597 (eqv? 0 (modulo 1 -1)))
598
599 (pass-if "n = fixnum-max"
600 (eqv? 1 (modulo 1 fixnum-max)))
601
602 (pass-if "n = fixnum-max + 1"
603 (eqv? 1 (modulo 1 (+ fixnum-max 1))))
604
605 (pass-if "n = fixnum-min"
606 (eqv? (+ fixnum-min 1) (modulo 1 fixnum-min)))
607
608 (pass-if "n = fixnum-min - 1"
609 (eqv? fixnum-min (modulo 1 (- fixnum-min 1)))))
610
611 (with-test-prefix "-1 % n"
612
613 (pass-if "n = 1"
614 (eqv? 0 (modulo -1 1)))
615
616 (pass-if "n = -1"
617 (eqv? 0 (modulo -1 -1)))
618
619 (pass-if "n = fixnum-max"
620 (eqv? (- fixnum-max 1) (modulo -1 fixnum-max)))
621
622 (pass-if "n = fixnum-max + 1"
623 (eqv? fixnum-max (modulo -1 (+ fixnum-max 1))))
624
625 (pass-if "n = fixnum-min"
626 (eqv? -1 (modulo -1 fixnum-min)))
627
628 (pass-if "n = fixnum-min - 1"
629 (eqv? -1 (modulo -1 (- fixnum-min 1)))))
630
631 (with-test-prefix "fixnum-max % n"
632
633 (pass-if "n = 1"
634 (eqv? 0 (modulo fixnum-max 1)))
635
636 (pass-if "n = -1"
637 (eqv? 0 (modulo fixnum-max -1)))
638
639 (pass-if "n = fixnum-max"
640 (eqv? 0 (modulo fixnum-max fixnum-max)))
641
642 (pass-if "n = fixnum-max + 1"
643 (eqv? fixnum-max (modulo fixnum-max (+ fixnum-max 1))))
644
645 (pass-if "n = fixnum-min"
646 (eqv? -1 (modulo fixnum-max fixnum-min)))
647
648 (pass-if "n = fixnum-min - 1"
649 (eqv? -2 (modulo fixnum-max (- fixnum-min 1)))))
650
651 (with-test-prefix "(fixnum-max + 1) % n"
652
653 (pass-if "n = 1"
654 (eqv? 0 (modulo (+ fixnum-max 1) 1)))
655
656 (pass-if "n = -1"
657 (eqv? 0 (modulo (+ fixnum-max 1) -1)))
658
659 (pass-if "n = fixnum-max"
660 (eqv? 1 (modulo (+ fixnum-max 1) fixnum-max)))
661
662 (pass-if "n = fixnum-max + 1"
663 (eqv? 0 (modulo (+ fixnum-max 1) (+ fixnum-max 1))))
664
665 (pass-if "n = fixnum-min"
666 (eqv? 0 (modulo (+ fixnum-max 1) fixnum-min)))
667
668 (pass-if "n = fixnum-min - 1"
669 (eqv? -1 (modulo (+ fixnum-max 1) (- fixnum-min 1)))))
670
671 (with-test-prefix "fixnum-min % n"
672
673 (pass-if "n = 1"
674 (eqv? 0 (modulo fixnum-min 1)))
675
676 (pass-if "n = -1"
677 (eqv? 0 (modulo fixnum-min -1)))
678
679 (pass-if "n = fixnum-max"
680 (eqv? (- fixnum-max 1) (modulo fixnum-min fixnum-max)))
681
682 (pass-if "n = fixnum-max + 1"
683 (eqv? 0 (modulo fixnum-min (+ fixnum-max 1))))
684
685 (pass-if "n = fixnum-min"
686 (eqv? 0 (modulo fixnum-min fixnum-min)))
687
688 (pass-if "n = fixnum-min - 1"
689 (eqv? fixnum-min (modulo fixnum-min (- fixnum-min 1)))))
690
691 (with-test-prefix "(fixnum-min - 1) % n"
692
693 (pass-if "n = 1"
694 (eqv? 0 (modulo (- fixnum-min 1) 1)))
695
696 (pass-if "n = -1"
697 (eqv? 0 (modulo (- fixnum-min 1) -1)))
698
699 (pass-if "n = fixnum-max"
700 (eqv? (- fixnum-max 2) (modulo (- fixnum-min 1) fixnum-max)))
701
702 (pass-if "n = fixnum-max + 1"
703 (eqv? fixnum-max (modulo (- fixnum-min 1) (+ fixnum-max 1))))
704
705 (pass-if "n = fixnum-min"
706 (eqv? -1 (modulo (- fixnum-min 1) fixnum-min)))
707
708 (pass-if "n = fixnum-min - 1"
709 (eqv? 0 (modulo (- fixnum-min 1) (- fixnum-min 1)))))
710
711 ;; Positive dividend and divisor
712
713 (pass-if "13 % 4"
714 (eqv? 1 (modulo 13 4)))
715
716 (pass-if "2177452800 % 86400"
717 (eqv? 0 (modulo 2177452800 86400)))
718
719 ;; Negative dividend, positive divisor
720
721 (pass-if "-13 % 4"
722 (eqv? 3 (modulo -13 4)))
723
724 (pass-if "-2177452800 % 86400"
725 (eqv? 0 (modulo -2177452800 86400)))
726
727 ;; Positive dividend, negative divisor
728
729 (pass-if "13 % -4"
730 (eqv? -3 (modulo 13 -4)))
731
732 (pass-if "2177452800 % -86400"
733 (eqv? 0 (modulo 2177452800 -86400)))
734
735 ;; Negative dividend and divisor
736
737 (pass-if "-13 % -4"
738 (eqv? -1 (modulo -13 -4)))
739
740 (pass-if "-2177452800 % -86400"
741 (eqv? 0 (modulo -2177452800 -86400)))
742
743 ;; Are numerical overflows detected correctly?
744
745 (with-test-prefix "division by zero"
746
747 (pass-if-exception "(modulo 1 0)"
748 exception:numerical-overflow
749 (modulo 1 0))
750
751 (pass-if-exception "(modulo bignum 0)"
752 exception:numerical-overflow
753 (modulo (+ fixnum-max 1) 0)))
754
755 ;; Are wrong type arguments detected correctly?
756
757 )
758
759 ;;;
760 ;;; gcd
761 ;;;
762
763 (with-test-prefix "gcd"
764
765 (expect-fail "documented?"
766 (documented? gcd))
767
768 (with-test-prefix "(0 n)"
769
770 (pass-if "n = 0"
771 (eqv? 0 (gcd 0 0)))
772
773 (pass-if "n = 1"
774 (eqv? 1 (gcd 0 1)))
775
776 (pass-if "n = -1"
777 (eqv? 1 (gcd 0 -1)))
778
779 (pass-if "n = fixnum-max"
780 (eqv? fixnum-max (gcd 0 fixnum-max)))
781
782 (pass-if "n = fixnum-max + 1"
783 (eqv? (+ fixnum-max 1) (gcd 0 (+ fixnum-max 1))))
784
785 (pass-if "n = fixnum-min"
786 (eqv? (- fixnum-min) (gcd 0 fixnum-min)))
787
788 (pass-if "n = fixnum-min - 1"
789 (eqv? (- (- fixnum-min 1)) (gcd 0 (- fixnum-min 1)))))
790
791 (with-test-prefix "(1 n)"
792
793 (pass-if "n = 0"
794 (eqv? 1 (gcd 1 0)))
795
796 (pass-if "n = 1"
797 (eqv? 1 (gcd 1 1)))
798
799 (pass-if "n = -1"
800 (eqv? 1 (gcd 1 -1)))
801
802 (pass-if "n = fixnum-max"
803 (eqv? 1 (gcd 1 fixnum-max)))
804
805 (pass-if "n = fixnum-max + 1"
806 (eqv? 1 (gcd 1 (+ fixnum-max 1))))
807
808 (pass-if "n = fixnum-min"
809 (eqv? 1 (gcd 1 fixnum-min)))
810
811 (pass-if "n = fixnum-min - 1"
812 (eqv? 1 (gcd 1 (- fixnum-min 1)))))
813
814 (with-test-prefix "(-1 n)"
815
816 (pass-if "n = 0"
817 (eqv? 1 (gcd -1 0)))
818
819 (pass-if "n = 1"
820 (eqv? 1 (gcd -1 1)))
821
822 (pass-if "n = -1"
823 (eqv? 1 (gcd -1 -1)))
824
825 (pass-if "n = fixnum-max"
826 (eqv? 1 (gcd -1 fixnum-max)))
827
828 (pass-if "n = fixnum-max + 1"
829 (eqv? 1 (gcd -1 (+ fixnum-max 1))))
830
831 (pass-if "n = fixnum-min"
832 (eqv? 1 (gcd -1 fixnum-min)))
833
834 (pass-if "n = fixnum-min - 1"
835 (eqv? 1 (gcd -1 (- fixnum-min 1)))))
836
837 (with-test-prefix "(fixnum-max n)"
838
839 (pass-if "n = 0"
840 (eqv? fixnum-max (gcd fixnum-max 0)))
841
842 (pass-if "n = 1"
843 (eqv? 1 (gcd fixnum-max 1)))
844
845 (pass-if "n = -1"
846 (eqv? 1 (gcd fixnum-max -1)))
847
848 (pass-if "n = fixnum-max"
849 (eqv? fixnum-max (gcd fixnum-max fixnum-max)))
850
851 (pass-if "n = fixnum-max + 1"
852 (eqv? 1 (gcd fixnum-max (+ fixnum-max 1))))
853
854 (pass-if "n = fixnum-min"
855 (eqv? 1 (gcd fixnum-max fixnum-min)))
856
857 (pass-if "n = fixnum-min - 1"
858 (eqv? 1 (gcd fixnum-max (- fixnum-min 1)))))
859
860 (with-test-prefix "((+ fixnum-max 1) n)"
861
862 (pass-if "n = 0"
863 (eqv? (+ fixnum-max 1) (gcd (+ fixnum-max 1) 0)))
864
865 (pass-if "n = 1"
866 (eqv? 1 (gcd (+ fixnum-max 1) 1)))
867
868 (pass-if "n = -1"
869 (eqv? 1 (gcd (+ fixnum-max 1) -1)))
870
871 (pass-if "n = fixnum-max"
872 (eqv? 1 (gcd (+ fixnum-max 1) fixnum-max)))
873
874 (pass-if "n = fixnum-max + 1"
875 (eqv? (+ fixnum-max 1) (gcd (+ fixnum-max 1) (+ fixnum-max 1))))
876
877 (pass-if "n = fixnum-min"
878 (eqv? (+ fixnum-max 1) (gcd (+ fixnum-max 1) fixnum-min)))
879
880 (pass-if "n = fixnum-min - 1"
881 (eqv? 1 (gcd (+ fixnum-max 1) (- fixnum-min 1)))))
882
883 (with-test-prefix "(fixnum-min n)"
884
885 (pass-if "n = 0"
886 (eqv? (- fixnum-min) (gcd fixnum-min 0)))
887
888 (pass-if "n = 1"
889 (eqv? 1 (gcd fixnum-min 1)))
890
891 (pass-if "n = -1"
892 (eqv? 1 (gcd fixnum-min -1)))
893
894 (pass-if "n = fixnum-max"
895 (eqv? 1 (gcd fixnum-min fixnum-max)))
896
897 (pass-if "n = fixnum-max + 1"
898 (eqv? (+ fixnum-max 1) (gcd fixnum-min (+ fixnum-max 1))))
899
900 (pass-if "n = fixnum-min"
901 (eqv? (- fixnum-min) (gcd fixnum-min fixnum-min)))
902
903 (pass-if "n = fixnum-min - 1"
904 (eqv? 1 (gcd fixnum-min (- fixnum-min 1)))))
905
906 (with-test-prefix "((- fixnum-min 1) n)"
907
908 (pass-if "n = 0"
909 (eqv? (- (- fixnum-min 1)) (gcd (- fixnum-min 1) 0)))
910
911 (pass-if "n = 1"
912 (eqv? 1 (gcd (- fixnum-min 1) 1)))
913
914 (pass-if "n = -1"
915 (eqv? 1 (gcd (- fixnum-min 1) -1)))
916
917 (pass-if "n = fixnum-max"
918 (eqv? 1 (gcd (- fixnum-min 1) fixnum-max)))
919
920 (pass-if "n = fixnum-max + 1"
921 (eqv? 1 (gcd (- fixnum-min 1) (+ fixnum-max 1))))
922
923 (pass-if "n = fixnum-min"
924 (eqv? 1 (gcd (- fixnum-min 1) fixnum-min)))
925
926 (pass-if "n = fixnum-min - 1"
927 (eqv? (- (- fixnum-min 1)) (gcd (- fixnum-min 1) (- fixnum-min 1)))))
928
929 ;; Are wrong type arguments detected correctly?
930
931 )
932
933 ;;;
934 ;;; lcm
935 ;;;
936
937 (with-test-prefix "lcm"
938 ;; FIXME: more tests?
939 ;; (some of these are already in r4rs.test)
940 (expect-fail (documented? lcm))
941 (pass-if (= (lcm) 1))
942 (pass-if (= (lcm 32 -36) 288))
943 (let ((big-n 115792089237316195423570985008687907853269984665640564039457584007913129639936) ; 2 ^ 256
944 (lcm-of-big-n-and-11 1273712981610478149659280835095566986385969831322046204434033424087044426039296))
945 (pass-if (= lcm-of-big-n-and-11 (lcm big-n 11)))
946 (pass-if (= lcm-of-big-n-and-11 (lcm 11 big-n 11)))))
947
948 ;;;
949 ;;; number->string
950 ;;;
951
952 (with-test-prefix "number->string"
953 (let ((num->str->num
954 (lambda (n radix)
955 (string->number (number->string n radix) radix))))
956
957 (pass-if (documented? number->string))
958 (pass-if (string=? (number->string 0) "0"))
959 (pass-if (string=? (number->string 171) "171"))
960 (pass-if (= (+ fixnum-max 1) (num->str->num (+ fixnum-max 1) 10)))
961 (pass-if (= (- fixnum-min 1) (num->str->num (- fixnum-min 1) 10)))
962 (pass-if (= (inf) (num->str->num (inf) 10)))
963 (pass-if (= 1.3 (num->str->num 1.3 10)))))
964
965 ;;;
966 ;;; string->number
967 ;;;
968
969 (with-test-prefix "string->number"
970
971 (pass-if "string->number"
972 (documented? string->number))
973
974 (pass-if "non number strings"
975 (for-each (lambda (x) (if (string->number x) (throw 'fail)))
976 '("" "q" "1q" "6+7iq" "8+9q" "10+11" "13+" "18@19q" "20@q" "23@"
977 "+25iq" "26i" "-q" "-iq" "i" "5#.0" "8/" "10#11" ".#" "."
978 "#o.2" "3.4q" "15.16e17q" "18.19e+q" ".q" ".17#18" "10q" "#b2"
979 "#b3" "#b4" "#b5" "#b6" "#b7" "#b8" "#b9" "#ba" "#bb" "#bc"
980 "#bd" "#be" "#bf" "#q" "#b#b1" "#o#o1" "#d#d1" "#x#x1" "#e#e1"
981 "#i#i1" "12@12+0i"))
982 #t)
983
984 (pass-if "valid number strings"
985 (for-each (lambda (couple)
986 (apply
987 (lambda (x y)
988 (let ((x (string->number x)))
989 (if (or (eq? x #f) (not (eqv? x y))) (throw 'fail))))
990 couple))
991 `(;; Radix:
992 ("#b0" 0) ("#B0" 0) ("#b1" 1) ("#B1" 1) ("#o0" 0) ("#O0" 0)
993 ("#o1" 1) ("#O1" 1) ("#o2" 2) ("#O2" 2) ("#o3" 3) ("#O3" 3)
994 ("#o4" 4) ("#O4" 4) ("#o5" 5) ("#O5" 5) ("#o6" 6) ("#O6" 6)
995 ("#o7" 7) ("#O7" 7) ("#d0" 0) ("#D0" 0) ("#d1" 1) ("#D1" 1)
996 ("#d2" 2) ("#D2" 2) ("#d3" 3) ("#D3" 3) ("#d4" 4) ("#D4" 4)
997 ("#d5" 5) ("#D5" 5) ("#d6" 6) ("#D6" 6) ("#d7" 7) ("#D7" 7)
998 ("#d8" 8) ("#D8" 8) ("#d9" 9) ("#D9" 9)
999 ("#xa" 10) ("#Xa" 10) ("#xb" 11) ("#Xb" 11)
1000 ("#xc" 12) ("#Xc" 12) ("#xd" 13) ("#Xd" 13)
1001 ("#xe" 14) ("#Xe" 14) ("#xf" 15) ("#Xf" 15)
1002 ("#b1010" 10)
1003 ("#o12345670" 2739128)
1004 ("#d1234567890" 1234567890)
1005 ("#x1234567890abcdef" 1311768467294899695)
1006 ;; Exactness:
1007 ("#e1" 1) ("#e1.2" 1) ("#i1.1" 1.1) ("#i1" 1.0)
1008 ;; Integers:
1009 ("1" ,(1+ 0)) ("23" ,(+ 9 9 5)) ("-1" ,(- 0 1))
1010 ("-45" ,(- 0 45)) ("2#" 20.0) ("2##" 200.0) ("12##" 1200.0)
1011 ("#b#i100" 4.0)
1012 ;; Rationals:
1013 ("1/1" 1) ("1/2" 0.5) ("-1/2" -0.5) ("1#/1" 10.0)
1014 ("10/1#" 1.0) ("1#/1#" 1.0) ("#e9/10" 1) ("#e10/1#" 1)
1015 ("#i6/8" 0.75) ("#i1/1" 1.0)
1016 ;; Decimal numbers:
1017 ;; * <uinteger 10> <suffix>
1018 ("1e2" 100.0) ("1E2" 100.0) ("1s2" 100.0) ("1S2" 100.0)
1019 ("1f2" 100.0) ("1F2" 100.0) ("1d2" 100.0) ("1D2" 100.0)
1020 ("1l2" 100.0) ("1L2" 100.0) ("1e+2" 100.0) ("1e-2" 0.01)
1021 ;; * . <digit 10>+ #* <suffix>
1022 (".1" .1) (".0123456789" 123456789e-10) (".16#" 0.16)
1023 (".0123456789e10" 123456789.0) (".16#e3" 160.0) ("#d.3" 0.3)
1024 ;; * <digit 10>+ . <digit 10>* #* <suffix>
1025 ("3." ,(exact->inexact 3)) ("3.e0" ,(exact->inexact 3))
1026 ("3.1" ,(exact->inexact 31/10)) ("3.1e0" 3.1) ("3.1#" 3.1)
1027 ("3.1#e0" 3.1)
1028 ;; * <digit 10>+ #+ . #* <suffix>
1029 ("3#." 30.0) ("3#.e0" 30.0) ("3#.#" 30.0) ("3#.#e0" 30.0)
1030 ;; Complex:
1031 ("1@0" 1.0) ("1@+0" 1.0) ("1@-0" 1.0)
1032 ("2+3i" ,(+ 2 (* 3 +i))) ("4-5i" ,(- 4 (* 5 +i)))
1033 ("1+i" 1+1i) ("1-i" 1-1i) ("+1i" 0+1i) ("-1i" 0-1i)
1034 ("+i" +1i) ("-i" -1i)))
1035 #t)
1036
1037 (pass-if-exception "exponent too big"
1038 exception:out-of-range
1039 (string->number "12.13e141414")))
1040
1041 ;;;
1042 ;;; number?
1043 ;;;
1044
1045 (with-test-prefix "number?"
1046 (pass-if (documented? number?))
1047 (pass-if (number? 0))
1048 (pass-if (number? 7))
1049 (pass-if (number? -7))
1050 (pass-if (number? 1.3))
1051 (pass-if (number? (+ 1 fixnum-max)))
1052 (pass-if (number? (- 1 fixnum-min)))
1053 (pass-if (number? 3+4i))
1054 (expect-fail (number? #\a))
1055 (expect-fail (number? "a"))
1056 (expect-fail (number? (make-vector 0)))
1057 (expect-fail (number? (cons 1 2)))
1058 (expect-fail (number? #t))
1059 (expect-fail (number? (lambda () #t)))
1060 (expect-fail (number? (current-input-port))))
1061
1062 ;;;
1063 ;;; complex?
1064 ;;;
1065
1066 (with-test-prefix "complex?"
1067 (pass-if (documented? complex?))
1068 (pass-if (complex? 0))
1069 (pass-if (complex? 7))
1070 (pass-if (complex? -7))
1071 (pass-if (complex? (+ 1 fixnum-max)))
1072 (pass-if (complex? (- 1 fixnum-min)))
1073 (pass-if (complex? 1.3))
1074 (pass-if (complex? 3+4i))
1075 (expect-fail (complex? #\a))
1076 (expect-fail (complex? "a"))
1077 (expect-fail (complex? (make-vector 0)))
1078 (expect-fail (complex? (cons 1 2)))
1079 (expect-fail (complex? #t))
1080 (expect-fail (complex? (lambda () #t)))
1081 (expect-fail (complex? (current-input-port))))
1082
1083 ;;;
1084 ;;; real?
1085 ;;;
1086
1087 (with-test-prefix "real?"
1088 (pass-if (documented? real?))
1089 (pass-if (real? 0))
1090 (pass-if (real? 7))
1091 (pass-if (real? -7))
1092 (pass-if (real? (+ 1 fixnum-max)))
1093 (pass-if (real? (- 1 fixnum-min)))
1094 (pass-if (real? 1.3))
1095 (expect-fail (real? 3+4i))
1096 (expect-fail (real? #\a))
1097 (expect-fail (real? "a"))
1098 (expect-fail (real? (make-vector 0)))
1099 (expect-fail (real? (cons 1 2)))
1100 (expect-fail (real? #t))
1101 (expect-fail (real? (lambda () #t)))
1102 (expect-fail (real? (current-input-port))))
1103
1104 ;;;
1105 ;;; rational? (same as real? right now)
1106 ;;;
1107
1108 (with-test-prefix "rational?"
1109 (pass-if (documented? rational?))
1110 (pass-if (rational? 0))
1111 (pass-if (rational? 7))
1112 (pass-if (rational? -7))
1113 (pass-if (rational? (+ 1 fixnum-max)))
1114 (pass-if (rational? (- 1 fixnum-min)))
1115 (pass-if (rational? 1.3))
1116 (expect-fail (rational? 3+4i))
1117 (expect-fail (rational? #\a))
1118 (expect-fail (rational? "a"))
1119 (expect-fail (rational? (make-vector 0)))
1120 (expect-fail (rational? (cons 1 2)))
1121 (expect-fail (rational? #t))
1122 (expect-fail (rational? (lambda () #t)))
1123 (expect-fail (rational? (current-input-port))))
1124
1125 ;;;
1126 ;;; integer?
1127 ;;;
1128
1129 (with-test-prefix "integer?"
1130 (pass-if (documented? integer?))
1131 (pass-if (integer? 0))
1132 (pass-if (integer? 7))
1133 (pass-if (integer? -7))
1134 (pass-if (integer? (+ 1 fixnum-max)))
1135 (pass-if (integer? (- 1 fixnum-min)))
1136 (pass-if (and (= 3+0i (round 3+0i)) (integer? 3+0i)))
1137 (pass-if (and (= 1.0 (round 1.0)) (integer? 1.0)))
1138 (expect-fail (integer? 1.3))
1139 (expect-fail (integer? 3+4i))
1140 (expect-fail (integer? #\a))
1141 (expect-fail (integer? "a"))
1142 (expect-fail (integer? (make-vector 0)))
1143 (expect-fail (integer? (cons 1 2)))
1144 (expect-fail (integer? #t))
1145 (expect-fail (integer? (lambda () #t)))
1146 (expect-fail (integer? (current-input-port))))
1147
1148 ;;;
1149 ;;; inexact?
1150 ;;;
1151
1152 (with-test-prefix "inexact?"
1153 (pass-if (documented? inexact?))
1154 (expect-fail (inexact? 0))
1155 (expect-fail (inexact? 7))
1156 (expect-fail (inexact? -7))
1157 (expect-fail (inexact? (+ 1 fixnum-max)))
1158 (expect-fail (inexact? (- 1 fixnum-min)))
1159 (pass-if (inexact? 1.3))
1160 (pass-if (inexact? 3.1+4.2i))
1161 (expect-fail (inexact? #\a))
1162 (expect-fail (inexact? "a"))
1163 (expect-fail (inexact? (make-vector 0)))
1164 (expect-fail (inexact? (cons 1 2)))
1165 (expect-fail (inexact? #t))
1166 (expect-fail (inexact? (lambda () #t)))
1167 (expect-fail (inexact? (current-input-port))))
1168
1169 ;;;
1170 ;;; =
1171 ;;;
1172
1173 (with-test-prefix "="
1174 (expect-fail (documented? =))
1175 (pass-if (= 0 0))
1176 (pass-if (= 7 7))
1177 (pass-if (= -7 -7))
1178 (pass-if (= (+ 1 fixnum-max) (+ 1 fixnum-max)))
1179 (pass-if (= (- 1 fixnum-min) (- 1 fixnum-min)))
1180 (expect-fail (= 0 1))
1181 (expect-fail (= fixnum-max (+ 1 fixnum-max)))
1182 (expect-fail (= (+ 1 fixnum-max) fixnum-max))
1183 (expect-fail (= fixnum-min (- fixnum-min 1)))
1184 (expect-fail (= (- fixnum-min 1) fixnum-min))
1185 (expect-fail (= (+ fixnum-max 1) (- fixnum-min 1))))
1186
1187 ;;;
1188 ;;; <
1189 ;;;
1190
1191 (with-test-prefix "<"
1192
1193 (expect-fail "documented?"
1194 (documented? <))
1195
1196 (with-test-prefix "(< 0 n)"
1197
1198 (pass-if "n = 0"
1199 (not (< 0 0)))
1200
1201 (pass-if "n = 0.0"
1202 (not (< 0 0.0)))
1203
1204 (pass-if "n = 1"
1205 (< 0 1))
1206
1207 (pass-if "n = 1.0"
1208 (< 0 1.0))
1209
1210 (pass-if "n = -1"
1211 (not (< 0 -1)))
1212
1213 (pass-if "n = -1.0"
1214 (not (< 0 -1.0)))
1215
1216 (pass-if "n = fixnum-max"
1217 (< 0 fixnum-max))
1218
1219 (pass-if "n = fixnum-max + 1"
1220 (< 0 (+ fixnum-max 1)))
1221
1222 (pass-if "n = fixnum-min"
1223 (not (< 0 fixnum-min)))
1224
1225 (pass-if "n = fixnum-min - 1"
1226 (not (< 0 (- fixnum-min 1)))))
1227
1228 (with-test-prefix "(< 0.0 n)"
1229
1230 (pass-if "n = 0"
1231 (not (< 0.0 0)))
1232
1233 (pass-if "n = 0.0"
1234 (not (< 0.0 0.0)))
1235
1236 (pass-if "n = 1"
1237 (< 0.0 1))
1238
1239 (pass-if "n = 1.0"
1240 (< 0.0 1.0))
1241
1242 (pass-if "n = -1"
1243 (not (< 0.0 -1)))
1244
1245 (pass-if "n = -1.0"
1246 (not (< 0.0 -1.0)))
1247
1248 (pass-if "n = fixnum-max"
1249 (< 0.0 fixnum-max))
1250
1251 (pass-if "n = fixnum-max + 1"
1252 (< 0.0 (+ fixnum-max 1)))
1253
1254 (pass-if "n = fixnum-min"
1255 (not (< 0.0 fixnum-min)))
1256
1257 (pass-if "n = fixnum-min - 1"
1258 (not (< 0.0 (- fixnum-min 1)))))
1259
1260 (with-test-prefix "(< 1 n)"
1261
1262 (pass-if "n = 0"
1263 (not (< 1 0)))
1264
1265 (pass-if "n = 0.0"
1266 (not (< 1 0.0)))
1267
1268 (pass-if "n = 1"
1269 (not (< 1 1)))
1270
1271 (pass-if "n = 1.0"
1272 (not (< 1 1.0)))
1273
1274 (pass-if "n = -1"
1275 (not (< 1 -1)))
1276
1277 (pass-if "n = -1.0"
1278 (not (< 1 -1.0)))
1279
1280 (pass-if "n = fixnum-max"
1281 (< 1 fixnum-max))
1282
1283 (pass-if "n = fixnum-max + 1"
1284 (< 1 (+ fixnum-max 1)))
1285
1286 (pass-if "n = fixnum-min"
1287 (not (< 1 fixnum-min)))
1288
1289 (pass-if "n = fixnum-min - 1"
1290 (not (< 1 (- fixnum-min 1)))))
1291
1292 (with-test-prefix "(< 1.0 n)"
1293
1294 (pass-if "n = 0"
1295 (not (< 1.0 0)))
1296
1297 (pass-if "n = 0.0"
1298 (not (< 1.0 0.0)))
1299
1300 (pass-if "n = 1"
1301 (not (< 1.0 1)))
1302
1303 (pass-if "n = 1.0"
1304 (not (< 1.0 1.0)))
1305
1306 (pass-if "n = -1"
1307 (not (< 1.0 -1)))
1308
1309 (pass-if "n = -1.0"
1310 (not (< 1.0 -1.0)))
1311
1312 (pass-if "n = fixnum-max"
1313 (< 1.0 fixnum-max))
1314
1315 (pass-if "n = fixnum-max + 1"
1316 (< 1.0 (+ fixnum-max 1)))
1317
1318 (pass-if "n = fixnum-min"
1319 (not (< 1.0 fixnum-min)))
1320
1321 (pass-if "n = fixnum-min - 1"
1322 (not (< 1.0 (- fixnum-min 1)))))
1323
1324 (with-test-prefix "(< -1 n)"
1325
1326 (pass-if "n = 0"
1327 (< -1 0))
1328
1329 (pass-if "n = 0.0"
1330 (< -1 0.0))
1331
1332 (pass-if "n = 1"
1333 (< -1 1))
1334
1335 (pass-if "n = 1.0"
1336 (< -1 1.0))
1337
1338 (pass-if "n = -1"
1339 (not (< -1 -1)))
1340
1341 (pass-if "n = -1.0"
1342 (not (< -1 -1.0)))
1343
1344 (pass-if "n = fixnum-max"
1345 (< -1 fixnum-max))
1346
1347 (pass-if "n = fixnum-max + 1"
1348 (< -1 (+ fixnum-max 1)))
1349
1350 (pass-if "n = fixnum-min"
1351 (not (< -1 fixnum-min)))
1352
1353 (pass-if "n = fixnum-min - 1"
1354 (not (< -1 (- fixnum-min 1)))))
1355
1356 (with-test-prefix "(< -1.0 n)"
1357
1358 (pass-if "n = 0"
1359 (< -1.0 0))
1360
1361 (pass-if "n = 0.0"
1362 (< -1.0 0.0))
1363
1364 (pass-if "n = 1"
1365 (< -1.0 1))
1366
1367 (pass-if "n = 1.0"
1368 (< -1.0 1.0))
1369
1370 (pass-if "n = -1"
1371 (not (< -1.0 -1)))
1372
1373 (pass-if "n = -1.0"
1374 (not (< -1.0 -1.0)))
1375
1376 (pass-if "n = fixnum-max"
1377 (< -1.0 fixnum-max))
1378
1379 (pass-if "n = fixnum-max + 1"
1380 (< -1.0 (+ fixnum-max 1)))
1381
1382 (pass-if "n = fixnum-min"
1383 (not (< -1.0 fixnum-min)))
1384
1385 (pass-if "n = fixnum-min - 1"
1386 (not (< -1.0 (- fixnum-min 1)))))
1387
1388 (with-test-prefix "(< fixnum-max n)"
1389
1390 (pass-if "n = 0"
1391 (not (< fixnum-max 0)))
1392
1393 (pass-if "n = 0.0"
1394 (not (< fixnum-max 0.0)))
1395
1396 (pass-if "n = 1"
1397 (not (< fixnum-max 1)))
1398
1399 (pass-if "n = 1.0"
1400 (not (< fixnum-max 1.0)))
1401
1402 (pass-if "n = -1"
1403 (not (< fixnum-max -1)))
1404
1405 (pass-if "n = -1.0"
1406 (not (< fixnum-max -1.0)))
1407
1408 (pass-if "n = fixnum-max"
1409 (not (< fixnum-max fixnum-max)))
1410
1411 (pass-if "n = fixnum-max + 1"
1412 (< fixnum-max (+ fixnum-max 1)))
1413
1414 (pass-if "n = fixnum-min"
1415 (not (< fixnum-max fixnum-min)))
1416
1417 (pass-if "n = fixnum-min - 1"
1418 (not (< fixnum-max (- fixnum-min 1)))))
1419
1420 (with-test-prefix "(< (+ fixnum-max 1) n)"
1421
1422 (pass-if "n = 0"
1423 (not (< (+ fixnum-max 1) 0)))
1424
1425 (pass-if "n = 0.0"
1426 (not (< (+ fixnum-max 1) 0.0)))
1427
1428 (pass-if "n = 1"
1429 (not (< (+ fixnum-max 1) 1)))
1430
1431 (pass-if "n = 1.0"
1432 (not (< (+ fixnum-max 1) 1.0)))
1433
1434 (pass-if "n = -1"
1435 (not (< (+ fixnum-max 1) -1)))
1436
1437 (pass-if "n = -1.0"
1438 (not (< (+ fixnum-max 1) -1.0)))
1439
1440 (pass-if "n = fixnum-max"
1441 (not (< (+ fixnum-max 1) fixnum-max)))
1442
1443 (pass-if "n = fixnum-max + 1"
1444 (not (< (+ fixnum-max 1) (+ fixnum-max 1))))
1445
1446 (pass-if "n = fixnum-min"
1447 (not (< (+ fixnum-max 1) fixnum-min)))
1448
1449 (pass-if "n = fixnum-min - 1"
1450 (not (< (+ fixnum-max 1) (- fixnum-min 1)))))
1451
1452 (with-test-prefix "(< fixnum-min n)"
1453
1454 (pass-if "n = 0"
1455 (< fixnum-min 0))
1456
1457 (pass-if "n = 0.0"
1458 (< fixnum-min 0.0))
1459
1460 (pass-if "n = 1"
1461 (< fixnum-min 1))
1462
1463 (pass-if "n = 1.0"
1464 (< fixnum-min 1.0))
1465
1466 (pass-if "n = -1"
1467 (< fixnum-min -1))
1468
1469 (pass-if "n = -1.0"
1470 (< fixnum-min -1.0))
1471
1472 (pass-if "n = fixnum-max"
1473 (< fixnum-min fixnum-max))
1474
1475 (pass-if "n = fixnum-max + 1"
1476 (< fixnum-min (+ fixnum-max 1)))
1477
1478 (pass-if "n = fixnum-min"
1479 (not (< fixnum-min fixnum-min)))
1480
1481 (pass-if "n = fixnum-min - 1"
1482 (not (< fixnum-min (- fixnum-min 1)))))
1483
1484 (with-test-prefix "(< (- fixnum-min 1) n)"
1485
1486 (pass-if "n = 0"
1487 (< (- fixnum-min 1) 0))
1488
1489 (pass-if "n = 0.0"
1490 (< (- fixnum-min 1) 0.0))
1491
1492 (pass-if "n = 1"
1493 (< (- fixnum-min 1) 1))
1494
1495 (pass-if "n = 1.0"
1496 (< (- fixnum-min 1) 1.0))
1497
1498 (pass-if "n = -1"
1499 (< (- fixnum-min 1) -1))
1500
1501 (pass-if "n = -1.0"
1502 (< (- fixnum-min 1) -1.0))
1503
1504 (pass-if "n = fixnum-max"
1505 (< (- fixnum-min 1) fixnum-max))
1506
1507 (pass-if "n = fixnum-max + 1"
1508 (< (- fixnum-min 1) (+ fixnum-max 1)))
1509
1510 (pass-if "n = fixnum-min"
1511 (< (- fixnum-min 1) fixnum-min))
1512
1513 (pass-if "n = fixnum-min - 1"
1514 (not (< (- fixnum-min 1) (- fixnum-min 1))))))
1515
1516 ;;;
1517 ;;; >
1518 ;;;
1519
1520 ;; currently not tested -- implementation is trivial
1521 ;; (> x y) is implemented as (< y x)
1522 ;; FIXME: tests should probably be added in case we change implementation.
1523
1524 ;;;
1525 ;;; <=
1526 ;;;
1527
1528 ;; currently not tested -- implementation is trivial
1529 ;; (<= x y) is implemented as (not (< y x))
1530 ;; FIXME: tests should probably be added in case we change implementation.
1531
1532 ;;;
1533 ;;; >=
1534 ;;;
1535
1536 ;; currently not tested -- implementation is trivial
1537 ;; (>= x y) is implemented as (not (< x y))
1538 ;; FIXME: tests should probably be added in case we change implementation.
1539
1540 ;;;
1541 ;;; zero?
1542 ;;;
1543
1544 (with-test-prefix "zero?"
1545 (expect-fail (documented? zero?))
1546 (pass-if (zero? 0))
1547 (expect-fail (zero? 7))
1548 (expect-fail (zero? -7))
1549 (expect-fail (zero? (+ 1 fixnum-max)))
1550 (expect-fail (zero? (- 1 fixnum-min)))
1551 (expect-fail (zero? 1.3))
1552 (expect-fail (zero? 3.1+4.2i)))
1553
1554 ;;;
1555 ;;; positive?
1556 ;;;
1557
1558 (with-test-prefix "positive?"
1559 (expect-fail (documented? positive?))
1560 (pass-if (positive? 1))
1561 (pass-if (positive? (+ fixnum-max 1)))
1562 (pass-if (positive? 1.3))
1563 (expect-fail (positive? 0))
1564 (expect-fail (positive? -1))
1565 (expect-fail (positive? (- fixnum-min 1)))
1566 (expect-fail (positive? -1.3)))
1567
1568 ;;;
1569 ;;; negative?
1570 ;;;
1571
1572 (with-test-prefix "negative?"
1573 (expect-fail (documented? negative?))
1574 (expect-fail (negative? 1))
1575 (expect-fail (negative? (+ fixnum-max 1)))
1576 (expect-fail (negative? 1.3))
1577 (expect-fail (negative? 0))
1578 (pass-if (negative? -1))
1579 (pass-if (negative? (- fixnum-min 1)))
1580 (pass-if (negative? -1.3)))
1581
1582 ;;;
1583 ;;; max
1584 ;;;
1585
1586 ;;;
1587 ;;; min
1588 ;;;
1589
1590 ;; FIXME: unfinished...
1591
1592 (with-test-prefix "min"
1593 (let ((big*2 (* fixnum-max 2))
1594 (big*3 (* fixnum-max 3))
1595 (big*4 (* fixnum-max 4))
1596 (big*5 (* fixnum-max 5)))
1597
1598 (expect-fail (documented? max))
1599 (pass-if (= 1 (min 7 3 1 5)))
1600 (pass-if (= 1 (min 1 7 3 5)))
1601 (pass-if (= 1 (min 7 3 5 1)))
1602 (pass-if (= -7 (min 2 3 4 -2 5 -7 1 -1 4 2)))
1603 (pass-if (= -7 (min -7 2 3 4 -2 5 1 -1 4 2)))
1604 (pass-if (= -7 (min 2 3 4 -2 5 1 -1 4 2 -7)))
1605 (pass-if (= big*2 (min big*3 big*5 big*2 big*4)))
1606 (pass-if (= big*2 (min big*2 big*3 big*5 big*4)))
1607 (pass-if (= big*2 (min big*3 big*5 big*4 big*2)))
1608 (pass-if
1609 (= (- fixnum-min 1) (min 2 4 (- fixnum-min 1) 3 (* 2 fixnum-max))))
1610 (pass-if
1611 (= (- fixnum-min 1) (min (- fixnum-min 1) 2 4 3 (* 2 fixnum-max))))
1612 (pass-if
1613 (= (- fixnum-min 1) (min 2 4 3 (* 2 fixnum-max) (- fixnum-min 1))))))
1614
1615 ;;;
1616 ;;; +
1617 ;;;
1618
1619 (with-test-prefix "+"
1620
1621 (expect-fail "documented?"
1622 (documented? +))
1623
1624 (with-test-prefix "wrong type argument"
1625
1626 (pass-if-exception "1st argument string"
1627 exception:wrong-type-arg
1628 (+ "1" 2))
1629
1630 (pass-if-exception "2nd argument bool"
1631 exception:wrong-type-arg
1632 (+ 1 #f))))
1633 ;;;
1634 ;;; -
1635 ;;;
1636
1637 ;;;
1638 ;;; *
1639 ;;;
1640
1641 ;;;
1642 ;;; /
1643 ;;;
1644
1645 (with-test-prefix "/"
1646
1647 (expect-fail "documented?"
1648 (documented? /))
1649
1650 (with-test-prefix "division by zero"
1651
1652 (pass-if-exception "(/ 0)"
1653 exception:numerical-overflow
1654 (/ 0))
1655
1656 (pass-if "(/ 0.0)"
1657 (= +inf.0 (/ 0.0)))
1658
1659 (pass-if-exception "(/ 1 0)"
1660 exception:numerical-overflow
1661 (/ 1 0))
1662
1663 (pass-if "(/ 1 0.0)"
1664 (= +inf.0 (/ 1 0.0)))
1665
1666 (pass-if-exception "(/ bignum 0)"
1667 exception:numerical-overflow
1668 (/ (+ fixnum-max 1) 0))
1669
1670 (pass-if "(/ bignum 0.0)"
1671 (= +inf.0 (/ (+ fixnum-max 1) 0.0)))
1672
1673 (pass-if-exception "(/ 1.0 0)"
1674 exception:numerical-overflow
1675 (/ 1.0 0))
1676
1677 (pass-if "(/ 1.0 0.0)"
1678 (= +inf.0 (/ 1.0 0.0)))
1679
1680 (pass-if-exception "(/ +i 0)"
1681 exception:numerical-overflow
1682 (/ +i 0))
1683
1684 (pass-if "(/ +i 0.0)"
1685 (= +inf.0 (imag-part (/ +i 0.0)))))
1686
1687 (with-test-prefix "complex division"
1688
1689 (pass-if "(/ 3+4i)"
1690 (= (/ 3+4i) 0.12-0.16i))
1691
1692 (pass-if "(/ 4+3i)"
1693 (= (/ 4+3i) 0.16-0.12i))
1694
1695 (pass-if "(/ 25+125i 3+4i)"
1696 (= (/ 25+125i 3+4i) 23.0+11.0i))
1697
1698 (pass-if "(/ 25+125i 4+3i)"
1699 (= (/ 25+125i 4+3i) 19.0+17.0i))
1700
1701 (pass-if "(/ 25 3+4i)"
1702 (= (/ 25 3+4i) 3.0-4.0i))
1703
1704 (pass-if "(/ 25 4+3i)"
1705 (= (/ 25 4+3i) 4.0-3.0i))
1706
1707 (pass-if "(/ 1e200+1e200i)"
1708 (= (/ 1e200+1e200i) 5.0e-201-5.0e-201i))))
1709
1710 ;;;
1711 ;;; truncate
1712 ;;;
1713
1714 ;;;
1715 ;;; round
1716 ;;;
1717
1718 ;;;
1719 ;;; exact->inexact
1720 ;;;
1721
1722 ;;;
1723 ;;; floor
1724 ;;;
1725
1726 ;;;
1727 ;;; ceiling
1728 ;;;
1729
1730 ;;;
1731 ;;; expt
1732 ;;;
1733
1734 (with-test-prefix "expt"
1735 (pass-if "(= 1 (expt 0 0))" (= 1 (expt 0 0)))
1736 (pass-if "(= 1 (expt 0 0.0))" (= 1 (expt 0 0.0)))
1737 (pass-if "(= 1 (expt 0.0 0))" (= 1 (expt 0.0 0)))
1738 (pass-if "(= 1 (expt 0.0 0.0))" (= 1 (expt 0.0 0.0))))
1739
1740 ;;;
1741 ;;; make-rectangular
1742 ;;;
1743
1744 ;;;
1745 ;;; make-polar
1746 ;;;
1747
1748 ;;;
1749 ;;; real-part
1750 ;;;
1751
1752 ;;;
1753 ;;; imag-part
1754 ;;;
1755
1756 ;;;
1757 ;;; magnitude
1758 ;;;
1759
1760 ;;;
1761 ;;; angle
1762 ;;;
1763
1764 ;;;
1765 ;;; inexact->exact
1766 ;;;