#!perl # test that config( trap_nan => 1, trap_inf => 1) really works/dies use strict; use warnings; use Test::More tests => 29; use Math::BigRat; my $mbr = 'Math::BigRat'; my $x; foreach my $class ($mbr) { # can do? can_ok($class, 'config'); ########################################################################### # Default values. ########################################################################### # defaults are okay? is($class->config("trap_nan"), 0, qq|$class->config("trap_nan")|); is($class->config("trap_inf"), 0, qq|$class->config("trap_inf")|); ########################################################################### # Trap NaN. ########################################################################### # can set? $class->config( trap_nan => 1 ); is($class->config("trap_nan"), 1, q|$class->config("trap_nan")|); # can reset? $class->config( trap_nan => 0 ); is($class->config("trap_nan"), 0, qq|$class->config("trap_nan")|); # can set via hash ref? $class->config( { trap_nan => 1 } ); is($class->config("trap_nan"), 1, q|$class->config("trap_nan")|); # also test that new() still works normally eval { $x = $class->new("42"); $x->bnan(); }; like($@, qr/^Tried to set/, qq|\$x = $class->new("42"); \$x->bnan();|); # after new() never modified is($x, 42, qq|\$x = $class->new("42"); \$x->bnan();|); # 0/0 => NaN eval { $x = $class->new("0"); $x->bdiv(0); }; like($@, qr/^Tried to set/, qq|\$x = $class->new("0"); \$x->bdiv(0);|); # after new() never modified is($x, 0, qq|\$x = $class->new("0"); \$x->bdiv(0);|); ########################################################################### # Trap inf. ########################################################################### # can set? $class->config( trap_inf => 1 ); is($class->config("trap_inf"), 1, qq|$class->config("trap_inf")|); eval { $x = $class->new("4711"); $x->binf(); }; like($@, qr/^Tried to set/, qq|\$x = $class->new("4711"); \$x->binf();|); # after new() never modified is($x, 4711, qq|\$x = $class->new("4711"); \$x->binf();|); # +$x/0 => +inf eval { $x = $class->new("4711"); $x->bdiv(0); }; like($@, qr/^Tried to set/, qq|\$x =\$class->new("4711"); \$x->bdiv(0);|); # after new() never modified is($x, 4711, qq|\$x =\$class->new("4711"); \$x->bdiv(0);|); # -$x/0 => -inf eval { $x = $class->new("-0815"); $x->bdiv(0); }; like($@, qr/^Tried to set/, qq|\$x = $class->new("-0815"); \$x->bdiv(0);|); # after new() never modified is($x, -815, qq|\$x = $class->new("-0815"); \$x->bdiv(0);|); } ############################################################################## # 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