blob: 2df72798fa7a0c3ae42b60267c3f16a15af156cf [file]
import assert from 'node:assert/strict';
import { describe, test } from 'node:test';
import {
assertFinitePositive,
assertNonNegativeInt,
assertPositiveInt,
assertRatio,
} from '../numeric-guards.js';
describe('assertPositiveInt', () => {
test('returns the value for an integer >= 1', () => {
assert.equal(assertPositiveInt('N', 1), 1);
assert.equal(assertPositiveInt('N', 42), 42);
});
test('throws on 0, negative, fractional, or NaN', () => {
assert.throws(() => assertPositiveInt('N', 0), /N must be a positive integer/);
assert.throws(() => assertPositiveInt('N', -1), /N must be a positive integer/);
assert.throws(() => assertPositiveInt('N', 1.5), /N must be a positive integer/);
assert.throws(() => assertPositiveInt('N', NaN), /N must be a positive integer/);
});
});
describe('assertNonNegativeInt', () => {
test('returns the value for an integer >= 0', () => {
assert.equal(assertNonNegativeInt('N', 0), 0);
assert.equal(assertNonNegativeInt('N', 5), 5);
});
test('throws on negative, fractional, or NaN', () => {
assert.throws(() => assertNonNegativeInt('N', -1), /N must be a non-negative integer/);
assert.throws(() => assertNonNegativeInt('N', 2.5), /N must be a non-negative integer/);
assert.throws(() => assertNonNegativeInt('N', NaN), /N must be a non-negative integer/);
});
});
describe('assertFinitePositive', () => {
test('returns the value for a finite positive number', () => {
assert.equal(assertFinitePositive('N', 0.5), 0.5);
assert.equal(assertFinitePositive('N', 30), 30);
});
test('throws on 0, negative, NaN, or non-finite', () => {
assert.throws(() => assertFinitePositive('N', 0), /N must be a finite positive number/);
assert.throws(() => assertFinitePositive('N', -5), /N must be a finite positive number/);
assert.throws(() => assertFinitePositive('N', NaN), /N must be a finite positive number/);
assert.throws(() => assertFinitePositive('N', Infinity), /N must be a finite positive number/);
});
});
describe('assertRatio', () => {
test('returns the value for a number in (0, 1]', () => {
assert.equal(assertRatio('R', 1), 1);
assert.equal(assertRatio('R', 0.25), 0.25);
});
test('throws outside (0, 1], on NaN, or non-finite', () => {
assert.throws(() => assertRatio('R', 0), /R must be a number in \(0, 1\]/);
assert.throws(() => assertRatio('R', 1.5), /R must be a number in \(0, 1\]/);
assert.throws(() => assertRatio('R', NaN), /R must be a number in \(0, 1\]/);
assert.throws(() => assertRatio('R', Infinity), /R must be a number in \(0, 1\]/);
});
});