Re: [perl #5025] #line directive explination wrong
[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
184f15d5 217#0:0e+1
218#+1:1e+0
219#1234:1234e+0
990fb837 220NaN:NaN
184f15d5 221#+inf:inf
222#-inf:-inf
223&fnan
224abc:NaN
2252:NaN
226-2:NaN
2270:NaN
228&fone
2292:+:1
230-2:-:-1
231-2:+:1
2322:-:-1
2330::1
234-2::1
235abc::1
2362:abc:1
237&fsstr
238+inf:inf
239-inf:-inf
240abcfsstr:NaN
2411:1/1
2423/1:3/1
2430.1:1/10
244&bnorm
2451:1
246-0:0
247bnormNaN:NaN
248+inf:inf
249-inf:-inf
250123:123
251-123.4567:-1234567/10000
252# invalid inputs
2531__2:NaN
2541E1__2:NaN
25511__2E2:NaN
256#1.E3:NaN
257.2E-3.:NaN
258#1e3e4:NaN
259.2E2:20
260inf:inf
261+inf:inf
262-inf:-inf
263+infinity:NaN
264+-inf:NaN
265abc:NaN
266 1 a:NaN
2671bcd2:NaN
26811111b:NaN
269+1z:NaN
270-1z:NaN
2710:0
272+0:0
273+00:0
274+0_0_0:0
275000000_0000000_00000:0
276-0:0
277-0000:0
278+1:1
279+01:1
280+001:1
281+00000100000:100000
282123456789:123456789
283-1:-1
284-01:-1
285-001:-1
286-123456789:-123456789
287-00000100000:-100000
288123.456a:NaN
289123.456:15432/125
2900.01:1/100
291.002:1/500
292+.2:1/5
293-0.0003:-3/10000
294-.0000000004:-1/2500000000
295123456E2:12345600
296123456E-2:30864/25
297-123456E2:-12345600
298-123456E-2:-30864/25
2991e1:10
3002e-11:1/50000000000
30112/10:6/5
3020.1/0.1:1
303100/0.1:1000
3040.1/10:1/100
3051 / 3:1/3
3061/ 3:1/3
3071 /3:1/3
308&fneg
309fnegNaN: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
320fabsNaN: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
331abc:abc:NaN
332abc:+0:NaN
333+0:abc:NaN
334+inf:-inf:NaN
335-inf:+inf:NaN
336+inf:+inf:inf
337-inf:-inf:-inf
338baddNaN:+inf:NaN
339baddNaN:+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
3761/3:1/3:2/3
3772/3:-1/3:1/3
378&bsub
379abc:abc:NaN
380abc:+0:NaN
381+0:abc:NaN
382+inf:-inf:inf
383-inf:+inf:-inf
384+inf:+inf:NaN
385-inf:-inf:NaN
386baddNaN:+inf:NaN
387baddNaN:+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
4242/3:1/3:1/3
4257/27:3/54:11/54
426-2/3:+2/3:-4/3
427-2/3:-2/3:0
428&bmul
429abc:abc:NaN
430abc:+0:NaN
431+0:abc:NaN
432+inf:NaNmul:NaN
433+inf:NaNmul:NaN
434NaNmul:+inf:NaN
435NaNmul:-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
444123.34:+inf:inf
445-123.34:+inf:-inf
446123.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
4776:120:720
47810:10000:100000
4791/4:1/3:1/12
480&bdiv
481$div_scale = 40; $round_mode = 'even'
482abc:abc:NaN
483abc:+1:abc:NaN
484+1:abc:NaN
485-1:abc:NaN
4860: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
500123:+inf:0
501123:-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
5252:25.024996000799840031993601279744051189762:1000000000000000000000000000000000000000/12512498000399920015996800639872025594881
526123456:1:123456
5271/4:1/3:3/4
528# reset scale for further tests
529$div_scale = 40
530&is_nan
531123:0
532abc:1
533NaN:1
534-123:0
535&is_inf
536+inf::1
537-inf::1
538abc::0
5391::0
540NaN::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
550abc:0
5510:0
552-1:1
553-3:1
5541:1
5553:1
5561000001:1
5571000002:0
558+inf:0
559-inf:0
560123.45:0
561-123.45:0
5622:0
563&is_int
564NaNis_int:0
5650:1
5661:1
5672:1
568-2:1
569-1:1
570-inf:0
571+inf:0
572123.4567:0
573-0.1:0
574-0.002:0
5751/3:0
5763/1:1
577&is_even
578abc:0
5790:1
580-1:0
581-3:0
5821:0
5833:0
5841000001:0
5851000002:1
5862:1
587+inf:0
588-inf:0
589123.456:0
590-123.456:0
5910.01:0
592-0.01:0
593120:1
5941200:1
595-1200:1
596&is_positive
5970:1
5981:1
599-1:0
600-123:0
601NaN:0
602-inf:0
603+inf:1
604&is_negative
6050:0
6061:0
607-1:1
608-123:1
609NaN:0
610-inf:1
611+inf:0
a4e2b1c6 612&parts
6130:0 1
6141:1 1
615123:123 1
616-123:-123 1
617-1200:-1200 1
6185/7:5 7
619-5/7:-5 7
620NaNparts:NaN NaN
621+inf:inf inf
622-inf:-inf inf
184f15d5 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
648NaNzero:0
649+inf:0
650-inf:0
6510:1
652-1:0
6531:0
6540/3:1
6551/3:0
656&is_one
657NaNone:0
658+inf:0
659-inf:0
6600:0
6612:0
6621:1
663-1:0
664-2:0
6651/3:0
666100/100:1
6670.1/0.1:1
668&ffloor
6690:0
670abc:NaN
671+inf:inf
672-inf:-inf
6731:1
674-51:-51
675-51.2:-52
67612.2:12
a4e2b1c6 6773/7:0
6786/7:0
6797/7:1
6808/7:1
68113/7:1
68214/7:2
68315/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
184f15d5 691&fceil
6920:0
693abc:NaN
694+inf:inf
695-inf:-inf
6961:1
697-51:-51
698-51.2:-51
69912.2:13
a4e2b1c6 7003/7:1
7016/7:1
7028/7:2
70313/7:2
70414/7:2
70515/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
713NaN:NaN
7141:1
715-1:NaN
716&bpow
717# bpow test for overload of **
7182:2:4
7193:3:27
720&fpow
7212/1:3/1:8
7223/1:3/1:27
7235/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
7311/5:-3:125
732-1/5:-3:-125
733&numerator
734NaN:NaN
735inf:inf
736-inf:-inf
7373/7:3
738-3/7:-3
7390:0
7401:1
741&denominator
742NaN:NaN
743inf:inf
744-inf:-inf
7453/7:7
7460:1
7471/1:1
748-3/7:7
749&finc
7503/2:5/2
751-15/6:-3/2
752NaN:NaN
753-1/3:2/3
754-2/7:5/7
755&fdec
75615/6:3/2
757-3/2:-5/2
7581/3:-2/3
7592/7:-5/7
760NaN:NaN