The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use strict;
use warnings;
use lib 't';

use Test::More tests => 50;

# testing of Math::BigInt:Scalar (used by the testsuite),
# primarily for interface/api and not for the math functionality

use Math::BigInt::Scalar;

my $class = 'Math::BigInt::Scalar'; # pass classname to sub's

# _new and _str

my $x = $class->_new("123");
my $y = $class->_new("321");
is(ref($x), 'SCALAR', 'ref($x)');
is($class->_str($x), 123, "$class->_str(\$x)");
is($class->_str($y), 321, "$class->_str(\$y)");

# _add, _sub, _mul, _div

is($class->_str($class->_add($x, $y)), 444,
   "$class->_str($class->_add(\$x, \$y)");
is($class->_str($class->_sub($x, $y)), 123,
   "$class->_str($class->_sub(\$x, \$y)");
is($class->_str($class->_mul($x, $y)), 39483,
   "$class->_str($class->_mul(\$x, \$y))");
is($class->_str($class->_div($x, $y)), 123,
   "$class->_str($class->_div(\$x, \$y)");

$class->_mul($x, $y);
is($class->_str($x), 39483, "$class->_str(\$x)");
is($class->_str($y),   321, "$class->_str(\$y)");

my $z = $class->_new("2");
is($class->_str($class->_add($x, $z)), 39485,
   "$class->_str($class->_add(\$x, \$z)");

my ($re, $rr) = $class->_div($x, $y);
is($class->_str($re), 123, "$class->_str(\$re)");
is($class->_str($rr),   2, "$class->_str(\$rr)");

# is_zero, _is_one, _one, _zero

is($class->_is_zero($x), 0, "$class->_is_zero($x)");
is($class->_is_one($x),  0, "$class->_is_one($x)");

is($class->_is_one($class->_one()), 1,
   "$class->_is_one($class->_one())");
is($class->_is_one($class->_zero()), 0,
   "$class->_is_one($class->_zero())");
is($class->_is_zero($class->_zero()), 1,
   "$class->_is_zero($class->_zero())");
is($class->_is_zero($class->_one()), 0,
   "$class->_is_zero($class->_one())");

# is_odd, is_even

is($class->_is_odd($class->_one()), 1,
   "$class->_is_odd($class->_one())");
is($class->_is_odd($class->_zero()), 0,
   "$class->_is_odd($class->_zero())");
is($class->_is_even($class->_one()), 0,
   "$class->_is_even($class->_one())");
is($class->_is_even($class->_zero()), 1,
   "$class->_is_even($class->_zero())");

# _digit

$x = $class->_new("123456789");
is($class->_digit($x,  0), 9, "$class->_digit(\$x, 0)");
is($class->_digit($x,  1), 8, "$class->_digit(\$x, 1)");
is($class->_digit($x,  2), 7, "$class->_digit(\$x, 2)");
is($class->_digit($x, -1), 1, "$class->_digit(\$x, -1)");
is($class->_digit($x, -2), 2, "$class->_digit(\$x, -2)");
is($class->_digit($x, -3), 3, "$class->_digit(\$x, -3)");

# _copy

$x = $class->_new("12356");
is($class->_str($class->_copy($x)), 12356,
   "$class->_str($class->_copy(\$x))");

# _acmp

$x = $class->_new("123456789");
$y = $class->_new("987654321");
is($class->_acmp($x, $y), -1, "$class->_acmp(\$x, \$y)");
is($class->_acmp($y, $x),  1, "$class->_acmp(\$y, \$x)");
is($class->_acmp($x, $x),  0, "$class->_acmp(\$x, \$x)");
is($class->_acmp($y, $y),  0, "$class->_acmp(\$y, \$y)");

# _div

$x = $class->_new("3333");
$y = $class->_new("1111");
is($class->_str(scalar $class->_div($x, $y)), 3,
   "$class->_str(scalar $class->_div(\$x, \$y))");

$x = $class->_new("33333");
$y = $class->_new("1111");
($x, $y) = $class->_div($x, $y);
is($class->_str($x), 30, "$class->_str(\$x)");
is($class->_str($y),  3, "$class->_str(\$y)");

$x = $class->_new("123");
$y = $class->_new("1111");
($x, $y) = $class->_div($x, $y);
is($class->_str($x),   0, "$class->_str(\$x)");
is($class->_str($y), 123, "$class->_str(\$y)");

# _num

$x = $class->_new("12345");
$x = $class->_num($x);
is(ref($x) || '', '', 'ref($x) || ""');
is($x, 12345, '$x');

# _len

$x = $class->_new("12345");
$x = $class->_len($x);
is(ref($x) || '', '', 'ref($x) || ""');
is($x, 5, '$x');

# _and, _or, _xor

$x = $class->_new("3");
$y = $class->_new("4");
is($class->_str($class->_or($x, $y)), 7,
   "$class->_str($class->_or($x, $y))");

$x = $class->_new("1");
$y = $class->_new("4");
is($class->_str($class->_xor($x, $y)), 5,
   "$class->_str($class->_xor($x, $y))");

$x = $class->_new("7");
$y = $class->_new("3");
is($class->_str($class->_and($x, $y)), 3,
   "$class->_str($class->_and($x, $y))");

# _pow

$x = $class->_new("2");
$y = $class->_new("4");
is($class->_str($class->_pow($x, $y)), 16,
   "$class->_str($class->_pow($x, $y))");

$x = $class->_new("2");
$y = $class->_new("5");
is($class->_str($class->_pow($x, $y)), 32,
   "$class->_str($class->_pow($x, $y))");

$x = $class->_new("3");
$y = $class->_new("3");
is($class->_str($class->_pow($x, $y)), 27,
   "$class->_str($class->_pow($x, $y))");

# _check

$x = $class->_new("123456789");
is($class->_check($x), 0,
   "$class->_check(\$x)");
is($class->_check(123), '123 is not a reference',
   "$class->_check(123)");