#!perl
# test the helper math routines in Math::BigFloat
use strict;
use warnings;
use Test::More tests => 26;
use Math::BigFloat lib => 'Calc';
#############################################################################
# add
{
my $a = Math::BigInt::Calc->_new("123");
my $b = Math::BigInt::Calc->_new("321");
test_add(123, 321, '+', '+');
test_add(123, 321, '+', '-');
test_add(123, 321, '-', '+');
test_add(321, 123, '-', '+');
test_add(321, 123, '+', '-');
test_add(10, 1, '+', '-');
test_add(10, 1, '-', '+');
test_add( 1, 10, '-', '+');
SKIP: {
skip q|$x -> _zero() does not (yet?) modify the first argument|, 2;
test_add(123, 123, '-', '+');
test_add(123, 123, '+', '-');
}
test_add(123, 123, '+', '+');
test_add(123, 123, '-', '-');
test_add(0, 0, '-', '+');
test_add(0, 0, '+', '-');
test_add(0, 0, '+', '+');
test_add(0, 0, '-', '-'); # gives "-0"! TODO: fix this!
}
#############################################################################
# sub
{
my $a = Math::BigInt::Calc->_new("123");
my $b = Math::BigInt::Calc->_new("321");
test_sub(123, 321, '+', '-');
test_sub(123, 321, '-', '+');
test_sub(123, 123, '-', '+');
test_sub(123, 123, '+', '-');
SKIP: {
skip q|$x -> _zero() does not (yet?) modify the first argument|, 2;
test_sub(123, 123, '+', '+');
test_sub(123, 123, '-', '-');
}
test_sub(0, 0, '-', '+'); # gives "-0"! TODO: fix this!
test_sub(0, 0, '+', '-');
test_sub(0, 0, '+', '+');
test_sub(0, 0, '-', '-');
}
###############################################################################
sub test_add {
my ($a, $b, $as, $bs) = @_;
my $aa = Math::BigInt::Calc -> _new($a);
my $bb = Math::BigInt::Calc -> _new($b);
my ($x, $xs) = Math::BigFloat::_e_add($aa, $bb, "$as", "$bs");
my $got = $xs . Math::BigInt::Calc->_str($x);
my $expected = sprintf("%+d", "$as$a" + "$bs$b");
subtest qq|Math::BigFloat::_e_add($a, $b, "$as", "$bs");|
=> sub {
plan tests => 2;
is($got, $expected, 'output has the correct value');
is(Math::BigInt::Calc->_str($x),
Math::BigInt::Calc->_str($aa),
'first operand to _e_add() is modified'
);
};
}
sub test_sub {
my ($a, $b, $as, $bs) = @_;
my $aa = Math::BigInt::Calc -> _new($a);
my $bb = Math::BigInt::Calc -> _new($b);
my ($x, $xs) = Math::BigFloat::_e_sub($aa, $bb, "$as", "$bs");
my $got = $xs . Math::BigInt::Calc->_str($x);
my $expected = sprintf("%+d", "$as$a" - "$bs$b");
subtest qq|Math::BigFloat::_e_sub($a, $b, "$as", "$bs");|
=> sub {
plan tests => 2;
is($got, $expected, 'output has the correct value');
is(Math::BigInt::Calc->_str($x),
Math::BigInt::Calc->_str($aa),
'first operand to _e_sub() is modified'
);
};
}