The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
#!/usr/bin/perl -w

use strict;
use Test;

BEGIN 
  {
  $| = 1;
  chdir 't' if -d 't';
  unshift @INC, '../lib'; # for running manually
  plan tests => 99;
  }

use Math::BigInt::Lite;

my $c = 'Math::BigInt::Lite';
my $mbi = 'Math::BigInt';

ok (Math::BigInt::Lite->config()->{version},$Math::BigInt::VERSION);
ok (Math::BigInt::Lite->config()->{version_lite},$Math::BigInt::Lite::VERSION);

my ($x,$y,$z);

##############################################################################
$x = $c->new(1234); 	ok (ref($x),$c);	ok ($x,1234);
ok ($x->isa('Math::BigInt::Lite'));
ok (!$x->isa('Math::BigRat'));
ok (!$x->isa('Math::BigFloat'));

$x = $c->new('1e3'); 	ok (ref($x),$c);	ok ($x,'1000');
$x = $c->new('1000'); 	ok (ref($x),$c);	ok ($x,'1000');
$x = $c->new('1234'); 	ok (ref($x),$c);	ok ($x,1234);
$x = $c->new('1e12'); 	ok (ref($x),$mbi);
$x = $c->new('1.'); 	ok (ref($x),$c);	ok ($x,1);
$x = $c->new('1.0'); 	ok (ref($x),$c);	ok ($x,1);
$x = $c->new('1.00'); 	ok (ref($x),$c);	ok ($x,1);
$x = $c->new('1.02'); 	ok (ref($x),$mbi);	ok ($x,'NaN');
$x = $c->new('-0'); 	ok (ref($x),$c);	ok ($x,'0');

$x = $c->new('1'); 	ok (ref($x),$c); $y = $x->copy(); ok (ref($y),$c);
ok ($x,$y);

$x = $c->new('6'); 	$y = $c->new('2');
ok (ref($x),$c); ok (ref($y),$c);

$z = $x; $z += $y; 	ok (ref($z),$c);	ok ($z,8);
$z = $x + $y;	 	ok (ref($z),$c);	ok ($z,8);
$z = $x - $y;	 	ok (ref($z),$c);	ok ($z,4);
$z = $y - $x;	 	ok (ref($z),$c);	ok ($z,-4);
$z = $x * $y;	 	ok (ref($z),$c);	ok ($z,12);
$z = $x / $y;	 	ok (ref($z),$c);	ok ($z,3);
$z = $x % $y;	 	ok (ref($z),$c);	ok ($z,0);

$z = $y / $x;	 	ok (ref($z),$c);	ok ($z,0);
$z = $y % $x;	 	ok (ref($z),$c);	ok ($z,2);

$z = $x->as_number(); 	ok (ref($z),$mbi);	ok ($z,6);

###############################################################################
# bone/binf etc

$z = $c->bone();	ok (ref($z),$c);	ok ($z,1);
$z = $c->bone('-');	ok (ref($z),$c);	ok ($z,-1);
$z = $c->bone('+');	ok (ref($z),$c);	ok ($z,1);
$z = $c->bzero();	ok (ref($z),$c);	ok ($z,0);
$z = $c->binf();	ok (ref($z),$mbi);	ok ($z,'inf');
$z = $c->binf('+');	ok (ref($z),$mbi);	ok ($z,'inf');
$z = $c->binf('+inf');	ok (ref($z),$mbi);	ok ($z,'inf');
$z = $c->binf('-');	ok (ref($z),$mbi);	ok ($z,'-inf');
$z = $c->binf('-inf');	ok (ref($z),$mbi);	ok ($z,'-inf');
$z = $c->bnan();	ok (ref($z),$mbi);	ok ($z,'NaN');

$x = $c->new(3); 
$z = $x->copy()->bone();	ok (ref($z),$c);	ok ($z,1);
$z = $x->copy()->bone('-');	ok (ref($z),$c);	ok ($z,-1);
$z = $x->copy()->bone('+');	ok (ref($z),$c);	ok ($z,1);
$z = $x->copy()->bzero();	ok (ref($z),$c);	ok ($z,0);
$z = $x->copy()->binf();	ok (ref($z),$mbi);	ok ($z,'inf');
$z = $x->copy()->binf('+');	ok (ref($z),$mbi);	ok ($z,'inf');
$z = $x->copy()->binf('+inf');	ok (ref($z),$mbi);	ok ($z,'inf');
$z = $x->copy()->binf('-');	ok (ref($z),$mbi);	ok ($z,'-inf');
$z = $x->copy()->binf('-inf');	ok (ref($z),$mbi);	ok ($z,'-inf');
$z = $x->copy()->bnan();	ok (ref($z),$mbi);	ok ($z,'NaN');

###############################################################################
# non-objects

$x = Math::BigInt::Lite::badd('1','2'); ok ($x,3);
$x = Math::BigInt::Lite::badd('1',2); ok ($x,3);
$x = Math::BigInt::Lite::badd(1,'2'); ok ($x,3);
$x = Math::BigInt::Lite::badd(1,2); ok ($x,3);

$x = Math::BigInt::Lite->new(123456);
ok ($x->copy()->round(3),123000);
ok ($x->copy()->bround(3),123000);
ok ($x->copy()->bfround(3),123000);

###############################################################################
# check faking of HASH-like acccess

$x = Math::BigInt::Lite->new(123); ok ($x->{sign},'+');
$x = Math::BigInt::Lite->new(0); ok ($x->{sign},'+');
$x = Math::BigInt::Lite->new(-123); ok ($x->{sign},'-');


# done

1;