lib0 0.2.49 → 0.2.52
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/.github/workflows/node.js.yml +1 -1
- package/README.md +23 -23
- package/broadcastchannel.d.ts +4 -4
- package/broadcastchannel.d.ts.map +1 -1
- package/broadcastchannel.js +7 -6
- package/decoding.d.ts +2 -0
- package/decoding.d.ts.map +1 -1
- package/decoding.js +39 -14
- package/dist/{broadcastchannel-1ac6c212.cjs → broadcastchannel-7655b66f.cjs} +9 -8
- package/dist/broadcastchannel-7655b66f.cjs.map +1 -0
- package/dist/broadcastchannel.cjs +2 -2
- package/dist/broadcastchannel.d.ts +4 -4
- package/dist/broadcastchannel.d.ts.map +1 -1
- package/dist/{buffer-c98f67d5.cjs → buffer-d3ba308b.cjs} +92 -28
- package/dist/buffer-d3ba308b.cjs.map +1 -0
- package/dist/buffer.cjs +1 -1
- package/dist/cache.cjs +3 -0
- package/dist/cache.cjs.map +1 -1
- package/dist/decoding.cjs +4 -2
- package/dist/decoding.cjs.map +1 -1
- package/dist/decoding.d.ts +2 -0
- package/dist/decoding.d.ts.map +1 -1
- package/dist/encoding.cjs +4 -1
- package/dist/encoding.cjs.map +1 -1
- package/dist/encoding.d.ts +3 -0
- package/dist/encoding.d.ts.map +1 -1
- package/dist/encoding.test.d.ts +6 -1
- package/dist/encoding.test.d.ts.map +1 -1
- package/dist/index.cjs +3 -3
- package/dist/list.cjs +52 -1
- package/dist/list.cjs.map +1 -1
- package/dist/list.d.ts +5 -0
- package/dist/list.d.ts.map +1 -1
- package/dist/list.test.d.ts.map +1 -1
- package/dist/number.test.d.ts +1 -0
- package/dist/number.test.d.ts.map +1 -1
- package/dist/{prng-1aa0a1bc.cjs → prng-76a2f4be.cjs} +3 -3
- package/dist/prng-76a2f4be.cjs.map +1 -0
- package/dist/prng.cjs +2 -2
- package/dist/prng.d.ts +1 -1
- package/dist/random.cjs +7 -1
- package/dist/random.cjs.map +1 -1
- package/dist/random.d.ts +1 -0
- package/dist/random.d.ts.map +1 -1
- package/dist/random.test.d.ts +1 -0
- package/dist/random.test.d.ts.map +1 -1
- package/dist/testing.cjs +5 -5
- package/dist/testing.cjs.map +1 -1
- package/encoding.d.ts +3 -0
- package/encoding.d.ts.map +1 -1
- package/encoding.js +46 -14
- package/encoding.test.d.ts +6 -1
- package/encoding.test.d.ts.map +1 -1
- package/list.d.ts +5 -0
- package/list.d.ts.map +1 -1
- package/list.js +46 -1
- package/list.test.d.ts.map +1 -1
- package/number.test.d.ts +1 -0
- package/number.test.d.ts.map +1 -1
- package/package.json +2 -2
- package/prng.d.ts +1 -1
- package/prng.js +1 -1
- package/random.d.ts +1 -0
- package/random.d.ts.map +1 -1
- package/random.js +6 -1
- package/random.test.d.ts +1 -0
- package/random.test.d.ts.map +1 -1
- package/testing.js +3 -3
- package/.circleci/config.yml +0 -7
- package/dist/broadcastchannel-1ac6c212.cjs.map +0 -1
- package/dist/buffer-c98f67d5.cjs.map +0 -1
- package/dist/prng-1aa0a1bc.cjs.map +0 -1
- package/dist/test.cjs +0 -7604
- package/dist/test.cjs.map +0 -1
- package/dist/test.d.ts +0 -2
- package/dist/test.d.ts.map +0 -1
- package/dist/test.js +0 -7631
- package/dist/test.js.map +0 -1
package/dist/testing.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.cjs","sources":["../testing.js"],"sourcesContent":["/**\n * Testing framework with support for generating tests.\n *\n * ```js\n * // test.js template for creating a test executable\n * import { runTests } from 'lib0/testing.js'\n * import * as log from 'lib0/logging.js'\n * import * as mod1 from './mod1.test.js'\n * import * as mod2 from './mod2.test.js'\n\n * import { isBrowser, isNode } from 'lib0/environment.js'\n *\n * if (isBrowser) {\n * // optional: if this is ran in the browser, attach a virtual console to the dom\n * log.createVConsole(document.body)\n * }\n *\n * runTests({\n * mod1,\n * mod2,\n * }).then(success => {\n * if (isNode) {\n * process.exit(success ? 0 : 1)\n * }\n * })\n * ```\n *\n * ```js\n * // mod1.test.js\n * /**\n * * runTests automatically tests all exported functions that start with \"test\".\n * * The name of the function should be in camelCase and is used for the logging output.\n * *\n * * @param {t.TestCase} tc\n * *\\/\n * export const testMyFirstTest = tc => {\n * t.compare({ a: 4 }, { a: 4 }, 'objects are equal')\n * }\n * ```\n *\n * Now you can simply run `node test.js` to run your test or run test.js in the browser.\n *\n * @module testing\n */\n\nimport * as log from './logging.js'\nimport { simpleDiffString } from './diff.js'\nimport * as object from './object.js'\nimport * as string from './string.js'\nimport * as math from './math.js'\nimport * as random from './random.js'\nimport * as prng from './prng.js'\nimport * as statistics from './statistics.js'\nimport * as array from './array.js'\nimport * as env from './environment.js'\nimport * as json from './json.js'\nimport * as time from './time.js'\nimport * as promise from './promise.js'\n\nimport { performance } from './isomorphic.js'\n\nexport { production } from './environment.js'\n\nexport const extensive = env.hasConf('extensive')\n\n/* istanbul ignore next */\nexport const envSeed = env.hasParam('--seed') ? Number.parseInt(env.getParam('--seed', '0')) : null\n\nexport class TestCase {\n /**\n * @param {string} moduleName\n * @param {string} testName\n */\n constructor (moduleName, testName) {\n /**\n * @type {string}\n */\n this.moduleName = moduleName\n /**\n * @type {string}\n */\n this.testName = testName\n this._seed = null\n this._prng = null\n }\n\n resetSeed () {\n this._seed = null\n this._prng = null\n }\n\n /**\n * @type {number}\n */\n /* istanbul ignore next */\n get seed () {\n /* istanbul ignore else */\n if (this._seed === null) {\n /* istanbul ignore next */\n this._seed = envSeed === null ? random.uint32() : envSeed\n }\n return this._seed\n }\n\n /**\n * A PRNG for this test case. Use only this PRNG for randomness to make the test case reproducible.\n *\n * @type {prng.PRNG}\n */\n get prng () {\n /* istanbul ignore else */\n if (this._prng === null) {\n this._prng = prng.create(this.seed)\n }\n return this._prng\n }\n}\n\nexport const repetitionTime = Number(env.getParam('--repetition-time', '50'))\n/* istanbul ignore next */\nconst testFilter = env.hasParam('--filter') ? env.getParam('--filter', '') : null\n\n/* istanbul ignore next */\nconst testFilterRegExp = testFilter !== null ? new RegExp(testFilter) : new RegExp('.*')\n\nconst repeatTestRegex = /^(repeat|repeating)\\s/\n\n/**\n * @param {string} moduleName\n * @param {string} name\n * @param {function(TestCase):void|Promise<any>} f\n * @param {number} i\n * @param {number} numberOfTests\n */\nexport const run = async (moduleName, name, f, i, numberOfTests) => {\n const uncamelized = string.fromCamelCase(name.slice(4), ' ')\n const filtered = !testFilterRegExp.test(`[${i + 1}/${numberOfTests}] ${moduleName}: ${uncamelized}`)\n /* istanbul ignore if */\n if (filtered) {\n return true\n }\n const tc = new TestCase(moduleName, name)\n const repeat = repeatTestRegex.test(uncamelized)\n const groupArgs = [log.GREY, `[${i + 1}/${numberOfTests}] `, log.PURPLE, `${moduleName}: `, log.BLUE, uncamelized]\n /* istanbul ignore next */\n if (testFilter === null) {\n log.groupCollapsed(...groupArgs)\n } else {\n log.group(...groupArgs)\n }\n const times = []\n const start = performance.now()\n let lastTime = start\n /**\n * @type {any}\n */\n let err = null\n performance.mark(`${name}-start`)\n do {\n try {\n const p = f(tc)\n if (promise.isPromise(p)) {\n await p\n }\n } catch (_err) {\n err = _err\n }\n const currTime = performance.now()\n times.push(currTime - lastTime)\n lastTime = currTime\n if (repeat && err === null && (lastTime - start) < repetitionTime) {\n tc.resetSeed()\n } else {\n break\n }\n } while (err === null && (lastTime - start) < repetitionTime)\n performance.mark(`${name}-end`)\n /* istanbul ignore if */\n if (err !== null && err.constructor !== SkipError) {\n log.printError(err)\n }\n performance.measure(name, `${name}-start`, `${name}-end`)\n log.groupEnd()\n const duration = lastTime - start\n let success = true\n times.sort((a, b) => a - b)\n /* istanbul ignore next */\n const againMessage = env.isBrowser\n ? ` - ${window.location.href}?filter=\\\\[${i + 1}/${tc._seed === null ? '' : `&seed=${tc._seed}`}`\n : `\\nrepeat: npm run test -- --filter \"\\\\[${i + 1}/\" ${tc._seed === null ? '' : `--seed ${tc._seed}`}`\n const timeInfo = (repeat && err === null)\n ? ` - ${times.length} repetitions in ${time.humanizeDuration(duration)} (best: ${time.humanizeDuration(times[0])}, worst: ${time.humanizeDuration(array.last(times))}, median: ${time.humanizeDuration(statistics.median(times))}, average: ${time.humanizeDuration(statistics.average(times))})`\n : ` in ${time.humanizeDuration(duration)}`\n if (err !== null) {\n /* istanbul ignore else */\n if (err.constructor === SkipError) {\n log.print(log.GREY, log.BOLD, 'Skipped: ', log.UNBOLD, uncamelized)\n } else {\n success = false\n log.print(log.RED, log.BOLD, 'Failure: ', log.UNBOLD, log.UNCOLOR, uncamelized, log.GREY, timeInfo, againMessage)\n }\n } else {\n log.print(log.GREEN, log.BOLD, 'Success: ', log.UNBOLD, log.UNCOLOR, uncamelized, log.GREY, timeInfo, againMessage)\n }\n return success\n}\n\n/**\n * Describe what you are currently testing. The message will be logged.\n *\n * ```js\n * export const testMyFirstTest = tc => {\n * t.describe('crunching numbers', 'already crunched 4 numbers!') // the optional second argument can describe the state.\n * }\n * ```\n *\n * @param {string} description\n * @param {string} info\n */\nexport const describe = (description, info = '') => log.print(log.BLUE, description, ' ', log.GREY, info)\n\n/**\n * Describe the state of the current computation.\n * ```js\n * export const testMyFirstTest = tc => {\n * t.info(already crunched 4 numbers!') // the optional second argument can describe the state.\n * }\n * ```\n *\n * @param {string} info\n */\nexport const info = info => describe('', info)\n\nexport const printDom = log.printDom\n\nexport const printCanvas = log.printCanvas\n\n/**\n * Group outputs in a collapsible category.\n *\n * ```js\n * export const testMyFirstTest = tc => {\n * t.group('subtest 1', () => {\n * t.describe('this message is part of a collapsible section')\n * })\n * await t.groupAsync('subtest async 2', async () => {\n * await someaction()\n * t.describe('this message is part of a collapsible section')\n * })\n * }\n * ```\n *\n * @param {string} description\n * @param {function(void):void} f\n */\nexport const group = (description, f) => {\n log.group(log.BLUE, description)\n try {\n f()\n } finally {\n log.groupEnd()\n }\n}\n\n/**\n * Group outputs in a collapsible category.\n *\n * ```js\n * export const testMyFirstTest = async tc => {\n * t.group('subtest 1', () => {\n * t.describe('this message is part of a collapsible section')\n * })\n * await t.groupAsync('subtest async 2', async () => {\n * await someaction()\n * t.describe('this message is part of a collapsible section')\n * })\n * }\n * ```\n *\n * @param {string} description\n * @param {function(void):Promise<any>} f\n */\nexport const groupAsync = async (description, f) => {\n log.group(log.BLUE, description)\n try {\n await f()\n } finally {\n log.groupEnd()\n }\n}\n\n/**\n * Measure the time that it takes to calculate something.\n *\n * ```js\n * export const testMyFirstTest = async tc => {\n * t.measureTime('measurement', () => {\n * heavyCalculation()\n * })\n * await t.groupAsync('async measurement', async () => {\n * await heavyAsyncCalculation()\n * })\n * }\n * ```\n *\n * @param {string} message\n * @param {function():void} f\n * @return {number} Returns a promise that resolves the measured duration to apply f\n */\nexport const measureTime = (message, f) => {\n let duration\n const start = performance.now()\n try {\n f()\n } finally {\n duration = performance.now() - start\n log.print(log.PURPLE, message, log.GREY, ` ${time.humanizeDuration(duration)}`)\n }\n return duration\n}\n\n/**\n * Measure the time that it takes to calculate something.\n *\n * ```js\n * export const testMyFirstTest = async tc => {\n * t.measureTimeAsync('measurement', async () => {\n * await heavyCalculation()\n * })\n * await t.groupAsync('async measurement', async () => {\n * await heavyAsyncCalculation()\n * })\n * }\n * ```\n *\n * @param {string} message\n * @param {function():Promise<any>} f\n * @return {Promise<number>} Returns a promise that resolves the measured duration to apply f\n */\nexport const measureTimeAsync = async (message, f) => {\n let duration\n const start = performance.now()\n try {\n await f()\n } finally {\n duration = performance.now() - start\n log.print(log.PURPLE, message, log.GREY, ` ${time.humanizeDuration(duration)}`)\n }\n return duration\n}\n\n/**\n * @template T\n * @param {Array<T>} as\n * @param {Array<T>} bs\n * @param {string} [m]\n * @return {boolean}\n */\nexport const compareArrays = (as, bs, m = 'Arrays match') => {\n if (as.length !== bs.length) {\n fail(m)\n }\n for (let i = 0; i < as.length; i++) {\n if (as[i] !== bs[i]) {\n fail(m)\n }\n }\n return true\n}\n\n/**\n * @param {string} a\n * @param {string} b\n * @param {string} [m]\n * @throws {TestError} Throws if tests fails\n */\nexport const compareStrings = (a, b, m = 'Strings match') => {\n if (a !== b) {\n const diff = simpleDiffString(a, b)\n log.print(log.GREY, a.slice(0, diff.index), log.RED, a.slice(diff.index, diff.remove), log.GREEN, diff.insert, log.GREY, a.slice(diff.index + diff.remove))\n fail(m)\n }\n}\n\n/**\n * @template K,V\n * @param {Object<K,V>} a\n * @param {Object<K,V>} b\n * @param {string} [m]\n * @throws {TestError} Throws if test fails\n */\nexport const compareObjects = (a, b, m = 'Objects match') => { object.equalFlat(a, b) || fail(m) }\n\n/**\n * @param {any} constructor\n * @param {any} a\n * @param {any} b\n * @param {string} path\n * @throws {TestError}\n */\nconst compareValues = (constructor, a, b, path) => {\n if (a !== b) {\n fail(`Values ${json.stringify(a)} and ${json.stringify(b)} don't match (${path})`)\n }\n return true\n}\n\n/**\n * @param {string?} message\n * @param {string} reason\n * @param {string} path\n * @throws {TestError}\n */\nconst _failMessage = (message, reason, path) => fail(\n message === null\n ? `${reason} ${path}`\n : `${message} (${reason}) ${path}`\n)\n\n/**\n * @param {any} a\n * @param {any} b\n * @param {string} path\n * @param {string?} message\n * @param {function(any,any,any,string,any):boolean} customCompare\n */\nconst _compare = (a, b, path, message, customCompare) => {\n // we don't use assert here because we want to test all branches (istanbul errors if one branch is not tested)\n if (a == null || b == null) {\n return compareValues(null, a, b, path)\n }\n if (a.constructor !== b.constructor) {\n _failMessage(message, 'Constructors don\\'t match', path)\n }\n let success = true\n switch (a.constructor) {\n case ArrayBuffer:\n a = new Uint8Array(a)\n b = new Uint8Array(b)\n // eslint-disable-next-line no-fallthrough\n case Uint8Array: {\n if (a.byteLength !== b.byteLength) {\n _failMessage(message, 'ArrayBuffer lengths match', path)\n }\n for (let i = 0; success && i < a.length; i++) {\n success = success && a[i] === b[i]\n }\n break\n }\n case Set: {\n if (a.size !== b.size) {\n _failMessage(message, 'Sets have different number of attributes', path)\n }\n // @ts-ignore\n a.forEach(value => {\n if (!b.has(value)) {\n _failMessage(message, `b.${path} does have ${value}`, path)\n }\n })\n break\n }\n case Map: {\n if (a.size !== b.size) {\n _failMessage(message, 'Maps have different number of attributes', path)\n }\n // @ts-ignore\n a.forEach((value, key) => {\n if (!b.has(key)) {\n _failMessage(message, `Property ${path}[\"${key}\"] does not exist on second argument`, path)\n }\n _compare(value, b.get(key), `${path}[\"${key}\"]`, message, customCompare)\n })\n break\n }\n case Object:\n if (object.length(a) !== object.length(b)) {\n _failMessage(message, 'Objects have a different number of attributes', path)\n }\n object.forEach(a, (value, key) => {\n if (!object.hasProperty(b, key)) {\n _failMessage(message, `Property ${path} does not exist on second argument`, path)\n }\n _compare(value, b[key], `${path}[\"${key}\"]`, message, customCompare)\n })\n break\n case Array:\n if (a.length !== b.length) {\n _failMessage(message, 'Arrays have a different number of attributes', path)\n }\n // @ts-ignore\n a.forEach((value, i) => _compare(value, b[i], `${path}[${i}]`, message, customCompare))\n break\n /* istanbul ignore next */\n default:\n if (!customCompare(a.constructor, a, b, path, compareValues)) {\n _failMessage(message, `Values ${json.stringify(a)} and ${json.stringify(b)} don't match`, path)\n }\n }\n assert(success, message)\n return true\n}\n\n/**\n * @template T\n * @param {T} a\n * @param {T} b\n * @param {string?} [message]\n * @param {function(any,T,T,string,any):boolean} [customCompare]\n */\nexport const compare = (a, b, message = null, customCompare = compareValues) => _compare(a, b, 'obj', message, customCompare)\n\n/* istanbul ignore next */\n/**\n * @param {boolean} condition\n * @param {string?} [message]\n * @throws {TestError}\n */\nexport const assert = (condition, message = null) => condition || fail(`Assertion failed${message !== null ? `: ${message}` : ''}`)\n\n/**\n * @param {function():void} f\n * @throws {TestError}\n */\nexport const fails = f => {\n let err = null\n try {\n f()\n } catch (_err) {\n err = _err\n log.print(log.GREEN, '⇖ This Error was expected')\n }\n /* istanbul ignore if */\n if (err === null) {\n fail('Expected this to fail')\n }\n}\n\n/**\n * @param {Object<string, Object<string, function(TestCase):void|Promise<any>>>} tests\n */\nexport const runTests = async tests => {\n const numberOfTests = object.map(tests, mod => object.map(mod, f => /* istanbul ignore next */ f ? 1 : 0).reduce(math.add, 0)).reduce(math.add, 0)\n let successfulTests = 0\n let testnumber = 0\n const start = performance.now()\n for (const modName in tests) {\n const mod = tests[modName]\n for (const fname in mod) {\n const f = mod[fname]\n /* istanbul ignore else */\n if (f) {\n const repeatEachTest = 1\n let success = true\n for (let i = 0; success && i < repeatEachTest; i++) {\n success = await run(modName, fname, f, testnumber, numberOfTests)\n }\n testnumber++\n /* istanbul ignore else */\n if (success) {\n successfulTests++\n }\n }\n }\n }\n const end = performance.now()\n log.print('')\n const success = successfulTests === numberOfTests\n /* istanbul ignore next */\n if (success) {\n /* istanbul ignore next */\n log.print(log.GREEN, log.BOLD, 'All tests successful!', log.GREY, log.UNBOLD, ` in ${time.humanizeDuration(end - start)}`)\n /* istanbul ignore next */\n log.printImgBase64(nyanCatImage, 50)\n } else {\n const failedTests = numberOfTests - successfulTests\n log.print(log.RED, log.BOLD, `> ${failedTests} test${failedTests > 1 ? 's' : ''} failed`)\n }\n return success\n}\n\nclass TestError extends Error {}\n\n/**\n * @param {string} reason\n * @throws {TestError}\n */\nexport const fail = reason => {\n log.print(log.RED, log.BOLD, 'X ', log.UNBOLD, reason)\n throw new TestError('Test Failed')\n}\n\nclass SkipError extends Error {}\n\n/**\n * @param {boolean} cond If true, this tests will be skipped\n * @throws {SkipError}\n */\nexport const skip = (cond = true) => {\n if (cond) {\n throw new SkipError('skipping..')\n }\n}\n\n// eslint-disable-next-line\nconst nyanCatImage = 'R0lGODlhjABMAPcAAMiSE0xMTEzMzUKJzjQ0NFsoKPc7//FM/9mH/z9x0HIiIoKCgmBHN+frGSkZLdDQ0LCwsDk71g0KCUzDdrQQEOFz/8yYdelmBdTiHFxcXDU2erR/mLrTHCgoKK5szBQUFNgSCTk6ymfpCB9VZS2Bl+cGBt2N8kWm0uDcGXhZRUvGq94NCFPhDiwsLGVlZTgqIPMDA1g3aEzS5D6xAURERDtG9JmBjJsZGWs2AD1W6Hp6eswyDeJ4CFNTU1LcEoJRmTMzSd14CTg5ser2GmDzBd17/xkZGUzMvoSMDiEhIfKruCwNAJaWlvRzA8kNDXDrCfi0pe1U/+GS6SZrAB4eHpZwVhoabsx9oiYmJt/TGHFxcYyMjOid0+Zl/0rF6j09PeRr/0zU9DxO6j+z0lXtBtp8qJhMAEssLGhoaPL/GVn/AAsWJ/9/AE3Z/zs9/3cAAOlf/+aa2RIyADo85uhh/0i84WtrazQ0UyMlmDMzPwUFBe16BTMmHau0E03X+g8pMEAoS1MBAf++kkzO8pBaqSZoe9uB/zE0BUQ3Sv///4WFheuiyzo880gzNDIyNissBNqF/8RiAOF2qG5ubj0vL1z6Avl5ASsgGkgUSy8vL/8n/z4zJy8lOv96uEssV1csAN5ZCDQ0Wz1a3tbEGHLeDdYKCg4PATE7PiMVFSoqU83eHEi43gUPAOZ8reGogeKU5dBBC8faHEez2lHYF4bQFMukFtl4CzY3kkzBVJfMGZkAAMfSFf27mP0t//g4/9R6Dfsy/1DRIUnSAPRD/0fMAFQ0Q+l7rnbaD0vEntCDD6rSGtO8GNpUCU/MK07LPNEfC7RaABUWWkgtOst+71v9AfD7GfDw8P19ATtA/NJpAONgB9yL+fm6jzIxMdnNGJxht1/2A9x//9jHGOSX3+5tBP27l35+fk5OTvZ9AhYgTjo0PUhGSDs9+LZjCFf2Aw0IDwcVAA8PD5lwg9+Q7YaChC0kJP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGNEM2MUEyMzE0QTRFMTExOUQzRkE3QTBCRDNBMjdBQyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpERjQ0NEY0QkI2MTcxMUUxOUJEQkUzNUNGQTkwRTU2MiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpERjQ0NEY0QUI2MTcxMUUxOUJEQkUzNUNGQTkwRTU2MiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1OEE3RTIwRjcyQTlFMTExOTQ1QkY2QTU5QzVCQjJBOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGNEM2MUEyMzE0QTRFMTExOUQzRkE3QTBCRDNBMjdBQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1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'\n"],"names":["env.hasConf","env.hasParam","env.getParam","random.uint32","prng.create","string.fromCamelCase","log.GREY","log.PURPLE","log.BLUE","log.groupCollapsed","log.group","performance","promise.isPromise","log.printError","log.groupEnd","env.isBrowser","time.humanizeDuration","array.last","statistics.median","statistics.average","log.print","log.BOLD","log.UNBOLD","log.RED","log.UNCOLOR","log.GREEN","log.printDom","log.printCanvas","diff","simpleDiffString","object.equalFlat","json.stringify","object.length","object.forEach","object.hasProperty","object.map","math.add","log.printImgBase64"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"testing.cjs","sources":["../testing.js"],"sourcesContent":["/**\n * Testing framework with support for generating tests.\n *\n * ```js\n * // test.js template for creating a test executable\n * import { runTests } from 'lib0/testing'\n * import * as log from 'lib0/logging'\n * import * as mod1 from './mod1.test.js'\n * import * as mod2 from './mod2.test.js'\n\n * import { isBrowser, isNode } from 'lib0/environment.js'\n *\n * if (isBrowser) {\n * // optional: if this is ran in the browser, attach a virtual console to the dom\n * log.createVConsole(document.body)\n * }\n *\n * runTests({\n * mod1,\n * mod2,\n * }).then(success => {\n * if (isNode) {\n * process.exit(success ? 0 : 1)\n * }\n * })\n * ```\n *\n * ```js\n * // mod1.test.js\n * /**\n * * runTests automatically tests all exported functions that start with \"test\".\n * * The name of the function should be in camelCase and is used for the logging output.\n * *\n * * @param {t.TestCase} tc\n * *\\/\n * export const testMyFirstTest = tc => {\n * t.compare({ a: 4 }, { a: 4 }, 'objects are equal')\n * }\n * ```\n *\n * Now you can simply run `node test.js` to run your test or run test.js in the browser.\n *\n * @module testing\n */\n\nimport * as log from './logging.js'\nimport { simpleDiffString } from './diff.js'\nimport * as object from './object.js'\nimport * as string from './string.js'\nimport * as math from './math.js'\nimport * as random from './random.js'\nimport * as prng from './prng.js'\nimport * as statistics from './statistics.js'\nimport * as array from './array.js'\nimport * as env from './environment.js'\nimport * as json from './json.js'\nimport * as time from './time.js'\nimport * as promise from './promise.js'\n\nimport { performance } from './isomorphic.js'\n\nexport { production } from './environment.js'\n\nexport const extensive = env.hasConf('extensive')\n\n/* istanbul ignore next */\nexport const envSeed = env.hasParam('--seed') ? Number.parseInt(env.getParam('--seed', '0')) : null\n\nexport class TestCase {\n /**\n * @param {string} moduleName\n * @param {string} testName\n */\n constructor (moduleName, testName) {\n /**\n * @type {string}\n */\n this.moduleName = moduleName\n /**\n * @type {string}\n */\n this.testName = testName\n this._seed = null\n this._prng = null\n }\n\n resetSeed () {\n this._seed = null\n this._prng = null\n }\n\n /**\n * @type {number}\n */\n /* istanbul ignore next */\n get seed () {\n /* istanbul ignore else */\n if (this._seed === null) {\n /* istanbul ignore next */\n this._seed = envSeed === null ? random.uint32() : envSeed\n }\n return this._seed\n }\n\n /**\n * A PRNG for this test case. Use only this PRNG for randomness to make the test case reproducible.\n *\n * @type {prng.PRNG}\n */\n get prng () {\n /* istanbul ignore else */\n if (this._prng === null) {\n this._prng = prng.create(this.seed)\n }\n return this._prng\n }\n}\n\nexport const repetitionTime = Number(env.getParam('--repetition-time', '50'))\n/* istanbul ignore next */\nconst testFilter = env.hasParam('--filter') ? env.getParam('--filter', '') : null\n\n/* istanbul ignore next */\nconst testFilterRegExp = testFilter !== null ? new RegExp(testFilter) : new RegExp('.*')\n\nconst repeatTestRegex = /^(repeat|repeating)\\s/\n\n/**\n * @param {string} moduleName\n * @param {string} name\n * @param {function(TestCase):void|Promise<any>} f\n * @param {number} i\n * @param {number} numberOfTests\n */\nexport const run = async (moduleName, name, f, i, numberOfTests) => {\n const uncamelized = string.fromCamelCase(name.slice(4), ' ')\n const filtered = !testFilterRegExp.test(`[${i + 1}/${numberOfTests}] ${moduleName}: ${uncamelized}`)\n /* istanbul ignore if */\n if (filtered) {\n return true\n }\n const tc = new TestCase(moduleName, name)\n const repeat = repeatTestRegex.test(uncamelized)\n const groupArgs = [log.GREY, `[${i + 1}/${numberOfTests}] `, log.PURPLE, `${moduleName}: `, log.BLUE, uncamelized]\n /* istanbul ignore next */\n if (testFilter === null) {\n log.groupCollapsed(...groupArgs)\n } else {\n log.group(...groupArgs)\n }\n const times = []\n const start = performance.now()\n let lastTime = start\n /**\n * @type {any}\n */\n let err = null\n performance.mark(`${name}-start`)\n do {\n try {\n const p = f(tc)\n if (promise.isPromise(p)) {\n await p\n }\n } catch (_err) {\n err = _err\n }\n const currTime = performance.now()\n times.push(currTime - lastTime)\n lastTime = currTime\n if (repeat && err === null && (lastTime - start) < repetitionTime) {\n tc.resetSeed()\n } else {\n break\n }\n } while (err === null && (lastTime - start) < repetitionTime)\n performance.mark(`${name}-end`)\n /* istanbul ignore if */\n if (err !== null && err.constructor !== SkipError) {\n log.printError(err)\n }\n performance.measure(name, `${name}-start`, `${name}-end`)\n log.groupEnd()\n const duration = lastTime - start\n let success = true\n times.sort((a, b) => a - b)\n /* istanbul ignore next */\n const againMessage = env.isBrowser\n ? ` - ${window.location.host + window.location.pathname}?filter=\\\\[${i + 1}/${tc._seed === null ? '' : `&seed=${tc._seed}`}`\n : `\\nrepeat: npm run test -- --filter \"\\\\[${i + 1}/\" ${tc._seed === null ? '' : `--seed ${tc._seed}`}`\n const timeInfo = (repeat && err === null)\n ? ` - ${times.length} repetitions in ${time.humanizeDuration(duration)} (best: ${time.humanizeDuration(times[0])}, worst: ${time.humanizeDuration(array.last(times))}, median: ${time.humanizeDuration(statistics.median(times))}, average: ${time.humanizeDuration(statistics.average(times))})`\n : ` in ${time.humanizeDuration(duration)}`\n if (err !== null) {\n /* istanbul ignore else */\n if (err.constructor === SkipError) {\n log.print(log.GREY, log.BOLD, 'Skipped: ', log.UNBOLD, uncamelized)\n } else {\n success = false\n log.print(log.RED, log.BOLD, 'Failure: ', log.UNBOLD, log.UNCOLOR, uncamelized, log.GREY, timeInfo, againMessage)\n }\n } else {\n log.print(log.GREEN, log.BOLD, 'Success: ', log.UNBOLD, log.UNCOLOR, uncamelized, log.GREY, timeInfo, againMessage)\n }\n return success\n}\n\n/**\n * Describe what you are currently testing. The message will be logged.\n *\n * ```js\n * export const testMyFirstTest = tc => {\n * t.describe('crunching numbers', 'already crunched 4 numbers!') // the optional second argument can describe the state.\n * }\n * ```\n *\n * @param {string} description\n * @param {string} info\n */\nexport const describe = (description, info = '') => log.print(log.BLUE, description, ' ', log.GREY, info)\n\n/**\n * Describe the state of the current computation.\n * ```js\n * export const testMyFirstTest = tc => {\n * t.info(already crunched 4 numbers!') // the optional second argument can describe the state.\n * }\n * ```\n *\n * @param {string} info\n */\nexport const info = info => describe('', info)\n\nexport const printDom = log.printDom\n\nexport const printCanvas = log.printCanvas\n\n/**\n * Group outputs in a collapsible category.\n *\n * ```js\n * export const testMyFirstTest = tc => {\n * t.group('subtest 1', () => {\n * t.describe('this message is part of a collapsible section')\n * })\n * await t.groupAsync('subtest async 2', async () => {\n * await someaction()\n * t.describe('this message is part of a collapsible section')\n * })\n * }\n * ```\n *\n * @param {string} description\n * @param {function(void):void} f\n */\nexport const group = (description, f) => {\n log.group(log.BLUE, description)\n try {\n f()\n } finally {\n log.groupEnd()\n }\n}\n\n/**\n * Group outputs in a collapsible category.\n *\n * ```js\n * export const testMyFirstTest = async tc => {\n * t.group('subtest 1', () => {\n * t.describe('this message is part of a collapsible section')\n * })\n * await t.groupAsync('subtest async 2', async () => {\n * await someaction()\n * t.describe('this message is part of a collapsible section')\n * })\n * }\n * ```\n *\n * @param {string} description\n * @param {function(void):Promise<any>} f\n */\nexport const groupAsync = async (description, f) => {\n log.group(log.BLUE, description)\n try {\n await f()\n } finally {\n log.groupEnd()\n }\n}\n\n/**\n * Measure the time that it takes to calculate something.\n *\n * ```js\n * export const testMyFirstTest = async tc => {\n * t.measureTime('measurement', () => {\n * heavyCalculation()\n * })\n * await t.groupAsync('async measurement', async () => {\n * await heavyAsyncCalculation()\n * })\n * }\n * ```\n *\n * @param {string} message\n * @param {function():void} f\n * @return {number} Returns a promise that resolves the measured duration to apply f\n */\nexport const measureTime = (message, f) => {\n let duration\n const start = performance.now()\n try {\n f()\n } finally {\n duration = performance.now() - start\n log.print(log.PURPLE, message, log.GREY, ` ${time.humanizeDuration(duration)}`)\n }\n return duration\n}\n\n/**\n * Measure the time that it takes to calculate something.\n *\n * ```js\n * export const testMyFirstTest = async tc => {\n * t.measureTimeAsync('measurement', async () => {\n * await heavyCalculation()\n * })\n * await t.groupAsync('async measurement', async () => {\n * await heavyAsyncCalculation()\n * })\n * }\n * ```\n *\n * @param {string} message\n * @param {function():Promise<any>} f\n * @return {Promise<number>} Returns a promise that resolves the measured duration to apply f\n */\nexport const measureTimeAsync = async (message, f) => {\n let duration\n const start = performance.now()\n try {\n await f()\n } finally {\n duration = performance.now() - start\n log.print(log.PURPLE, message, log.GREY, ` ${time.humanizeDuration(duration)}`)\n }\n return duration\n}\n\n/**\n * @template T\n * @param {Array<T>} as\n * @param {Array<T>} bs\n * @param {string} [m]\n * @return {boolean}\n */\nexport const compareArrays = (as, bs, m = 'Arrays match') => {\n if (as.length !== bs.length) {\n fail(m)\n }\n for (let i = 0; i < as.length; i++) {\n if (as[i] !== bs[i]) {\n fail(m)\n }\n }\n return true\n}\n\n/**\n * @param {string} a\n * @param {string} b\n * @param {string} [m]\n * @throws {TestError} Throws if tests fails\n */\nexport const compareStrings = (a, b, m = 'Strings match') => {\n if (a !== b) {\n const diff = simpleDiffString(a, b)\n log.print(log.GREY, a.slice(0, diff.index), log.RED, a.slice(diff.index, diff.remove), log.GREEN, diff.insert, log.GREY, a.slice(diff.index + diff.remove))\n fail(m)\n }\n}\n\n/**\n * @template K,V\n * @param {Object<K,V>} a\n * @param {Object<K,V>} b\n * @param {string} [m]\n * @throws {TestError} Throws if test fails\n */\nexport const compareObjects = (a, b, m = 'Objects match') => { object.equalFlat(a, b) || fail(m) }\n\n/**\n * @param {any} constructor\n * @param {any} a\n * @param {any} b\n * @param {string} path\n * @throws {TestError}\n */\nconst compareValues = (constructor, a, b, path) => {\n if (a !== b) {\n fail(`Values ${json.stringify(a)} and ${json.stringify(b)} don't match (${path})`)\n }\n return true\n}\n\n/**\n * @param {string?} message\n * @param {string} reason\n * @param {string} path\n * @throws {TestError}\n */\nconst _failMessage = (message, reason, path) => fail(\n message === null\n ? `${reason} ${path}`\n : `${message} (${reason}) ${path}`\n)\n\n/**\n * @param {any} a\n * @param {any} b\n * @param {string} path\n * @param {string?} message\n * @param {function(any,any,any,string,any):boolean} customCompare\n */\nconst _compare = (a, b, path, message, customCompare) => {\n // we don't use assert here because we want to test all branches (istanbul errors if one branch is not tested)\n if (a == null || b == null) {\n return compareValues(null, a, b, path)\n }\n if (a.constructor !== b.constructor) {\n _failMessage(message, 'Constructors don\\'t match', path)\n }\n let success = true\n switch (a.constructor) {\n case ArrayBuffer:\n a = new Uint8Array(a)\n b = new Uint8Array(b)\n // eslint-disable-next-line no-fallthrough\n case Uint8Array: {\n if (a.byteLength !== b.byteLength) {\n _failMessage(message, 'ArrayBuffer lengths match', path)\n }\n for (let i = 0; success && i < a.length; i++) {\n success = success && a[i] === b[i]\n }\n break\n }\n case Set: {\n if (a.size !== b.size) {\n _failMessage(message, 'Sets have different number of attributes', path)\n }\n // @ts-ignore\n a.forEach(value => {\n if (!b.has(value)) {\n _failMessage(message, `b.${path} does have ${value}`, path)\n }\n })\n break\n }\n case Map: {\n if (a.size !== b.size) {\n _failMessage(message, 'Maps have different number of attributes', path)\n }\n // @ts-ignore\n a.forEach((value, key) => {\n if (!b.has(key)) {\n _failMessage(message, `Property ${path}[\"${key}\"] does not exist on second argument`, path)\n }\n _compare(value, b.get(key), `${path}[\"${key}\"]`, message, customCompare)\n })\n break\n }\n case Object:\n if (object.length(a) !== object.length(b)) {\n _failMessage(message, 'Objects have a different number of attributes', path)\n }\n object.forEach(a, (value, key) => {\n if (!object.hasProperty(b, key)) {\n _failMessage(message, `Property ${path} does not exist on second argument`, path)\n }\n _compare(value, b[key], `${path}[\"${key}\"]`, message, customCompare)\n })\n break\n case Array:\n if (a.length !== b.length) {\n _failMessage(message, 'Arrays have a different number of attributes', path)\n }\n // @ts-ignore\n a.forEach((value, i) => _compare(value, b[i], `${path}[${i}]`, message, customCompare))\n break\n /* istanbul ignore next */\n default:\n if (!customCompare(a.constructor, a, b, path, compareValues)) {\n _failMessage(message, `Values ${json.stringify(a)} and ${json.stringify(b)} don't match`, path)\n }\n }\n assert(success, message)\n return true\n}\n\n/**\n * @template T\n * @param {T} a\n * @param {T} b\n * @param {string?} [message]\n * @param {function(any,T,T,string,any):boolean} [customCompare]\n */\nexport const compare = (a, b, message = null, customCompare = compareValues) => _compare(a, b, 'obj', message, customCompare)\n\n/* istanbul ignore next */\n/**\n * @param {boolean} condition\n * @param {string?} [message]\n * @throws {TestError}\n */\nexport const assert = (condition, message = null) => condition || fail(`Assertion failed${message !== null ? `: ${message}` : ''}`)\n\n/**\n * @param {function():void} f\n * @throws {TestError}\n */\nexport const fails = f => {\n let err = null\n try {\n f()\n } catch (_err) {\n err = _err\n log.print(log.GREEN, '⇖ This Error was expected')\n }\n /* istanbul ignore if */\n if (err === null) {\n fail('Expected this to fail')\n }\n}\n\n/**\n * @param {Object<string, Object<string, function(TestCase):void|Promise<any>>>} tests\n */\nexport const runTests = async tests => {\n const numberOfTests = object.map(tests, mod => object.map(mod, f => /* istanbul ignore next */ f ? 1 : 0).reduce(math.add, 0)).reduce(math.add, 0)\n let successfulTests = 0\n let testnumber = 0\n const start = performance.now()\n for (const modName in tests) {\n const mod = tests[modName]\n for (const fname in mod) {\n const f = mod[fname]\n /* istanbul ignore else */\n if (f) {\n const repeatEachTest = 1\n let success = true\n for (let i = 0; success && i < repeatEachTest; i++) {\n success = await run(modName, fname, f, testnumber, numberOfTests)\n }\n testnumber++\n /* istanbul ignore else */\n if (success) {\n successfulTests++\n }\n }\n }\n }\n const end = performance.now()\n log.print('')\n const success = successfulTests === numberOfTests\n /* istanbul ignore next */\n if (success) {\n /* istanbul ignore next */\n log.print(log.GREEN, log.BOLD, 'All tests successful!', log.GREY, log.UNBOLD, ` in ${time.humanizeDuration(end - start)}`)\n /* istanbul ignore next */\n log.printImgBase64(nyanCatImage, 50)\n } else {\n const failedTests = numberOfTests - successfulTests\n log.print(log.RED, log.BOLD, `> ${failedTests} test${failedTests > 1 ? 's' : ''} failed`)\n }\n return success\n}\n\nclass TestError extends Error {}\n\n/**\n * @param {string} reason\n * @throws {TestError}\n */\nexport const fail = reason => {\n log.print(log.RED, log.BOLD, 'X ', log.UNBOLD, reason)\n throw new TestError('Test Failed')\n}\n\nclass SkipError extends Error {}\n\n/**\n * @param {boolean} cond If true, this tests will be skipped\n * @throws {SkipError}\n */\nexport const skip = (cond = true) => {\n if (cond) {\n throw new SkipError('skipping..')\n }\n}\n\n// eslint-disable-next-line\nconst nyanCatImage = 'R0lGODlhjABMAPcAAMiSE0xMTEzMzUKJzjQ0NFsoKPc7//FM/9mH/z9x0HIiIoKCgmBHN+frGSkZLdDQ0LCwsDk71g0KCUzDdrQQEOFz/8yYdelmBdTiHFxcXDU2erR/mLrTHCgoKK5szBQUFNgSCTk6ymfpCB9VZS2Bl+cGBt2N8kWm0uDcGXhZRUvGq94NCFPhDiwsLGVlZTgqIPMDA1g3aEzS5D6xAURERDtG9JmBjJsZGWs2AD1W6Hp6eswyDeJ4CFNTU1LcEoJRmTMzSd14CTg5ser2GmDzBd17/xkZGUzMvoSMDiEhIfKruCwNAJaWlvRzA8kNDXDrCfi0pe1U/+GS6SZrAB4eHpZwVhoabsx9oiYmJt/TGHFxcYyMjOid0+Zl/0rF6j09PeRr/0zU9DxO6j+z0lXtBtp8qJhMAEssLGhoaPL/GVn/AAsWJ/9/AE3Z/zs9/3cAAOlf/+aa2RIyADo85uhh/0i84WtrazQ0UyMlmDMzPwUFBe16BTMmHau0E03X+g8pMEAoS1MBAf++kkzO8pBaqSZoe9uB/zE0BUQ3Sv///4WFheuiyzo880gzNDIyNissBNqF/8RiAOF2qG5ubj0vL1z6Avl5ASsgGkgUSy8vL/8n/z4zJy8lOv96uEssV1csAN5ZCDQ0Wz1a3tbEGHLeDdYKCg4PATE7PiMVFSoqU83eHEi43gUPAOZ8reGogeKU5dBBC8faHEez2lHYF4bQFMukFtl4CzY3kkzBVJfMGZkAAMfSFf27mP0t//g4/9R6Dfsy/1DRIUnSAPRD/0fMAFQ0Q+l7rnbaD0vEntCDD6rSGtO8GNpUCU/MK07LPNEfC7RaABUWWkgtOst+71v9AfD7GfDw8P19ATtA/NJpAONgB9yL+fm6jzIxMdnNGJxht1/2A9x//9jHGOSX3+5tBP27l35+fk5OTvZ9AhYgTjo0PUhGSDs9+LZjCFf2Aw0IDwcVAA8PD5lwg9+Q7YaChC0kJP8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGNEM2MUEyMzE0QTRFMTExOUQzRkE3QTBCRDNBMjdBQyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpERjQ0NEY0QkI2MTcxMUUxOUJEQkUzNUNGQTkwRTU2MiIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpERjQ0NEY0QUI2MTcxMUUxOUJEQkUzNUNGQTkwRTU2MiIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1OEE3RTIwRjcyQTlFMTExOTQ1QkY2QTU5QzVCQjJBOSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpGNEM2MUEyMzE0QTRFMTExOUQzRkE3QTBCRDNBMjdBQyIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1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'\n"],"names":["env.hasConf","env.hasParam","env.getParam","random.uint32","prng.create","string.fromCamelCase","log.GREY","log.PURPLE","log.BLUE","log.groupCollapsed","log.group","performance","promise.isPromise","log.printError","log.groupEnd","env.isBrowser","time.humanizeDuration","array.last","statistics.median","statistics.average","log.print","log.BOLD","log.UNBOLD","log.RED","log.UNCOLOR","log.GREEN","log.printDom","log.printCanvas","diff","simpleDiffString","object.equalFlat","json.stringify","object.length","object.forEach","object.hasProperty","object.map","math.add","log.printImgBase64"],"mappings":"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"}
|
package/encoding.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ export class Encoder {
|
|
|
12
12
|
export function createEncoder(): Encoder;
|
|
13
13
|
export function length(encoder: Encoder): number;
|
|
14
14
|
export function toUint8Array(encoder: Encoder): Uint8Array;
|
|
15
|
+
export function verifyLen(encoder: Encoder, len: number): void;
|
|
15
16
|
export function write(encoder: Encoder, num: number): void;
|
|
16
17
|
export function set(encoder: Encoder, pos: number, num: number): void;
|
|
17
18
|
export function writeUint8(encoder: Encoder, num: number): void;
|
|
@@ -23,6 +24,8 @@ export function writeUint32BigEndian(encoder: Encoder, num: number): void;
|
|
|
23
24
|
export function setUint32(encoder: Encoder, pos: number, num: number): void;
|
|
24
25
|
export function writeVarUint(encoder: Encoder, num: number): void;
|
|
25
26
|
export function writeVarInt(encoder: Encoder, num: number): void;
|
|
27
|
+
export function _writeVarStringNative(encoder: Encoder, str: string): void;
|
|
28
|
+
export function _writeVarStringPolyfill(encoder: Encoder, str: string): void;
|
|
26
29
|
export function writeVarString(encoder: Encoder, str: string): void;
|
|
27
30
|
export function writeBinaryEncoder(encoder: Encoder, append: Encoder): void;
|
|
28
31
|
export function writeUint8Array(encoder: Encoder, uint8Array: Uint8Array): void;
|
package/encoding.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["encoding.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["encoding.js"],"names":[],"mappings":"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"}
|
package/encoding.js
CHANGED
|
@@ -30,6 +30,7 @@ import * as buffer from './buffer.js'
|
|
|
30
30
|
import * as math from './math.js'
|
|
31
31
|
import * as number from './number.js'
|
|
32
32
|
import * as binary from './binary.js'
|
|
33
|
+
import * as string from './string.js'
|
|
33
34
|
|
|
34
35
|
/**
|
|
35
36
|
* A BinaryEncoder handles the encoding to an Uint8Array.
|
|
@@ -92,7 +93,7 @@ export const toUint8Array = encoder => {
|
|
|
92
93
|
* @param {Encoder} encoder
|
|
93
94
|
* @param {number} len
|
|
94
95
|
*/
|
|
95
|
-
const verifyLen = (encoder, len) => {
|
|
96
|
+
export const verifyLen = (encoder, len) => {
|
|
96
97
|
const bufferLen = encoder.cbuf.length
|
|
97
98
|
if (bufferLen - encoder.cpos < len) {
|
|
98
99
|
encoder.bufs.push(buffer.createUint8ArrayViewFromArrayBuffer(encoder.cbuf.buffer, 0, encoder.cpos))
|
|
@@ -232,9 +233,7 @@ export const setUint32 = (encoder, pos, num) => {
|
|
|
232
233
|
}
|
|
233
234
|
|
|
234
235
|
/**
|
|
235
|
-
* Write a variable length unsigned integer.
|
|
236
|
-
*
|
|
237
|
-
* Encodes integers in the range from [0, 4294967295] / [0, 0xffffffff]. (max 32 bit unsigned integer)
|
|
236
|
+
* Write a variable length unsigned integer. Max encodable integer is 2^53.
|
|
238
237
|
*
|
|
239
238
|
* @function
|
|
240
239
|
* @param {Encoder} encoder
|
|
@@ -243,7 +242,7 @@ export const setUint32 = (encoder, pos, num) => {
|
|
|
243
242
|
export const writeVarUint = (encoder, num) => {
|
|
244
243
|
while (num > binary.BITS7) {
|
|
245
244
|
write(encoder, binary.BIT8 | (binary.BITS7 & num))
|
|
246
|
-
num
|
|
245
|
+
num = math.floor(num / 128) // shift >>> 7
|
|
247
246
|
}
|
|
248
247
|
write(encoder, binary.BITS7 & num)
|
|
249
248
|
}
|
|
@@ -251,11 +250,6 @@ export const writeVarUint = (encoder, num) => {
|
|
|
251
250
|
/**
|
|
252
251
|
* Write a variable length integer.
|
|
253
252
|
*
|
|
254
|
-
* Encodes integers in the range from [-2147483648, -2147483647].
|
|
255
|
-
*
|
|
256
|
-
* We don't use zig-zag encoding because we want to keep the option open
|
|
257
|
-
* to use the same function for BigInt and 53bit integers (doubles).
|
|
258
|
-
*
|
|
259
253
|
* We use the 7th bit instead for signaling that this is a negative number.
|
|
260
254
|
*
|
|
261
255
|
* @function
|
|
@@ -269,15 +263,21 @@ export const writeVarInt = (encoder, num) => {
|
|
|
269
263
|
}
|
|
270
264
|
// |- whether to continue reading |- whether is negative |- number
|
|
271
265
|
write(encoder, (num > binary.BITS6 ? binary.BIT8 : 0) | (isNegative ? binary.BIT7 : 0) | (binary.BITS6 & num))
|
|
272
|
-
num
|
|
266
|
+
num = math.floor(num / 64) // shift >>> 6
|
|
273
267
|
// We don't need to consider the case of num === 0 so we can use a different
|
|
274
268
|
// pattern here than above.
|
|
275
269
|
while (num > 0) {
|
|
276
270
|
write(encoder, (num > binary.BITS7 ? binary.BIT8 : 0) | (binary.BITS7 & num))
|
|
277
|
-
num
|
|
271
|
+
num = math.floor(num / 128) // shift >>> 7
|
|
278
272
|
}
|
|
279
273
|
}
|
|
280
274
|
|
|
275
|
+
/**
|
|
276
|
+
* A cache to store strings temporarily
|
|
277
|
+
*/
|
|
278
|
+
const _strBuffer = new Uint8Array(30000)
|
|
279
|
+
const _maxStrBSize = _strBuffer.length / 3
|
|
280
|
+
|
|
281
281
|
/**
|
|
282
282
|
* Write a variable length string.
|
|
283
283
|
*
|
|
@@ -285,7 +285,28 @@ export const writeVarInt = (encoder, num) => {
|
|
|
285
285
|
* @param {Encoder} encoder
|
|
286
286
|
* @param {String} str The string that is to be encoded.
|
|
287
287
|
*/
|
|
288
|
-
export const
|
|
288
|
+
export const _writeVarStringNative = (encoder, str) => {
|
|
289
|
+
if (str.length < _maxStrBSize) {
|
|
290
|
+
// We can encode the string into the existing buffer
|
|
291
|
+
/* istanbul ignore else */
|
|
292
|
+
const written = string.utf8TextEncoder.encodeInto(str, _strBuffer).written || 0
|
|
293
|
+
writeVarUint(encoder, written)
|
|
294
|
+
for (let i = 0; i < written; i++) {
|
|
295
|
+
write(encoder, _strBuffer[i])
|
|
296
|
+
}
|
|
297
|
+
} else {
|
|
298
|
+
writeVarUint8Array(encoder, string.encodeUtf8(str))
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Write a variable length string.
|
|
304
|
+
*
|
|
305
|
+
* @function
|
|
306
|
+
* @param {Encoder} encoder
|
|
307
|
+
* @param {String} str The string that is to be encoded.
|
|
308
|
+
*/
|
|
309
|
+
export const _writeVarStringPolyfill = (encoder, str) => {
|
|
289
310
|
const encodedString = unescape(encodeURIComponent(str))
|
|
290
311
|
const len = encodedString.length
|
|
291
312
|
writeVarUint(encoder, len)
|
|
@@ -294,6 +315,16 @@ export const writeVarString = (encoder, str) => {
|
|
|
294
315
|
}
|
|
295
316
|
}
|
|
296
317
|
|
|
318
|
+
/**
|
|
319
|
+
* Write a variable length string.
|
|
320
|
+
*
|
|
321
|
+
* @function
|
|
322
|
+
* @param {Encoder} encoder
|
|
323
|
+
* @param {String} str The string that is to be encoded.
|
|
324
|
+
*/
|
|
325
|
+
/* istanbul ignore next */
|
|
326
|
+
export const writeVarString = string.utf8TextEncoder ? _writeVarStringNative : _writeVarStringPolyfill
|
|
327
|
+
|
|
297
328
|
/**
|
|
298
329
|
* Write the content of another Encoder.
|
|
299
330
|
*
|
|
@@ -721,7 +752,8 @@ export class IncUintOptRleEncoder {
|
|
|
721
752
|
const flushIntDiffOptRleEncoder = encoder => {
|
|
722
753
|
if (encoder.count > 0) {
|
|
723
754
|
// 31 bit making up the diff | wether to write the counter
|
|
724
|
-
const encodedDiff = encoder.diff << 1 | (encoder.count === 1 ? 0 : 1)
|
|
755
|
+
// const encodedDiff = encoder.diff << 1 | (encoder.count === 1 ? 0 : 1)
|
|
756
|
+
const encodedDiff = encoder.diff * 2 + (encoder.count === 1 ? 0 : 1)
|
|
725
757
|
// flush counter, unless this is the first value (count = 0)
|
|
726
758
|
// case 1: just a single value. set first bit to positive
|
|
727
759
|
// case 2: write several values. set first bit to negative to indicate that there is a length coming
|
package/encoding.test.d.ts
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
export function testGolangBinaryEncodingCompatibility(): void;
|
|
2
|
+
export function testVerifyLen(): void;
|
|
3
|
+
export function testStringEncodingPerformanceNativeVsPolyfill(): void;
|
|
4
|
+
export function testDecodingPerformanceNativeVsPolyfill(): void;
|
|
2
5
|
export function testStringDecodingPerformance(): void;
|
|
3
6
|
export function testAnyEncodeUnknowns(tc: t.TestCase): void;
|
|
4
7
|
export function testAnyEncodeDate(tc: t.TestCase): void;
|
|
@@ -6,8 +9,10 @@ export function testEncodeMax32bitUint(tc: t.TestCase): void;
|
|
|
6
9
|
export function testVarUintEncoding(tc: t.TestCase): void;
|
|
7
10
|
export function testVarIntEncoding(tc: t.TestCase): void;
|
|
8
11
|
export function testRepeatVarUintEncoding(tc: t.TestCase): void;
|
|
12
|
+
export function testRepeatVarUintEncoding53bit(tc: t.TestCase): void;
|
|
9
13
|
export function testRepeatVarIntEncoding(tc: t.TestCase): void;
|
|
10
|
-
export function
|
|
14
|
+
export function testRepeatVarIntEncoding53bit(tc: t.TestCase): void;
|
|
15
|
+
export function testRepeanntAnyEncoding(tc: t.TestCase): void;
|
|
11
16
|
export function testRepeatPeekVarUintEncoding(tc: t.TestCase): void;
|
|
12
17
|
export function testRepeatPeekVarIntEncoding(tc: t.TestCase): void;
|
|
13
18
|
export function testAnyVsJsonEncoding(tc: t.TestCase): void;
|
package/encoding.test.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encoding.test.d.ts","sourceRoot":"","sources":["encoding.test.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"encoding.test.d.ts","sourceRoot":"","sources":["encoding.test.js"],"names":[],"mappings":"AA6CO,8DAiCN;AAwCM,sCAON;AAEM,sEAyCN;AAEM,gEAkDN;AAEM,sDAiDN;AAKM,0CAFI,EAAE,QAAQ,QAYpB;AAKM,sCAFI,EAAE,QAAQ,QAIpB;AAKM,2CAFI,EAAE,QAAQ,QAIpB;AAKM,wCAFI,EAAE,QAAQ,QASpB;AAKM,uCAFI,EAAE,QAAQ,QAUpB;AAKM,8CAFI,EAAE,QAAQ,QAKpB;AAKM,mDAFI,EAAE,QAAQ,QAKpB;AAKM,6CAFI,EAAE,QAAQ,QAKpB;AAKM,kDAFI,EAAE,QAAQ,QAKpB;AAKM,4CAFI,EAAE,QAAQ,QAKpB;AAKM,kDAFI,EAAE,QAAQ,QAKpB;AAKM,iDAFI,EAAE,QAAQ,QAKpB;AAKM,0CAFI,EAAE,QAAQ,QAkBpB;AAKM,uCAFI,EAAE,QAAQ,QAWpB;AAKM,6CAFI,EAAE,QAAQ,QAGqB;AAKnC,mCAFI,EAAE,QAAQ,QAkBpB;AAyCM,2CAFI,EAAE,QAAQ,QA6BpB;AAKM,gDAFI,EAAE,QAAQ,QAiBpB;AAKM,sCAFI,EAAE,QAAQ,QAuBpB;AAKM,qCAFI,EAAE,QAAQ,QAcpB;AAKM,2CAFI,EAAE,QAAQ,QAYpB;AAKM,+CAFI,EAAE,QAAQ,QAapB;AAKM,mCAFI,EAAE,QAAQ,QAkBpB;AAKM,0CAFI,EAAE,QAAQ,QAkBpB;AAKM,0CAFI,EAAE,QAAQ,QAkBpB;AAKM,0CAFI,EAAE,QAAQ,QAkBpB;AAKM,oCAFI,EAAE,QAAQ,QAqCpB;AAKM,uCAFI,EAAE,QAAQ,QAYpB;AAKM,sCAFI,EAAE,QAAQ,QAyBpB;AAKM,+CAFI,EAAE,QAAQ,QASpB;;iBAvUsB,SAAS,OAAO,KAAE,GAAG;kBACrB,SAAS,OAAO,QAAC,GAAG,KAAE,IAAI;gBAC1B,KAAK,IAAI,KAAE,GAAG;oBACd,GAAG,QAAC,GAAG,KAAE,OAAO;UACzB,MAAM"}
|
package/list.d.ts
CHANGED
|
@@ -20,14 +20,19 @@ export class List<N extends ListNode> {
|
|
|
20
20
|
* @type {N | null}
|
|
21
21
|
*/
|
|
22
22
|
end: N | null;
|
|
23
|
+
len: number;
|
|
23
24
|
}
|
|
24
25
|
export function create<N extends ListNode>(): List<N>;
|
|
25
26
|
export function isEmpty<N extends ListNode>(queue: List<N>): boolean;
|
|
27
|
+
export function remove<N extends ListNode>(queue: List<N>, node: N): N;
|
|
26
28
|
export function removeNode<N extends ListNode>(queue: List<N>, node: N): N;
|
|
27
29
|
export function insertBetween<N extends ListNode>(queue: List<N>, left: N | null, right: N | null, node: N): void;
|
|
30
|
+
export function replace<N extends ListNode>(queue: List<N>, node: N, newNode: N): void;
|
|
28
31
|
export function pushEnd<N extends ListNode>(queue: List<N>, n: N): void;
|
|
29
32
|
export function pushFront<N extends ListNode>(queue: List<N>, n: N): void;
|
|
30
33
|
export function popFront<N extends ListNode>(list: List<N>): N | null;
|
|
31
34
|
export function popEnd<N extends ListNode>(list: List<N>): N | null;
|
|
32
35
|
export function map<N extends ListNode, M>(list: List<N>, f: (arg0: N) => M): M[];
|
|
36
|
+
export function toArray<N extends ListNode>(list: List<N>): N[];
|
|
37
|
+
export function forEach<N extends ListNode, M>(list: List<N>, f: (arg0: N) => M): void;
|
|
33
38
|
//# sourceMappingURL=list.d.ts.map
|
package/list.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["list.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["list.js"],"names":[],"mappings":"AAGA;IAEI;;OAEG;IACH,sBAAgB;IAChB;;OAEG;IACH,sBAAgB;CAEnB;AAED;;GAEG;AACH;IAEI;;OAEG;IACH,OAFU,CAAC,GAAG,IAAI,CAED;IACjB;;OAEG;IACH,KAFU,CAAC,GAAG,IAAI,CAEH;IACf,YAAY;CAEf;AAUM,sDAA+B;AAO/B,qEAA6C;AAU7C,uEAeN;AAfM,2EAeN;AAeM,kHAkBN;AAWM,uFAGN;AAQM,wEACmC;AAQnC,0EACqC;AAQrC,sEAC2C;AAQ3C,oEACuC;AAUvC,kFAWN;AAOM,gEAAqC;AASrC,uFAMN"}
|
package/list.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { id } from './function.js'
|
|
1
2
|
import * as error from './error.js'
|
|
2
3
|
|
|
3
4
|
export class ListNode {
|
|
@@ -26,6 +27,7 @@ export class List {
|
|
|
26
27
|
* @type {N | null}
|
|
27
28
|
*/
|
|
28
29
|
this.end = null
|
|
30
|
+
this.len = 0
|
|
29
31
|
}
|
|
30
32
|
}
|
|
31
33
|
|
|
@@ -54,7 +56,7 @@ export const isEmpty = queue => queue.start === null
|
|
|
54
56
|
* @param {List<N>} queue
|
|
55
57
|
* @param {N} node
|
|
56
58
|
*/
|
|
57
|
-
export const
|
|
59
|
+
export const remove = (queue, node) => {
|
|
58
60
|
const prev = node.prev
|
|
59
61
|
const next = node.next
|
|
60
62
|
if (prev) {
|
|
@@ -67,9 +69,15 @@ export const removeNode = (queue, node) => {
|
|
|
67
69
|
} else {
|
|
68
70
|
queue.end = prev
|
|
69
71
|
}
|
|
72
|
+
queue.len--
|
|
70
73
|
return node
|
|
71
74
|
}
|
|
72
75
|
|
|
76
|
+
/**
|
|
77
|
+
* @deprecated @todo remove in next major release
|
|
78
|
+
*/
|
|
79
|
+
export const removeNode = remove
|
|
80
|
+
|
|
73
81
|
/**
|
|
74
82
|
* @template {ListNode} N
|
|
75
83
|
*
|
|
@@ -95,6 +103,21 @@ export const insertBetween = (queue, left, right, node) => {
|
|
|
95
103
|
}
|
|
96
104
|
node.prev = left
|
|
97
105
|
node.next = right
|
|
106
|
+
queue.len++
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Remove a single node from the queue. Only works with Queues that operate on Doubly-linked lists of nodes.
|
|
111
|
+
*
|
|
112
|
+
* @template {ListNode} N
|
|
113
|
+
*
|
|
114
|
+
* @param {List<N>} queue
|
|
115
|
+
* @param {N} node
|
|
116
|
+
* @param {N} newNode
|
|
117
|
+
*/
|
|
118
|
+
export const replace = (queue, node, newNode) => {
|
|
119
|
+
insertBetween(queue, node, node.next, newNode)
|
|
120
|
+
remove(queue, node)
|
|
98
121
|
}
|
|
99
122
|
|
|
100
123
|
/**
|
|
@@ -153,3 +176,25 @@ export const map = (list, f) => {
|
|
|
153
176
|
}
|
|
154
177
|
return arr
|
|
155
178
|
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* @template {ListNode} N
|
|
182
|
+
*
|
|
183
|
+
* @param {List<N>} list
|
|
184
|
+
*/
|
|
185
|
+
export const toArray = list => map(list, id)
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* @template {ListNode} N
|
|
189
|
+
* @template M
|
|
190
|
+
*
|
|
191
|
+
* @param {List<N>} list
|
|
192
|
+
* @param {function(N):M} f
|
|
193
|
+
*/
|
|
194
|
+
export const forEach = (list, f) => {
|
|
195
|
+
let n = list.start
|
|
196
|
+
while (n) {
|
|
197
|
+
f(n)
|
|
198
|
+
n = n.next
|
|
199
|
+
}
|
|
200
|
+
}
|
package/list.test.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.test.d.ts","sourceRoot":"","sources":["list.test.js"],"names":[],"mappings":"AAgBO,uCAFI,EAAE,QAAQ,QA8BpB;AAKM,qCAFI,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"list.test.d.ts","sourceRoot":"","sources":["list.test.js"],"names":[],"mappings":"AAgBO,uCAFI,EAAE,QAAQ,QA8BpB;AAKM,qCAFI,EAAE,QAAQ,QA0BpB"}
|
package/number.test.d.ts
CHANGED
package/number.test.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"number.test.d.ts","sourceRoot":"","sources":["number.test.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"number.test.d.ts","sourceRoot":"","sources":["number.test.js"],"names":[],"mappings":"AAQO,+BAFI,EAAE,QAAQ,QAcpB;AAOM,wCAFI,EAAE,QAAQ,QA6DpB"}
|
package/package.json
CHANGED
package/prng.d.ts
CHANGED
package/prng.js
CHANGED
package/random.d.ts
CHANGED
package/random.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"random.d.ts","sourceRoot":"","sources":["random.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"random.d.ts","sourceRoot":"","sources":["random.js"],"names":[],"mappings":"AAaA,gCAA+B;AAExB,iCAA8D;AAE9D,iCAGN;AAOM,sCAAyD;AAIzD,8BAEN"}
|
package/random.js
CHANGED
|
@@ -8,13 +8,18 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import * as math from './math.js'
|
|
11
|
+
import * as binary from './binary.js'
|
|
11
12
|
import { cryptoRandomBuffer } from './isomorphic.js'
|
|
12
13
|
|
|
13
14
|
export const rand = Math.random
|
|
14
15
|
|
|
15
|
-
/* istanbul ignore next */
|
|
16
16
|
export const uint32 = () => new Uint32Array(cryptoRandomBuffer(4))[0]
|
|
17
17
|
|
|
18
|
+
export const uint53 = () => {
|
|
19
|
+
const arr = new Uint32Array(cryptoRandomBuffer(8))
|
|
20
|
+
return (arr[0] & binary.BITS21) * (binary.BITS32 + 1) + (arr[1] >>> 0)
|
|
21
|
+
}
|
|
22
|
+
|
|
18
23
|
/**
|
|
19
24
|
* @template T
|
|
20
25
|
* @param {Array<T>} arr
|
package/random.test.d.ts
CHANGED
package/random.test.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"random.test.d.ts","sourceRoot":"","sources":["random.test.js"],"names":[],"mappings":"AASO,+BAFI,EAAE,QAAQ,QA0BpB;AAKM,+BAFI,EAAE,QAAQ,QAIpB;AAKM,uCAFI,EAAE,QAAQ,QAkBpB"}
|
|
1
|
+
{"version":3,"file":"random.test.d.ts","sourceRoot":"","sources":["random.test.js"],"names":[],"mappings":"AASO,+BAFI,EAAE,QAAQ,QA0BpB;AAKM,+BAFI,EAAE,QAAQ,QAyBpB;AAKM,+BAFI,EAAE,QAAQ,QAIpB;AAKM,uCAFI,EAAE,QAAQ,QAkBpB"}
|
package/testing.js
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
*
|
|
4
4
|
* ```js
|
|
5
5
|
* // test.js template for creating a test executable
|
|
6
|
-
* import { runTests } from 'lib0/testing
|
|
7
|
-
* import * as log from 'lib0/logging
|
|
6
|
+
* import { runTests } from 'lib0/testing'
|
|
7
|
+
* import * as log from 'lib0/logging'
|
|
8
8
|
* import * as mod1 from './mod1.test.js'
|
|
9
9
|
* import * as mod2 from './mod2.test.js'
|
|
10
10
|
|
|
@@ -186,7 +186,7 @@ export const run = async (moduleName, name, f, i, numberOfTests) => {
|
|
|
186
186
|
times.sort((a, b) => a - b)
|
|
187
187
|
/* istanbul ignore next */
|
|
188
188
|
const againMessage = env.isBrowser
|
|
189
|
-
? ` - ${window.location.
|
|
189
|
+
? ` - ${window.location.host + window.location.pathname}?filter=\\[${i + 1}/${tc._seed === null ? '' : `&seed=${tc._seed}`}`
|
|
190
190
|
: `\nrepeat: npm run test -- --filter "\\[${i + 1}/" ${tc._seed === null ? '' : `--seed ${tc._seed}`}`
|
|
191
191
|
const timeInfo = (repeat && err === null)
|
|
192
192
|
? ` - ${times.length} repetitions in ${time.humanizeDuration(duration)} (best: ${time.humanizeDuration(times[0])}, worst: ${time.humanizeDuration(array.last(times))}, median: ${time.humanizeDuration(statistics.median(times))}, average: ${time.humanizeDuration(statistics.average(times))})`
|