stringzy 4.1.0 → 4.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/auto-assign.yml +26 -0
- package/CODE_OF_CONDUCT.MD +115 -0
- package/README.md +591 -79
- package/dist/analyzing/checkMultiplePatterns.d.ts +2 -2
- package/dist/analyzing/checkMultiplePatterns.js +43 -31
- package/dist/analyzing/index.d.ts +3 -0
- package/dist/analyzing/index.js +6 -2
- package/dist/analyzing/lexicographicalRank.d.ts +26 -0
- package/dist/analyzing/lexicographicalRank.js +66 -0
- package/dist/formatting/binary.d.ts +24 -0
- package/dist/formatting/binary.js +49 -0
- package/dist/formatting/creditCard.d.ts +8 -0
- package/dist/formatting/creditCard.js +28 -0
- package/dist/formatting/decimal.d.ts +21 -0
- package/dist/formatting/decimal.js +73 -0
- package/dist/formatting/duration.d.ts +27 -0
- package/dist/formatting/duration.js +92 -0
- package/dist/formatting/fileSize.d.ts +18 -0
- package/dist/formatting/fileSize.js +39 -0
- package/dist/formatting/hexadecimal.d.ts +14 -0
- package/dist/formatting/hexadecimal.js +38 -0
- package/dist/formatting/index.d.ts +42 -0
- package/dist/formatting/index.js +57 -1
- package/dist/formatting/listToString.d.ts +17 -0
- package/dist/formatting/listToString.js +35 -0
- package/dist/formatting/octal.d.ts +19 -0
- package/dist/formatting/octal.js +31 -0
- package/dist/formatting/ordinal.d.ts +20 -0
- package/dist/formatting/ordinal.js +43 -0
- package/dist/formatting/percentage.d.ts +19 -0
- package/dist/formatting/percentage.js +31 -0
- package/dist/formatting/romanNumerals.d.ts +20 -0
- package/dist/formatting/romanNumerals.js +53 -0
- package/dist/formatting/scientific.d.ts +14 -0
- package/dist/formatting/scientific.js +24 -0
- package/dist/formatting/temperature.d.ts +6 -0
- package/dist/formatting/temperature.js +27 -0
- package/dist/formatting/trim.d.ts +10 -0
- package/dist/formatting/trim.js +20 -0
- package/dist/index.d.ts +17 -0
- package/dist/tests/analyzing/lexicographicalRank.test.d.ts +1 -0
- package/dist/tests/analyzing/lexicographicalRank.test.js +43 -0
- package/dist/tests/formatting/binary.test.d.ts +1 -0
- package/dist/tests/formatting/binary.test.js +53 -0
- package/dist/tests/formatting/creditCard.test.d.ts +1 -0
- package/dist/tests/formatting/creditCard.test.js +31 -0
- package/dist/tests/formatting/decimal.test.d.ts +1 -0
- package/dist/tests/formatting/decimal.test.js +62 -0
- package/dist/tests/formatting/duration.test.d.ts +1 -0
- package/dist/tests/formatting/duration.test.js +61 -0
- package/dist/tests/formatting/fileSize.test.d.ts +1 -0
- package/dist/tests/formatting/fileSize.test.js +39 -0
- package/dist/tests/formatting/hexadecimal.test.d.ts +1 -0
- package/dist/tests/formatting/hexadecimal.test.js +38 -0
- package/dist/tests/formatting/listToString.test.d.ts +1 -0
- package/dist/tests/formatting/listToString.test.js +37 -0
- package/dist/tests/formatting/octal.test.d.ts +1 -0
- package/dist/tests/formatting/octal.test.js +36 -0
- package/dist/tests/formatting/ordinal.test.d.ts +1 -0
- package/dist/tests/formatting/ordinal.test.js +37 -0
- package/dist/tests/formatting/percentage.test.d.ts +1 -0
- package/dist/tests/formatting/percentage.test.js +38 -0
- package/dist/tests/formatting/romanNumerals.test.d.ts +1 -0
- package/dist/tests/formatting/romanNumerals.test.js +35 -0
- package/dist/tests/formatting/scientific.test.d.ts +1 -0
- package/dist/tests/formatting/scientific.test.js +35 -0
- package/dist/tests/formatting/temperature.test.d.ts +1 -0
- package/dist/tests/formatting/temperature.test.js +34 -0
- package/dist/tests/formatting/trim.test.d.ts +1 -0
- package/dist/tests/formatting/trim.test.js +42 -0
- package/dist/tests/transformations/stringPermutations.test.js +70 -0
- package/dist/tests/validations/isIPv6.test.d.ts +1 -0
- package/dist/tests/validations/isIPv6.test.js +65 -0
- package/dist/transformations/index.d.ts +3 -2
- package/dist/transformations/index.js +3 -1
- package/dist/transformations/stringPermutations.d.ts +23 -1
- package/dist/transformations/stringPermutations.js +127 -1
- package/dist/validations/index.d.ts +3 -0
- package/dist/validations/index.js +5 -1
- package/dist/validations/isIPv6.d.ts +24 -0
- package/dist/validations/isIPv6.js +45 -0
- package/package.json +1 -1
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_test_1 = require("node:test");
|
|
7
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
8
|
+
const lexicographicalRank_1 = require("../../analyzing/lexicographicalRank");
|
|
9
|
+
(0, node_test_1.describe)('lexicographicalRank', () => {
|
|
10
|
+
(0, node_test_1.it)('returns correct rank for small strings', () => {
|
|
11
|
+
node_assert_1.default.strictEqual((0, lexicographicalRank_1.lexicographicalRank)('acb'), 2);
|
|
12
|
+
node_assert_1.default.strictEqual((0, lexicographicalRank_1.lexicographicalRank)('cba'), 6);
|
|
13
|
+
node_assert_1.default.strictEqual((0, lexicographicalRank_1.lexicographicalRank)('abc'), 1);
|
|
14
|
+
});
|
|
15
|
+
(0, node_test_1.it)('handles strings with repeated characters', () => {
|
|
16
|
+
node_assert_1.default.strictEqual((0, lexicographicalRank_1.lexicographicalRank)('aba'), 2);
|
|
17
|
+
node_assert_1.default.strictEqual((0, lexicographicalRank_1.lexicographicalRank)('aab'), 1);
|
|
18
|
+
node_assert_1.default.strictEqual((0, lexicographicalRank_1.lexicographicalRank)('baa'), 3);
|
|
19
|
+
});
|
|
20
|
+
(0, node_test_1.it)('returns 1 for single character string', () => {
|
|
21
|
+
node_assert_1.default.strictEqual((0, lexicographicalRank_1.lexicographicalRank)('a'), 1);
|
|
22
|
+
node_assert_1.default.strictEqual((0, lexicographicalRank_1.lexicographicalRank)('Z'), 1);
|
|
23
|
+
});
|
|
24
|
+
(0, node_test_1.it)('handles larger examples correctly', () => {
|
|
25
|
+
node_assert_1.default.strictEqual((0, lexicographicalRank_1.lexicographicalRank)('string'), 598);
|
|
26
|
+
});
|
|
27
|
+
(0, node_test_1.it)('handles empty string', () => {
|
|
28
|
+
node_assert_1.default.strictEqual((0, lexicographicalRank_1.lexicographicalRank)(''), 1);
|
|
29
|
+
});
|
|
30
|
+
(0, node_test_1.it)('is case-sensitive', () => {
|
|
31
|
+
node_assert_1.default.strictEqual((0, lexicographicalRank_1.lexicographicalRank)('Abc'), 1); // 'A' < 'b' < 'c'
|
|
32
|
+
node_assert_1.default.strictEqual((0, lexicographicalRank_1.lexicographicalRank)('bAc'), 3);
|
|
33
|
+
});
|
|
34
|
+
(0, node_test_1.it)('handles special characters', () => {
|
|
35
|
+
node_assert_1.default.strictEqual((0, lexicographicalRank_1.lexicographicalRank)('!ab'), 1); // '!' comes first
|
|
36
|
+
node_assert_1.default.strictEqual((0, lexicographicalRank_1.lexicographicalRank)('ab!'), 4); // correct rank is 4
|
|
37
|
+
});
|
|
38
|
+
(0, node_test_1.it)('throws an error if input is not a string', () => {
|
|
39
|
+
node_assert_1.default.throws(() => (0, lexicographicalRank_1.lexicographicalRank)(123), /Input must be a string/);
|
|
40
|
+
node_assert_1.default.throws(() => (0, lexicographicalRank_1.lexicographicalRank)(null), /Input must be a string/);
|
|
41
|
+
node_assert_1.default.throws(() => (0, lexicographicalRank_1.lexicographicalRank)(undefined), /Input must be a string/);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_test_1 = require("node:test");
|
|
7
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
8
|
+
const binary_1 = require("../../formatting/binary");
|
|
9
|
+
(0, node_test_1.describe)('formatToBinary', () => {
|
|
10
|
+
(0, node_test_1.it)('converts standard positive integers', () => {
|
|
11
|
+
node_assert_1.default.strictEqual((0, binary_1.formatToBinary)(5), '101');
|
|
12
|
+
node_assert_1.default.strictEqual((0, binary_1.formatToBinary)(10), '1010');
|
|
13
|
+
node_assert_1.default.strictEqual((0, binary_1.formatToBinary)(255), '11111111');
|
|
14
|
+
node_assert_1.default.strictEqual((0, binary_1.formatToBinary)(1), '1');
|
|
15
|
+
node_assert_1.default.strictEqual((0, binary_1.formatToBinary)(2), '10');
|
|
16
|
+
});
|
|
17
|
+
(0, node_test_1.it)('handles zero', () => {
|
|
18
|
+
node_assert_1.default.strictEqual((0, binary_1.formatToBinary)(0), '0');
|
|
19
|
+
});
|
|
20
|
+
(0, node_test_1.it)('prefixes negative numbers with a minus sign', () => {
|
|
21
|
+
node_assert_1.default.strictEqual((0, binary_1.formatToBinary)(-5), '-101');
|
|
22
|
+
node_assert_1.default.strictEqual((0, binary_1.formatToBinary)(-10), '-1010');
|
|
23
|
+
});
|
|
24
|
+
(0, node_test_1.it)('supports optional grouping from right to left (LSB first)', () => {
|
|
25
|
+
node_assert_1.default.strictEqual((0, binary_1.formatToBinary)(255, { group: 4 }), '1111 1111');
|
|
26
|
+
node_assert_1.default.strictEqual((0, binary_1.formatToBinary)(10, { group: 2 }), '10 10');
|
|
27
|
+
node_assert_1.default.strictEqual((0, binary_1.formatToBinary)(5, { group: 4 }), '101'); // no padding on the left
|
|
28
|
+
node_assert_1.default.strictEqual((0, binary_1.formatToBinary)(1023, { group: 4 }), '11 1111 1111');
|
|
29
|
+
});
|
|
30
|
+
(0, node_test_1.it)('applies grouping with negative numbers', () => {
|
|
31
|
+
node_assert_1.default.strictEqual((0, binary_1.formatToBinary)(-255, { group: 4 }), '-1111 1111');
|
|
32
|
+
});
|
|
33
|
+
(0, node_test_1.it)('handles large integers (MAX_SAFE_INTEGER)', () => {
|
|
34
|
+
const expected = Number.MAX_SAFE_INTEGER.toString(2);
|
|
35
|
+
node_assert_1.default.strictEqual((0, binary_1.formatToBinary)(Number.MAX_SAFE_INTEGER), expected);
|
|
36
|
+
});
|
|
37
|
+
(0, node_test_1.it)('throws TypeError for invalid inputs (type/NaN)', () => {
|
|
38
|
+
node_assert_1.default.throws(() => (0, binary_1.formatToBinary)('5'), /Input must be a number/);
|
|
39
|
+
node_assert_1.default.throws(() => (0, binary_1.formatToBinary)(null), /Input must be a number/);
|
|
40
|
+
node_assert_1.default.throws(() => (0, binary_1.formatToBinary)(undefined), /Input must be a number/);
|
|
41
|
+
node_assert_1.default.throws(() => (0, binary_1.formatToBinary)(NaN), /Input must be a number/);
|
|
42
|
+
});
|
|
43
|
+
(0, node_test_1.it)('throws TypeError for non-integer numbers', () => {
|
|
44
|
+
node_assert_1.default.throws(() => (0, binary_1.formatToBinary)(3.14), /Input must be an integer/);
|
|
45
|
+
node_assert_1.default.throws(() => (0, binary_1.formatToBinary)(-2.5), /Input must be an integer/);
|
|
46
|
+
});
|
|
47
|
+
(0, node_test_1.it)('throws TypeError for invalid group size', () => {
|
|
48
|
+
node_assert_1.default.throws(() => (0, binary_1.formatToBinary)(10, { group: 0 }), /Group size must be a positive integer/);
|
|
49
|
+
node_assert_1.default.throws(() => (0, binary_1.formatToBinary)(10, { group: -1 }), /Group size must be a positive integer/);
|
|
50
|
+
node_assert_1.default.throws(() => (0, binary_1.formatToBinary)(10, { group: 2.5 }), /Group size must be a positive integer/);
|
|
51
|
+
node_assert_1.default.throws(() => (0, binary_1.formatToBinary)(10, { group: '4' }), /Group size must be a positive integer/);
|
|
52
|
+
});
|
|
53
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_test_1 = require("node:test");
|
|
7
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
8
|
+
const creditCard_1 = require("../../formatting/creditCard");
|
|
9
|
+
(0, node_test_1.describe)('formatCreditCard', () => {
|
|
10
|
+
(0, node_test_1.it)('formats 16-digit card numbers correctly', () => {
|
|
11
|
+
node_assert_1.default.strictEqual((0, creditCard_1.formatCreditCard)('1234567812345678'), '1234 5678 1234 5678');
|
|
12
|
+
node_assert_1.default.strictEqual((0, creditCard_1.formatCreditCard)('4111111111111111'), '4111 1111 1111 1111');
|
|
13
|
+
});
|
|
14
|
+
(0, node_test_1.it)('formats 15-digit card numbers (AmEx) correctly', () => {
|
|
15
|
+
node_assert_1.default.strictEqual((0, creditCard_1.formatCreditCard)('378282246310005'), '3782 822463 10005');
|
|
16
|
+
});
|
|
17
|
+
(0, node_test_1.it)('removes non-digit characters before formatting', () => {
|
|
18
|
+
node_assert_1.default.strictEqual((0, creditCard_1.formatCreditCard)('4111-1111-1111-1111'), '4111 1111 1111 1111');
|
|
19
|
+
node_assert_1.default.strictEqual((0, creditCard_1.formatCreditCard)('3782 8224 6310 005'), '3782 822463 10005');
|
|
20
|
+
});
|
|
21
|
+
(0, node_test_1.it)('returns empty string for invalid lengths', () => {
|
|
22
|
+
node_assert_1.default.strictEqual((0, creditCard_1.formatCreditCard)('123'), '');
|
|
23
|
+
node_assert_1.default.strictEqual((0, creditCard_1.formatCreditCard)('11112222333344445555'), '');
|
|
24
|
+
node_assert_1.default.strictEqual((0, creditCard_1.formatCreditCard)(''), '');
|
|
25
|
+
});
|
|
26
|
+
(0, node_test_1.it)('throws an error if input is not a string', () => {
|
|
27
|
+
node_assert_1.default.throws(() => (0, creditCard_1.formatCreditCard)(1234567812345678), /Input must be a string/);
|
|
28
|
+
node_assert_1.default.throws(() => (0, creditCard_1.formatCreditCard)(null), /Input must be a string/);
|
|
29
|
+
node_assert_1.default.throws(() => (0, creditCard_1.formatCreditCard)(undefined), /Input must be a string/);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_test_1 = require("node:test");
|
|
7
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
8
|
+
const decimal_1 = require("../../formatting/decimal");
|
|
9
|
+
(0, node_test_1.describe)('formatToDecimal', () => {
|
|
10
|
+
// Binary
|
|
11
|
+
(0, node_test_1.it)('converts binary strings (base 2) without prefix', () => {
|
|
12
|
+
node_assert_1.default.strictEqual((0, decimal_1.formatToDecimal)('1010', { base: 2 }), 10);
|
|
13
|
+
node_assert_1.default.strictEqual((0, decimal_1.formatToDecimal)('0', { base: 2 }), 0);
|
|
14
|
+
node_assert_1.default.strictEqual((0, decimal_1.formatToDecimal)('000101', { base: 2 }), 5);
|
|
15
|
+
});
|
|
16
|
+
(0, node_test_1.it)('converts binary strings (base 2) with 0b prefix', () => {
|
|
17
|
+
node_assert_1.default.strictEqual((0, decimal_1.formatToDecimal)('0b1010', { base: 2 }), 10);
|
|
18
|
+
node_assert_1.default.strictEqual((0, decimal_1.formatToDecimal)('0B111', { base: 2 }), 7);
|
|
19
|
+
});
|
|
20
|
+
// Octal
|
|
21
|
+
(0, node_test_1.it)('converts octal strings (base 8) without prefix', () => {
|
|
22
|
+
node_assert_1.default.strictEqual((0, decimal_1.formatToDecimal)('12', { base: 8 }), 10);
|
|
23
|
+
node_assert_1.default.strictEqual((0, decimal_1.formatToDecimal)('00012', { base: 8 }), 10);
|
|
24
|
+
});
|
|
25
|
+
(0, node_test_1.it)('converts octal strings (base 8) with 0o prefix', () => {
|
|
26
|
+
node_assert_1.default.strictEqual((0, decimal_1.formatToDecimal)('0o12', { base: 8 }), 10);
|
|
27
|
+
node_assert_1.default.strictEqual((0, decimal_1.formatToDecimal)('0O377', { base: 8 }), 255);
|
|
28
|
+
});
|
|
29
|
+
// Hexadecimal
|
|
30
|
+
(0, node_test_1.it)('converts hexadecimal strings (base 16) without prefix (uppercase/lowercase)', () => {
|
|
31
|
+
node_assert_1.default.strictEqual((0, decimal_1.formatToDecimal)('ff', { base: 16 }), 255);
|
|
32
|
+
node_assert_1.default.strictEqual((0, decimal_1.formatToDecimal)('FF', { base: 16 }), 255);
|
|
33
|
+
node_assert_1.default.strictEqual((0, decimal_1.formatToDecimal)('000a', { base: 16 }), 10);
|
|
34
|
+
});
|
|
35
|
+
(0, node_test_1.it)('converts hexadecimal strings (base 16) with 0x prefix', () => {
|
|
36
|
+
node_assert_1.default.strictEqual((0, decimal_1.formatToDecimal)('0xFF', { base: 16 }), 255);
|
|
37
|
+
node_assert_1.default.strictEqual((0, decimal_1.formatToDecimal)('0X10', { base: 16 }), 16);
|
|
38
|
+
});
|
|
39
|
+
// Whitespace and sign handling
|
|
40
|
+
(0, node_test_1.it)('trims whitespace and supports optional sign', () => {
|
|
41
|
+
node_assert_1.default.strictEqual((0, decimal_1.formatToDecimal)(' 1010 ', { base: 2 }), 10);
|
|
42
|
+
node_assert_1.default.strictEqual((0, decimal_1.formatToDecimal)('+0xFF', { base: 16 }), 255);
|
|
43
|
+
node_assert_1.default.strictEqual((0, decimal_1.formatToDecimal)('-0b10', { base: 2 }), -2);
|
|
44
|
+
});
|
|
45
|
+
// Errors: unsupported base
|
|
46
|
+
(0, node_test_1.it)('throws for unsupported bases', () => {
|
|
47
|
+
node_assert_1.default.throws(() => (0, decimal_1.formatToDecimal)('10', { base: 10 }), /Base must be one of 2, 8, or 16/);
|
|
48
|
+
});
|
|
49
|
+
// Errors: invalid input type or empty string
|
|
50
|
+
(0, node_test_1.it)('throws TypeError for non-string inputs or empty strings', () => {
|
|
51
|
+
node_assert_1.default.throws(() => (0, decimal_1.formatToDecimal)(1010, { base: 2 }), /Input must be a string/);
|
|
52
|
+
node_assert_1.default.throws(() => (0, decimal_1.formatToDecimal)(' ', { base: 2 }), /non-empty/);
|
|
53
|
+
});
|
|
54
|
+
// Errors: malformed or invalid values
|
|
55
|
+
(0, node_test_1.it)('throws TypeError for malformed values', () => {
|
|
56
|
+
node_assert_1.default.throws(() => (0, decimal_1.formatToDecimal)('102', { base: 2 }), /invalid characters/);
|
|
57
|
+
node_assert_1.default.throws(() => (0, decimal_1.formatToDecimal)('89', { base: 8 }), /invalid characters/);
|
|
58
|
+
node_assert_1.default.throws(() => (0, decimal_1.formatToDecimal)('0xG1', { base: 16 }), /invalid characters/);
|
|
59
|
+
node_assert_1.default.throws(() => (0, decimal_1.formatToDecimal)('-', { base: 2 }), /Malformed/);
|
|
60
|
+
node_assert_1.default.throws(() => (0, decimal_1.formatToDecimal)('+', { base: 16 }), /Malformed/);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_test_1 = require("node:test");
|
|
7
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
8
|
+
const duration_1 = require("../../formatting/duration");
|
|
9
|
+
(0, node_test_1.describe)('formatDuration', () => {
|
|
10
|
+
(0, node_test_1.describe)('basic functionality', () => {
|
|
11
|
+
(0, node_test_1.it)('formats exact minutes', () => {
|
|
12
|
+
node_assert_1.default.strictEqual((0, duration_1.formatDuration)(60), '1m');
|
|
13
|
+
});
|
|
14
|
+
(0, node_test_1.it)('formats minutes and seconds', () => {
|
|
15
|
+
node_assert_1.default.strictEqual((0, duration_1.formatDuration)(61), '1m 1s');
|
|
16
|
+
});
|
|
17
|
+
(0, node_test_1.it)('formats hours, minutes and seconds', () => {
|
|
18
|
+
node_assert_1.default.strictEqual((0, duration_1.formatDuration)(3661), '1h 1m 1s');
|
|
19
|
+
});
|
|
20
|
+
(0, node_test_1.it)('formats exact hours', () => {
|
|
21
|
+
node_assert_1.default.strictEqual((0, duration_1.formatDuration)(3600), '1h');
|
|
22
|
+
});
|
|
23
|
+
(0, node_test_1.it)('formats complex durations', () => {
|
|
24
|
+
node_assert_1.default.strictEqual((0, duration_1.formatDuration)(7325), '2h 2m 5s');
|
|
25
|
+
});
|
|
26
|
+
(0, node_test_1.it)('formats milliseconds when specified', () => {
|
|
27
|
+
node_assert_1.default.strictEqual((0, duration_1.formatDuration)(1234567, { unit: 'milliseconds', includeMs: true }), '20m 34s 567ms');
|
|
28
|
+
});
|
|
29
|
+
(0, node_test_1.it)('formats zero as zero seconds', () => {
|
|
30
|
+
node_assert_1.default.strictEqual((0, duration_1.formatDuration)(0), '0s');
|
|
31
|
+
});
|
|
32
|
+
(0, node_test_1.it)('handles large values', () => {
|
|
33
|
+
node_assert_1.default.strictEqual((0, duration_1.formatDuration)(86400), '24h');
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
(0, node_test_1.describe)('format options', () => {
|
|
37
|
+
(0, node_test_1.it)('formats with medium format', () => {
|
|
38
|
+
node_assert_1.default.strictEqual((0, duration_1.formatDuration)(3661, { format: 'medium' }), '1h 01m 01s');
|
|
39
|
+
});
|
|
40
|
+
(0, node_test_1.it)('formats with long format', () => {
|
|
41
|
+
node_assert_1.default.strictEqual((0, duration_1.formatDuration)(3661, { format: 'long' }), '1 hour 1 minute 1 second');
|
|
42
|
+
});
|
|
43
|
+
(0, node_test_1.it)('formats with custom delimiter', () => {
|
|
44
|
+
node_assert_1.default.strictEqual((0, duration_1.formatDuration)(3661, { delimiter: ':' }), '1h:1m:1s');
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
(0, node_test_1.describe)('error handling', () => {
|
|
48
|
+
(0, node_test_1.it)('throws on non-numeric input', () => {
|
|
49
|
+
node_assert_1.default.throws(() => (0, duration_1.formatDuration)('60'), {
|
|
50
|
+
name: 'TypeError',
|
|
51
|
+
message: 'Input must be a number'
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
(0, node_test_1.it)('throws on negative input', () => {
|
|
55
|
+
node_assert_1.default.throws(() => (0, duration_1.formatDuration)(-60), {
|
|
56
|
+
name: 'TypeError',
|
|
57
|
+
message: 'Input must be non-negative'
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_test_1 = require("node:test");
|
|
7
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
8
|
+
const fileSize_1 = require("../../formatting/fileSize");
|
|
9
|
+
(0, node_test_1.describe)('formatFileSize', () => {
|
|
10
|
+
(0, node_test_1.it)('formats basic sizes correctly', () => {
|
|
11
|
+
node_assert_1.default.strictEqual((0, fileSize_1.formatFileSize)(123), '123 B');
|
|
12
|
+
node_assert_1.default.strictEqual((0, fileSize_1.formatFileSize)(1024), '1 KB');
|
|
13
|
+
node_assert_1.default.strictEqual((0, fileSize_1.formatFileSize)(1048576), '1 MB');
|
|
14
|
+
node_assert_1.default.strictEqual((0, fileSize_1.formatFileSize)(1073741824), '1 GB');
|
|
15
|
+
});
|
|
16
|
+
(0, node_test_1.it)('handles fractional sizes with correct rounding', () => {
|
|
17
|
+
node_assert_1.default.strictEqual((0, fileSize_1.formatFileSize)(1572864), '1.5 MB'); // 1.5 MB
|
|
18
|
+
node_assert_1.default.strictEqual((0, fileSize_1.formatFileSize)(1536, 1), '1.5 KB'); // 1.5 KB
|
|
19
|
+
});
|
|
20
|
+
(0, node_test_1.it)('handles precision configuration', () => {
|
|
21
|
+
node_assert_1.default.strictEqual((0, fileSize_1.formatFileSize)(1500, 0), '1 KB'); // rounds down
|
|
22
|
+
node_assert_1.default.strictEqual((0, fileSize_1.formatFileSize)(1500, 3), '1.465 KB');
|
|
23
|
+
});
|
|
24
|
+
(0, node_test_1.it)('handles zero correctly', () => {
|
|
25
|
+
node_assert_1.default.strictEqual((0, fileSize_1.formatFileSize)(0), '0 B');
|
|
26
|
+
});
|
|
27
|
+
(0, node_test_1.it)('throws TypeError for invalid inputs', () => {
|
|
28
|
+
node_assert_1.default.throws(() => (0, fileSize_1.formatFileSize)('1024'), /Input must be a number/);
|
|
29
|
+
node_assert_1.default.throws(() => (0, fileSize_1.formatFileSize)(null), /Input must be a number/);
|
|
30
|
+
node_assert_1.default.throws(() => (0, fileSize_1.formatFileSize)(undefined), /Input must be a number/);
|
|
31
|
+
});
|
|
32
|
+
(0, node_test_1.it)('throws TypeError for invalid precision', () => {
|
|
33
|
+
node_assert_1.default.throws(() => (0, fileSize_1.formatFileSize)(1024, -1), /Precision must be a non-negative number/);
|
|
34
|
+
node_assert_1.default.throws(() => (0, fileSize_1.formatFileSize)(1024, '2'), /Precision must be a non-negative number/);
|
|
35
|
+
});
|
|
36
|
+
(0, node_test_1.it)('throws RangeError for negative byte values', () => {
|
|
37
|
+
node_assert_1.default.throws(() => (0, fileSize_1.formatFileSize)(-1024), /File size cannot be negative/);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_test_1 = require("node:test");
|
|
7
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
8
|
+
const hexadecimal_1 = require("../../formatting/hexadecimal");
|
|
9
|
+
(0, node_test_1.describe)('formatToHexadecimal', () => {
|
|
10
|
+
(0, node_test_1.it)('converts decimal to hexadecimal (uppercase by default)', () => {
|
|
11
|
+
node_assert_1.default.strictEqual((0, hexadecimal_1.formatToHexadecimal)(10), 'A');
|
|
12
|
+
node_assert_1.default.strictEqual((0, hexadecimal_1.formatToHexadecimal)(15), 'F');
|
|
13
|
+
node_assert_1.default.strictEqual((0, hexadecimal_1.formatToHexadecimal)(255), 'FF');
|
|
14
|
+
node_assert_1.default.strictEqual((0, hexadecimal_1.formatToHexadecimal)(4095), 'FFF');
|
|
15
|
+
});
|
|
16
|
+
(0, node_test_1.it)('handles negative numbers', () => {
|
|
17
|
+
node_assert_1.default.strictEqual((0, hexadecimal_1.formatToHexadecimal)(-255), '-FF');
|
|
18
|
+
node_assert_1.default.strictEqual((0, hexadecimal_1.formatToHexadecimal)(-4095), '-FFF');
|
|
19
|
+
});
|
|
20
|
+
(0, node_test_1.it)('supports prefix option (0x)', () => {
|
|
21
|
+
node_assert_1.default.strictEqual((0, hexadecimal_1.formatToHexadecimal)(255, { prefix: true }), '0xFF');
|
|
22
|
+
node_assert_1.default.strictEqual((0, hexadecimal_1.formatToHexadecimal)(-255, { prefix: true }), '-0xFF');
|
|
23
|
+
});
|
|
24
|
+
(0, node_test_1.it)('supports lowercase option', () => {
|
|
25
|
+
node_assert_1.default.strictEqual((0, hexadecimal_1.formatToHexadecimal)(255, { lowercase: true }), 'ff');
|
|
26
|
+
node_assert_1.default.strictEqual((0, hexadecimal_1.formatToHexadecimal)(4095, { lowercase: true }), 'fff');
|
|
27
|
+
});
|
|
28
|
+
(0, node_test_1.it)('supports both prefix and lowercase together', () => {
|
|
29
|
+
node_assert_1.default.strictEqual((0, hexadecimal_1.formatToHexadecimal)(255, { prefix: true, lowercase: true }), '0xff');
|
|
30
|
+
node_assert_1.default.strictEqual((0, hexadecimal_1.formatToHexadecimal)(-255, { prefix: true, lowercase: true }), '-0xff');
|
|
31
|
+
});
|
|
32
|
+
(0, node_test_1.it)('throws an error for non-numeric inputs', () => {
|
|
33
|
+
node_assert_1.default.throws(() => (0, hexadecimal_1.formatToHexadecimal)('123'), /Input must be a valid number/);
|
|
34
|
+
node_assert_1.default.throws(() => (0, hexadecimal_1.formatToHexadecimal)(null), /Input must be a valid number/);
|
|
35
|
+
node_assert_1.default.throws(() => (0, hexadecimal_1.formatToHexadecimal)(undefined), /Input must be a valid number/);
|
|
36
|
+
node_assert_1.default.throws(() => (0, hexadecimal_1.formatToHexadecimal)(NaN), /Input must be a valid number/);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_test_1 = require("node:test");
|
|
7
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
8
|
+
const listToString_1 = require("../../formatting/listToString");
|
|
9
|
+
(0, node_test_1.describe)('formatList', () => {
|
|
10
|
+
(0, node_test_1.it)('formats empty arrays correctly', () => {
|
|
11
|
+
node_assert_1.default.strictEqual((0, listToString_1.formatList)([]), '');
|
|
12
|
+
});
|
|
13
|
+
(0, node_test_1.it)('formats single-item arrays correctly', () => {
|
|
14
|
+
node_assert_1.default.strictEqual((0, listToString_1.formatList)(['apple']), 'apple');
|
|
15
|
+
});
|
|
16
|
+
(0, node_test_1.it)('formats two-item arrays correctly', () => {
|
|
17
|
+
node_assert_1.default.strictEqual((0, listToString_1.formatList)(['apples', 'bananas']), 'apples and bananas');
|
|
18
|
+
});
|
|
19
|
+
(0, node_test_1.it)('formats three or more items with Oxford comma', () => {
|
|
20
|
+
node_assert_1.default.strictEqual((0, listToString_1.formatList)(['apples', 'bananas', 'cherries']), 'apples, bananas, and cherries');
|
|
21
|
+
node_assert_1.default.strictEqual((0, listToString_1.formatList)(['red', 'blue', 'green', 'yellow']), 'red, blue, green, and yellow');
|
|
22
|
+
});
|
|
23
|
+
(0, node_test_1.it)('throws TypeError for non-array inputs', () => {
|
|
24
|
+
node_assert_1.default.throws(() => (0, listToString_1.formatList)('apple'), /Input must be an array/);
|
|
25
|
+
node_assert_1.default.throws(() => (0, listToString_1.formatList)(123), /Input must be an array/);
|
|
26
|
+
});
|
|
27
|
+
(0, node_test_1.it)('throws TypeError for non-string elements in array', () => {
|
|
28
|
+
node_assert_1.default.throws(() => (0, listToString_1.formatList)(['apple', 123]), /All elements in the array must be strings/);
|
|
29
|
+
node_assert_1.default.throws(() => (0, listToString_1.formatList)(['apple', null]), /All elements in the array must be strings/);
|
|
30
|
+
});
|
|
31
|
+
(0, node_test_1.it)('throws TypeError for mixed arrays (strings + other types)', () => {
|
|
32
|
+
node_assert_1.default.throws(() => (0, listToString_1.formatList)(['apple', 42, 'banana']), /All elements in the array must be strings/);
|
|
33
|
+
node_assert_1.default.throws(() => (0, listToString_1.formatList)(['apple', true, 'banana']), /All elements in the array must be strings/);
|
|
34
|
+
node_assert_1.default.throws(() => (0, listToString_1.formatList)(['apple', undefined, 'banana']), /All elements in the array must be strings/);
|
|
35
|
+
node_assert_1.default.throws(() => (0, listToString_1.formatList)(['apple', {}, 'banana']), /All elements in the array must be strings/);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_test_1 = require("node:test");
|
|
7
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
8
|
+
const octal_1 = require("../../formatting/octal");
|
|
9
|
+
(0, node_test_1.describe)('formatToOctal', () => {
|
|
10
|
+
(0, node_test_1.it)('converts standard positive numbers', () => {
|
|
11
|
+
node_assert_1.default.strictEqual((0, octal_1.formatToOctal)(8), '10');
|
|
12
|
+
node_assert_1.default.strictEqual((0, octal_1.formatToOctal)(10), '12');
|
|
13
|
+
node_assert_1.default.strictEqual((0, octal_1.formatToOctal)(255), '377');
|
|
14
|
+
node_assert_1.default.strictEqual((0, octal_1.formatToOctal)(0), '0');
|
|
15
|
+
});
|
|
16
|
+
(0, node_test_1.it)('handles negative numbers', () => {
|
|
17
|
+
node_assert_1.default.strictEqual((0, octal_1.formatToOctal)(-8), '-10');
|
|
18
|
+
node_assert_1.default.strictEqual((0, octal_1.formatToOctal)(-255), '-377');
|
|
19
|
+
});
|
|
20
|
+
(0, node_test_1.it)('adds prefix when specified', () => {
|
|
21
|
+
node_assert_1.default.strictEqual((0, octal_1.formatToOctal)(255, { prefix: true }), '0o377');
|
|
22
|
+
node_assert_1.default.strictEqual((0, octal_1.formatToOctal)(-255, { prefix: true }), '-0o377');
|
|
23
|
+
node_assert_1.default.strictEqual((0, octal_1.formatToOctal)(0, { prefix: true }), '0o0');
|
|
24
|
+
});
|
|
25
|
+
(0, node_test_1.it)('handles large integers', () => {
|
|
26
|
+
const value = Number.MAX_SAFE_INTEGER;
|
|
27
|
+
const expected = value.toString(8);
|
|
28
|
+
node_assert_1.default.strictEqual((0, octal_1.formatToOctal)(value), expected);
|
|
29
|
+
});
|
|
30
|
+
(0, node_test_1.it)('throws TypeError for invalid inputs', () => {
|
|
31
|
+
node_assert_1.default.throws(() => (0, octal_1.formatToOctal)('10'), /Input must be a number/);
|
|
32
|
+
node_assert_1.default.throws(() => (0, octal_1.formatToOctal)(null), /Input must be a number/);
|
|
33
|
+
node_assert_1.default.throws(() => (0, octal_1.formatToOctal)(undefined), /Input must be a number/);
|
|
34
|
+
node_assert_1.default.throws(() => (0, octal_1.formatToOctal)(NaN), /Input must be a number/);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_test_1 = require("node:test");
|
|
7
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
8
|
+
const ordinal_1 = require("../../formatting/ordinal");
|
|
9
|
+
(0, node_test_1.describe)('formatOrdinal', () => {
|
|
10
|
+
(0, node_test_1.it)('formats basic ordinals correctly', () => {
|
|
11
|
+
node_assert_1.default.strictEqual((0, ordinal_1.formatOrdinal)(1), '1st');
|
|
12
|
+
node_assert_1.default.strictEqual((0, ordinal_1.formatOrdinal)(2), '2nd');
|
|
13
|
+
node_assert_1.default.strictEqual((0, ordinal_1.formatOrdinal)(3), '3rd');
|
|
14
|
+
node_assert_1.default.strictEqual((0, ordinal_1.formatOrdinal)(4), '4th');
|
|
15
|
+
node_assert_1.default.strictEqual((0, ordinal_1.formatOrdinal)(10), '10th');
|
|
16
|
+
});
|
|
17
|
+
(0, node_test_1.it)('handles special teen cases (11, 12, 13)', () => {
|
|
18
|
+
node_assert_1.default.strictEqual((0, ordinal_1.formatOrdinal)(11), '11th');
|
|
19
|
+
node_assert_1.default.strictEqual((0, ordinal_1.formatOrdinal)(12), '12th');
|
|
20
|
+
node_assert_1.default.strictEqual((0, ordinal_1.formatOrdinal)(13), '13th');
|
|
21
|
+
});
|
|
22
|
+
(0, node_test_1.it)('handles large numbers correctly', () => {
|
|
23
|
+
node_assert_1.default.strictEqual((0, ordinal_1.formatOrdinal)(21), '21st');
|
|
24
|
+
node_assert_1.default.strictEqual((0, ordinal_1.formatOrdinal)(22), '22nd');
|
|
25
|
+
node_assert_1.default.strictEqual((0, ordinal_1.formatOrdinal)(23), '23rd');
|
|
26
|
+
node_assert_1.default.strictEqual((0, ordinal_1.formatOrdinal)(24), '24th');
|
|
27
|
+
node_assert_1.default.strictEqual((0, ordinal_1.formatOrdinal)(101), '101st');
|
|
28
|
+
node_assert_1.default.strictEqual((0, ordinal_1.formatOrdinal)(111), '111th');
|
|
29
|
+
node_assert_1.default.strictEqual((0, ordinal_1.formatOrdinal)(112), '112th');
|
|
30
|
+
node_assert_1.default.strictEqual((0, ordinal_1.formatOrdinal)(113), '113th');
|
|
31
|
+
});
|
|
32
|
+
(0, node_test_1.it)('throws TypeError for invalid inputs', () => {
|
|
33
|
+
node_assert_1.default.throws(() => (0, ordinal_1.formatOrdinal)('21'), /Input must be a number/);
|
|
34
|
+
node_assert_1.default.throws(() => (0, ordinal_1.formatOrdinal)(null), /Input must be a number/);
|
|
35
|
+
node_assert_1.default.throws(() => (0, ordinal_1.formatOrdinal)(undefined), /Input must be a number/);
|
|
36
|
+
});
|
|
37
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_test_1 = require("node:test");
|
|
7
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
8
|
+
const percentage_1 = require("../../formatting/percentage");
|
|
9
|
+
(0, node_test_1.describe)('formatPercentage', () => {
|
|
10
|
+
(0, node_test_1.it)('formats numbers correctly with default precision', () => {
|
|
11
|
+
node_assert_1.default.strictEqual((0, percentage_1.formatPercentage)(0.567), '56.70%');
|
|
12
|
+
node_assert_1.default.strictEqual((0, percentage_1.formatPercentage)(0.5), '50.00%');
|
|
13
|
+
node_assert_1.default.strictEqual((0, percentage_1.formatPercentage)(1), '100.00%');
|
|
14
|
+
});
|
|
15
|
+
(0, node_test_1.it)('formats numbers correctly with custom precision', () => {
|
|
16
|
+
node_assert_1.default.strictEqual((0, percentage_1.formatPercentage)(0.567, 1), '56.7%');
|
|
17
|
+
node_assert_1.default.strictEqual((0, percentage_1.formatPercentage)(0.5, 0), '50%');
|
|
18
|
+
});
|
|
19
|
+
(0, node_test_1.it)('supports negative numbers', () => {
|
|
20
|
+
node_assert_1.default.strictEqual((0, percentage_1.formatPercentage)(-0.25, 0), '-25%');
|
|
21
|
+
node_assert_1.default.strictEqual((0, percentage_1.formatPercentage)(-0.1234, 2), '-12.34%');
|
|
22
|
+
});
|
|
23
|
+
(0, node_test_1.it)('works with whole numbers (scales by 100)', () => {
|
|
24
|
+
node_assert_1.default.strictEqual((0, percentage_1.formatPercentage)(50, 0), '5000%');
|
|
25
|
+
});
|
|
26
|
+
(0, node_test_1.it)('handles zero correctly', () => {
|
|
27
|
+
node_assert_1.default.strictEqual((0, percentage_1.formatPercentage)(0), '0.00%');
|
|
28
|
+
});
|
|
29
|
+
(0, node_test_1.it)('throws TypeError for invalid inputs', () => {
|
|
30
|
+
node_assert_1.default.throws(() => (0, percentage_1.formatPercentage)('0.5'), /Input must be a number/);
|
|
31
|
+
node_assert_1.default.throws(() => (0, percentage_1.formatPercentage)(null), /Input must be a number/);
|
|
32
|
+
node_assert_1.default.throws(() => (0, percentage_1.formatPercentage)(undefined), /Input must be a number/);
|
|
33
|
+
});
|
|
34
|
+
(0, node_test_1.it)('throws TypeError for invalid precision', () => {
|
|
35
|
+
node_assert_1.default.throws(() => (0, percentage_1.formatPercentage)(0.5, -1), /Precision must be a non-negative number/);
|
|
36
|
+
node_assert_1.default.throws(() => (0, percentage_1.formatPercentage)(0.5, '2'), /Precision must be a non-negative number/);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_test_1 = require("node:test");
|
|
7
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
8
|
+
const romanNumerals_1 = require("../../formatting/romanNumerals");
|
|
9
|
+
(0, node_test_1.describe)('formatRomanNumeral', () => {
|
|
10
|
+
(0, node_test_1.it)('correctly converts basic numerals', () => {
|
|
11
|
+
node_assert_1.default.strictEqual((0, romanNumerals_1.formatRomanNumeral)(1), 'I');
|
|
12
|
+
node_assert_1.default.strictEqual((0, romanNumerals_1.formatRomanNumeral)(4), 'IV');
|
|
13
|
+
node_assert_1.default.strictEqual((0, romanNumerals_1.formatRomanNumeral)(9), 'IX');
|
|
14
|
+
});
|
|
15
|
+
(0, node_test_1.it)('correctly converts mid-range numbers', () => {
|
|
16
|
+
node_assert_1.default.strictEqual((0, romanNumerals_1.formatRomanNumeral)(58), 'LVIII'); // 50 + 5 + 3
|
|
17
|
+
node_assert_1.default.strictEqual((0, romanNumerals_1.formatRomanNumeral)(1994), 'MCMXCIV'); // 1000 + 900 + 90 + 4
|
|
18
|
+
node_assert_1.default.strictEqual((0, romanNumerals_1.formatRomanNumeral)(2025), 'MMXXV');
|
|
19
|
+
});
|
|
20
|
+
(0, node_test_1.it)('correctly converts upper limit', () => {
|
|
21
|
+
node_assert_1.default.strictEqual((0, romanNumerals_1.formatRomanNumeral)(3999), 'MMMCMXCIX');
|
|
22
|
+
});
|
|
23
|
+
(0, node_test_1.it)('throws error for 0 and negative numbers', () => {
|
|
24
|
+
node_assert_1.default.throws(() => (0, romanNumerals_1.formatRomanNumeral)(0), /Roman numerals are only defined for positive integers/);
|
|
25
|
+
node_assert_1.default.throws(() => (0, romanNumerals_1.formatRomanNumeral)(-5), /Roman numerals are only defined for positive integers/);
|
|
26
|
+
});
|
|
27
|
+
(0, node_test_1.it)('throws error for numbers above 3999', () => {
|
|
28
|
+
node_assert_1.default.throws(() => (0, romanNumerals_1.formatRomanNumeral)(4000), /Roman numerals are supported only up to 3999/);
|
|
29
|
+
});
|
|
30
|
+
(0, node_test_1.it)('throws TypeError for non-number inputs', () => {
|
|
31
|
+
node_assert_1.default.throws(() => (0, romanNumerals_1.formatRomanNumeral)('123'), /Input must be a number/);
|
|
32
|
+
node_assert_1.default.throws(() => (0, romanNumerals_1.formatRomanNumeral)(null), /Input must be a number/);
|
|
33
|
+
node_assert_1.default.throws(() => (0, romanNumerals_1.formatRomanNumeral)(undefined), /Input must be a number/);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_test_1 = require("node:test");
|
|
7
|
+
const node_assert_1 = __importDefault(require("node:assert"));
|
|
8
|
+
const scientific_1 = require("../../formatting/scientific");
|
|
9
|
+
(0, node_test_1.describe)('formatScientific', () => {
|
|
10
|
+
(0, node_test_1.it)('converts numbers to scientific notation with default precision (2)', () => {
|
|
11
|
+
node_assert_1.default.strictEqual((0, scientific_1.formatScientific)(12345), '1.23e+4');
|
|
12
|
+
node_assert_1.default.strictEqual((0, scientific_1.formatScientific)(0.000123), '1.23e-4');
|
|
13
|
+
});
|
|
14
|
+
(0, node_test_1.it)('handles negative numbers correctly', () => {
|
|
15
|
+
node_assert_1.default.strictEqual((0, scientific_1.formatScientific)(-12345), '-1.23e+4');
|
|
16
|
+
node_assert_1.default.strictEqual((0, scientific_1.formatScientific)(-0.000987), '-9.87e-4');
|
|
17
|
+
});
|
|
18
|
+
(0, node_test_1.it)('applies custom precision', () => {
|
|
19
|
+
node_assert_1.default.strictEqual((0, scientific_1.formatScientific)(1000000, { precision: 4 }), '1.0000e+6');
|
|
20
|
+
node_assert_1.default.strictEqual((0, scientific_1.formatScientific)(98765, { precision: 3 }), '9.877e+4');
|
|
21
|
+
});
|
|
22
|
+
(0, node_test_1.it)('uses uppercase E when specified', () => {
|
|
23
|
+
node_assert_1.default.strictEqual((0, scientific_1.formatScientific)(98765, { uppercase: true }), '9.88E+4');
|
|
24
|
+
node_assert_1.default.strictEqual((0, scientific_1.formatScientific)(0.000123, { uppercase: true }), '1.23E-4');
|
|
25
|
+
});
|
|
26
|
+
(0, node_test_1.it)('combines precision and uppercase options', () => {
|
|
27
|
+
node_assert_1.default.strictEqual((0, scientific_1.formatScientific)(12345, { precision: 5, uppercase: true }), '1.23450E+4');
|
|
28
|
+
});
|
|
29
|
+
(0, node_test_1.it)('throws an error for invalid inputs', () => {
|
|
30
|
+
node_assert_1.default.throws(() => (0, scientific_1.formatScientific)('12345'), /Input must be a valid number/);
|
|
31
|
+
node_assert_1.default.throws(() => (0, scientific_1.formatScientific)(null), /Input must be a valid number/);
|
|
32
|
+
node_assert_1.default.throws(() => (0, scientific_1.formatScientific)(undefined), /Input must be a valid number/);
|
|
33
|
+
node_assert_1.default.throws(() => (0, scientific_1.formatScientific)(NaN), /Input must be a valid number/);
|
|
34
|
+
});
|
|
35
|
+
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|