|
my @classes ;
BEGIN {
@classes = qw< Math::BigInt Math::BigRat Math::BigFloat > ;
for my $class ( @classes ) {
use_ok( $class );
}
}
my %cases =
(
'common' =>
[
[ 'NaN' , 'NaN' , 'NaN' ],
[ 'inf' , 'NaN' , 'NaN' ],
[ 'NaN' , 'inf' , 'NaN' ],
[ '0' , 'NaN' , 'NaN' ],
[ '0' , 'inf' , 'NaN' ],
[ '0' , '-inf' , 'NaN' ],
[ '1' , 'NaN' , 'NaN' ],
[ '1' , 'inf' , 'NaN' ],
[ '1' , '-inf' , 'NaN' ],
[ '-4' , '0' , '4' ],
[ '0' , '-4' , '4' ],
[ '-1' , '0' , '1' ],
[ '0' , '-1' , '1' ],
[ '0' , '0' , '0' ],
[ '1' , '0' , '1' ],
[ '0' , '1' , '1' ],
[ '4' , '0' , '4' ],
[ '0' , '4' , '4' ],
[ '-6' , '-4' , '2' ],
[ '-6' , '4' , '2' ],
[ '4' , '-6' , '2' ],
[ '4' , '6' , '2' ],
],
'Math::BigInt' =>
[
[ '0.8' , '1.2' , 'NaN' ],
[ '1.2' , '0.8' , 'NaN' ],
[ '0' , '0.8' , 'NaN' ],
[ '1.2' , '0' , 'NaN' ],
],
'Math::BigRat' =>
[
[ '4/5' , '6/5' , '2/5' ],
[ '6/5' , '4/5' , '2/5' ],
],
'Math::BigFloat' =>
[
[ '0.8' , '1.2' , '0.4' ],
[ '1.2' , '0.8' , '0.4' ],
],
);
for my $class ( @classes ) {
my @cases = (@{ $cases {common} },
@{ $cases { $class } });
for my $case ( @cases ) {
my ( $in0 , $in1 , $out0 ) = @$case ;
{
my ( $x , $z );
my $test = qq|\$z = $class -> bgcd("$in0", "$in1");| ;
note( "\n$test\n\n" );
eval $test ;
die $@ if $@;
subtest $test , sub {
is( ref ( $z ), $class , "output arg is a $class" );
is( $z , $out0 , 'output arg has the right value' );
};
}
{
my ( $x , $y , $z );
my $test = qq|\$x = $class -> new("$in0");|
. qq| \$y = $class -> new("$in1");|
. qq| \$z = \$x -> bgcd(\$y);| ;
note( "\n$test\n\n" );
eval $test ;
die $@ if $@;
subtest $test , sub {
is( ref ( $z ), $class , "output arg is a $class" );
is( $z , $out0 , 'output arg has the right value' );
is( $x , $in0 , 'first operand is unmodified' )
unless $class eq "Math::BigInt" && $in0 =~ m|[./]|;
is( $y , $in1 , 'second operand is unmodified' )
unless $class eq "Math::BigInt" && $in1 =~ m|[./]|;
isnt(refaddr( $z ), refaddr( $x ),
'output arg is not the first operand' );
isnt(refaddr( $z ), refaddr( $y ),
'output arg is not the second operand' );
};
}
{
my ( $x , $y , $z );
my $test = qq|\$x = $class -> new("$in0");|
. qq| \$y = $class -> new("$in1");|
. qq| \$z = ${class}::bgcd(\$x, \$y);| ;
note( "\n$test\n\n" );
eval $test ;
die $@ if $@;
subtest $test , sub {
is( ref ( $z ), $class , "output arg is a $class" );
is( $z , $out0 , 'output arg has the right value' );
is( $x , $in0 , 'first operand is unmodified' )
unless $class eq "Math::BigInt" && $in0 =~ m|[./]|;
is( $y , $in1 , 'second operand is unmodified' )
unless $class eq "Math::BigInt" && $in1 =~ m|[./]|;
isnt(refaddr( $z ), refaddr( $x ),
'output arg is not the first operand' );
isnt(refaddr( $z ), refaddr( $y ),
'output arg is not the second operand' );
};
}
{
my $z ;
my $test = qq|\$z = ${class}::bgcd("$in0", "$in1");| ;
eval $test ;
die $@ if $@;
subtest $test , sub {
is( ref ( $z ), $class , "output arg is a $class" );
is( $z , $out0 , 'output arg has the right value' );
};
}
}
}
|