cbor-x 0.9.4 → 1.0.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/tests/test.js DELETED
@@ -1,596 +0,0 @@
1
- import * as CBOR from '../index.js'
2
- import chai from 'chai'
3
- import sampleData from './example4.json'
4
- //import inspector from 'inspector'; inspector.open(9229, null, true); debugger
5
- function tryRequire(module) {
6
- try {
7
- return require(module)
8
- } catch(error) {
9
- return {}
10
- }
11
- }
12
- var assert = chai.assert
13
-
14
- var Encoder = CBOR.Encoder
15
- var EncoderStream = CBOR.EncoderStream
16
- var DecoderStream = CBOR.DecoderStream
17
- var decode = CBOR.decode
18
- var encode = CBOR.encode
19
- var DECIMAL_FIT = CBOR.DECIMAL_FIT
20
-
21
- var addExtension = CBOR.addExtension
22
-
23
- var zlib = tryRequire('zlib')
24
- var deflateSync = zlib.deflateSync
25
- var inflateSync = zlib.inflateSync
26
- var deflateSync = zlib.brotliCompressSync
27
- var inflateSync = zlib.brotliDecompressSync
28
- var constants = zlib.constants
29
- try {
30
- // var { decode, encode } = require('msgencode-lite')
31
- } catch (error) {}
32
-
33
- var ITERATIONS = 4000
34
-
35
- suite('CBOR basic tests', function(){
36
- test('encode/decode data', function(){
37
- var data = {
38
- data: [
39
- { a: 1, name: 'one', type: 'odd', isOdd: true },
40
- { a: 2, name: 'two', type: 'even'},
41
- { a: 3, name: 'three', type: 'odd', isOdd: true },
42
- { a: 4, name: 'four', type: 'even'},
43
- { a: 5, name: 'five', type: 'odd', isOdd: true },
44
- { a: 6, name: 'six', type: 'even', isOdd: null }
45
- ],
46
- description: 'some names',
47
- types: ['odd', 'even'],
48
- convertEnumToNum: [
49
- { prop: 'test' },
50
- { prop: 'test' },
51
- { prop: 'test' },
52
- { prop: 1 },
53
- { prop: 2 },
54
- { prop: [undefined] },
55
- { prop: null }
56
- ]
57
- }
58
- let structures = []
59
- let encoder = new Encoder({ structures })
60
- var serialized = encoder.encode(data)
61
- var deserialized = encoder.decode(serialized)
62
- assert.deepEqual(deserialized, data)
63
- })
64
-
65
- test('mixed array', function(){
66
- var data = [
67
- 'one',
68
- 'two',
69
- 'one',
70
- 10,
71
- 11,
72
- null,
73
- true,
74
- 'three',
75
- 'three',
76
- 'one', [
77
- 3, -5, -50, -400,1.3, -5.3, true
78
- ]
79
- ]
80
- let structures = []
81
- let encoder = new Encoder({ structures })
82
- var serialized = encoder.encode(data)
83
- var deserialized = encoder.decode(serialized)
84
- assert.deepEqual(deserialized, data)
85
- })
86
-
87
- test('255 chars', function() {
88
- const data = 'RRZG9A6I7xupPeOZhxcOcioFsuhszGOdyDUcbRf4Zef2kdPIfC9RaLO4jTM5JhuZvTsF09fbRHMGtqk7YAgu3vespeTe9l61ziZ6VrMnYu2CamK96wCkmz0VUXyqaiUoTPgzk414LS9yYrd5uh7w18ksJF5SlC2e91rukWvNqAZJjYN3jpkqHNOFchCwFrhbxq2Lrv1kSJPYCx9blRg2hGmYqTbElLTZHv20iNqwZeQbRMgSBPT6vnbCBPnOh1W'
89
- var serialized = CBOR.encode(data)
90
- var deserialized = CBOR.decode(serialized)
91
- assert.equal(deserialized, data)
92
- })
93
-
94
- test('encode/decode sample data', function(){
95
- var data = sampleData
96
- var serialized = CBOR.encode(data)
97
- var deserialized = CBOR.decode(serialized)
98
- assert.deepEqual(deserialized, data)
99
- var serialized = CBOR.encode(data)
100
- var deserialized = CBOR.decode(serialized)
101
- assert.deepEqual(deserialized, data)
102
- })
103
- test('encode/decode sample data with records', function(){
104
- var data = sampleData
105
- let structures = []
106
- let encoder = new Encoder({ structures, useRecords: true })
107
- var serialized = encoder.encode(data)
108
- var deserialized = encoder.decode(serialized)
109
- assert.deepEqual(deserialized, data)
110
- })
111
- test('encode/decode sample data with packing', function(){
112
- var data = sampleData
113
- let encoder = new Encoder({ pack: true, useRecords: false })
114
- var serialized = encoder.encode(data)
115
- var deserialized = encoder.decode(serialized)
116
- assert.deepEqual(deserialized, data)
117
- })
118
- test('encode/decode sample data with packing and records', function(){
119
- var data = sampleData
120
- let structures = []
121
- let encoder = new Encoder({ structures, pack: true, useRecords: true })
122
- var serialized = encoder.encode(data)
123
- var deserialized = encoder.decode(serialized)
124
- assert.deepEqual(deserialized, data)
125
- })
126
- test('encode/decode sample data with shared packing and records', function(){
127
- let encoder = new Encoder({ useRecords: true })
128
- let finishPack = encoder.findCommonStringsToPack()
129
- for (let i = 0; i < 20; i++) {
130
- let data = {
131
- shouldShare: 'same each time',
132
- shouldShare2: 'same each time 2',
133
- shouldntShare: 'different each time ' + i
134
- }
135
- if (i == 10)
136
- finishPack({})
137
- var serialized = encoder.encode(data)
138
- var deserialized = encoder.decode(serialized)
139
- assert.deepEqual(deserialized, data)
140
- }
141
- })
142
- test('encode/decode sample data with individual packing, shared packing and records', function(){
143
- let encoder = new Encoder({ pack: true, useRecords: true })
144
- let finishPack = encoder.findCommonStringsToPack()
145
- for (let i = 0; i < 20; i++) {
146
- let data = {
147
- shouldShare: 'same each time',
148
- shouldShare2: 'same each time',
149
- shouldntShare: 'different each time ' + i,
150
- shouldntShare2: 'different each time ' + i,
151
- noPack: 'no packing ' + i,
152
- }
153
- if (i == 10)
154
- finishPack({ threshold: 5 })
155
- var serialized = encoder.encode(data)
156
- var deserialized = encoder.decode(serialized)
157
- assert.deepEqual(deserialized, data)
158
- }
159
- })
160
- if (typeof Buffer != 'undefined')
161
- test('replace data', function(){
162
- var data1 = {
163
- data: [
164
- { a: 1, name: 'one', type: 'odd', isOdd: true, a: '13 characters' },
165
- { a: 2, name: 'two', type: 'even', a: '11 characte' },
166
- { a: 3, name: 'three', type: 'odd', isOdd: true, a: '12 character' },
167
- { a: 4, name: 'four', type: 'even', a: '9 charact'},
168
- { a: 5, name: 'five', type: 'odd', isOdd: true, a: '14 characters!' },
169
- { a: 6, name: 'six', type: 'even', isOdd: null }
170
- ],
171
- }
172
- var data2 = {
173
- data: [
174
- { foo: 7, name: 'one', type: 'odd', isOdd: true },
175
- { foo: 8, name: 'two', type: 'even'},
176
- { foo: 9, name: 'three', type: 'odd', isOdd: true },
177
- { foo: 10, name: 'four', type: 'even'},
178
- { foo: 11, name: 'five', type: 'odd', isOdd: true },
179
- { foo: 12, name: 'six', type: 'even', isOdd: null }
180
- ],
181
- }
182
- var serialized1 = encode(data1)
183
- var serialized2 = encode(data2)
184
- var b = Buffer.alloc(8000)
185
- serialized1.copy(b)
186
- var deserialized1 = decode(b, serialized1.length)
187
- serialized2.copy(b)
188
- var deserialized2 = decode(b, serialized2.length)
189
- assert.deepEqual(deserialized1, data1)
190
- assert.deepEqual(deserialized2, data2)
191
- })
192
-
193
- test('extended class encode/decode', function(){
194
- function Extended() {
195
-
196
- }
197
- Extended.prototype.getDouble = function() {
198
- return this.value * 2
199
- }
200
- var instance = new Extended()
201
- instance.value = 4
202
- instance.string = 'decode this: ᾜ'
203
- var data = {
204
- prop1: 'has multi-byte: ᾜ',
205
- extendedInstance: instance,
206
- prop2: 'more string',
207
- num: 3,
208
- }
209
- let encoder = new Encoder()
210
- addExtension({
211
- Class: Extended,
212
- tag: 300,
213
- decode: function(data) {
214
- let e = new Extended()
215
- e.value = data[0]
216
- e.string = data[1]
217
- return e
218
- },
219
- encode: function(instance) {
220
- return encoder.encode([instance.value, instance.string])
221
- }
222
- })
223
- var serialized = encode(data)
224
- var deserialized = decode(serialized)
225
- assert.deepEqual(data, deserialized)
226
- assert.equal(deserialized.extendedInstance.getDouble(), 8)
227
- })
228
-
229
- test.skip('text decoder', function() {
230
- let td = new TextDecoder('ISO-8859-15')
231
- let b = Buffer.alloc(3)
232
- let total = 0
233
- for (var i = 0; i < 256; i++) {
234
- b[0] = i
235
- b[1] = 0
236
- b[2] = 0
237
- let s = td.decode(b)
238
- if (!require('CBOR-extract').isOneByte(s)) {
239
- console.log(i.toString(16), s.length)
240
- total++
241
- }
242
- }
243
- })
244
-
245
- test('structured cloning: self reference', function() {
246
- let object = {
247
- test: 'string',
248
- children: [
249
- { name: 'child' }
250
- ]
251
- }
252
- object.self = object
253
- object.children[1] = object
254
- object.children[2] = object.children[0]
255
- object.childrenAgain = object.children
256
- let encoder = new Encoder({
257
- structuredClone: true,
258
- })
259
- var serialized = encoder.encode(object)
260
- var deserialized = encoder.decode(serialized)
261
- assert.equal(deserialized.self, deserialized)
262
- assert.equal(deserialized.children[0].name, 'child')
263
- assert.equal(deserialized.children[1], deserialized)
264
- assert.equal(deserialized.children[0], deserialized.children[2])
265
- assert.equal(deserialized.children, deserialized.childrenAgain)
266
- })
267
-
268
- test('structured cloning: types', function() {
269
- let b = typeof Buffer != 'undefined' ? Buffer.alloc(20) : new Uint8Array(20)
270
- let fa = new Float32Array(b.buffer, 8, 2)
271
- fa[0] = 2.25
272
- fa[1] = 6
273
- let map = new Map()
274
- map.set('key', 'value')
275
- let object = {
276
- error: new Error('test'),
277
- set: new Set(['a', 'b']),
278
- regexp: /test/gi,
279
- map,
280
- float32Array: fa,
281
- uint16Array: new Uint16Array([3,4])
282
- }
283
- let encoder = new Encoder({
284
- structuredClone: true,
285
- })
286
- var serialized = encoder.encode(object)
287
- var deserialized = encoder.decode(serialized)
288
- assert.deepEqual(Array.from(deserialized.set), Array.from(object.set))
289
- assert.equal(deserialized.map.get('key'), 'value')
290
- assert.equal(deserialized.error.message, object.error.message)
291
- assert.equal(deserialized.regexp.test('TEST'), true)
292
- assert.equal(deserialized.float32Array.constructor.name, 'Float32Array')
293
- assert.equal(deserialized.float32Array[0], 2.25)
294
- assert.equal(deserialized.float32Array[1], 6)
295
- assert.equal(deserialized.uint16Array.constructor.name, 'Uint16Array')
296
- assert.equal(deserialized.uint16Array[0], 3)
297
- assert.equal(deserialized.uint16Array[1], 4)
298
- })
299
-
300
- test('explicit maps and sets', function () {
301
- let map = new Map()
302
- map.set('key', { inside: 'value'})
303
- let object = {
304
- set: new Set(['a', 'b']),
305
- map,
306
- }
307
- var serialized = encode(object) // default encoder
308
- var deserialized = decode(serialized)
309
- assert.deepEqual(Array.from(deserialized.set), Array.from(object.set))
310
- assert.equal(deserialized.map.get('key').inside, 'value')
311
- })
312
-
313
- test('object without prototype', function(){
314
- var data = Object.create(null)
315
- data.test = 3
316
- var serialized = encode(data)
317
- var deserialized = decode(serialized)
318
- assert.deepEqual(deserialized, data)
319
- })
320
-
321
- test('big buffer', function() {
322
- var size = 100000000
323
- var data = new Uint8Array(size).fill(1)
324
- var encoded = encode(data)
325
- var decoded = decode(encoded)
326
- assert.equal(decoded.length, size)
327
- })
328
- test('little buffer', function() {
329
- var data = typeof Buffer == 'undefined' ? new Uint8Array(0) : Buffer.alloc(0)
330
- var encoded = encode(data)
331
- assert.equal(encoded.length, 1) // make sure to use canonical form
332
- var decoded = decode(encoded)
333
- assert.equal(decoded.length, 0)
334
- })
335
-
336
- test('random strings', function(){
337
- var data = []
338
- for (var i = 0; i < 2000; i++) {
339
- var str = 'test'
340
- while (Math.random() < 0.7 && str.length < 0x100000) {
341
- str = str + String.fromCharCode(90/(Math.random() + 0.01)) + str
342
- }
343
- data.push(str)
344
- }
345
- var serialized = encode(data)
346
- var deserialized = decode(serialized)
347
- assert.deepEqual(deserialized, data)
348
- })
349
-
350
- test('map/date', function(){
351
- var map = new Map()
352
- map.set(4, 'four')
353
- map.set('three', 3)
354
-
355
-
356
- var data = {
357
- map: map,
358
- date: new Date(1532219539733),
359
- farFutureDate: new Date(3532219539133),
360
- ancient: new Date(-3532219539133),
361
- }
362
- let encoder = new Encoder()
363
- var serialized = encoder.encode(data)
364
- var deserialized = encoder.decode(serialized)
365
- assert.equal(deserialized.map.get(4), 'four')
366
- assert.equal(deserialized.map.get('three'), 3)
367
- assert.equal(deserialized.date.getTime(), 1532219539733)
368
- assert.equal(deserialized.farFutureDate.getTime(), 3532219539133)
369
- assert.equal(deserialized.ancient.getTime(), -3532219539133)
370
- })
371
- test('map/date with options', function(){
372
- var map = new Map()
373
- map.set(4, 'four')
374
- map.set('three', 3)
375
- var data = {
376
- map: map,
377
- date: new Date(1532219539011),
378
- }
379
- let encoder = new Encoder({
380
- mapsAsObjects: true,
381
- useTimestamp32: true,
382
- useTag259ForMaps: false,
383
- })
384
- var serialized = encoder.encode(data)
385
- var deserialized = encoder.decode(serialized)
386
- assert.equal(deserialized.map[4], 'four')
387
- assert.equal(deserialized.map.three, 3)
388
- assert.equal(deserialized.date.getTime(), 1532219539000)
389
- })
390
- test('key caching', function() {
391
- var data = {
392
- foo: 2,
393
- bar: 'test',
394
- four: 4,
395
- seven: 7,
396
- foz: 3,
397
- }
398
- var serialized = CBOR.encode(data)
399
- var deserialized = CBOR.decode(serialized)
400
- assert.deepEqual(deserialized, data)
401
- // do multiple times to test caching
402
- var serialized = CBOR.encode(data)
403
- var deserialized = CBOR.decode(serialized)
404
- assert.deepEqual(deserialized, data)
405
- var serialized = CBOR.encode(data)
406
- var deserialized = CBOR.decode(serialized)
407
- assert.deepEqual(deserialized, data)
408
- })
409
- test('strings', function() {
410
- var data = ['']
411
- var serialized = encode(data)
412
- var deserialized = decode(serialized)
413
- assert.deepEqual(deserialized, data)
414
- // do multiple times
415
- var serialized = encode(data)
416
- var deserialized = decode(serialized)
417
- assert.deepEqual(deserialized, data)
418
- data = 'decode this: ᾜ'
419
- var serialized = encode(data)
420
- var deserialized = decode(serialized)
421
- assert.deepEqual(deserialized, data)
422
- data = 'decode this that is longer but without any non-latin characters'
423
- var serialized = encode(data)
424
- var deserialized = decode(serialized)
425
- assert.deepEqual(deserialized, data)
426
- })
427
- test('decimal float32', function() {
428
- var data = {
429
- a: 2.526,
430
- b: 0.0035235,
431
- c: 0.00000000000352501,
432
- d: 3252.77,
433
- }
434
- let encoder = new Encoder({
435
- useFloat32: DECIMAL_FIT
436
- })
437
- var serialized = encoder.encode(data)
438
- assert.equal(serialized.length, 35)
439
- var deserialized = encoder.decode(serialized)
440
- assert.deepEqual(deserialized, data)
441
- })
442
- test('bigint to float', function() {
443
- var data = {
444
- a: 325283295382932843n
445
- }
446
- let encoder = new Encoder({
447
- int64AsNumber: true
448
- })
449
- var serialized = encoder.encode(data)
450
- var deserialized = encoder.decode(serialized)
451
- assert.deepEqual(deserialized.a, 325283295382932843)
452
- })
453
- test('numbers', function(){
454
- var data = {
455
- bigEncodable: 48978578104322,
456
- dateEpoch: 1530886513200,
457
- realBig: 3432235352353255323,
458
- decimal: 32.55234,
459
- negative: -34.11,
460
- exponential: 0.234e123,
461
- tiny: 3.233e-120,
462
- zero: 0,
463
- //negativeZero: -0,
464
- Infinity: Infinity
465
- }
466
- var serialized = encode(data)
467
- var deserialized = decode(serialized)
468
- assert.deepEqual(deserialized, data)
469
- })
470
-
471
- test('iterator/indefinite length array', function(){
472
- class NotArray {
473
- }
474
- let data = ['a', 'b', 'c', ['d']] // iterable
475
- data.constructor = NotArray
476
- var serialized = encode(data)
477
- var deserialized = decode(serialized)
478
- assert.deepEqual(deserialized, data)
479
- })
480
- test('bigint', function(){
481
- var data = {
482
- bigintSmall: 352n,
483
- bigintSmallNegative: -333335252n,
484
- bigintBig: 2n**64n - 1n, // biggest possible
485
- bigintBigNegative: -(2n**63n), // largest negative
486
- mixedWithNormal: 44,
487
- }
488
- var serialized = encode(data)
489
- var deserialized = decode(serialized)
490
- assert.deepEqual(deserialized, data)
491
- var tooBigInt = {
492
- tooBig: 2n**66n
493
- }
494
- assert.throws(function(){ serialized = encode(tooBigInt) })
495
- let encoder = new Encoder({
496
- largeBigIntToFloat: true
497
- })
498
- serialized = encoder.encode(tooBigInt)
499
- deserialized = decode(serialized)
500
- assert.isTrue(deserialized.tooBig > 2n**65n)
501
- })
502
-
503
- test('buffers', function() {
504
- var data = {
505
- buffer1: new Uint8Array([2,3,4]),
506
- buffer2: new Uint8Array(encode(sampleData))
507
- }
508
- var serialized = encode(data)
509
- var deserialized = decode(serialized)
510
- assert.deepEqual(deserialized, data)
511
- })
512
-
513
- test('noteencode test', function() {
514
- const data = {
515
- foo: 1,
516
- bar: [1, 2, 3, 4, 'abc', 'def'],
517
- foobar: {
518
- foo: true,
519
- bar: -2147483649,
520
- foobar: {
521
- foo: new Uint8Array([1, 2, 3, 4, 5]),
522
- bar: 1.5,
523
- foobar: [true, false, 'abcdefghijkmonpqrstuvwxyz']
524
- }
525
- }
526
- };
527
- var serialized = encode(data)
528
- var deserialized = decode(serialized)
529
- var deserialized = decode(serialized)
530
- var deserialized = decode(serialized)
531
- assert.deepEqual(deserialized, data)
532
- })
533
-
534
- test('utf16 causing expansion', function() {
535
- this.timeout(10000)
536
- let data = {fixstr: 'ᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝ', str8:'ᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝ'}
537
- var serialized = encode(data)
538
- var deserialized = decode(serialized)
539
- assert.deepEqual(deserialized, data)
540
- })
541
- test('decodeMultiple', () => {
542
- let values = CBOR.decodeMultiple(new Uint8Array([1, 2, 3, 4]))
543
- assert.deepEqual(values, [1, 2, 3, 4])
544
- values = []
545
- CBOR.decodeMultiple(new Uint8Array([1, 2, 3, 4]), value => values.push(value))
546
- assert.deepEqual(values, [1, 2, 3, 4])
547
- })
548
-
549
- })
550
- suite('CBOR performance tests', function(){
551
- test('performance JSON.parse', function() {
552
- var data = sampleData
553
- this.timeout(10000)
554
- let structures = []
555
- var serialized = JSON.stringify(data)
556
- console.log('JSON size', serialized.length)
557
- for (var i = 0; i < ITERATIONS; i++) {
558
- var deserialized = JSON.parse(serialized)
559
- }
560
- })
561
- test('performance JSON.stringify', function() {
562
- var data = sampleData
563
- this.timeout(10000)
564
- for (var i = 0; i < ITERATIONS; i++) {
565
- var serialized = JSON.stringify(data)
566
- }
567
- })
568
- test('performance decode', function() {
569
- var data = sampleData
570
- this.timeout(10000)
571
- let structures = []
572
- var serialized = encode(data)
573
- console.log('CBOR size', serialized.length)
574
- let encoder = new Encoder({ structures })
575
- var serialized = encoder.encode(data)
576
- console.log('CBOR w/ record ext size', serialized.length)
577
- for (var i = 0; i < ITERATIONS; i++) {
578
- var deserialized = encoder.decode(serialized)
579
- }
580
- })
581
- test('performance encode', function() {
582
- var data = sampleData
583
- this.timeout(10000)
584
- let structures = []
585
- let encoder = new Encoder({ structures })
586
- let buffer = typeof Buffer != 'undefined' ? Buffer.alloc(0x10000) : new Uint8Array(0x10000)
587
-
588
- for (var i = 0; i < ITERATIONS; i++) {
589
- //serialized = encode(data, { shared: sharedStructure })
590
- encoder.useBuffer(buffer)
591
- var serialized = encoder.encode(data)
592
- //var serializedGzip = deflateSync(serialized)
593
- }
594
- //console.log('serialized', serialized.length, global.propertyComparisons)
595
- })
596
- })