source: trunk/essentials/dev-lang/perl/lib/Math/BigRat/t/bigrat.t

Last change on this file was 3181, checked in by bird, 19 years ago

perl 5.8.8

File size: 8.7 KB
Line 
1#!/usr/bin/perl -w
2
3use strict;
4use Test;
5
6BEGIN
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
16use Math::BigRat;
17use Math::BigInt;
18use Math::BigFloat;
19
20# shortcuts
21my $cr = 'Math::BigRat';
22my $mbi = 'Math::BigInt';
23my $mbf = 'Math::BigFloat';
24
25my ($x,$y,$z);
26
27$x = Math::BigRat->new(1234); ok ($x,1234);
28ok ($x->isa('Math::BigRat'));
29ok (!$x->isa('Math::BigFloat'));
30ok (!$x->isa('Math::BigInt'));
31
32##############################################################################
33# new and bnorm()
34
35foreach 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
71my $n = 'numerator';
72my $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
89ok ($cr->new('123a4'),'NaN');
90ok ($cr->new('123e4'),'1230000');
91ok ($cr->new('-NaN'),'NaN');
92ok ($cr->new('NaN'),'NaN');
93ok ($cr->new('+inf'),'inf');
94ok ($cr->new('-inf'),'-inf');
95
96##############################################################################
97# two Bigints
98
99ok ($cr->new($mbi->new(3),$mbi->new(7))->badd(1),'10/7');
100ok ($cr->new($mbi->new(-13),$mbi->new(7)),'-13/7');
101ok ($cr->new($mbi->new(13),$mbi->new(-7)),'-13/7');
102ok ($cr->new($mbi->new(-13),$mbi->new(-7)),'13/7');
103
104##############################################################################
105# mixed arguments
106
107ok ($cr->new('3/7')->badd(1),'10/7');
108ok ($cr->new('3/10')->badd(1.1),'7/5');
109ok ($cr->new('3/7')->badd($mbi->new(1)),'10/7');
110ok ($cr->new('3/10')->badd($mbf->new('1.1')),'7/5');
111
112ok ($cr->new('3/7')->bsub(1),'-4/7');
113ok ($cr->new('3/10')->bsub(1.1),'-4/5');
114ok ($cr->new('3/7')->bsub($mbi->new(1)),'-4/7');