Upgrade to Math::BigInt v1.65, Math::BigRat v0.10,
[p5sagit/p5-mst-13.2.git] / lib / Math / BigRat / t / bigratpm.inc
1 #include this file into another test for subclass testing...
2
3 ok ($class->config()->{lib},$CL);
4
5 $setup = '';
6
7 while (<DATA>)
8   {
9   chomp;
10   $_ =~ s/#.*$//;       # remove comments
11   $_ =~ s/\s+$//;       # trailing spaces
12   next if /^$/;         # skip empty lines & comments
13   if (s/^&//)
14     {
15     $f = $_;
16     }
17   elsif (/^\$/)
18     {
19     $setup = $_; $setup =~ s/\$/\$${class}::/g; # round_mode, div_scale
20     #print "\$setup== $setup\n";
21     }
22   else
23     {
24     if (m|^(.*?):(/.+)$|)
25       {
26       $ans = $2;
27       @args = split(/:/,$1,99);
28       }
29     else
30       {
31       @args = split(/:/,$_,99); $ans = pop(@args);
32       }
33     $try = "\$x = new $class \"$args[0]\";";
34     if ($f eq "bnorm")
35       {
36         $try .= "\$x;";
37       } elsif ($f eq "finf") {
38         my $a = $args[1] || '';
39         $try .= "\$x->binf('$a');";
40       } elsif ($f eq "is_inf") {
41         $try .= "\$x->is_inf('$args[1]');"; 
42       } elsif ($f eq "fone") {
43         $try .= "\$x->bone('$args[1]');";
44       } elsif ($f eq "fstr") {
45         $try .= "\$x->accuracy($args[1]); \$x->precision($args[2]);";
46         $try .= '$x->bstr();';
47       } elsif ($f eq "parts") {
48         # ->bstr() to see if an object is returned
49         $try .= '($a,$b) = $x->parts(); $a = $a->bstr(); $b = $b->bstr();';
50         $try .= '"$a $b";';
51       } elsif ($f eq "numerator") {
52         # ->bstr() to see if an object is returned
53         $try .= '$x->numerator()->bstr();';
54       } elsif ($f eq "denominator") {
55         # ->bstr() to see if an object is returned
56         $try .= '$x->denominator()->bstr();';
57       } elsif ($f =~ /^(length|numify)$/) {
58         $try .= "\$x->$f();";
59       # some unary ops (can't test the fxxx form, since no AUTOLOAD in BigRat)
60       } elsif ($f =~ /^f(nan|sstr|neg|floor|ceil|abs)$/) {
61         $try .= "\$x->b$1();";
62       # some is_xxx test function       
63       } elsif ($f =~ /^is_(zero|one|negative|positive|odd|even|nan|int)$/) {
64         $try .= "\$x->$f();";
65       } elsif ($f eq "as_number") {
66         $try .= '$x->as_number();';
67       } elsif ($f eq "finc") {
68         $try .= '++$x;';
69       } elsif ($f eq "fdec") {
70         $try .= '--$x;';
71       }elsif ($f eq "fround") {
72         $try .= "$setup; \$x->bround($args[1]);";
73       } elsif ($f eq "ffround") {
74         $try .= "$setup; \$x->bfround($args[1]);";
75       } elsif ($f eq "fsqrt") {
76         $try .= "$setup; \$x->bsqrt();";
77       } elsif ($f eq "flog") {
78         $try .= "$setup; \$x->blog();";
79       } elsif ($f eq "ffac") {
80         $try .= "$setup; \$x->bfac();";
81       }
82     else
83       {
84       $try .= "\$y = new $class \"$args[1]\";";
85       if ($f eq "fcmp") {
86         $try .= '$x <=> $y;';
87       } elsif ($f eq "facmp") {
88         $try .= '$x->bacmp($y);';
89       } elsif ($f eq "bpow") {
90         $try .= '$x ** $y;';
91       } elsif ($f eq "fpow") {
92         $try .= '$x->bpow($y);';
93       } elsif ($f eq "badd") {
94         $try .= '$x + $y;';
95       } elsif ($f eq "bsub") {
96         $try .= '$x - $y;';
97       } elsif ($f eq "bmul") {
98         $try .= '$x * $y;';
99       } elsif ($f eq "bdiv") {
100         $try .= "$setup; \$x / \$y;";
101       } elsif ($f eq "fdiv-list") {
102         $try .= "$setup; join(',',\$x->bdiv(\$y));";
103       } elsif ($f eq "brsft") {
104         $try .= '$x >> $y;';
105       } elsif ($f eq "blsft") {
106         $try .= '$x << $y;';
107       } elsif ($f eq "bmod") {
108         $try .= '$x % $y;';
109       } else { warn "Unknown op '$f'"; }
110     }
111     # print "# Trying: '$try'\n";
112     $ans1 = eval $try;
113     if ($ans =~ m|^/(.*)$|)
114       {
115       my $pat = $1;
116       if ($ans1 =~ /$pat/)
117         {
118         ok (1,1);
119         }
120       else
121         {
122         print "# '$try' expected: /$pat/ got: '$ans1'\n" if !ok(1,0);
123         }
124       }
125     else
126       {
127       if ($ans eq "")
128         {
129         ok_undef ($ans1);
130         }
131       else
132         {
133         print "# Tried: '$try'\n" if !ok ($ans1, $ans);
134 #        if (ref($ans1) eq "$class")
135 #         {
136 #         # float numbers are normalized (for now), so mantissa shouldn't have
137 #         # trailing zeros
138 #         #print $ans1->_trailing_zeros(),"\n";
139 #          print "# Has trailing zeros after '$try'\n"
140 #          if !ok ($ans1->{_m}->_trailing_zeros(), 0);
141 #         }
142         }
143       } # end pattern or string
144     }
145   } # end while
146
147 # check whether $class->new( Math::BigInt->new()) destroys it 
148 # ($y == 12 in this case)
149 $x = Math::BigInt->new(1200); $y = $class->new($x);
150 ok ($y,1200); ok ($x,1200);
151
152 ###############################################################################
153 # zero,inf,one,nan
154
155 $x = $class->new(2); $x->bzero(); ok_undef ($x->{_a}); ok_undef ($x->{_p});
156 $x = $class->new(2); $x->binf();  ok_undef ($x->{_a}); ok_undef ($x->{_p});
157 $x = $class->new(2); $x->bone();  ok_undef ($x->{_a}); ok_undef ($x->{_p});
158 $x = $class->new(2); $x->bnan();  ok_undef ($x->{_a}); ok_undef ($x->{_p});
159         
160 1; # all done
161
162 ###############################################################################
163 # Perl 5.005 does not like ok ($x,undef)
164
165 sub ok_undef
166   {
167   my $x = shift;
168
169   ok (1,1) and return if !defined $x;
170   ok ($x,'undef');
171   }
172
173 __DATA__
174 &as_number
175 144/7:20
176 NaN:NaN
177 +inf:inf
178 -inf:-inf
179 &bmod
180 NaN:1:NaN
181 1:NaN:NaN
182 1:1:0
183 2:2:0
184 12:6:0
185 7/4:4/14:1/28
186 7/4:4/16:0
187 -7/4:4/16:0
188 -7/4:-4/16:0
189 7/4:-4/16:0
190 7/4:4/32:0
191 -7/4:4/32:0
192 -7/4:-4/32:0
193 7/4:-4/32:0
194 7/4:4/28:1/28
195 -7/4:4/28:-1/28
196 7/4:-4/28:1/28
197 -7/4:-4/28:-1/28
198 &fsqrt
199 1:1
200 0:0
201 NaN:NaN
202 +inf:inf
203 -inf:NaN
204 144:12
205 # sqrt(144) / sqrt(4) = 12/2 = 6/1
206 144/4:6
207 25/16:5/4
208 -3:NaN
209 &flog
210 NaN:NaN
211 0:NaN
212 &finf
213 1:+:inf
214 2:-:-inf
215 3:abc:inf
216 &numify
217 #0:0e+1
218 #+1:1e+0
219 #1234:1234e+0
220 NaN:NaN
221 #+inf:inf
222 #-inf:-inf
223 &fnan
224 abc:NaN
225 2:NaN
226 -2:NaN
227 0:NaN
228 &fone
229 2:+:1
230 -2:-:-1
231 -2:+:1
232 2:-:-1
233 0::1
234 -2::1
235 abc::1
236 2:abc:1
237 &fsstr
238 +inf:inf
239 -inf:-inf
240 abcfsstr:NaN
241 1:1/1
242 3/1:3/1
243 0.1:1/10
244 &bnorm
245 1:1
246 -0:0
247 bnormNaN:NaN
248 +inf:inf
249 -inf:-inf
250 123:123
251 -123.4567:-1234567/10000
252 # invalid inputs
253 1__2:NaN
254 1E1__2:NaN
255 11__2E2:NaN
256 #1.E3:NaN
257 .2E-3.:NaN
258 #1e3e4:NaN
259 .2E2:20
260 inf:inf
261 +inf:inf
262 -inf:-inf
263 +infinity:NaN
264 +-inf:NaN
265 abc:NaN
266    1 a:NaN
267 1bcd2:NaN
268 11111b:NaN
269 +1z:NaN
270 -1z:NaN
271 0:0
272 +0:0
273 +00:0
274 +0_0_0:0
275 000000_0000000_00000:0
276 -0:0
277 -0000:0
278 +1:1
279 +01:1
280 +001:1
281 +00000100000:100000
282 123456789:123456789
283 -1:-1
284 -01:-1
285 -001:-1
286 -123456789:-123456789
287 -00000100000:-100000
288 123.456a:NaN
289 123.456:15432/125
290 0.01:1/100
291 .002:1/500
292 +.2:1/5
293 -0.0003:-3/10000
294 -.0000000004:-1/2500000000
295 123456E2:12345600
296 123456E-2:30864/25
297 -123456E2:-12345600
298 -123456E-2:-30864/25
299 1e1:10
300 2e-11:1/50000000000
301 12/10:6/5
302 0.1/0.1:1
303 100/0.1:1000
304 0.1/10:1/100
305 1 / 3:1/3
306 1/ 3:1/3
307 1 /3:1/3
308 &fneg
309 fnegNaN:NaN
310 +inf:-inf
311 -inf:inf
312 +0:0
313 +1:-1
314 -1:1
315 +123456789:-123456789
316 -123456789:123456789
317 +123.456789:-123456789/1000000
318 -123456.789:123456789/1000
319 &fabs
320 fabsNaN:NaN
321 +inf:inf
322 -inf:inf
323 +0:0
324 +1:1
325 -1:1
326 +123456789:123456789
327 -123456789:123456789
328 +123.456789:123456789/1000000
329 -123456.789:123456789/1000
330 &badd
331 abc:abc:NaN
332 abc:+0:NaN
333 +0:abc:NaN
334 +inf:-inf:NaN
335 -inf:+inf:NaN
336 +inf:+inf:inf
337 -inf:-inf:-inf
338 baddNaN:+inf:NaN
339 baddNaN:+inf:NaN
340 +inf:baddNaN:NaN
341 -inf:baddNaN:NaN
342 +0:+0:0
343 +1:+0:1
344 +0:+1:1
345 +1:+1:2
346 -1:+0:-1
347 +0:-1:-1
348 -1:-1:-2
349 -1:+1:0
350 +1:-1:0
351 +9:+1:10
352 +99:+1:100
353 +999:+1:1000
354 +9999:+1:10000
355 +99999:+1:100000
356 +999999:+1:1000000
357 +9999999:+1:10000000
358 +99999999:+1:100000000
359 +999999999:+1:1000000000
360 +9999999999:+1:10000000000
361 +99999999999:+1:100000000000
362 +10:-1:9
363 +100:-1:99
364 +1000:-1:999
365 +10000:-1:9999
366 +100000:-1:99999
367 +1000000:-1:999999
368 +10000000:-1:9999999
369 +100000000:-1:99999999
370 +1000000000:-1:999999999
371 +10000000000:-1:9999999999
372 +123456789:+987654321:1111111110
373 -123456789:+987654321:864197532
374 -123456789:-987654321:-1111111110
375 +123456789:-987654321:-864197532
376 1/3:1/3:2/3
377 2/3:-1/3:1/3
378 &bsub
379 abc:abc:NaN
380 abc:+0:NaN
381 +0:abc:NaN
382 +inf:-inf:inf
383 -inf:+inf:-inf
384 +inf:+inf:NaN
385 -inf:-inf:NaN
386 baddNaN:+inf:NaN
387 baddNaN:+inf:NaN
388 +inf:baddNaN:NaN
389 -inf:baddNaN:NaN
390 +0:+0:0
391 +1:+0:1
392 +0:+1:-1
393 +1:+1:0
394 -1:+0:-1
395 +0:-1:1
396 -1:-1:0
397 -1:+1:-2
398 +1:-1:2
399 +9:+1:8
400 +99:+1:98
401 +999:+1:998
402 +9999:+1:9998
403 +99999:+1:99998
404 +999999:+1:999998
405 +9999999:+1:9999998
406 +99999999:+1:99999998
407 +999999999:+1:999999998
408 +9999999999:+1:9999999998
409 +99999999999:+1:99999999998
410 +10:-1:11
411 +100:-1:101
412 +1000:-1:1001
413 +10000:-1:10001
414 +100000:-1:100001
415 +1000000:-1:1000001
416 +10000000:-1:10000001
417 +100000000:-1:100000001
418 +1000000000:-1:1000000001
419 +10000000000:-1:10000000001
420 +123456789:+987654321:-864197532
421 -123456789:+987654321:-1111111110
422 -123456789:-987654321:864197532
423 +123456789:-987654321:1111111110
424 2/3:1/3:1/3
425 7/27:3/54:11/54
426 -2/3:+2/3:-4/3
427 -2/3:-2/3:0
428 &bmul
429 abc:abc:NaN
430 abc:+0:NaN
431 +0:abc:NaN
432 +inf:NaNmul:NaN
433 +inf:NaNmul:NaN
434 NaNmul:+inf:NaN
435 NaNmul:-inf:NaN
436 +inf:+inf:inf
437 +inf:-inf:-inf
438 +inf:-inf:-inf
439 +inf:+inf:inf
440 +inf:123.34:inf
441 +inf:-123.34:-inf
442 -inf:123.34:-inf
443 -inf:-123.34:inf
444 123.34:+inf:inf
445 -123.34:+inf:-inf
446 123.34:-inf:-inf
447 -123.34:-inf:inf
448 +0:+0:0
449 +0:+1:0
450 +1:+0:0
451 +0:-1:0
452 -1:+0:0
453 +123456789123456789:+0:0
454 +0:+123456789123456789:0
455 -1:-1:1
456 -1:+1:-1
457 +1:-1:-1
458 +1:+1:1
459 +2:+3:6
460 -2:+3:-6
461 +2:-3:-6
462 -2:-3:6
463 +111:+111:12321
464 +10101:+10101:102030201
465 +1001001:+1001001:1002003002001
466 +100010001:+100010001:10002000300020001
467 +10000100001:+10000100001:100002000030000200001
468 +11111111111:+9:99999999999
469 +22222222222:+9:199999999998
470 +33333333333:+9:299999999997
471 +44444444444:+9:399999999996
472 +55555555555:+9:499999999995
473 +66666666666:+9:599999999994
474 +77777777777:+9:699999999993
475 +88888888888:+9:799999999992
476 +99999999999:+9:899999999991
477 6:120:720
478 10:10000:100000
479 1/4:1/3:1/12
480 &bdiv
481 $div_scale = 40; $round_mode = 'even'
482 abc:abc:NaN
483 abc:+1:abc:NaN
484 +1:abc:NaN
485 -1:abc:NaN
486 0:abc:NaN
487 +0:+0:NaN
488 +0:+1:0
489 +1:+0:inf
490 +3214:+0:inf
491 +0:-1:0
492 -1:+0:-inf
493 -3214:+0:-inf
494 +1:+1:1
495 -1:-1:1
496 +1:-1:-1
497 -1:+1:-1
498 +1:+2:1/2
499 +2:+1:2
500 123:+inf:0
501 123:-inf:0
502 +10:+5:2
503 +100:+4:25
504 +1000:+8:125
505 +10000:+16:625
506 +10000:-16:-625
507 +999999999999:+9:111111111111
508 +999999999999:+99:10101010101
509 +999999999999:+999:1001001001
510 +999999999999:+9999:100010001
511 +999999999999999:+99999:10000100001
512 +1000000000:+9:1000000000/9
513 +2000000000:+9:2000000000/9
514 +3000000000:+9:1000000000/3
515 +4000000000:+9:4000000000/9
516 +5000000000:+9:5000000000/9
517 +6000000000:+9:2000000000/3
518 +7000000000:+9:7000000000/9
519 +8000000000:+9:8000000000/9
520 +9000000000:+9:1000000000
521 +35500000:+113:35500000/113
522 +71000000:+226:35500000/113
523 +106500000:+339:35500000/113
524 +1000000000:+3:1000000000/3
525 2:25.024996000799840031993601279744051189762:1000000000000000000000000000000000000000/12512498000399920015996800639872025594881
526 123456:1:123456
527 1/4:1/3:3/4
528 # reset scale for further tests
529 $div_scale = 40
530 &is_nan
531 123:0
532 abc:1
533 NaN:1
534 -123:0
535 &is_inf
536 +inf::1
537 -inf::1
538 abc::0
539 1::0
540 NaN::0
541 -1::0
542 +inf:-:0
543 +inf:+:1
544 -inf:-:1
545 -inf:+:0
546 # it must be exactly /^[+-]inf$/
547 +infinity::0
548 -infinity::0
549 &is_odd
550 abc:0
551 0:0
552 -1:1
553 -3:1
554 1:1
555 3:1
556 1000001:1
557 1000002:0
558 +inf:0
559 -inf:0
560 123.45:0
561 -123.45:0
562 2:0
563 &is_int
564 NaNis_int:0
565 0:1
566 1:1
567 2:1
568 -2:1
569 -1:1
570 -inf:0
571 +inf:0
572 123.4567:0
573 -0.1:0
574 -0.002:0
575 1/3:0
576 3/1:1
577 &is_even
578 abc:0
579 0:1
580 -1:0
581 -3:0
582 1:0
583 3:0
584 1000001:0
585 1000002:1
586 2:1
587 +inf:0
588 -inf:0
589 123.456:0
590 -123.456:0
591 0.01:0
592 -0.01:0
593 120:1
594 1200:1
595 -1200:1
596 &is_positive
597 0:1
598 1:1
599 -1:0
600 -123:0
601 NaN:0
602 -inf:0
603 +inf:1
604 &is_negative
605 0:0
606 1:0
607 -1:1
608 -123:1
609 NaN:0
610 -inf:1
611 +inf:0
612 &parts
613 0:0 1
614 1:1 1
615 123:123 1
616 -123:-123 1
617 -1200:-1200 1
618 5/7:5 7
619 -5/7:-5 7
620 NaNparts:NaN NaN
621 +inf:inf inf
622 -inf:-inf inf
623 #&exponent
624 #0:1
625 #1:0
626 #123:0
627 #-123:0
628 #-1200:2
629 #+inf:inf
630 #-inf:inf
631 #NaNexponent:NaN
632 #&mantissa
633 #0:0
634 #1:1
635 #123:123
636 #-123:-123
637 #-1200:-12
638 #+inf:inf
639 #-inf:-inf
640 #NaNmantissa:NaN
641 #&length
642 #123:3
643 #-123:3
644 #0:1
645 #1:1
646 #12345678901234567890:20
647 &is_zero
648 NaNzero:0
649 +inf:0
650 -inf:0
651 0:1
652 -1:0
653 1:0
654 0/3:1
655 1/3:0
656 &is_one
657 NaNone:0
658 +inf:0
659 -inf:0
660 0:0
661 2:0
662 1:1
663 -1:0
664 -2:0
665 1/3:0
666 100/100:1
667 0.1/0.1:1
668 &ffloor
669 0:0
670 abc:NaN
671 +inf:inf
672 -inf:-inf
673 1:1
674 -51:-51
675 -51.2:-52
676 12.2:12
677 3/7:0
678 6/7:0
679 7/7:1
680 8/7:1
681 13/7:1
682 14/7:2
683 15/7:2
684 -3/7:-1
685 -6/7:-1
686 -7/1:-7
687 -8/7:-2
688 -13/7:-2
689 -14/7:-2
690 -15/7:-3
691 &fceil
692 0:0
693 abc:NaN
694 +inf:inf
695 -inf:-inf
696 1:1
697 -51:-51
698 -51.2:-51
699 12.2:13
700 3/7:1
701 6/7:1
702 8/7:2
703 13/7:2
704 14/7:2
705 15/7:3
706 -3/7:0
707 -6/7:0
708 -8/7:-1
709 -13/7:-1
710 -14/7:-2
711 -15/7:-2
712 &ffac
713 NaN:NaN
714 1:1
715 -1:NaN
716 &bpow
717 # bpow test for overload of **
718 2:2:4
719 3:3:27
720 &fpow
721 2/1:3/1:8
722 3/1:3/1:27
723 5/2:3/1:125/8
724 -2/1:3/1:-8
725 -3/1:3/1:-27
726 -5/2:3/1:-125/8
727 -2/1:4/1:16
728 -3/1:4/1:81
729 -5/2:4/1:625/16
730 -5/2:-4/1:16/625
731 1/5:-3:125
732 -1/5:-3:-125
733 &numerator
734 NaN:NaN
735 inf:inf
736 -inf:-inf
737 3/7:3
738 -3/7:-3
739 0:0
740 1:1
741 &denominator
742 NaN:NaN
743 inf:inf
744 -inf:-inf
745 3/7:7
746 0:1
747 1/1:1
748 -3/7:7
749 &finc
750 3/2:5/2
751 -15/6:-3/2
752 NaN:NaN
753 -1/3:2/3
754 -2/7:5/7
755 &fdec
756 15/6:3/2
757 -3/2:-5/2
758 1/3:-2/3
759 2/7:-5/7
760 NaN:NaN