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