This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Move Math::BigRat from ext/ to cpan/
[perl5.git] / cpan / Math-BigRat / t / trap.t
diff --git a/cpan/Math-BigRat/t/trap.t b/cpan/Math-BigRat/t/trap.t
new file mode 100644 (file)
index 0000000..ccd9ae8
--- /dev/null
@@ -0,0 +1,86 @@
+#!/usr/bin/perl -w
+
+# test that config ( trap_nan => 1, trap_inf => 1) really works/dies
+
+use strict;
+use Test;
+
+BEGIN
+  {
+  $| = 1;
+  chdir 't' if -d 't';
+  unshift @INC, '../lib'; # for running manually
+  plan tests => 29;
+  } 
+
+use Math::BigRat;
+
+my $mbi = 'Math::BigRat';
+my ($cfg,$x);
+
+foreach my $class ($mbi)
+  {
+  # can do and defaults are okay?
+  ok ($class->can('config'));
+  ok ($class->config()->{trap_nan}, 0);
+  ok ($class->config()->{trap_inf}, 0);
+
+  # can set?
+  $cfg = $class->config( trap_nan => 1 ); ok ($cfg->{trap_nan},1);
+  
+  # can set via hash ref?
+  $cfg = $class->config( { trap_nan => 1 } ); ok ($cfg->{trap_nan},1);
+
+  # also test that new() still works normally
+  eval ("\$x = \$class->new('42'); \$x->bnan();");
+  ok ($@ =~/^Tried to set/, 1);
+  ok ($x,42);                          # after new() never modified
+
+  # can reset?
+  $cfg = $class->config( trap_nan => 0 ); ok ($cfg->{trap_nan},0);
+  
+  # can set?
+  $cfg = $class->config( trap_inf => 1 ); ok ($cfg->{trap_inf},1);
+  eval ("\$x = \$class->new('4711'); \$x->binf();");
+  ok ($@ =~/^Tried to set/, 1);
+  ok ($x,4711);                                # after new() never modified
+  
+  # +$x/0 => +inf
+  eval ("\$x = \$class->new('4711'); \$x->bdiv(0);");
+  ok ($@ =~/^Tried to set/, 1);
+  ok ($x,4711);                                # after new() never modified
+  # -$x/0 => -inf
+  eval ("\$x = \$class->new('-0815'); \$x->bdiv(0);");
+  ok ($@ =~/^Tried to set/, 1);
+  ok ($x,-815);                                # after new() never modified
+  
+  $cfg = $class->config( trap_nan => 1 );
+  # 0/0 => NaN
+  eval ("\$x = \$class->new('0'); \$x->bdiv(0);");
+  ok ($@ =~/^Tried to set/, 1);
+  ok ($x,0);                           # after new() never modified
+  }
+
+##############################################################################
+# BigRat
+
+$cfg = Math::BigRat->config( trap_nan => 1 );
+
+for my $trap (qw/0.1a +inf inf -inf/)
+  {
+  my $x = Math::BigRat->new('7/4');
+
+  eval ("\$x = \$mbi->new('$trap');");
+  print "# Got: $x\n" unless
+   ok ($x,'7/4');                      # never modified since it dies
+  eval ("\$x = \$mbi->new('$trap');");
+  print "# Got: $x\n" unless
+   ok ($x,'7/4');                      # never modified since it dies
+  eval ("\$x = \$mbi->new('$trap/7');");
+  print "# Got: $x\n" unless
+   ok ($x,'7/4');                      # never modified since it dies
+  }
+
+# all tests done
+