1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
# -*- mode: perl; -*-
# test that config ( trap_nan => 1, trap_inf => 1) really works/dies
use strict;
use warnings;
use Test::More tests => 90;
my $mbi = 'Math::BigInt';
my $mbf = 'Math::BigFloat';
my $mbr = 'Math::BigRat';
use_ok($mbi);
use_ok($mbf);
use_ok($mbr);
my $x;
foreach my $class ($mbi, $mbf, $mbr) {
# can do?
can_ok($class, 'config');
###########################################################################
# Default values.
###########################################################################
# defaults are okay?
is($class->config("trap_nan"), 0, 'trap_nan defaults to 0');
is($class->config("trap_inf"), 0, 'trap_inf defaults to 0');
###########################################################################
# Trap NaN.
###########################################################################
# can set?
$class->config( trap_nan => 1 );
is($class->config("trap_nan"), 1, qq|$class->config( trap_nan => 1 );|);
# can reset?
$class->config( trap_nan => 0 );
is($class->config("trap_nan"), 0, qq|$class->config( trap_nan => 0 );|);
# can set via hash ref?
$class->config( { trap_nan => 1 } );
is($class->config("trap_nan"), 1, qq|$class->config( { trap_nan => 1 } );|);
# 0/0 => NaN
$x = $class->new("0");
eval { $x->bdiv(0); };
like($@, qr/^Tried to /, qq|\$x = $class->new("0"); \$x->bdiv(0);|);
# new() didn't modify $x
is($x, 0, qq|\$x = $class->new("0"); \$x->bdiv(0);|);
# also test that new() still works normally
eval { $x = $class->new('42'); $x->bnan(); };
like($@, qr/^Tried to /, 'died');
is($x, 42, '$x after new() never modified');
# can reset?
$class->config( trap_nan => 0 );
is($class->config("trap_nan"), 0, qq|$class->config( trap_nan => 0 );|);
###########################################################################
# Trap inf.
###########################################################################
# can set?
$class->config( trap_inf => 1 );
is($class->config("trap_inf"), 1, 'trap_inf enabled');
eval { $x = $class->new('4711'); $x->binf(); };
like($@, qr/^Tried to /, 'died');
is($x, 4711, '$x after new() never modified');
eval { $x = $class->new('inf'); };
like($@, qr/^Tried to /, 'died');
is($x, 4711, '$x after new() never modified');
eval { $x = $class->new('-inf'); };
like($@, qr/^Tried to /, 'died');
is($x, 4711, '$x after new() never modified');
# +$x/0 => +inf
eval { $x = $class->new('4711'); $x->bdiv(0); };
like($@, qr/^Tried to /, 'died');
is($x, 4711, '$x after new() never modified');
# -$x/0 => -inf
eval { $x = $class->new('-0815'); $x->bdiv(0); };
like($@, qr/^Tried to /, 'died');
is($x, '-815', '$x after new not modified');
$class->config( trap_nan => 1 );
# 0/0 => NaN
eval { $x = $class->new('0'); $x->bdiv(0); };
like($@, qr/^Tried to /, 'died');
is($x, '0', '$x after new not modified');
}
##############################################################################
# Math::BigInt
$x = Math::BigInt->new(2);
eval { $x = $mbi->new('0.1'); };
is($x, 2, 'never modified since it dies');
eval { $x = $mbi->new('0a.1'); };
is($x, 2, 'never modified since it dies');
##############################################################################
# Math::BigFloat
$x = Math::BigFloat->new(2);
eval { $x = $mbf->new('0.1a'); };
is($x, 2, 'never modified since it dies');
##############################################################################
# BigRat
Math::BigRat->config(trap_nan => 1,
trap_inf => 1);
for my $trap (qw/ 0.1a +inf inf -inf /) {
my $x = Math::BigRat->new('7/4');
note(""); # this is just for some space in the output
# In each of the cases below, $x is not modified, because the code dies.
eval { $x = $mbr->new("$trap"); };
is($x, "7/4", qq|\$x = $mbr->new("$trap");|);
eval { $x = $mbr->new("$trap"); };
is($x, "7/4", qq|\$x = $mbr->new("$trap");|);
eval { $x = $mbr->new("$trap/7"); };
is($x, "7/4", qq|\$x = $mbr->new("$trap/7");|);
}
# all tests done
|