#!/usr/bin/perl -w

# Test for memory leaks.

# XXX TODO: This test file doesn't actually seem to work! If you remove
# the sv_2mortal() in the XS file, it still happily passes all tests...

use Test::More;
use strict;

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

#############################################################################
package Math::BigInt::FastCalc::LeakCheck;
use base qw(Math::BigInt::FastCalc);

my $destroyed = 0;
sub DESTROY { $destroyed++; }

#############################################################################
package main;

for my $method (qw(_zero _one _two _ten))
  {
  $destroyed = 0;
    {
    my $num = Math::BigInt::FastCalc::LeakCheck->$method();
    bless $num, "Math::BigInt::FastCalc::LeakCheck";
    }
  is ($destroyed, 1, "$method does not leak memory");
  }

my $num = Math::BigInt::FastCalc->_zero();
for my $method (qw(_is_zero _is_one _is_two _is_ten _num))
  {
  $destroyed = 0;
    {
    my $rc = Math::BigInt::FastCalc->$method($num);
    bless \$rc, "Math::BigInt::FastCalc::LeakCheck";
    }
  is ($destroyed, 1, "$method does not leak memory");
  }

my $num_10 = Math::BigInt::FastCalc->_ten();
my $num_2 = Math::BigInt::FastCalc->_two();

my $num_long   = Math::BigInt::FastCalc->_new("1234567890");
my $num_long_2 = Math::BigInt::FastCalc->_new("12345678900987654321");

# to hit all possible code branches
_test_acmp($num, $num);
_test_acmp($num_10, $num_10);
_test_acmp($num, $num_10);
_test_acmp($num_10, $num);
_test_acmp($num, $num_2);
_test_acmp($num_2, $num);
_test_acmp($num_long, $num);
_test_acmp($num, $num_long);
_test_acmp($num_long, $num_long);
_test_acmp($num_long, $num_long_2);
_test_acmp($num_long_2, $num_long);

sub _test_acmp
  {
  my ($n1,$n2) = @_;

  $destroyed = 0;
    {
    my $rc = Math::BigInt::FastCalc->_acmp($n1,$n2);
    bless \$rc, "Math::BigInt::FastCalc::LeakCheck";
    }
  my $n_1 = Math::BigInt::FastCalc->_str($n1);
  my $n_2 = Math::BigInt::FastCalc->_str($n2);
  is ($destroyed, 1, "_acmp($n_1,$n_2) does not leak memory");
  }

