Nicer formatting for function arguments in Carp messages
[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
990fb837 5$setup = '';
6
184f15d5 7while (<DATA>)
8 {
a4e2b1c6 9 chomp;
184f15d5 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") {
990fb837 38 my $a = $args[1] || '';
39 $try .= "\$x->binf('$a');";
184f15d5 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();';
7d341013 57 } elsif ($f =~ /^(length|numify)$/) {
58 $try .= "\$x->$f();";
59 # some unary ops (can't test the fxxx form, since no AUTOLOAD in BigRat)
184f15d5 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;';
a4e2b1c6 91 } elsif ($f eq "fpow") {
92 $try .= '$x->bpow($y);';
184f15d5 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);
150ok ($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
1601; # all done
161
162###############################################################################
163# Perl 5.005 does not like ok ($x,undef)
164
165sub 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__
990fb837 174&as_number
175144/7:20
176NaN:NaN
177+inf:inf
178-inf:-inf
179&bmod
180NaN:1:NaN
1811:NaN:NaN
1821:1:0
1832:2:0
18412:6:0
1857/4:4/14:1/28
1867/4:4/16:0
187-7/4:4/16:0
188-7/4:-4/16:0
1897/4:-4/16:0
1907/4:4/32:0
191-7/4:4/32:0
192-7/4:-4/32:0
1937/4:-4/32:0
1947/4:4/28:1/28
195-7/4:4/28:-1/28
1967/4:-4/28:1/28
197-7/4:-4/28:-1/28
198&fsqrt
1991:1
2000:0
201NaN:NaN
202+inf:inf
203-inf:NaN
204144:12
205# sqrt(144) / sqrt(4) = 12/2 = 6/1
206144/4:6
20725/16:5/4
208-3:NaN
209&flog
210NaN:NaN
2110:NaN
184f15d5 212&finf
2131:+:inf
2142:-:-inf
2153:abc:inf
990fb837 216&numify
93c87d9d 2170:0
218+1:1
2191234:1234
2203/4:0.75
2215/2:2.5
2223/2:1.5
2235/4:1.25
990fb837 224NaN:NaN
93c87d9d 225+inf:inf
226-inf:-inf
184f15d5 227&fnan
228abc:NaN
2292:NaN
230-2:NaN
2310:NaN
232&fone
2332:+:1
234-2:-:-1
235-2:+:1
2362:-:-1
2370::1
238-2::1
239abc::1
2402:abc:1
241&fsstr
242+inf:inf
243-inf:-inf
244abcfsstr:NaN
2451:1/1
2463/1:3/1
2470.1:1/10
248&bnorm
2491:1
250-0:0
251bnormNaN:NaN
252+inf:inf
253-inf:-inf
254123:123
255-123.4567:-1234567/10000
256# invalid inputs
2571__2:NaN
2581E1__2:NaN
25911__2E2:NaN
260#1.E3:NaN
261.2E-3.:NaN
262#1e3e4:NaN
263.2E2:20
264inf:inf
265+inf:inf
266-inf:-inf
267+infinity:NaN
268+-inf:NaN
269abc:NaN
270 1 a:NaN
2711bcd2:NaN
27211111b:NaN
273+1z:NaN
274-1z:NaN
2750:0
276+0:0
277+00:0
278+0_0_0:0
279000000_0000000_00000:0
280-0:0
281-0000:0
282+1:1
283+01:1
284+001:1
285+00000100000:100000
286123456789:123456789
287-1:-1
288-01:-1
289-001:-1
290-123456789:-123456789
291-00000100000:-100000
292123.456a:NaN
293123.456:15432/125
2940.01:1/100
295.002:1/500
296+.2:1/5
297-0.0003:-3/10000
298-.0000000004:-1/2500000000
299123456E2:12345600
300123456E-2:30864/25
301-123456E2:-12345600
302-123456E-2:-30864/25
3031e1:10
3042e-11:1/50000000000
30512/10:6/5
3060.1/0.1:1
307100/0.1:1000
3080.1/10:1/100
3091 / 3:1/3
3101/ 3:1/3
3111 /3:1/3
312&fneg
313fnegNaN:NaN
314+inf:-inf
315-inf:inf
316+0:0
317+1:-1
318-1:1
319+123456789:-123456789
320-123456789:123456789
321+123.456789:-123456789/1000000
322-123456.789:123456789/1000
323&fabs
324fabsNaN:NaN
325+inf:inf
326-inf:inf
327+0:0
328+1:1
329-1:1
330+123456789:123456789
331-123456789:123456789
332+123.456789:123456789/1000000
333-123456.789:123456789/1000
334&badd
335abc:abc:NaN
336abc:+0:NaN
337+0:abc:NaN
338+inf:-inf:NaN
339-inf:+inf:NaN
340+inf:+inf:inf
341-inf:-inf:-inf
342baddNaN:+inf:NaN
343baddNaN:+inf:NaN
344+inf:baddNaN:NaN
345-inf:baddNaN:NaN
346+0:+0:0
347+1:+0:1
348+0:+1:1
349+1:+1:2
350-1:+0:-1
351+0:-1:-1
352-1:-1:-2
353-1:+1:0
354+1:-1:0
355+9:+1:10
356+99:+1:100
357+999:+1:1000
358+9999:+1:10000
359+99999:+1:100000
360+999999:+1:1000000
361+9999999:+1:10000000
362+99999999:+1:100000000
363+999999999:+1:1000000000
364+9999999999:+1:10000000000
365+99999999999:+1:100000000000
366+10:-1:9
367+100:-1:99
368+1000:-1:999
369+10000:-1:9999
370+100000:-1:99999
371+1000000:-1:999999
372+10000000:-1:9999999
373+100000000:-1:99999999
374+1000000000:-1:999999999
375+10000000000:-1:9999999999
376+123456789:+987654321:1111111110
377-123456789:+987654321:864197532
378-123456789:-987654321:-1111111110
379+123456789:-987654321:-864197532
3801/3:1/3:2/3
3812/3:-1/3:1/3
382&bsub
383abc:abc:NaN
384abc:+0:NaN
385+0:abc:NaN
386+inf:-inf:inf
387-inf:+inf:-inf
388+inf:+inf:NaN
389-inf:-inf:NaN
390baddNaN:+inf:NaN
391baddNaN:+inf:NaN
392+inf:baddNaN:NaN
393-inf:baddNaN:NaN
394+0:+0:0
395+1:+0:1
396+0:+1:-1
397+1:+1:0
398-1:+0:-1
399+0:-1:1
400-1:-1:0
401-1:+1:-2
402+1:-1:2
403+9:+1:8
404+99:+1:98
405+999:+1:998
406+9999:+1:9998
407+99999:+1:99998
408+999999:+1:999998
409+9999999:+1:9999998
410+99999999:+1:99999998
411+999999999:+1:999999998
412+9999999999:+1:9999999998
413+99999999999:+1:99999999998
414+10:-1:11
415+100:-1:101
416+1000:-1:1001
417+10000:-1:10001
418+100000:-1:100001
419+1000000:-1:1000001
420+10000000:-1:10000001
421+100000000:-1:100000001
422+1000000000:-1:1000000001
423+10000000000:-1:10000000001
424+123456789:+987654321:-864197532
425-123456789:+987654321:-1111111110
426-123456789:-987654321:864197532
427+123456789:-987654321:1111111110
4282/3:1/3:1/3
4297/27:3/54:11/54
430-2/3:+2/3:-4/3
431-2/3:-2/3:0
432&bmul
433abc:abc:NaN
434abc:+0:NaN
435+0:abc:NaN
436+inf:NaNmul:NaN
437+inf:NaNmul:NaN
438NaNmul:+inf:NaN
439NaNmul:-inf:NaN
440+inf:+inf:inf
441+inf:-inf:-inf
442+inf:-inf:-inf
443+inf:+inf:inf
444+inf:123.34:inf
445+inf:-123.34:-inf
446-inf:123.34:-inf
447-inf:-123.34:inf
448123.34:+inf:inf
449-123.34:+inf:-inf
450123.34:-inf:-inf
451-123.34:-inf:inf
452+0:+0:0
453+0:+1:0
454+1:+0:0
455+0:-1:0
456-1:+0:0
457+123456789123456789:+0:0
458+0:+123456789123456789:0
459-1:-1:1
460-1:+1:-1
461+1:-1:-1
462+1:+1:1
463+2:+3:6
464-2:+3:-6
465+2:-3:-6
466-2:-3:6
467+111:+111:12321
468+10101:+10101:102030201
469+1001001:+1001001:1002003002001
470+100010001:+100010001:10002000300020001
471+10000100001:+10000100001:100002000030000200001
472+11111111111:+9:99999999999
473+22222222222:+9:199999999998
474+33333333333:+9:299999999997
475+44444444444:+9:399999999996
476+55555555555:+9:499999999995
477+66666666666:+9:599999999994
478+77777777777:+9:699999999993
479+88888888888:+9:799999999992
480+99999999999:+9:899999999991
4816:120:720
48210:10000:100000
4831/4:1/3:1/12
484&bdiv
485$div_scale = 40; $round_mode = 'even'
486abc:abc:NaN
487abc:+1:abc:NaN
488+1:abc:NaN
489-1:abc:NaN
4900:abc:NaN
491+0:+0:NaN
492+0:+1:0
493+1:+0:inf
494+3214:+0:inf
495+0:-1:0
496-1:+0:-inf
497-3214:+0:-inf
498+1:+1:1
499-1:-1:1
500+1:-1:-1
501-1:+1:-1
502+1:+2:1/2
503+2:+1:2
504123:+inf:0
505123:-inf:0
506+10:+5:2
507+100:+4:25
508+1000:+8:125
509+10000:+16:625
510+10000:-16:-625
511+999999999999:+9:111111111111
512+999999999999:+99:10101010101
513+999999999999:+999:1001001001
514+999999999999:+9999:100010001
515+999999999999999:+99999:10000100001
516+1000000000:+9:1000000000/9
517+2000000000:+9:2000000000/9
518+3000000000:+9:1000000000/3
519+4000000000:+9:4000000000/9
520+5000000000:+9:5000000000/9
521+6000000000:+9:2000000000/3
522+7000000000:+9:7000000000/9
523+8000000000:+9:8000000000/9
524+9000000000:+9:1000000000
525+35500000:+113:35500000/113
526+71000000:+226:35500000/113
527+106500000:+339:35500000/113
528+1000000000:+3:1000000000/3
5292:25.024996000799840031993601279744051189762:1000000000000000000000000000000000000000/12512498000399920015996800639872025594881
530123456:1:123456
5311/4:1/3:3/4
532# reset scale for further tests
533$div_scale = 40
534&is_nan
535123:0
536abc:1
537NaN:1
538-123:0
539&is_inf
540+inf::1
541-inf::1
542abc::0
5431::0
544NaN::0
545-1::0
546+inf:-:0
547+inf:+:1
548-inf:-:1
549-inf:+:0
550# it must be exactly /^[+-]inf$/
551+infinity::0
552-infinity::0
553&is_odd
554abc:0
5550:0
556-1:1
557-3:1
5581:1
5593:1
5601000001:1
5611000002:0
562+inf:0
563-inf:0
564123.45:0
565-123.45:0
5662:0
567&is_int
568NaNis_int:0
5690:1
5701:1
5712:1
572-2:1
573-1:1
574-inf:0
575+inf:0
576123.4567:0
577-0.1:0
578-0.002:0
5791/3:0
5803/1:1
581&is_even
582abc:0
5830:1
584-1:0
585-3:0
5861:0
5873:0
5881000001:0
5891000002:1
5902:1
591+inf:0
592-inf:0
593123.456:0
594-123.456:0
5950.01:0
596-0.01:0
597120:1
5981200:1
599-1200:1
600&is_positive
6010:1
6021:1
603-1:0
604-123:0
605NaN:0
606-inf:0
607+inf:1
608&is_negative
6090:0
6101:0
611-1:1
612-123:1
613NaN:0
614-inf:1
615+inf:0
a4e2b1c6 616&parts
6170:0 1
6181:1 1
619123:123 1
620-123:-123 1
621-1200:-1200 1
6225/7:5 7
623-5/7:-5 7
624NaNparts:NaN NaN
625+inf:inf inf
626-inf:-inf inf
184f15d5 627#&exponent
628#0:1
629#1:0
630#123:0
631#-123:0
632#-1200:2
633#+inf:inf
634#-inf:inf
635#NaNexponent:NaN
636#&mantissa
637#0:0
638#1:1
639#123:123
640#-123:-123
641#-1200:-12
642#+inf:inf
643#-inf:-inf
644#NaNmantissa:NaN
645#&length
646#123:3
647#-123:3
648#0:1
649#1:1
650#12345678901234567890:20
651&is_zero
652NaNzero:0
653+inf:0
654-inf:0
6550:1
656-1:0
6571:0
6580/3:1
6591/3:0
660&is_one
661NaNone:0
662+inf:0
663-inf:0
6640:0
6652:0
6661:1
667-1:0
668-2:0
6691/3:0
670100/100:1
6710.1/0.1:1
672&ffloor
6730:0
674abc:NaN
675+inf:inf
676-inf:-inf
6771:1
678-51:-51
679-51.2:-52
68012.2:12
a4e2b1c6 6813/7:0
6826/7:0
6837/7:1
6848/7:1
68513/7:1
68614/7:2
68715/7:2
688-3/7:-1
689-6/7:-1
690-7/1:-7
691-8/7:-2
692-13/7:-2
693-14/7:-2
694-15/7:-3
184f15d5 695&fceil
6960:0
697abc:NaN
698+inf:inf
699-inf:-inf
7001:1
701-51:-51
702-51.2:-51
70312.2:13
a4e2b1c6 7043/7:1
7056/7:1
7068/7:2
70713/7:2
70814/7:2
70915/7:3
710-3/7:0
711-6/7:0
712-8/7:-1
713-13/7:-1
714-14/7:-2
715-15/7:-2
716&ffac
717NaN:NaN
7181:1
719-1:NaN
720&bpow
721# bpow test for overload of **
7222:2:4
7233:3:27
724&fpow
7252/1:3/1:8
7263/1:3/1:27
7275/2:3/1:125/8
728-2/1:3/1:-8
729-3/1:3/1:-27
730-5/2:3/1:-125/8
731-2/1:4/1:16
732-3/1:4/1:81
733-5/2:4/1:625/16
734-5/2:-4/1:16/625
7351/5:-3:125
736-1/5:-3:-125
737&numerator
738NaN:NaN
739inf:inf
740-inf:-inf
7413/7:3
742-3/7:-3
7430:0
7441:1
745&denominator
746NaN:NaN
747inf:inf
748-inf:-inf
7493/7:7
7500:1
7511/1:1
752-3/7:7
753&finc
7543/2:5/2
755-15/6:-3/2
756NaN:NaN
757-1/3:2/3
758-2/7:5/7
759&fdec
76015/6:3/2
761-3/2:-5/2
7621/3:-2/3
7632/7:-5/7
764NaN:NaN