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