/ src / radixes.test.ts
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  })