Acme-ExtUtils-XSOne-Test-Calculator
view release on metacpan or search on metacpan
t/02-import.t view on Meta::CPAN
is(clamp(-5, 0, 10), 0, 'clamp(-5, 0, 10) = 0');
is(percent(200, 15), 30, 'percent(200, 15) = 30');
is(percent(50, 50), 25, 'percent(50, 50) = 25');
is(percent(100, 100), 100, 'percent(100, 100) = 100');
};
subtest 'Division by zero' => sub {
plan tests => 2;
eval { divide(5, 0) };
like($@, qr/Division by zero/, 'divide by zero croaks');
eval { modulo(5, 0) };
like($@, qr/Modulo by zero/, 'modulo by zero croaks');
};
# =============================================================================
# Test Scientific operations (using imported functions)
# =============================================================================
subtest 'Scientific functions' => sub {
plan tests => 14;
is(power(2, 10), 1024, 'power(2, 10) = 1024');
is(power(5, 0), 1, 'power(5, 0) = 1');
is(sqrt_val(16), 4, 'sqrt(16) = 4');
is(sqrt_val(2), sqrt(2), 'sqrt(2) matches perl sqrt');
is(cbrt_val(27), 3, 'cbrt(27) = 3');
is(cbrt_val(-8), -2, 'cbrt(-8) = -2');
ok(abs(exp_val(1) - exp(1)) < 0.0001, 'exp(1) = e');
is(factorial(5), 120, 'factorial(5) = 120');
is(ipow(2, 10), 1024, 'ipow(2, 10) = 1024');
is(ipow(3, -2), 1/9, 'ipow(3, -2) = 1/9');
is(safe_sqrt(16), 4, 'safe_sqrt(16) = 4');
is(safe_sqrt(-1), 0, 'safe_sqrt(-1) = 0 (no croak)');
is(combination(5, 2), 10, 'combination(5, 2) = 10');
is(permutation(5, 2), 20, 'permutation(5, 2) = 20');
};
subtest 'Logarithms' => sub {
plan tests => 6;
ok(abs(log_natural(exp(1)) - 1) < 0.0001, 'ln(e) = 1');
ok(abs(log10_val(100) - 2) < 0.0001, 'log10(100) = 2');
ok(abs(log_base(8, 2) - 3) < 0.0001, 'log2(8) = 3');
is(nth_root(27, 3), 3, 'nth_root(27, 3) = 3');
ok(abs(safe_log(exp(1)) - 1) < 0.0001, 'safe_log(e) = 1');
is(safe_log(-1), 0, 'safe_log(-1) = 0 (no croak)');
};
subtest 'Scientific error handling' => sub {
plan tests => 3;
eval { sqrt_val(-1) };
like($@, qr/negative/, 'sqrt of negative croaks');
eval { log_natural(-1) };
like($@, qr/non-positive/, 'log of negative croaks');
eval { factorial(-1) };
like($@, qr/negative/, 'factorial of negative croaks');
};
# =============================================================================
# Test Trig operations (using imported functions)
# =============================================================================
subtest 'Trigonometric functions' => sub {
plan tests => 14;
my $pi = Acme::ExtUtils::XSOne::Test::Calculator::pi();
ok(abs(sin_val(0)) < 0.0001, 'sin(0) = 0');
ok(abs(sin_val($pi/2) - 1) < 0.0001, 'sin(pi/2) = 1');
ok(abs(cos_val(0) - 1) < 0.0001, 'cos(0) = 1');
ok(abs(cos_val($pi) - (-1)) < 0.0001, 'cos(pi) = -1');
ok(abs(tan_val(0)) < 0.0001, 'tan(0) = 0');
is(hypot_val(3, 4), 5, 'hypot(3, 4) = 5');
ok(abs(deg_to_rad(180) - $pi) < 0.0001, 'deg_to_rad(180) = pi');
ok(abs(normalize_angle(3 * $pi) - $pi) < 0.0001, 'normalize_angle(3*pi) = pi');
ok(abs(normalize_angle(-3 * $pi) - (-$pi)) < 0.0001, 'normalize_angle(-3*pi) = -pi');
ok(abs(sec_val(0) - 1) < 0.0001, 'sec(0) = 1');
ok(abs(csc_val($pi/2) - 1) < 0.0001, 'csc(pi/2) = 1');
ok(abs(cot_val($pi/4) - 1) < 0.0001, 'cot(pi/4) = 1');
is(is_valid_asin_arg(0.5), 1, 'is_valid_asin_arg(0.5) = 1');
is(is_valid_asin_arg(2.0), 0, 'is_valid_asin_arg(2.0) = 0');
};
subtest 'Inverse trig' => sub {
plan tests => 3;
my $pi = Acme::ExtUtils::XSOne::Test::Calculator::pi();
ok(abs(asin_val(1) - $pi/2) < 0.0001, 'asin(1) = pi/2');
ok(abs(acos_val(0) - $pi/2) < 0.0001, 'acos(0) = pi/2');
ok(abs(atan_val(1) - $pi/4) < 0.0001, 'atan(1) = pi/4');
};
# =============================================================================
# Test Memory (using imported functions)
# =============================================================================
subtest 'Memory operations' => sub {
plan tests => 13;
( run in 1.054 second using v1.01-cache-2.11-cpan-c966e8aa7e8 )