Upgrade to Math::BigRat 0.07.
[p5sagit/p5-mst-13.2.git] / lib / Math / BigRat / t / bigratpm.inc
CommitLineData
184f15d5 1#include this file into another test for subclass testing...
2
3ok ($class->config()->{lib},$CL);
4
5while (<DATA>)
6 {
a4e2b1c6 7 chomp;
184f15d5 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;';
a4e2b1c6 90 } elsif ($f eq "fpow") {
91 $try .= '$x->bpow($y);';
184f15d5 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);
149ok ($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
1591; # all done
160
161###############################################################################
162# Perl 5.005 does not like ok ($x,undef)
163
164sub 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
1741:+:inf
1752:-:-inf
1763: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
185abc:NaN
1862:NaN
187-2:NaN
1880:NaN
189&fone
1902:+:1
191-2:-:-1
192-2:+:1
1932:-:-1
1940::1
195-2::1
196abc::1
1972:abc:1
198&fsstr
199+inf:inf
200-inf:-inf
201abcfsstr:NaN
2021:1/1
2033/1:3/1
2040.1:1/10
205&bnorm
2061:1
207-0:0
208bnormNaN:NaN
209+inf:inf
210-inf:-inf
211123:123
212-123.4567:-1234567/10000
213# invalid inputs
2141__2:NaN
2151E1__2:NaN
21611__2E2:NaN
217#1.E3:NaN
218.2E-3.:NaN
219#1e3e4:NaN
220.2E2:20
221inf:inf
222+inf:inf
223-inf:-inf
224+infinity:NaN
225+-inf:NaN
226abc:NaN
227 1 a:NaN
2281bcd2:NaN
22911111b:NaN
230+1z:NaN
231-1z:NaN
2320:0
233+0:0
234+00:0
235+0_0_0:0
236000000_0000000_00000:0
237-0:0
238-0000:0
239+1:1
240+01:1
241+001:1
242+00000100000:100000
243123456789:123456789
244-1:-1
245-01:-1
246-001:-1
247-123456789:-123456789
248-00000100000:-100000
249123.456a:NaN
250123.456:15432/125
2510.01:1/100
252.002:1/500
253+.2:1/5
254-0.0003:-3/10000
255-.0000000004:-1/2500000000
256123456E2:12345600
257123456E-2:30864/25
258-123456E2:-12345600
259-123456E-2:-30864/25
2601e1:10
2612e-11:1/50000000000
26212/10:6/5
2630.1/0.1:1
264100/0.1:1000
2650.1/10:1/100
2661 / 3:1/3
2671/ 3:1/3
2681 /3:1/3
269&fneg
270fnegNaN: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
281fabsNaN: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
292abc:abc:NaN
293abc:+0:NaN
294+0:abc:NaN
295+inf:-inf:NaN
296-inf:+inf:NaN
297+inf:+inf:inf
298-inf:-inf:-inf
299baddNaN:+inf:NaN
300baddNaN:+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
3371/3:1/3:2/3
3382/3:-1/3:1/3
339&bsub
340abc:abc:NaN
341abc:+0:NaN
342+0:abc:NaN
343+inf:-inf:inf
344-inf:+inf:-inf
345+inf:+inf:NaN
346-inf:-inf:NaN
347baddNaN:+inf:NaN
348baddNaN:+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
3852/3:1/3:1/3
3867/27:3/54:11/54
387-2/3:+2/3:-4/3
388-2/3:-2/3:0
389&bmul
390abc:abc:NaN
391abc:+0:NaN
392+0:abc:NaN
393+inf:NaNmul:NaN
394+inf:NaNmul:NaN
395NaNmul:+inf:NaN
396NaNmul:-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
405123.34:+inf:inf
406-123.34:+inf:-inf
407123.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
4386:120:720
43910:10000:100000
4401/4:1/3:1/12
441&bdiv
442$div_scale = 40; $round_mode = 'even'
443abc:abc:NaN
444abc:+1:abc:NaN
445+1:abc:NaN
446-1:abc:NaN
4470: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
461123:+inf:0
462123:-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
4862:25.024996000799840031993601279744051189762:1000000000000000000000000000000000000000/12512498000399920015996800639872025594881
487123456:1:123456
4881/4:1/3:3/4
489# reset scale for further tests
490$div_scale = 40
491&is_nan
492123:0
493abc:1
494NaN:1
495-123:0
496&is_inf
497+inf::1
498-inf::1
499abc::0
5001::0
501NaN::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
511abc:0
5120:0
513-1:1
514-3:1
5151:1
5163:1
5171000001:1
5181000002:0
519+inf:0
520-inf:0
521123.45:0
522-123.45:0
5232:0
524&is_int
525NaNis_int:0
5260:1
5271:1
5282:1
529-2:1
530-1:1
531-inf:0
532+inf:0
533123.4567:0
534-0.1:0
535-0.002:0
5361/3:0
5373/1:1
538&is_even
539abc:0
5400:1
541-1:0
542-3:0
5431:0
5443:0
5451000001:0
5461000002:1
5472:1
548+inf:0
549-inf:0
550123.456:0
551-123.456:0
5520.01:0
553-0.01:0
554120:1
5551200:1
556-1200:1
557&is_positive
5580:1
5591:1
560-1:0
561-123:0
562NaN:0
563-inf:0
564+inf:1
565&is_negative
5660:0
5671:0
568-1:1
569-123:1
570NaN:0
571-inf:1
572+inf:0
a4e2b1c6 573&parts
5740:0 1
5751:1 1
576123:123 1
577-123:-123 1
578-1200:-1200 1
5795/7:5 7
580-5/7:-5 7
581NaNparts:NaN NaN
582+inf:inf inf
583-inf:-inf inf
184f15d5 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
609NaNzero:0
610+inf:0
611-inf:0
6120:1
613-1:0
6141:0
6150/3:1
6161/3:0
617&is_one
618NaNone:0
619+inf:0
620-inf:0
6210:0
6222:0
6231:1
624-1:0
625-2:0
6261/3:0
627100/100:1
6280.1/0.1:1
629&ffloor
6300:0
631abc:NaN
632+inf:inf
633-inf:-inf
6341:1
635-51:-51
636-51.2:-52
63712.2:12
a4e2b1c6 6383/7:0
6396/7:0
6407/7:1
6418/7:1
64213/7:1
64314/7:2
64415/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
184f15d5 652&fceil
6530:0
654abc:NaN
655+inf:inf
656-inf:-inf
6571:1
658-51:-51
659-51.2:-51
66012.2:13
a4e2b1c6 6613/7:1
6626/7:1
6638/7:2
66413/7:2
66514/7:2
66615/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
674NaN:NaN
6751:1
676-1:NaN
677&bpow
678# bpow test for overload of **
6792:2:4
6803:3:27
681&fpow
6822/1:3/1:8
6833/1:3/1:27
6845/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
6921/5:-3:125
693-1/5:-3:-125
694&numerator
695NaN:NaN
696inf:inf
697-inf:-inf
6983/7:3
699-3/7:-3
7000:0
7011:1
702&denominator
703NaN:NaN
704inf:inf
705-inf:-inf
7063/7:7
7070:1
7081/1:1
709-3/7:7
710&finc
7113/2:5/2
712-15/6:-3/2
713NaN:NaN
714-1/3:2/3
715-2/7:5/7
716&fdec
71715/6:3/2
718-3/2:-5/2
7191/3:-2/3
7202/7:-5/7
721NaN:NaN