|
Packit |
dcde0c |
#!/usr/bin/perl -w
|
|
Packit |
dcde0c |
|
|
Packit |
dcde0c |
# Test for memory leaks.
|
|
Packit |
dcde0c |
|
|
Packit |
dcde0c |
# XXX TODO: This test file doesn't actually seem to work! If you remove
|
|
Packit |
dcde0c |
# the sv_2mortal() in the XS file, it still happily passes all tests...
|
|
Packit |
dcde0c |
|
|
Packit |
dcde0c |
use strict;
|
|
Packit |
dcde0c |
use Test::More tests => 22;
|
|
Packit |
dcde0c |
|
|
Packit |
dcde0c |
use Math::BigInt::FastCalc;
|
|
Packit |
dcde0c |
|
|
Packit |
dcde0c |
#############################################################################
|
|
Packit |
dcde0c |
package Math::BigInt::FastCalc::LeakCheck;
|
|
Packit |
dcde0c |
|
|
Packit |
dcde0c |
use Math::BigInt::FastCalc;
|
|
Packit |
dcde0c |
our @ISA = qw< Math::BigInt::FastCalc >;
|
|
Packit |
dcde0c |
|
|
Packit |
dcde0c |
my $destroyed = 0;
|
|
Packit |
dcde0c |
sub DESTROY { $destroyed++; }
|
|
Packit |
dcde0c |
|
|
Packit |
dcde0c |
#############################################################################
|
|
Packit |
dcde0c |
package main;
|
|
Packit |
dcde0c |
|
|
Packit |
dcde0c |
for my $method (qw(_zero _one _two _ten))
|
|
Packit |
dcde0c |
{
|
|
Packit |
dcde0c |
$destroyed = 0;
|
|
Packit |
dcde0c |
{
|
|
Packit |
dcde0c |
my $num = Math::BigInt::FastCalc::LeakCheck->$method();
|
|
Packit |
dcde0c |
bless $num, "Math::BigInt::FastCalc::LeakCheck";
|
|
Packit |
dcde0c |
}
|
|
Packit |
dcde0c |
is ($destroyed, 1, "$method does not leak memory");
|
|
Packit |
dcde0c |
}
|
|
Packit |
dcde0c |
|
|
Packit |
dcde0c |
my $num = Math::BigInt::FastCalc->_zero();
|
|
Packit |
dcde0c |
for my $method (qw(_is_zero _is_one _is_two _is_ten _num))
|
|
Packit |
dcde0c |
{
|
|
Packit |
dcde0c |
$destroyed = 0;
|
|
Packit |
dcde0c |
{
|
|
Packit |
dcde0c |
my $rc = Math::BigInt::FastCalc->$method($num);
|
|
Packit |
dcde0c |
bless \$rc, "Math::BigInt::FastCalc::LeakCheck";
|
|
Packit |
dcde0c |
}
|
|
Packit |
dcde0c |
is ($destroyed, 1, "$method does not leak memory");
|
|
Packit |
dcde0c |
}
|
|
Packit |
dcde0c |
|
|
Packit |
dcde0c |
my $num_10 = Math::BigInt::FastCalc->_ten();
|
|
Packit |
dcde0c |
my $num_2 = Math::BigInt::FastCalc->_two();
|
|
Packit |
dcde0c |
|
|
Packit |
dcde0c |
my $num_long = Math::BigInt::FastCalc->_new("1234567890");
|
|
Packit |
dcde0c |
my $num_long_2 = Math::BigInt::FastCalc->_new("12345678900987654321");
|
|
Packit |
dcde0c |
|
|
Packit |
dcde0c |
is (Math::BigInt::FastCalc->_str($num_long), "1234567890");
|
|
Packit |
dcde0c |
is (Math::BigInt::FastCalc->_str($num_long_2), "12345678900987654321");
|
|
Packit |
dcde0c |
|
|
Packit |
dcde0c |
# to hit all possible code branches
|
|
Packit |
dcde0c |
_test_acmp($num, $num);
|
|
Packit |
dcde0c |
_test_acmp($num_10, $num_10);
|
|
Packit |
dcde0c |
_test_acmp($num, $num_10);
|
|
Packit |
dcde0c |
_test_acmp($num_10, $num);
|
|
Packit |
dcde0c |
_test_acmp($num, $num_2);
|
|
Packit |
dcde0c |
_test_acmp($num_2, $num);
|
|
Packit |
dcde0c |
_test_acmp($num_long, $num);
|
|
Packit |
dcde0c |
_test_acmp($num, $num_long);
|
|
Packit |
dcde0c |
_test_acmp($num_long, $num_long);
|
|
Packit |
dcde0c |
_test_acmp($num_long, $num_long_2);
|
|
Packit |
dcde0c |
_test_acmp($num_long_2, $num_long);
|
|
Packit |
dcde0c |
|
|
Packit |
dcde0c |
sub _test_acmp
|
|
Packit |
dcde0c |
{
|
|
Packit |
dcde0c |
my ($n1,$n2) = @_;
|
|
Packit |
dcde0c |
|
|
Packit |
dcde0c |
$destroyed = 0;
|
|
Packit |
dcde0c |
{
|
|
Packit |
dcde0c |
my $rc = Math::BigInt::FastCalc->_acmp($n1,$n2);
|
|
Packit |
dcde0c |
bless \$rc, "Math::BigInt::FastCalc::LeakCheck";
|
|
Packit |
dcde0c |
}
|
|
Packit |
dcde0c |
my $n_1 = Math::BigInt::FastCalc->_str($n1);
|
|
Packit |
dcde0c |
my $n_2 = Math::BigInt::FastCalc->_str($n2);
|
|
Packit |
dcde0c |
is ($destroyed, 1, "_acmp($n_1,$n_2) does not leak memory");
|
|
Packit |
dcde0c |
}
|