test.js 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. import { assert } from 'chai'
  2. import { toBufferKey, fromBufferKey, readKey, writeKey } from '../index.js'
  3. function assertBufferComparison(lesser, greater) {
  4. for (let i = 0; i < lesser.length; i++) {
  5. if (lesser[i] < greater[i]) {
  6. return
  7. }
  8. if (lesser[i] > (greater[i] || 0)) {
  9. assert.fail('Byte ' + i + 'should not be ' + lesser[i] + '>' + greater[i])
  10. }
  11. }
  12. }
  13. //var inspector = require('inspector'); inspector.open(9330, null, true); debugger
  14. let seed = 0;
  15. export function random() {
  16. seed++;
  17. let a = seed * 15485863;
  18. return ((a * a * a) % 2038074743) / 2038074743;
  19. }
  20. suite('key buffers', () => {
  21. test('numbers equivalence', () => {
  22. assert.strictEqual(fromBufferKey(toBufferKey(4)), 4)
  23. assert.strictEqual(fromBufferKey(toBufferKey(-4)), -4)
  24. assert.strictEqual(fromBufferKey(toBufferKey(3.4)), 3.4)
  25. assert.strictEqual(fromBufferKey(toBufferKey(Math.PI)), Math.PI)
  26. assert.strictEqual(fromBufferKey(toBufferKey(2002225)), 2002225)
  27. assert.strictEqual(fromBufferKey(toBufferKey(9377288)), 9377288)
  28. assert.strictEqual(fromBufferKey(toBufferKey(1503579323825)), 1503579323825)
  29. assert.strictEqual(fromBufferKey(toBufferKey(1503579323825.3523532)), 1503579323825.3523532)
  30. assert.strictEqual(fromBufferKey(toBufferKey(-1503579323825)), -1503579323825)
  31. assert.strictEqual(fromBufferKey(toBufferKey(0.00005032)), 0.00005032)
  32. assert.strictEqual(fromBufferKey(toBufferKey(-0.00005032)), -0.00005032)
  33. assert.strictEqual(fromBufferKey(toBufferKey(0.00000000000000000000000005431)), 0.00000000000000000000000005431)
  34. })
  35. test('within buffer equivalence', () => {
  36. let buffer = Buffer.alloc(1024, 0xff);
  37. let length = writeKey(2002225, buffer, 0);
  38. let position = length;
  39. buffer[position++] = 0xff;
  40. buffer[position++] = 0xff;
  41. assert.strictEqual(readKey(buffer, 0, length), 2002225);
  42. length = writeKey('hello, world', buffer, 0);
  43. assert.strictEqual(readKey(buffer, 0, length), 'hello, world');
  44. // ensure that reading the string didn't modify the buffer after the string (or is restored at least)
  45. assert.strictEqual(buffer[length], 0xff);
  46. });
  47. test('number comparison', () => {
  48. assertBufferComparison(toBufferKey(4), toBufferKey(5))
  49. assertBufferComparison(toBufferKey(1503579323824), toBufferKey(1503579323825))
  50. assertBufferComparison(toBufferKey(1.4), toBufferKey(2))
  51. assertBufferComparison(toBufferKey(0.000000001), toBufferKey(0.00000001))
  52. assertBufferComparison(toBufferKey(-4), toBufferKey(3))
  53. assertBufferComparison(toBufferKey(0), toBufferKey(1))
  54. assertBufferComparison(toBufferKey(-0.001), toBufferKey(0))
  55. assertBufferComparison(toBufferKey(-0.001), toBufferKey(-0.000001))
  56. assertBufferComparison(toBufferKey(-5236532532532), toBufferKey(-5236532532531))
  57. })
  58. test('bigint equivalence', () => {
  59. assert.strictEqual(fromBufferKey(toBufferKey(-35913040084491349n)), -35913040084491349n)
  60. assert.strictEqual(fromBufferKey(toBufferKey(6135421331404949076605986n)), 6135421331404949076605986n)
  61. assert.strictEqual(fromBufferKey(toBufferKey(0xfffffffffffffffffffffn)), 0xfffffffffffffffffffffn)
  62. assert.strictEqual(fromBufferKey(toBufferKey(12345678901234567890n)), 12345678901234567890n)
  63. assert.deepEqual(fromBufferKey(toBufferKey([12345678901234567890n, 44])), [12345678901234567890n, 44])
  64. assert.deepEqual(fromBufferKey(toBufferKey(['hi', 12345678901234567890n])), ['hi', 12345678901234567890n])
  65. assert.deepEqual(fromBufferKey(toBufferKey([6135421331404949076605986n, 'after'])), [6135421331404949076605986n, 'after'])
  66. assert.strictEqual(fromBufferKey(toBufferKey(132923456789012345678903533235253252353211125n)), 132923456789012345678903533235253252353211125n)
  67. assert.strictEqual(fromBufferKey(toBufferKey(352n)), 352)
  68. let num = 5325n
  69. for (let i = 0; i < 1100; i++) {
  70. num *= BigInt(Math.floor(random() * 3 + 1));
  71. num -= BigInt(Math.floor(random() * 1000));
  72. assert.strictEqual(BigInt(fromBufferKey(toBufferKey(num))), num)
  73. assert.strictEqual(BigInt(fromBufferKey(toBufferKey(-num))), -num)
  74. }
  75. assert.strictEqual(fromBufferKey(toBufferKey(-352n)), -352)
  76. })
  77. test('bigint comparison', () => {
  78. assertBufferComparison(toBufferKey(0xfffffffffffffffffffffn), toBufferKey(0x100fffffffffffffffffffn))
  79. assertBufferComparison(toBufferKey(12345678901234567890), toBufferKey(12345678901234567890n))
  80. assertBufferComparison(toBufferKey(6135421331404949076605986n), toBufferKey(6135421331404949076605987n))
  81. assertBufferComparison(toBufferKey(-6135421331404949076605986n), toBufferKey(-6135421331404949076605985n))
  82. assertBufferComparison(toBufferKey(-35913040084491349n), toBufferKey(-35913040084491348n))
  83. })
  84. test('string equivalence', () => {
  85. assert.strictEqual(fromBufferKey(toBufferKey('4')), '4')
  86. assert.strictEqual(fromBufferKey(toBufferKey('hello')), 'hello')
  87. assert.strictEqual(fromBufferKey(toBufferKey('')), '')
  88. assert.strictEqual(fromBufferKey(toBufferKey('\x00')), '\x00')
  89. assert.strictEqual(fromBufferKey(toBufferKey('\x03test\x01\x00')), '\x03test\x01\x00')
  90. assert.strictEqual(fromBufferKey(toBufferKey('prance 🧚🏻‍♀️🩷')), 'prance 🧚🏻‍♀️🩷')
  91. })
  92. test('string comparison', () => {
  93. assertBufferComparison(toBufferKey('4'), toBufferKey('5'))
  94. assertBufferComparison(toBufferKey('and'), toBufferKey('bad'))
  95. assertBufferComparison(toBufferKey('hello'), toBufferKey('hello2'))
  96. let buffer = Buffer.alloc(1024)
  97. let end = writeKey(['this is a test', 5.25], buffer, 0)
  98. })
  99. test('boolean equivalence', () => {
  100. assert.strictEqual(fromBufferKey(toBufferKey(true)), true)
  101. assert.strictEqual(fromBufferKey(toBufferKey(false)), false)
  102. })
  103. test('multipart equivalence', () => {
  104. assert.deepEqual(fromBufferKey(toBufferKey([4, 5])),
  105. [4, 5])
  106. assert.deepEqual(fromBufferKey(toBufferKey(['hello', 5.25])),
  107. ['hello', 5.25])
  108. assert.deepEqual(fromBufferKey(toBufferKey([true, 1503579323825])),
  109. [true, 1503579323825])
  110. assert.deepEqual(fromBufferKey(toBufferKey([-0.2525, 'sec\x00nd'])),
  111. [-0.2525, 'sec\x00nd'])
  112. assert.deepEqual(fromBufferKey(toBufferKey([-0.2525, '2nd', '3rd'])),
  113. [-0.2525, '2nd', '3rd'])
  114. })
  115. test('multipart comparison', () => {
  116. assertBufferComparison(
  117. Buffer.concat([toBufferKey(4), Buffer.from([30]), toBufferKey(5)]),
  118. Buffer.concat([toBufferKey(5), Buffer.from([30]), toBufferKey(5)]))
  119. assertBufferComparison(
  120. Buffer.concat([toBufferKey(4), Buffer.from([30]), toBufferKey(5)]),
  121. Buffer.concat([toBufferKey(4), Buffer.from([30]), toBufferKey(6)]))
  122. assertBufferComparison(
  123. Buffer.concat([toBufferKey('and'), Buffer.from([30]), toBufferKey(5)]),
  124. Buffer.concat([toBufferKey('and2'), Buffer.from([30]), toBufferKey(5)]))
  125. assertBufferComparison(
  126. Buffer.concat([toBufferKey(4), Buffer.from([30]), toBufferKey('and')]),
  127. Buffer.concat([toBufferKey(4), Buffer.from([30]), toBufferKey('cat')]))
  128. })
  129. test('performance', () => {
  130. let buffer = Buffer.alloc(1024)
  131. let start = process.hrtime.bigint()
  132. let end, value
  133. for (let i = 0; i < 1000000; i++) {
  134. end = writeKey('this is a test of a longer string to read and write', buffer, 0)
  135. }
  136. console.log('writeKey string time', nextTime(), end)
  137. for (let i = 0; i < 1000000; i++) {
  138. value = readKey(buffer, 0, end)
  139. }
  140. console.log('readKey string time', nextTime(), value)
  141. for (let i = 0; i < 1000000; i++) {
  142. end = writeKey(33456, buffer, 0)
  143. }
  144. console.log('writeKey number time', nextTime(), end)
  145. for (let i = 0; i < 1000000; i++) {
  146. value = readKey(buffer, 2, end)
  147. }
  148. console.log('readKey number time', nextTime(), value)
  149. for (let i = 0; i < 1000000; i++) {
  150. end = writeKey(['hello', 33456], buffer, 0)
  151. }
  152. console.log('writeKey array time', nextTime(), end, buffer.slice(0, end))
  153. for (let i = 0; i < 1000000; i++) {
  154. value = readKey(buffer, 0, end)
  155. }
  156. console.log('readKey array time', nextTime(), value)
  157. function nextTime() {
  158. let ns = process.hrtime.bigint()
  159. let elapsed = ns - start
  160. start = ns
  161. return Number(elapsed) / 1000000 + 'ns'
  162. }
  163. })
  164. })