diff --git a/services/web/scripts/lezer-latex/random.mjs b/services/web/scripts/lezer-latex/random.mjs new file mode 100644 index 0000000000..0c07468b59 --- /dev/null +++ b/services/web/scripts/lezer-latex/random.mjs @@ -0,0 +1,19 @@ +// Super quick and dirty LCG PRNG + +const m = 0xffffffff +let X = Math.floor(Math.random() * (m - 1)) +const a = 16807 +const c = 0 + +// Should probably be a large-ish number +export function seed(i) { + if (i < 0) { + throw new Error('Seed must be a positive integer') + } + X = i & m +} + +export function random() { + X = (a * X + c) % m + return X / m +} diff --git a/services/web/scripts/lezer-latex/test-incremental-parser.mjs b/services/web/scripts/lezer-latex/test-incremental-parser.mjs index 11cef79682..a32894e16e 100644 --- a/services/web/scripts/lezer-latex/test-incremental-parser.mjs +++ b/services/web/scripts/lezer-latex/test-incremental-parser.mjs @@ -5,10 +5,16 @@ import * as path from 'path' import { fileURLToPath } from 'url' import { TreeFragment } from '@lezer/common' import minimist from 'minimist' +import { seed, random } from './random.mjs' const argv = minimist(process.argv.slice(2)) const NUMBER_OF_OPS = argv.ops || 1000 const CSV_OUTPUT = argv.csv || false +const SEED = argv.seed + +if (SEED) { + seed(SEED) +} const __dirname = path.dirname(fileURLToPath(import.meta.url)) @@ -108,13 +114,13 @@ function writeTextAt(document, position, text) { function randomInsertions(document, num) { return timedChanges(document, num, currentDoc => - insertAt(currentDoc, Math.floor(Math.random() * currentDoc.length), 'a') + insertAt(currentDoc, Math.floor(random() * currentDoc.length), 'a') ) } function randomDeletions(document, num) { return timedChanges(document, num, currentDoc => - deleteAt(currentDoc, Math.floor(Math.random() * currentDoc.length), 1) + deleteAt(currentDoc, Math.floor(random() * currentDoc.length), 1) ) }