@@ -49,307 +49,3 @@ describe("useBigInt64: true", () => {
49
49
assert . deepStrictEqual ( decoded , value ) ;
50
50
} ) ;
51
51
} ) ;
52
-
53
- interface TestCase {
54
- input : bigint ;
55
- expected : Map < IntMode , number | bigint | "error" > ;
56
- }
57
-
58
- // declared as a function to delay referencing the BigInt constructor
59
- function BIGINTSPECS ( ) : Record < string , TestCase > {
60
- return {
61
- ZERO : {
62
- input : BigInt ( 0 ) ,
63
- expected : new Map < IntMode , number | bigint > ( [
64
- [ IntMode . UNSAFE_NUMBER , 0 ] ,
65
- [ IntMode . SAFE_NUMBER , 0 ] ,
66
- [ IntMode . MIXED , 0 ] ,
67
- [ IntMode . BIGINT , BigInt ( 0 ) ] ,
68
- ] ) ,
69
- } ,
70
- ONE : {
71
- input : BigInt ( 1 ) ,
72
- expected : new Map < IntMode , number | bigint > ( [
73
- [ IntMode . UNSAFE_NUMBER , 1 ] ,
74
- [ IntMode . SAFE_NUMBER , 1 ] ,
75
- [ IntMode . MIXED , 1 ] ,
76
- [ IntMode . BIGINT , BigInt ( 1 ) ] ,
77
- ] ) ,
78
- } ,
79
- MINUS_ONE : {
80
- input : BigInt ( - 1 ) ,
81
- expected : new Map < IntMode , number | bigint > ( [
82
- [ IntMode . UNSAFE_NUMBER , - 1 ] ,
83
- [ IntMode . SAFE_NUMBER , - 1 ] ,
84
- [ IntMode . MIXED , - 1 ] ,
85
- [ IntMode . BIGINT , BigInt ( - 1 ) ] ,
86
- ] ) ,
87
- } ,
88
- X_FF : {
89
- input : BigInt ( 0xff ) ,
90
- expected : new Map < IntMode , number | bigint > ( [
91
- [ IntMode . UNSAFE_NUMBER , 0xff ] ,
92
- [ IntMode . SAFE_NUMBER , 0xff ] ,
93
- [ IntMode . MIXED , 0xff ] ,
94
- [ IntMode . BIGINT , BigInt ( 0xff ) ] ,
95
- ] ) ,
96
- } ,
97
- MINUS_X_FF : {
98
- input : BigInt ( - 0xff ) ,
99
- expected : new Map < IntMode , number | bigint > ( [
100
- [ IntMode . UNSAFE_NUMBER , - 0xff ] ,
101
- [ IntMode . SAFE_NUMBER , - 0xff ] ,
102
- [ IntMode . MIXED , - 0xff ] ,
103
- [ IntMode . BIGINT , BigInt ( - 0xff ) ] ,
104
- ] ) ,
105
- } ,
106
- INT32_MAX : {
107
- input : BigInt ( 0x7fffffff ) ,
108
- expected : new Map < IntMode , number | bigint > ( [
109
- [ IntMode . UNSAFE_NUMBER , 0x7fffffff ] ,
110
- [ IntMode . SAFE_NUMBER , 0x7fffffff ] ,
111
- [ IntMode . MIXED , 0x7fffffff ] ,
112
- [ IntMode . BIGINT , BigInt ( 0x7fffffff ) ] ,
113
- ] ) ,
114
- } ,
115
- INT32_MIN : {
116
- input : BigInt ( - 0x7fffffff - 1 ) ,
117
- expected : new Map < IntMode , number | bigint > ( [
118
- [ IntMode . UNSAFE_NUMBER , - 0x7fffffff - 1 ] ,
119
- [ IntMode . SAFE_NUMBER , - 0x7fffffff - 1 ] ,
120
- [ IntMode . MIXED , - 0x7fffffff - 1 ] ,
121
- [ IntMode . BIGINT , BigInt ( - 0x7fffffff - 1 ) ] ,
122
- ] ) ,
123
- } ,
124
- MAX_SAFE_INTEGER : {
125
- input : BigInt ( Number . MAX_SAFE_INTEGER ) ,
126
- expected : new Map < IntMode , number | bigint > ( [
127
- [ IntMode . UNSAFE_NUMBER , Number . MAX_SAFE_INTEGER ] ,
128
- [ IntMode . SAFE_NUMBER , Number . MAX_SAFE_INTEGER ] ,
129
- [ IntMode . MIXED , Number . MAX_SAFE_INTEGER ] ,
130
- [ IntMode . BIGINT , BigInt ( Number . MAX_SAFE_INTEGER ) ] ,
131
- ] ) ,
132
- } ,
133
- MAX_SAFE_INTEGER_PLUS_ONE : {
134
- input : BigInt ( Number . MAX_SAFE_INTEGER ) + BigInt ( 1 ) ,
135
- expected : new Map < IntMode , number | bigint | "error" > ( [
136
- // exclude IntMode.UNSAFE_NUMBER, behavior will not be exact
137
- [ IntMode . SAFE_NUMBER , "error" ] ,
138
- [ IntMode . MIXED , BigInt ( Number . MAX_SAFE_INTEGER ) + BigInt ( 1 ) ] ,
139
- [ IntMode . BIGINT , BigInt ( Number . MAX_SAFE_INTEGER ) + BigInt ( 1 ) ] ,
140
- ] ) ,
141
- } ,
142
- MIN_SAFE_INTEGER : {
143
- input : BigInt ( Number . MIN_SAFE_INTEGER ) ,
144
- expected : new Map < IntMode , number | bigint > ( [
145
- [ IntMode . UNSAFE_NUMBER , Number . MIN_SAFE_INTEGER ] ,
146
- [ IntMode . SAFE_NUMBER , Number . MIN_SAFE_INTEGER ] ,
147
- [ IntMode . MIXED , Number . MIN_SAFE_INTEGER ] ,
148
- [ IntMode . BIGINT , BigInt ( Number . MIN_SAFE_INTEGER ) ] ,
149
- ] ) ,
150
- } ,
151
- MIN_SAFE_INTEGER_MINUS_ONE : {
152
- input : BigInt ( Number . MIN_SAFE_INTEGER ) - BigInt ( 1 ) ,
153
- expected : new Map < IntMode , number | bigint | "error" > ( [
154
- // exclude IntMode.UNSAFE_NUMBER, behavior will not be exact
155
- [ IntMode . SAFE_NUMBER , "error" ] ,
156
- [ IntMode . MIXED , BigInt ( Number . MIN_SAFE_INTEGER ) - BigInt ( 1 ) ] ,
157
- [ IntMode . BIGINT , BigInt ( Number . MIN_SAFE_INTEGER ) - BigInt ( 1 ) ] ,
158
- ] ) ,
159
- } ,
160
- INT64_MAX : {
161
- input : BigInt ( "0x7fffffffffffffff" ) ,
162
- expected : new Map < IntMode , number | bigint | "error" > ( [
163
- // exclude IntMode.UNSAFE_NUMBER, behavior will not be exact
164
- [ IntMode . SAFE_NUMBER , "error" ] ,
165
- [ IntMode . MIXED , BigInt ( "0x7fffffffffffffff" ) ] ,
166
- [ IntMode . BIGINT , BigInt ( "0x7fffffffffffffff" ) ] ,
167
- ] ) ,
168
- } ,
169
- INT64_MIN : {
170
- input : BigInt ( - 1 ) * BigInt ( "0x8000000000000000" ) ,
171
- expected : new Map < IntMode , number | bigint | "error" > ( [
172
- // exclude IntMode.UNSAFE_NUMBER, behavior will not be exact
173
- [ IntMode . SAFE_NUMBER , "error" ] ,
174
- [ IntMode . MIXED , BigInt ( - 1 ) * BigInt ( "0x8000000000000000" ) ] ,
175
- [ IntMode . BIGINT , BigInt ( - 1 ) * BigInt ( "0x8000000000000000" ) ] ,
176
- ] ) ,
177
- } ,
178
- } ;
179
- }
180
-
181
- // declared as a function to delay referencing the BigInt constructor
182
- function BIGUINTSPECS ( ) : Record < string , TestCase > {
183
- return {
184
- ZERO : {
185
- input : BigInt ( 0 ) ,
186
- expected : new Map < IntMode , number | bigint > ( [
187
- [ IntMode . UNSAFE_NUMBER , 0 ] ,
188
- [ IntMode . SAFE_NUMBER , 0 ] ,
189
- [ IntMode . MIXED , 0 ] ,
190
- [ IntMode . BIGINT , BigInt ( 0 ) ] ,
191
- ] ) ,
192
- } ,
193
- ONE : {
194
- input : BigInt ( 1 ) ,
195
- expected : new Map < IntMode , number | bigint > ( [
196
- [ IntMode . UNSAFE_NUMBER , 1 ] ,
197
- [ IntMode . SAFE_NUMBER , 1 ] ,
198
- [ IntMode . MIXED , 1 ] ,
199
- [ IntMode . BIGINT , BigInt ( 1 ) ] ,
200
- ] ) ,
201
- } ,
202
- X_FF : {
203
- input : BigInt ( 0xff ) ,
204
- expected : new Map < IntMode , number | bigint > ( [
205
- [ IntMode . UNSAFE_NUMBER , 0xff ] ,
206
- [ IntMode . SAFE_NUMBER , 0xff ] ,
207
- [ IntMode . MIXED , 0xff ] ,
208
- [ IntMode . BIGINT , BigInt ( 0xff ) ] ,
209
- ] ) ,
210
- } ,
211
- UINT32_MAX : {
212
- input : BigInt ( 0xffffffff ) ,
213
- expected : new Map < IntMode , number | bigint > ( [
214
- [ IntMode . UNSAFE_NUMBER , 0xffffffff ] ,
215
- [ IntMode . SAFE_NUMBER , 0xffffffff ] ,
216
- [ IntMode . MIXED , 0xffffffff ] ,
217
- [ IntMode . BIGINT , BigInt ( 0xffffffff ) ] ,
218
- ] ) ,
219
- } ,
220
- MAX_SAFE_INTEGER : {
221
- input : BigInt ( Number . MAX_SAFE_INTEGER ) ,
222
- expected : new Map < IntMode , number | bigint > ( [
223
- [ IntMode . UNSAFE_NUMBER , Number . MAX_SAFE_INTEGER ] ,
224
- [ IntMode . SAFE_NUMBER , Number . MAX_SAFE_INTEGER ] ,
225
- [ IntMode . MIXED , Number . MAX_SAFE_INTEGER ] ,
226
- [ IntMode . BIGINT , BigInt ( Number . MAX_SAFE_INTEGER ) ] ,
227
- ] ) ,
228
- } ,
229
- MAX_SAFE_INTEGER_PLUS_ONE : {
230
- input : BigInt ( Number . MAX_SAFE_INTEGER ) + BigInt ( 1 ) ,
231
- expected : new Map < IntMode , number | bigint | "error" > ( [
232
- // exclude IntMode.UNSAFE_NUMBER, behavior will not be exact
233
- [ IntMode . SAFE_NUMBER , "error" ] ,
234
- [ IntMode . MIXED , BigInt ( Number . MAX_SAFE_INTEGER ) + BigInt ( 1 ) ] ,
235
- [ IntMode . BIGINT , BigInt ( Number . MAX_SAFE_INTEGER ) + BigInt ( 1 ) ] ,
236
- ] ) ,
237
- } ,
238
- UINT64_MAX : {
239
- input : BigInt ( "0xffffffffffffffff" ) ,
240
- expected : new Map < IntMode , number | bigint | "error" > ( [
241
- // exclude IntMode.UNSAFE_NUMBER, behavior will not be exact
242
- [ IntMode . SAFE_NUMBER , "error" ] ,
243
- [ IntMode . MIXED , BigInt ( "0xffffffffffffffff" ) ] ,
244
- [ IntMode . BIGINT , BigInt ( "0xffffffffffffffff" ) ] ,
245
- ] ) ,
246
- } ,
247
- } ;
248
- }
249
-
250
- function abs ( value : bigint ) : bigint {
251
- if ( value < 0 ) {
252
- return BigInt ( - 1 ) * value ;
253
- }
254
- return value ;
255
- }
256
-
257
- const extensionCodec = new ExtensionCodec ( ) ;
258
- extensionCodec . register ( {
259
- type : 0 ,
260
- encode : ( input : unknown ) => {
261
- if ( typeof input === "bigint" ) {
262
- if ( input <= Number . MAX_SAFE_INTEGER && input >= Number . MIN_SAFE_INTEGER ) {
263
- return encode ( parseInt ( input . toString ( ) , 10 ) ) ;
264
- } else {
265
- return encode ( input . toString ( ) ) ;
266
- }
267
- } else {
268
- return null ;
269
- }
270
- } ,
271
- decode : ( data : Uint8Array ) => {
272
- const val = decode ( data ) ;
273
- if ( ! ( typeof val === "string" || typeof val === "number" ) ) {
274
- throw new DecodeError ( `unexpected BigInt source: ${ val } (${ typeof val } )` ) ;
275
- }
276
- return BigInt ( val ) ;
277
- } ,
278
- } ) ;
279
- context ( "extension" , ( ) => {
280
- it ( "encodes and decodes 0n" , ( ) => {
281
- const value = BigInt ( 0 ) ;
282
- const encoded = encode ( value , { extensionCodec } ) ;
283
- assert . deepStrictEqual ( decode ( encoded , { extensionCodec } ) , value ) ;
284
- } ) ;
285
-
286
- it ( "encodes and decodes MAX_SAFE_INTEGER+1" , ( ) => {
287
- const value = BigInt ( Number . MAX_SAFE_INTEGER ) + BigInt ( 1 ) ;
288
- const encoded = encode ( value , { extensionCodec } ) ;
289
- assert . deepStrictEqual ( decode ( encoded , { extensionCodec } ) , value ) ;
290
- } ) ;
291
-
292
- it ( "encodes and decodes MIN_SAFE_INTEGER-1" , ( ) => {
293
- const value = BigInt ( Number . MIN_SAFE_INTEGER ) - BigInt ( 1 ) ;
294
- const encoded = encode ( value , { extensionCodec } ) ;
295
- assert . deepStrictEqual ( decode ( encoded , { extensionCodec } ) , value ) ;
296
- } ) ;
297
- } ) ;
298
-
299
- context ( "native" , ( ) => {
300
- context ( "int 64" , ( ) => {
301
- const specs = BIGINTSPECS ( ) ;
302
-
303
- for ( const name of Object . keys ( specs ) ) {
304
- const testCase = specs [ name ] ! ;
305
-
306
- it ( `sets and gets ${ testCase . input } (${ testCase . input < 0 ? "-" : "" } 0x${ abs ( testCase . input ) . toString (
307
- 16 ,
308
- ) } )`, ( ) => {
309
- const b = new Uint8Array ( 8 ) ;
310
- const view = new DataView ( b . buffer ) ;
311
- view . setBigInt64 ( 0 , testCase . input ) ;
312
- for ( const [ mode , expected ] of testCase . expected ) {
313
- if ( expected === "error" ) {
314
- assert . throws (
315
- ( ) => getInt64 ( view , 0 , mode ) ,
316
- new RegExp (
317
- `Mode is IntMode\\.SAFE_NUMBER and value is not a safe integer: ${ testCase . input < 0 ? "-" : "" } 0x${ abs (
318
- testCase . input ,
319
- ) . toString ( 16 ) } $`,
320
- ) ,
321
- ) ;
322
- continue ;
323
- }
324
- assert . deepStrictEqual ( getInt64 ( view , 0 , mode ) , expected ) ;
325
- }
326
- } ) ;
327
- }
328
- } ) ;
329
-
330
- context ( "uint 64" , ( ) => {
331
- const specs = BIGUINTSPECS ( ) ;
332
-
333
- for ( const name of Object . keys ( specs ) ) {
334
- const testCase = specs [ name ] ! ;
335
-
336
- it ( `sets and gets ${ testCase . input } (0x${ testCase . input . toString ( 16 ) } )` , ( ) => {
337
- const b = new Uint8Array ( 8 ) ;
338
- const view = new DataView ( b . buffer ) ;
339
- view . setBigUint64 ( 0 , testCase . input ) ;
340
- for ( const [ mode , expected ] of testCase . expected ) {
341
- if ( expected === "error" ) {
342
- assert . throws (
343
- ( ) => getUint64 ( view , 0 , mode ) ,
344
- new RegExp (
345
- `Mode is IntMode\\.SAFE_NUMBER and value is not a safe integer: 0x${ testCase . input . toString ( 16 ) } $` ,
346
- ) ,
347
- ) ;
348
- continue ;
349
- }
350
- assert . deepStrictEqual ( getUint64 ( view , 0 , mode ) , expected ) ;
351
- }
352
- } ) ;
353
- }
354
- } ) ;
355
- } ) ;
0 commit comments