diff options
Diffstat (limited to 'cpan/Math-BigInt/t/new-mbi.t')
-rw-r--r-- | cpan/Math-BigInt/t/new-mbi.t | 279 |
1 files changed, 279 insertions, 0 deletions
diff --git a/cpan/Math-BigInt/t/new-mbi.t b/cpan/Math-BigInt/t/new-mbi.t new file mode 100644 index 0000000000..07d826d4ca --- /dev/null +++ b/cpan/Math-BigInt/t/new-mbi.t @@ -0,0 +1,279 @@ +# -*- mode: perl; -*- + +use strict; +use warnings; + +use Test::More tests => 106; + +use Scalar::Util qw< refaddr >; + +my $class; + +BEGIN { $class = 'Math::BigInt'; } +BEGIN { use_ok($class); } + +while (<DATA>) { + s/#.*$//; # remove comments + s/\s+$//; # remove trailing whitespace + next unless length; # skip empty lines + + my ($in0, $out0) = split /:/; + my $x; + my $test = qq|\$x = $class -> new("$in0");|; + my $desc = $test; + + eval $test; + die $@ if $@; # this should never happen + + subtest $desc, sub { + plan tests => 2, + + # Check output. + + is(ref($x), $class, "output arg is a $class"); + is($x, $out0, 'output arg has the right value'); + }; + +} + +# new() + +{ + my $x = $class -> new(); + subtest qq|\$x = $class -> new();|, => sub { + plan tests => 2; + + is(ref($x), $class, "output arg is a $class"); + is($x, "0", 'output arg has the right value'); + }; +} + +# new("") + +{ + no warnings "numeric"; + my $x = $class -> new(""); + subtest qq|\$x = $class -> new("");|, => sub { + plan tests => 2; + + is(ref($x), $class, "output arg is a $class"); + #is($x, "0", 'output arg has the right value'); + is($x, "NaN", 'output arg has the right value'); + }; +} + +# new(undef) + +{ + no warnings "uninitialized"; + my $x = $class -> new(undef); + subtest qq|\$x = $class -> new(undef);|, => sub { + plan tests => 2; + + is(ref($x), $class, "output arg is a $class"); + is($x, "0", 'output arg has the right value'); + }; +} + +# new($x) +# +# In this case, when $x isa Math::BigInt, only the sign and value should be +# copied from $x, not the accuracy or precision. + +{ + my ($a, $p, $x, $y); + + $a = $class -> accuracy(); # get original + $class -> accuracy(4711); # set new global value + $x = $class -> new("314"); # create object + $x -> accuracy(41); # set instance value + $y = $class -> new($x); # create new object + is($y -> accuracy(), 4711, 'object has the global accuracy'); + $class -> accuracy($a); # reset + + $p = $class -> precision(); # get original + $class -> precision(4711); # set new global value + $x = $class -> new("314"); # create object + $x -> precision(41); # set instance value + $y = $class -> new($x); # create new object + is($y -> precision(), 4711, 'object has the global precision'); + $class -> precision($p); # reset +} + +# Make sure that library thingies are indeed copied. + +{ + my ($x, $y); + + $x = $class -> new("314"); # create object + $y = $class -> new($x); # create new object + subtest 'library thingy is copied' => sub { + my @keys = ('value'); + plan tests => scalar @keys; + for my $key (@keys) { + isnt(refaddr($y -> {$key}), refaddr($x -> {$key}), + 'library thingy is a copy'); + } + }; +} + +__END__ + +NaN:NaN +inf:inf +infinity:inf ++inf:inf ++infinity:inf +-inf:-inf +-infinity:-inf + +# This is the same data as in from_bin-mbf.t, except that some of them are +# commented out, since new() only treats input as binary if it has a "0b" or +# "0B" prefix, possibly with a leading "+" or "-" sign. Duplicates from above +# are also commented out. + +0b1p+0:1 +0b.1p+1:1 +0b.01p+2:1 +0b.001p+3:1 +0b.0001p+4:1 +0b10p-1:1 +0b100p-2:1 +0b1000p-3:1 + +-0b1p+0:-1 + +0b0p+0:0 +0b0p+7:0 +0b0p-7:0 +0b0.p+0:0 +0b.0p+0:0 +0b0.0p+0:0 + +0b1100101011111110:51966 +0B1100101011111110:51966 +b1100101011111110:51966 +B1100101011111110:51966 +#1100101011111110:51966 + +0b1.1001p+3:NaN +0b10010.001101p-1:NaN +-0b.11110001001101010111100110111101111p+31:NaN +0b10.0100011010001010110011110001001101p+34:39093746765 + +0b.p+0:NaN + +#NaN:NaN +#+inf:NaN +#-inf:NaN + +# This is more or less the same data as in from_oct-mbf.t, except that some of +# them are commented out, since new() does not consider a number with just a +# leading zero to be an octal number. Duplicates from above are also commented +# out. + +# Without "0o" prefix. + +001p+0:1 +00.4p+1:1 +00.2p+2:1 +00.1p+3:1 +00.04p+4:1 +02p-1:1 +04p-2:1 +010p-3:1 + +-01p+0:-1 + +00p+0:0 +00p+7:0 +00p-7:0 +00.p+0:0 +00.0p+0:0 + +#145376:51966 +#0145376:51966 +#00145376:51966 + +03.1p+2:NaN +022.15p-1:NaN +-00.361152746757p+32:NaN +044.3212636115p+30:39093746765 + +0.p+0:NaN +.p+0:NaN + +# With "0o" prefix. + +0o01p+0:1 +0o0.4p+1:1 +0o0.2p+2:1 +0o0.1p+3:1 +0o0.04p+4:1 +0o02p-1:1 +0o04p-2:1 +0o010p-3:1 + +-0o1p+0:-1 + +0o0p+0:0 +0o0p+7:0 +0o0p-7:0 +0o0.p+0:0 +0o.0p+0:0 +0o0.0p+0:0 + +0o145376:51966 +0O145376:51966 +o145376:51966 +O145376:51966 + +0o3.1p+2:NaN +0o22.15p-1:NaN +-0o0.361152746757p+32:NaN +0o44.3212636115p+30:39093746765 + +0o.p+0:NaN + +#NaN:NaN +#+inf:NaN +#-inf:NaN + +# This is the same data as in from_hex-mbf.t, except that some of them are +# commented out, since new() only treats input as hexadecimal if it has a "0x" +# or "0X" prefix, possibly with a leading "+" or "-" sign. + +0x1p+0:1 +0x.8p+1:1 +0x.4p+2:1 +0x.2p+3:1 +0x.1p+4:1 +0x2p-1:1 +0x4p-2:1 +0x8p-3:1 + +-0x1p+0:-1 + +0x0p+0:0 +0x0p+7:0 +0x0p-7:0 +0x0.p+0:0 +0x.0p+0:0 +0x0.0p+0:0 + +0xcafe:51966 +0Xcafe:51966 +xcafe:51966 +Xcafe:51966 +#cafe:51966 + +0x1.9p+3:NaN +0x12.34p-1:NaN +-0x.789abcdefp+32:NaN +0x12.3456789ap+31:39093746765 + +0x.p+0:NaN + +#NaN:NaN +#+inf:NaN +#-inf:NaN |