Acme-ExtUtils-XSOne-Test-Calculator
view release on metacpan or search on metacpan
t/01-calculator.t view on Meta::CPAN
use_ok('Acme::ExtUtils::XSOne::Test::Calculator');
# =============================================================================
# Test constants
# =============================================================================
subtest 'Constants' => sub {
plan tests => 3;
my $pi = Acme::ExtUtils::XSOne::Test::Calculator::pi();
ok(abs($pi - 3.14159265358979) < 0.0001, 'pi is approximately correct');
my $e = Acme::ExtUtils::XSOne::Test::Calculator::e();
ok(abs($e - 2.71828182845905) < 0.0001, 'e is approximately correct');
is(Acme::ExtUtils::XSOne::Test::Calculator::version(), '0.01', 'version returns correct value');
};
# =============================================================================
# Test Basic operations
# =============================================================================
subtest 'Basic arithmetic' => sub {
plan tests => 9;
# Clear any previous state
Acme::ExtUtils::XSOne::Test::Calculator::Memory::clear();
is(Acme::ExtUtils::XSOne::Test::Calculator::Basic::add(2, 3), 5, 'add(2, 3) = 5');
is(Acme::ExtUtils::XSOne::Test::Calculator::Basic::add(-5, 3), -2, 'add(-5, 3) = -2');
is(Acme::ExtUtils::XSOne::Test::Calculator::Basic::subtract(10, 4), 6, 'subtract(10, 4) = 6');
is(Acme::ExtUtils::XSOne::Test::Calculator::Basic::subtract(3, 7), -4, 'subtract(3, 7) = -4');
is(Acme::ExtUtils::XSOne::Test::Calculator::Basic::multiply(3, 4), 12, 'multiply(3, 4) = 12');
is(Acme::ExtUtils::XSOne::Test::Calculator::Basic::multiply(-2, 5), -10, 'multiply(-2, 5) = -10');
is(Acme::ExtUtils::XSOne::Test::Calculator::Basic::divide(15, 3), 5, 'divide(15, 3) = 5');
is(Acme::ExtUtils::XSOne::Test::Calculator::Basic::divide(7, 2), 3.5, 'divide(7, 2) = 3.5');
is(Acme::ExtUtils::XSOne::Test::Calculator::Basic::modulo(17, 5), 2, 'modulo(17, 5) = 2');
};
subtest 'Basic edge cases' => sub {
plan tests => 12;
is(Acme::ExtUtils::XSOne::Test::Calculator::Basic::negate(5), -5, 'negate(5) = -5');
is(Acme::ExtUtils::XSOne::Test::Calculator::Basic::negate(-3), 3, 'negate(-3) = 3');
is(Acme::ExtUtils::XSOne::Test::Calculator::Basic::absolute(-7), 7, 'absolute(-7) = 7');
is(Acme::ExtUtils::XSOne::Test::Calculator::Basic::absolute(4), 4, 'absolute(4) = 4');
# Test C helper functions (defined in basic.xs preamble)
is(Acme::ExtUtils::XSOne::Test::Calculator::Basic::safe_divide(10, 2), 5, 'safe_divide(10, 2) = 5');
is(Acme::ExtUtils::XSOne::Test::Calculator::Basic::safe_divide(10, 0), 0, 'safe_divide(10, 0) = 0 (no croak)');
is(Acme::ExtUtils::XSOne::Test::Calculator::Basic::clamp(5, 0, 10), 5, 'clamp(5, 0, 10) = 5');
is(Acme::ExtUtils::XSOne::Test::Calculator::Basic::clamp(15, 0, 10), 10, 'clamp(15, 0, 10) = 10');
is(Acme::ExtUtils::XSOne::Test::Calculator::Basic::clamp(-5, 0, 10), 0, 'clamp(-5, 0, 10) = 0');
is(Acme::ExtUtils::XSOne::Test::Calculator::Basic::percent(200, 15), 30, 'percent(200, 15) = 30');
is(Acme::ExtUtils::XSOne::Test::Calculator::Basic::percent(50, 50), 25, 'percent(50, 50) = 25');
is(Acme::ExtUtils::XSOne::Test::Calculator::Basic::percent(100, 100), 100, 'percent(100, 100) = 100');
};
subtest 'Division by zero' => sub {
plan tests => 2;
eval { Acme::ExtUtils::XSOne::Test::Calculator::Basic::divide(5, 0) };
like($@, qr/Division by zero/, 'divide by zero croaks');
eval { Acme::ExtUtils::XSOne::Test::Calculator::Basic::modulo(5, 0) };
like($@, qr/Modulo by zero/, 'modulo by zero croaks');
};
# =============================================================================
# Test Scientific operations
# =============================================================================
subtest 'Scientific functions' => sub {
plan tests => 14;
is(Acme::ExtUtils::XSOne::Test::Calculator::Scientific::power(2, 10), 1024, 'power(2, 10) = 1024');
is(Acme::ExtUtils::XSOne::Test::Calculator::Scientific::power(5, 0), 1, 'power(5, 0) = 1');
is(Acme::ExtUtils::XSOne::Test::Calculator::Scientific::sqrt_val(16), 4, 'sqrt(16) = 4');
is(Acme::ExtUtils::XSOne::Test::Calculator::Scientific::sqrt_val(2), sqrt(2), 'sqrt(2) matches perl sqrt');
is(Acme::ExtUtils::XSOne::Test::Calculator::Scientific::cbrt_val(27), 3, 'cbrt(27) = 3');
is(Acme::ExtUtils::XSOne::Test::Calculator::Scientific::cbrt_val(-8), -2, 'cbrt(-8) = -2');
ok(abs(Acme::ExtUtils::XSOne::Test::Calculator::Scientific::exp_val(1) - exp(1)) < 0.0001, 'exp(1) = e');
is(Acme::ExtUtils::XSOne::Test::Calculator::Scientific::factorial(5), 120, 'factorial(5) = 120');
# Test C helper functions (defined in scientific.xs preamble)
is(Acme::ExtUtils::XSOne::Test::Calculator::Scientific::ipow(2, 10), 1024, 'ipow(2, 10) = 1024');
is(Acme::ExtUtils::XSOne::Test::Calculator::Scientific::ipow(3, -2), 1/9, 'ipow(3, -2) = 1/9');
is(Acme::ExtUtils::XSOne::Test::Calculator::Scientific::safe_sqrt(16), 4, 'safe_sqrt(16) = 4');
is(Acme::ExtUtils::XSOne::Test::Calculator::Scientific::safe_sqrt(-1), 0, 'safe_sqrt(-1) = 0 (no croak)');
is(Acme::ExtUtils::XSOne::Test::Calculator::Scientific::combination(5, 2), 10, 'combination(5, 2) = 10');
is(Acme::ExtUtils::XSOne::Test::Calculator::Scientific::permutation(5, 2), 20, 'permutation(5, 2) = 20');
};
subtest 'Logarithms' => sub {
plan tests => 6;
ok(abs(Acme::ExtUtils::XSOne::Test::Calculator::Scientific::log_natural(exp(1)) - 1) < 0.0001, 'ln(e) = 1');
ok(abs(Acme::ExtUtils::XSOne::Test::Calculator::Scientific::log10_val(100) - 2) < 0.0001, 'log10(100) = 2');
ok(abs(Acme::ExtUtils::XSOne::Test::Calculator::Scientific::log_base(8, 2) - 3) < 0.0001, 'log2(8) = 3');
is(Acme::ExtUtils::XSOne::Test::Calculator::Scientific::nth_root(27, 3), 3, 'nth_root(27, 3) = 3');
# Test C helper function (defined in scientific.xs preamble)
ok(abs(Acme::ExtUtils::XSOne::Test::Calculator::Scientific::safe_log(exp(1)) - 1) < 0.0001, 'safe_log(e) = 1');
is(Acme::ExtUtils::XSOne::Test::Calculator::Scientific::safe_log(-1), 0, 'safe_log(-1) = 0 (no croak)');
};
subtest 'Scientific error handling' => sub {
plan tests => 3;
( run in 1.643 second using v1.01-cache-2.11-cpan-5a3173703d6 )