summaryrefslogtreecommitdiff
path: root/dist/Math-BigInt/t/mbimbf.t
diff options
context:
space:
mode:
Diffstat (limited to 'dist/Math-BigInt/t/mbimbf.t')
-rw-r--r--dist/Math-BigInt/t/mbimbf.t103
1 files changed, 103 insertions, 0 deletions
diff --git a/dist/Math-BigInt/t/mbimbf.t b/dist/Math-BigInt/t/mbimbf.t
new file mode 100644
index 0000000000..5bc8793478
--- /dev/null
+++ b/dist/Math-BigInt/t/mbimbf.t
@@ -0,0 +1,103 @@
+#!/usr/bin/perl -w
+
+# test rounding, accuracy, precicion and fallback, round_mode and mixing
+# of classes
+
+use strict;
+use Test;
+
+BEGIN
+ {
+ $| = 1;
+ # to locate the testing files
+ my $location = $0; $location =~ s/mbimbf.t//i;
+ unshift @INC, '../lib'; # for testing manually
+ if (-d 't')
+ {
+ chdir 't';
+ require File::Spec;
+ unshift @INC, File::Spec->catdir(File::Spec->updir, $location);
+ }
+ else
+ {
+ unshift @INC, $location;
+ }
+ print "# INC = @INC\n";
+
+ plan tests => 684
+ + 26; # own tests
+ }
+
+use Math::BigInt 1.70;
+use Math::BigFloat 1.43;
+
+use vars qw/$mbi $mbf/;
+
+$mbi = 'Math::BigInt';
+$mbf = 'Math::BigFloat';
+
+require 'mbimbf.inc';
+
+# some tests that won't work with subclasses, since the things are only
+# garantied in the Math::BigInt/BigFloat (unless subclass chooses to support
+# this)
+
+Math::BigInt->round_mode('even'); # reset for tests
+Math::BigFloat->round_mode('even'); # reset for tests
+
+ok ($Math::BigInt::rnd_mode,'even');
+ok ($Math::BigFloat::rnd_mode,'even');
+
+my $x = eval '$mbi->round_mode("huhmbi");';
+print "# Got '$@'\n" unless
+ ok ($@ =~ /^Unknown round mode 'huhmbi' at/);
+
+$x = eval '$mbf->round_mode("huhmbf");';
+print "# Got '$@'\n" unless
+ ok ($@ =~ /^Unknown round mode 'huhmbf' at/);
+
+# old way (now with test for validity)
+$x = eval '$Math::BigInt::rnd_mode = "huhmbi";';
+print "# Got '$@'\n" unless
+ ok ($@ =~ /^Unknown round mode 'huhmbi' at/);
+$x = eval '$Math::BigFloat::rnd_mode = "huhmbf";';
+print "# Got '$@'\n" unless
+ ok ($@ =~ /^Unknown round mode 'huhmbf' at/);
+# see if accessor also changes old variable
+$mbi->round_mode('odd'); ok ($Math::BigInt::rnd_mode,'odd');
+$mbf->round_mode('odd'); ok ($Math::BigInt::rnd_mode,'odd');
+
+foreach my $class (qw/Math::BigInt Math::BigFloat/)
+ {
+ ok ($class->accuracy(5),5); # set A
+ ok_undef ($class->precision()); # and now P must be cleared
+ ok ($class->precision(5),5); # set P
+ ok_undef ($class->accuracy()); # and now A must be cleared
+ }
+
+foreach my $class (qw/Math::BigInt Math::BigFloat/)
+ {
+ $class->accuracy(42);
+ my $x = $class->new(123); # $x gets A of 42, too!
+ ok ($x->accuracy(),42); # really?
+ ok ($x->accuracy(undef),42); # $x has no A, but the
+ # global is still in effect for $x
+ # so the return value of that operation should
+ # be 42, not undef
+ ok ($x->accuracy(),42); # so $x should still have A = 42
+ $class->accuracy(undef); # reset for further tests
+ $class->precision(undef);
+ }
+# bug with flog(Math::BigFloat,Math::BigInt)
+$x = Math::BigFloat->new(100);
+$x = $x->blog(Math::BigInt->new(10));
+
+ok ($x,2);
+
+# bug until v1.88 for sqrt() with enough digits
+for my $i (80,88,100)
+ {
+ $x = Math::BigFloat->new("1." . ("0" x $i) . "1");
+ $x = $x->bsqrt;
+ ok ($x, 1);
+ }