| 1 | #!/usr/bin/perl -w
|
|---|
| 2 |
|
|---|
| 3 | use strict;
|
|---|
| 4 | use Test;
|
|---|
| 5 |
|
|---|
| 6 | BEGIN
|
|---|
| 7 | {
|
|---|
| 8 | $| = 1;
|
|---|
| 9 | chdir 't' if -d 't';
|
|---|
| 10 | unshift @INC, '../lib'; # for running manually
|
|---|
| 11 | plan tests => 185;
|
|---|
| 12 | }
|
|---|
| 13 |
|
|---|
| 14 | # basic testing of Math::BigRat
|
|---|
| 15 |
|
|---|
| 16 | use Math::BigRat;
|
|---|
| 17 | use Math::BigInt;
|
|---|
| 18 | use Math::BigFloat;
|
|---|
| 19 |
|
|---|
| 20 | # shortcuts
|
|---|
| 21 | my $cr = 'Math::BigRat';
|
|---|
| 22 | my $mbi = 'Math::BigInt';
|
|---|
| 23 | my $mbf = 'Math::BigFloat';
|
|---|
| 24 |
|
|---|
| 25 | my ($x,$y,$z);
|
|---|
| 26 |
|
|---|
| 27 | $x = Math::BigRat->new(1234); ok ($x,1234);
|
|---|
| 28 | ok ($x->isa('Math::BigRat'));
|
|---|
| 29 | ok (!$x->isa('Math::BigFloat'));
|
|---|
| 30 | ok (!$x->isa('Math::BigInt'));
|
|---|
| 31 |
|
|---|
| 32 | ##############################################################################
|
|---|
| 33 | # new and bnorm()
|
|---|
| 34 |
|
|---|
| 35 | foreach my $func (qw/new bnorm/)
|
|---|
| 36 | {
|
|---|
| 37 | $x = $cr->$func(1234); ok ($x,1234);
|
|---|
| 38 |
|
|---|
| 39 | $x = $cr->$func('1234/1'); ok ($x,1234);
|
|---|
| 40 | $x = $cr->$func('1234/2'); ok ($x,617);
|
|---|
| 41 |
|
|---|
| 42 | $x = $cr->$func('100/1.0'); ok ($x,100);
|
|---|
| 43 | $x = $cr->$func('10.0/1.0'); ok ($x,10);
|
|---|
| 44 | $x = $cr->$func('0.1/10'); ok ($x,'1/100');
|
|---|
| 45 | $x = $cr->$func('0.1/0.1'); ok ($x,'1');
|
|---|
| 46 | $x = $cr->$func('1e2/10'); ok ($x,10);
|
|---|
| 47 | $x = $cr->$func('5/1e2'); ok ($x,'1/20');
|
|---|
| 48 | $x = $cr->$func('1e2/1e1'); ok ($x,10);
|
|---|
| 49 | $x = $cr->$func('1 / 3'); ok ($x,'1/3');
|
|---|
| 50 | $x = $cr->$func('-1 / 3'); ok ($x,'-1/3');
|
|---|
| 51 | $x = $cr->$func('NaN'); ok ($x,'NaN');
|
|---|
| 52 | $x = $cr->$func('inf'); ok ($x,'inf');
|
|---|
| 53 | $x = $cr->$func('-inf'); ok ($x,'-inf');
|
|---|
| 54 | $x = $cr->$func('1/'); ok ($x,'NaN');
|
|---|
| 55 |
|
|---|
| 56 | # input ala '1+1/3' isn't parsed ok yet
|
|---|
| 57 | $x = $cr->$func('1+1/3'); ok ($x,'NaN');
|
|---|
| 58 |
|
|---|
| 59 | $x = $cr->$func('1/1.2'); ok ($x,'5/6');
|
|---|
| 60 | $x = $cr->$func('1.3/1.2'); ok ($x,'13/12');
|
|---|
| 61 | $x = $cr->$func('1.2/1'); ok ($x,'6/5');
|
|---|
| 62 |
|
|---|
| 63 | ############################################################################
|
|---|
| 64 | # other classes as input
|
|---|
| 65 |
|
|---|
| 66 | $x = $cr->$func($mbi->new(1231)); ok ($x,'1231');
|
|---|
| 67 | $x = $cr->$func($mbf->new(1232)); ok ($x,'1232');
|
|---|
| 68 | $x = $cr->$func($mbf->new(1232.3)); ok ($x,'12323/10');
|
|---|
| 69 | }
|
|---|
| 70 |
|
|---|
| 71 | my $n = 'numerator';
|
|---|
| 72 | my $d = 'denominator';
|
|---|
| 73 |
|
|---|
| 74 | $x = $cr->new('-0'); ok ($x,'0'); ok ($x->$n(), '0'); ok ($x->$d(),'1');
|
|---|
| 75 | $x = $cr->new('NaN'); ok ($x,'NaN'); ok ($x->$n(), 'NaN'); ok ($x->$d(),'NaN');
|
|---|
| 76 | $x = $cr->new('-NaN'); ok ($x,'NaN'); ok ($x->$n(), 'NaN'); ok ($x->$d(),'NaN');
|
|---|
| 77 | $x = $cr->new('-1r4'); ok ($x,'NaN'); ok ($x->$n(), 'NaN'); ok ($x->$d(),'NaN');
|
|---|
| 78 |
|
|---|
| 79 | $x = $cr->new('+inf'); ok ($x,'inf'); ok ($x->$n(), 'inf'); ok ($x->$d(),'1');
|
|---|
| 80 | $x = $cr->new('-inf'); ok ($x,'-inf'); ok ($x->$n(), '-inf'); ok ($x->$d(),'1');
|
|---|
| 81 | $x = $cr->new('123a4'); ok ($x,'NaN'); ok ($x->$n(), 'NaN'); ok ($x->$d(),'NaN');
|
|---|
| 82 |
|
|---|
| 83 | # wrong inputs
|
|---|
| 84 | $x = $cr->new('1e2e2'); ok ($x,'NaN'); ok ($x->$n(), 'NaN'); ok ($x->$d(),'NaN');
|
|---|
| 85 | $x = $cr->new('1+2+2'); ok ($x,'NaN'); ok ($x->$n(), 'NaN'); ok ($x->$d(),'NaN');
|
|---|
| 86 | # failed due to BigFloat bug
|
|---|
| 87 | $x = $cr->new('1.2.2'); ok ($x,'NaN'); ok ($x->$n(), 'NaN'); ok ($x->$d(),'NaN');
|
|---|
| 88 |
|
|---|
| 89 | ok ($cr->new('123a4'),'NaN');
|
|---|
| 90 | ok ($cr->new('123e4'),'1230000');
|
|---|
| 91 | ok ($cr->new('-NaN'),'NaN');
|
|---|
| 92 | ok ($cr->new('NaN'),'NaN');
|
|---|
| 93 | ok ($cr->new('+inf'),'inf');
|
|---|
| 94 | ok ($cr->new('-inf'),'-inf');
|
|---|
| 95 |
|
|---|
| 96 | ##############################################################################
|
|---|
| 97 | # two Bigints
|
|---|
| 98 |
|
|---|
| 99 | ok ($cr->new($mbi->new(3),$mbi->new(7))->badd(1),'10/7');
|
|---|
| 100 | ok ($cr->new($mbi->new(-13),$mbi->new(7)),'-13/7');
|
|---|
| 101 | ok ($cr->new($mbi->new(13),$mbi->new(-7)),'-13/7');
|
|---|
| 102 | ok ($cr->new($mbi->new(-13),$mbi->new(-7)),'13/7');
|
|---|
| 103 |
|
|---|
| 104 | ##############################################################################
|
|---|
| 105 | # mixed arguments
|
|---|
| 106 |
|
|---|
| 107 | ok ($cr->new('3/7')->badd(1),'10/7');
|
|---|
| 108 | ok ($cr->new('3/10')->badd(1.1),'7/5');
|
|---|
| 109 | ok ($cr->new('3/7')->badd($mbi->new(1)),'10/7');
|
|---|
| 110 | ok ($cr->new('3/10')->badd($mbf->new('1.1')),'7/5');
|
|---|
| 111 |
|
|---|
| 112 | ok ($cr->new('3/7')->bsub(1),'-4/7');
|
|---|
| 113 | ok ($cr->new('3/10')->bsub(1.1),'-4/5');
|
|---|
| 114 | ok ($cr->new('3/7')->bsub($mbi->new(1)),'-4/7');
|
|---|
|
|---|