Merge Math::BigRat 0.04, from Tels.
[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   chop;
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 "badd") {
91         $try .= '$x + $y;';
92       } elsif ($f eq "bsub") {
93         $try .= '$x - $y;';
94       } elsif ($f eq "bmul") {
95         $try .= '$x * $y;';
96       } elsif ($f eq "bdiv") {
97         $try .= "$setup; \$x / \$y;";
98       } elsif ($f eq "fdiv-list") {
99         $try .= "$setup; join(',',\$x->bdiv(\$y));";
100       } elsif ($f eq "brsft") {
101         $try .= '$x >> $y;';
102       } elsif ($f eq "blsft") {
103         $try .= '$x << $y;';
104       } elsif ($f eq "bmod") {
105         $try .= '$x % $y;';
106       } else { warn "Unknown op '$f'"; }
107     }
108     # print "# Trying: '$try'\n";
109     $ans1 = eval $try;
110     if ($ans =~ m|^/(.*)$|)
111       {
112       my $pat = $1;
113       if ($ans1 =~ /$pat/)
114         {
115         ok (1,1);
116         }
117       else
118         {
119         print "# '$try' expected: /$pat/ got: '$ans1'\n" if !ok(1,0);
120         }
121       }
122     else
123       {
124       if ($ans eq "")
125         {
126         ok_undef ($ans1);
127         }
128       else
129         {
130         print "# Tried: '$try'\n" if !ok ($ans1, $ans);
131 #        if (ref($ans1) eq "$class")
132 #         {
133 #         # float numbers are normalized (for now), so mantissa shouldn't have
134 #         # trailing zeros
135 #         #print $ans1->_trailing_zeros(),"\n";
136 #          print "# Has trailing zeros after '$try'\n"
137 #          if !ok ($ans1->{_m}->_trailing_zeros(), 0);
138 #         }
139         }
140       } # end pattern or string
141     }
142   } # end while
143
144 # check whether $class->new( Math::BigInt->new()) destroys it 
145 # ($y == 12 in this case)
146 $x = Math::BigInt->new(1200); $y = $class->new($x);
147 ok ($y,1200); ok ($x,1200);
148
149 ###############################################################################
150 # zero,inf,one,nan
151
152 $x = $class->new(2); $x->bzero(); ok_undef ($x->{_a}); ok_undef ($x->{_p});
153 $x = $class->new(2); $x->binf();  ok_undef ($x->{_a}); ok_undef ($x->{_p});
154 $x = $class->new(2); $x->bone();  ok_undef ($x->{_a}); ok_undef ($x->{_p});
155 $x = $class->new(2); $x->bnan();  ok_undef ($x->{_a}); ok_undef ($x->{_p});
156         
157 1; # all done
158
159 ###############################################################################
160 # Perl 5.005 does not like ok ($x,undef)
161
162 sub ok_undef
163   {
164   my $x = shift;
165
166   ok (1,1) and return if !defined $x;
167   ok ($x,'undef');
168   }
169
170 __DATA__
171 &finf
172 1:+:inf
173 2:-:-inf
174 3:abc:inf
175 #&numify
176 #0:0e+1
177 #+1:1e+0
178 #1234:1234e+0
179 #NaN:NaN
180 #+inf:inf
181 #-inf:-inf
182 &fnan
183 abc:NaN
184 2:NaN
185 -2:NaN
186 0:NaN
187 &fone
188 2:+:1
189 -2:-:-1
190 -2:+:1
191 2:-:-1
192 0::1
193 -2::1
194 abc::1
195 2:abc:1
196 &fsstr
197 +inf:inf
198 -inf:-inf
199 abcfsstr:NaN
200 1:1/1
201 3/1:3/1
202 0.1:1/10
203 &bnorm
204 1:1
205 -0:0
206 bnormNaN:NaN
207 +inf:inf
208 -inf:-inf
209 123:123
210 -123.4567:-1234567/10000
211 # invalid inputs
212 1__2:NaN
213 1E1__2:NaN
214 11__2E2:NaN
215 #1.E3:NaN
216 .2E-3.:NaN
217 #1e3e4:NaN
218 .2E2:20
219 inf:inf
220 +inf:inf
221 -inf:-inf
222 +infinity:NaN
223 +-inf:NaN
224 abc:NaN
225    1 a:NaN
226 1bcd2:NaN
227 11111b:NaN
228 +1z:NaN
229 -1z:NaN
230 0:0
231 +0:0
232 +00:0
233 +0_0_0:0
234 000000_0000000_00000:0
235 -0:0
236 -0000:0
237 +1:1
238 +01:1
239 +001:1
240 +00000100000:100000
241 123456789:123456789
242 -1:-1
243 -01:-1
244 -001:-1
245 -123456789:-123456789
246 -00000100000:-100000
247 123.456a:NaN
248 123.456:15432/125
249 0.01:1/100
250 .002:1/500
251 +.2:1/5
252 -0.0003:-3/10000
253 -.0000000004:-1/2500000000
254 123456E2:12345600
255 123456E-2:30864/25
256 -123456E2:-12345600
257 -123456E-2:-30864/25
258 1e1:10
259 2e-11:1/50000000000
260 12/10:6/5
261 0.1/0.1:1
262 100/0.1:1000
263 0.1/10:1/100
264 1 / 3:1/3
265 1/ 3:1/3
266 1 /3:1/3
267 &fneg
268 fnegNaN:NaN
269 +inf:-inf
270 -inf:inf
271 +0:0
272 +1:-1
273 -1:1
274 +123456789:-123456789
275 -123456789:123456789
276 +123.456789:-123456789/1000000
277 -123456.789:123456789/1000
278 &fabs
279 fabsNaN:NaN
280 +inf:inf
281 -inf:inf
282 +0:0
283 +1:1
284 -1:1
285 +123456789:123456789
286 -123456789:123456789
287 +123.456789:123456789/1000000
288 -123456.789:123456789/1000
289 &badd
290 abc:abc:NaN
291 abc:+0:NaN
292 +0:abc:NaN
293 +inf:-inf:NaN
294 -inf:+inf:NaN
295 +inf:+inf:inf
296 -inf:-inf:-inf
297 baddNaN:+inf:NaN
298 baddNaN:+inf:NaN
299 +inf:baddNaN:NaN
300 -inf:baddNaN:NaN
301 +0:+0:0
302 +1:+0:1
303 +0:+1:1
304 +1:+1:2
305 -1:+0:-1
306 +0:-1:-1
307 -1:-1:-2
308 -1:+1:0
309 +1:-1:0
310 +9:+1:10
311 +99:+1:100
312 +999:+1:1000
313 +9999:+1:10000
314 +99999:+1:100000
315 +999999:+1:1000000
316 +9999999:+1:10000000
317 +99999999:+1:100000000
318 +999999999:+1:1000000000
319 +9999999999:+1:10000000000
320 +99999999999:+1:100000000000
321 +10:-1:9
322 +100:-1:99
323 +1000:-1:999
324 +10000:-1:9999
325 +100000:-1:99999
326 +1000000:-1:999999
327 +10000000:-1:9999999
328 +100000000:-1:99999999
329 +1000000000:-1:999999999
330 +10000000000:-1:9999999999
331 +123456789:+987654321:1111111110
332 -123456789:+987654321:864197532
333 -123456789:-987654321:-1111111110
334 +123456789:-987654321:-864197532
335 1/3:1/3:2/3
336 2/3:-1/3:1/3
337 &bsub
338 abc:abc:NaN
339 abc:+0:NaN
340 +0:abc:NaN
341 +inf:-inf:inf
342 -inf:+inf:-inf
343 +inf:+inf:NaN
344 -inf:-inf:NaN
345 baddNaN:+inf:NaN
346 baddNaN:+inf:NaN
347 +inf:baddNaN:NaN
348 -inf:baddNaN:NaN
349 +0:+0:0
350 +1:+0:1
351 +0:+1:-1
352 +1:+1:0
353 -1:+0:-1
354 +0:-1:1
355 -1:-1:0
356 -1:+1:-2
357 +1:-1:2
358 +9:+1:8
359 +99:+1:98
360 +999:+1:998
361 +9999:+1:9998
362 +99999:+1:99998
363 +999999:+1:999998
364 +9999999:+1:9999998
365 +99999999:+1:99999998
366 +999999999:+1:999999998
367 +9999999999:+1:9999999998
368 +99999999999:+1:99999999998
369 +10:-1:11
370 +100:-1:101
371 +1000:-1:1001
372 +10000:-1:10001
373 +100000:-1:100001
374 +1000000:-1:1000001
375 +10000000:-1:10000001
376 +100000000:-1:100000001
377 +1000000000:-1:1000000001
378 +10000000000:-1:10000000001
379 +123456789:+987654321:-864197532
380 -123456789:+987654321:-1111111110
381 -123456789:-987654321:864197532
382 +123456789:-987654321:1111111110
383 2/3:1/3:1/3
384 7/27:3/54:11/54
385 -2/3:+2/3:-4/3
386 -2/3:-2/3:0
387 &bmul
388 abc:abc:NaN
389 abc:+0:NaN
390 +0:abc:NaN
391 +inf:NaNmul:NaN
392 +inf:NaNmul:NaN
393 NaNmul:+inf:NaN
394 NaNmul:-inf:NaN
395 +inf:+inf:inf
396 +inf:-inf:-inf
397 +inf:-inf:-inf
398 +inf:+inf:inf
399 +inf:123.34:inf
400 +inf:-123.34:-inf
401 -inf:123.34:-inf
402 -inf:-123.34:inf
403 123.34:+inf:inf
404 -123.34:+inf:-inf
405 123.34:-inf:-inf
406 -123.34:-inf:inf
407 +0:+0:0
408 +0:+1:0
409 +1:+0:0
410 +0:-1:0
411 -1:+0:0
412 +123456789123456789:+0:0
413 +0:+123456789123456789:0
414 -1:-1:1
415 -1:+1:-1
416 +1:-1:-1
417 +1:+1:1
418 +2:+3:6
419 -2:+3:-6
420 +2:-3:-6
421 -2:-3:6
422 +111:+111:12321
423 +10101:+10101:102030201
424 +1001001:+1001001:1002003002001
425 +100010001:+100010001:10002000300020001
426 +10000100001:+10000100001:100002000030000200001
427 +11111111111:+9:99999999999
428 +22222222222:+9:199999999998
429 +33333333333:+9:299999999997
430 +44444444444:+9:399999999996
431 +55555555555:+9:499999999995
432 +66666666666:+9:599999999994
433 +77777777777:+9:699999999993
434 +88888888888:+9:799999999992
435 +99999999999:+9:899999999991
436 6:120:720
437 10:10000:100000
438 1/4:1/3:1/12
439 &bdiv
440 $div_scale = 40; $round_mode = 'even'
441 abc:abc:NaN
442 abc:+1:abc:NaN
443 +1:abc:NaN
444 -1:abc:NaN
445 0:abc:NaN
446 +0:+0:NaN
447 +0:+1:0
448 +1:+0:inf
449 +3214:+0:inf
450 +0:-1:0
451 -1:+0:-inf
452 -3214:+0:-inf
453 +1:+1:1
454 -1:-1:1
455 +1:-1:-1
456 -1:+1:-1
457 +1:+2:1/2
458 +2:+1:2
459 123:+inf:0
460 123:-inf:0
461 +10:+5:2
462 +100:+4:25
463 +1000:+8:125
464 +10000:+16:625
465 +10000:-16:-625
466 +999999999999:+9:111111111111
467 +999999999999:+99:10101010101
468 +999999999999:+999:1001001001
469 +999999999999:+9999:100010001
470 +999999999999999:+99999:10000100001
471 +1000000000:+9:1000000000/9
472 +2000000000:+9:2000000000/9
473 +3000000000:+9:1000000000/3
474 +4000000000:+9:4000000000/9
475 +5000000000:+9:5000000000/9
476 +6000000000:+9:2000000000/3
477 +7000000000:+9:7000000000/9
478 +8000000000:+9:8000000000/9
479 +9000000000:+9:1000000000
480 +35500000:+113:35500000/113
481 +71000000:+226:35500000/113
482 +106500000:+339:35500000/113
483 +1000000000:+3:1000000000/3
484 2:25.024996000799840031993601279744051189762:1000000000000000000000000000000000000000/12512498000399920015996800639872025594881
485 123456:1:123456
486 1/4:1/3:3/4
487 # reset scale for further tests
488 $div_scale = 40
489 &is_nan
490 123:0
491 abc:1
492 NaN:1
493 -123:0
494 &is_inf
495 +inf::1
496 -inf::1
497 abc::0
498 1::0
499 NaN::0
500 -1::0
501 +inf:-:0
502 +inf:+:1
503 -inf:-:1
504 -inf:+:0
505 # it must be exactly /^[+-]inf$/
506 +infinity::0
507 -infinity::0
508 &is_odd
509 abc:0
510 0:0
511 -1:1
512 -3:1
513 1:1
514 3:1
515 1000001:1
516 1000002:0
517 +inf:0
518 -inf:0
519 123.45:0
520 -123.45:0
521 2:0
522 &is_int
523 NaNis_int:0
524 0:1
525 1:1
526 2:1
527 -2:1
528 -1:1
529 -inf:0
530 +inf:0
531 123.4567:0
532 -0.1:0
533 -0.002:0
534 1/3:0
535 3/1:1
536 &is_even
537 abc:0
538 0:1
539 -1:0
540 -3:0
541 1:0
542 3:0
543 1000001:0
544 1000002:1
545 2:1
546 +inf:0
547 -inf:0
548 123.456:0
549 -123.456:0
550 0.01:0
551 -0.01:0
552 120:1
553 1200:1
554 -1200:1
555 &is_positive
556 0:1
557 1:1
558 -1:0
559 -123:0
560 NaN:0
561 -inf:0
562 +inf:1
563 &is_negative
564 0:0
565 1:0
566 -1:1
567 -123:1
568 NaN:0
569 -inf:1
570 +inf:0
571 #&parts
572 #0:0 1
573 #1:1 0
574 #123:123 0
575 #-123:-123 0
576 #-1200:-12 2
577 #NaNparts:NaN NaN
578 #+inf:inf inf
579 #-inf:-inf inf
580 #&exponent
581 #0:1
582 #1:0
583 #123:0
584 #-123:0
585 #-1200:2
586 #+inf:inf
587 #-inf:inf
588 #NaNexponent:NaN
589 #&mantissa
590 #0:0
591 #1:1
592 #123:123
593 #-123:-123
594 #-1200:-12
595 #+inf:inf
596 #-inf:-inf
597 #NaNmantissa:NaN
598 #&length
599 #123:3
600 #-123:3
601 #0:1
602 #1:1
603 #12345678901234567890:20
604 &is_zero
605 NaNzero:0
606 +inf:0
607 -inf:0
608 0:1
609 -1:0
610 1:0
611 0/3:1
612 1/3:0
613 &is_one
614 NaNone:0
615 +inf:0
616 -inf:0
617 0:0
618 2:0
619 1:1
620 -1:0
621 -2:0
622 1/3:0
623 100/100:1
624 0.1/0.1:1
625 &ffloor
626 0:0
627 abc:NaN
628 +inf:inf
629 -inf:-inf
630 1:1
631 -51:-51
632 -51.2:-52
633 12.2:12
634 &fceil
635 0:0
636 abc:NaN
637 +inf:inf
638 -inf:-inf
639 1:1
640 -51:-51
641 -51.2:-51
642 12.2:13