radixes.test.ts
1 import { test } from 'node:test' 2 import { strictEqual as assertStrictEquals } from 'node:assert' 3 4 import { type Radix, createRadix, num2str, str2num } from './radixes.ts' 5 6 7 type Tests = { 8 radix: Radix, 9 pairs: [ bigint, string ][], 10 }[] 11 12 const tests: Tests = [{ 13 radix: createRadix(9), 14 pairs: [ 15 [ -80n, '-88' ], 16 [ -40n, '-44' ], 17 [ -9n, '-10' ], 18 [ -8n, '-8' ], 19 [ -1n, '-1' ], 20 [ 0n, '0' ], 21 [ 1n, '1' ], 22 [ 8n, '8' ], 23 [ 9n, '10' ], 24 [ 40n, '44' ], 25 [ 80n, '88' ], 26 ] 27 }, { 28 radix: createRadix(9, 'bijective'), 29 pairs: [ 30 [ -90n, '-99' ], 31 [ -50n, '-55' ], 32 [ -10n, '-11' ], 33 [ -9n, '-9' ], 34 [ -1n, '-1' ], 35 [ 0n, '0' ], 36 [ 1n, '1' ], 37 [ 9n, '9' ], 38 [ 10n, '11' ], 39 [ -50n, '-55' ], 40 [ 90n, '99' ], 41 ] 42 }, { 43 radix: createRadix(9, 'balanced'), 44 pairs: [ 45 [ -40n, '➍➍' ], 46 [ -18n, '➋0' ], 47 [ -5n, '➊4' ], 48 [ -4n, '➍' ], 49 [ -1n, '➊' ], 50 [ 0n, '0' ], 51 [ 1n, '1' ], 52 [ 4n, '4' ], 53 [ 5n, '1➍' ], 54 [ 18n, '20' ], 55 [ 40n, '44' ], 56 ] 57 }, { 58 radix: createRadix(10), 59 pairs: [ 60 [ -99n, '-99' ], 61 [ -90n, '-90' ], 62 [ -10n, '-10' ], 63 [ -9n, '-9' ], 64 [ -1n, '-1' ], 65 [ 0n, '0' ], 66 [ 1n, '1' ], 67 [ 9n, '9' ], 68 [ 10n, '10' ], 69 [ 90n, '90' ], 70 [ 99n, '99' ], 71 ] 72 }, { 73 radix: createRadix(10, 'bijective'), 74 pairs: [ 75 [ -110n, '-AA' ], 76 [ -101n, '-A1' ], 77 [ -11n, '-11' ], 78 [ -10n, '-A' ], 79 [ -1n, '-1' ], 80 [ 0n, '0' ], 81 [ 1n, '1' ], 82 [ 10n, 'A' ], 83 [ 11n, '11' ], 84 [ 101n, 'A1' ], 85 [ 110n, 'AA' ], 86 ] 87 }, { 88 radix: createRadix(10, 'sum'), 89 pairs: [ 90 [ 0n, '0' ], 91 [ 1n, 'A' ], 92 [ 2n, 'B' ], 93 [ 3n, 'C' ], 94 [ 4n, 'D' ], 95 [ 5n, 'E' ], 96 [ 6n, 'F' ], 97 [ 7n, 'G' ], 98 [ 8n, 'H' ], 99 [ 9n, 'I' ], 100 [ 10n, 'J' ], 101 [ 11n, 'JA' ], 102 [ 19n, 'JI' ], 103 [ 20n, 'K' ], 104 [ 21n, 'KA' ], 105 [ 28n, 'KH' ], 106 [ 29n, 'KI' ], 107 [ 30n, 'L' ], 108 [ 31n, 'LA' ], 109 [ 37n, 'LG' ], 110 [ 39n, 'LI' ], 111 [ 40n, 'M' ], 112 [ 41n, 'MA' ], 113 [ 46n, 'MF' ], 114 [ 49n, 'MI' ], 115 [ 50n, 'N' ], 116 [ 51n, 'NA' ], 117 [ 55n, 'NE' ], 118 [ 59n, 'NI' ], 119 [ 60n, 'O' ], 120 [ 61n, 'OA' ], 121 [ 64n, 'OD' ], 122 [ 69n, 'OI' ], 123 [ 70n, 'P' ], 124 [ 71n, 'PA' ], 125 [ 73n, 'PC' ], 126 [ 79n, 'PI' ], 127 [ 80n, 'Q' ], 128 [ 81n, 'QA' ], 129 [ 82n, 'QB' ], 130 [ 89n, 'QI' ], 131 [ 90n, 'R' ], 132 [ 91n, 'RA' ], 133 [ 99n, 'RI' ], 134 [ 100n, 'S' ], 135 [ 101n, 'SA' ], 136 [ 109n, 'SI' ], 137 [ 199n, 'SRI' ], 138 [ 200n, 'T' ], 139 [ 201n, 'TA' ], 140 [ 299n, 'TRI' ], 141 [ 300n, 'U' ], 142 [ 301n, 'UA' ], 143 [ 399n, 'URI' ], 144 [ 400n, 'V' ], 145 [ 401n, 'VA' ], 146 [ 409n, 'VI' ], 147 [ 499n, 'VRI' ], 148 [ 500n, 'W' ], 149 [ 501n, 'WA' ], 150 [ 509n, 'WI' ], 151 [ 599n, 'WRI' ], 152 [ 600n, 'X' ], 153 [ 601n, 'XA' ], 154 [ 609n, 'XI' ], 155 [ 699n, 'XRI' ], 156 [ 700n, 'Y' ], 157 [ 701n, 'YA' ], 158 [ 709n, 'YI' ], 159 [ 799n, 'YRI' ], 160 [ 800n, 'Z' ], 161 [ 801n, 'ZA' ], 162 [ 809n, 'ZI' ], 163 [ 899n, 'ZRI' ], 164 [ 900n, 'ZS' ], 165 [ 901n, 'ZSA' ], 166 [ 999n, 'ZSRI' ], 167 [ 1000n, 'ZT' ], 168 [ 1001n, 'ZTA' ], 169 [ 1234n, 'ZVLD' ], 170 [ 1567n, 'ZYOG' ], 171 [ 2345n, 'ZZYME' ], 172 [ 3894n, 'ZZZZXRD' ], 173 ] 174 }, { 175 radix: createRadix(12), 176 pairs: [ 177 [ -143n, '-BB' ], 178 [ -132n, '-B0' ], 179 [ -12n, '-10' ], 180 [ -11n, '-B' ], 181 [ -1n, '-1' ], 182 [ 0n, '0' ], 183 [ 1n, '1' ], 184 [ 11n, 'B' ], 185 [ 12n, '10' ], 186 [ 132n, 'B0' ], 187 [ 143n, 'BB' ], 188 ] 189 }, { 190 radix: createRadix(19, 'balanced'), 191 pairs: [ 192 [ -180n, '➒➒' ], 193 [ -162n, '➒9' ], 194 [ -10n, '➊9' ], 195 [ -9n, '➒' ], 196 [ -1n, '➊' ], 197 [ 0n, '0' ], 198 [ 1n, '1' ], 199 [ 9n, '9' ], 200 [ 10n, '1➒' ], 201 [ 162n, '9➒' ], 202 [ 180n, '99' ], 203 ] 204 }, { 205 radix: createRadix(26, 'bijective'), 206 pairs: [ 207 [ -702n, '-ZZ' ], 208 [ -677n, '-ZA' ], 209 [ -27n, '-AA' ], 210 [ -26n, '-Z' ], 211 [ -1n, '-A' ], 212 [ 0n, '0' ], 213 [ 1n, 'A' ], 214 [ 26n, 'Z' ], 215 [ 27n, 'AA' ], 216 [ 677n, 'ZA' ], 217 [ 702n, 'ZZ' ], 218 ] 219 }, { 220 radix: createRadix(27, 'balanced'), 221 pairs: [ 222 [ -364n, 'AA' ], 223 [ -338n, 'AZ' ], 224 [ -14n, 'MZ' ], 225 [ -13n, 'A' ], 226 [ -1n, 'M' ], 227 [ 0n, '0' ], 228 [ 1n, 'N' ], 229 [ 13n, 'Z' ], 230 [ 14n, 'NA' ], 231 [ 338n, 'ZA' ], 232 [ 364n, 'ZZ' ], 233 ] 234 }] 235 236 await test('num2str', async test => { 237 await Promise.all(tests.map(t => test.test(`num2str(${t.radix.name})`, () => { 238 t.pairs.forEach(([ n, s ]) => { assertStrictEquals(num2str(n, t.radix), s) }) 239 }))) 240 }) 241 242 await test('str2num', async test => { 243 await Promise.all(tests.map(t => test.test(`str2num(${t.radix.name})`, () => { 244 t.pairs.forEach(([ n, s ]) => { assertStrictEquals(str2num(s, t.radix), n) }) 245 }))) 246 })