@fluidframework/merge-tree 2.81.0 → 2.82.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/CHANGELOG.md +4 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +3 -1
- package/dist/client.js.map +1 -1
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +12 -2
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeTracking.d.ts.map +1 -1
- package/dist/mergeTreeTracking.js +3 -1
- package/dist/mergeTreeTracking.js.map +1 -1
- package/dist/partialLengths.d.ts.map +1 -1
- package/dist/partialLengths.js.map +1 -1
- package/dist/test/beastTest.spec.d.ts.map +1 -1
- package/dist/test/beastTest.spec.js +3 -1
- package/dist/test/beastTest.spec.js.map +1 -1
- package/dist/test/testServer.d.ts.map +1 -1
- package/dist/test/testServer.js +3 -1
- package/dist/test/testServer.js.map +1 -1
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +3 -1
- package/lib/client.js.map +1 -1
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +12 -2
- package/lib/mergeTree.js.map +1 -1
- package/lib/mergeTreeTracking.d.ts.map +1 -1
- package/lib/mergeTreeTracking.js +3 -1
- package/lib/mergeTreeTracking.js.map +1 -1
- package/lib/partialLengths.d.ts.map +1 -1
- package/lib/partialLengths.js.map +1 -1
- package/lib/test/beastTest.spec.d.ts.map +1 -1
- package/lib/test/beastTest.spec.js +3 -1
- package/lib/test/beastTest.spec.js.map +1 -1
- package/lib/test/testServer.d.ts.map +1 -1
- package/lib/test/testServer.js +3 -1
- package/lib/test/testServer.js.map +1 -1
- package/package.json +18 -18
- package/src/client.ts +1 -0
- package/src/mergeTree.ts +27 -9
- package/src/mergeTreeTracking.ts +1 -0
- package/src/partialLengths.ts +5 -1
- package/biome.jsonc +0 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"beastTest.spec.js","sourceRoot":"","sources":["../../src/test/beastTest.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/consistent-type-assertions, no-bitwise */\n/* eslint-disable @typescript-eslint/no-unnecessary-type-assertion */\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/* eslint-disable @typescript-eslint/no-base-to-string */\n\nimport { strict as assert } from \"node:assert\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nimport { Trace } from \"@fluid-internal/client-utils\";\nimport { type IRandom, makeRandom } from \"@fluid-private/stochastic-test-utils\";\nimport type { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\nimport { createChildLogger } from \"@fluidframework/telemetry-utils/internal\";\nimport JsDiff from \"diff\";\n\nimport { MergeTreeTextHelper } from \"../MergeTreeTextHelper.js\";\nimport {\n\ttype KeyComparer,\n\ttype Property,\n\ttype PropertyAction,\n\tRedBlackTree,\n\ttype SortedDictionary,\n} from \"../collections/index.js\";\nimport {\n\tLocalClientId,\n\tUnassignedSequenceNumber,\n\tUniversalSequenceNumber,\n} from \"../constants.js\";\nimport { MergeTree } from \"../mergeTree.js\";\nimport type { IMergeTreeDeltaOpArgs } from \"../mergeTreeDeltaCallback.js\";\nimport {\n\ttype IJSONMarkerSegment,\n\tcompareNumbers,\n\tcompareStrings,\n\treservedMarkerIdKey,\n\ttype ISegmentPrivate,\n} from \"../mergeTreeNodes.js\";\nimport { createRemoveRangeOp } from \"../opBuilder.js\";\nimport { type IMergeTreeOp, MergeTreeDeltaType, ReferenceType } from \"../ops.js\";\nimport { LocalDefaultPerspective } from \"../perspective.js\";\nimport { reservedRangeLabelsKey, reservedTileLabelsKey } from \"../referencePositions.js\";\nimport type { JsonSegmentSpecs } from \"../snapshotChunks.js\";\nimport { SnapshotLegacy } from \"../snapshotlegacy.js\";\nimport { type IJSONTextSegment, TextSegment } from \"../textSegment.js\";\n\nimport { _dirname } from \"./dirname.cjs\";\nimport { TestClient, getStats, specToSegment } from \"./testClient.js\";\nimport { TestServer } from \"./testServer.js\";\nimport { loadTextFromFile, nodeOrdinalsHaveIntegrity } from \"./testUtils.js\";\n\nfunction LinearDictionary<TKey, TData>(\n\tcompareKeys: KeyComparer<TKey>,\n): SortedDictionary<TKey, TData> {\n\tconst props: Property<TKey, TData>[] = [];\n\tconst compareProps = (a: Property<TKey, TData>, b: Property<TKey, TData>): number =>\n\t\tcompareKeys(a.key, b.key);\n\tfunction mapRange<TAccum>(\n\t\taction: PropertyAction<TKey, TData>,\n\t\taccum?: TAccum,\n\t\tstart?: TKey,\n\t\tend?: TKey,\n\t): void {\n\t\tlet _start = start;\n\t\tlet _end = end;\n\n\t\tif (props.length > 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- using ??= could change behavior if value is falsy\n\t\tif (_start === undefined) {\n\t\t\t_start = min()!.key;\n\t\t}\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- using ??= could change behavior if value is falsy\n\t\tif (_end === undefined) {\n\t\t\t_end = max()!.key;\n\t\t}\n\t\tfor (let i = 0, len = props.length; i < len; i++) {\n\t\t\tif (compareKeys(_start, props[i].key) <= 0) {\n\t\t\t\tconst ecmp = compareKeys(_end, props[i].key);\n\t\t\t\tif (ecmp < 0) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (!action(props[i], accum)) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction map<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum): void {\n\t\tmapRange(action, accum);\n\t}\n\n\tfunction min(): Property<TKey, TData> | undefined {\n\t\tif (props.length > 0) {\n\t\t\treturn props[0];\n\t\t}\n\t}\n\tfunction max(): Property<TKey, TData> | undefined {\n\t\tif (props.length > 0) {\n\t\t\treturn props[props.length - 1];\n\t\t}\n\t}\n\n\tfunction get(key: TKey): Property<TKey, TData> | undefined {\n\t\tfor (let i = 0, len = props.length; i < len; i++) {\n\t\t\tif (props[i].key === key) {\n\t\t\t\treturn props[i];\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction put(key: TKey, data: TData): void {\n\t\tif (key !== undefined) {\n\t\t\tif (data === undefined) {\n\t\t\t\tremove(key);\n\t\t\t} else {\n\t\t\t\tprops.push({ key, data });\n\t\t\t\tprops.sort(compareProps); // Go to insertion sort if too slow\n\t\t\t}\n\t\t}\n\t}\n\tfunction remove(key: TKey): void {\n\t\tif (key !== undefined) {\n\t\t\tfor (let i = 0, len = props.length; i < len; i++) {\n\t\t\t\tif (props[i].key === key) {\n\t\t\t\t\tprops[i] = props[len - 1];\n\t\t\t\t\tprops.length--;\n\t\t\t\t\tprops.sort(compareProps);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn {\n\t\tmin,\n\t\tmax,\n\t\tmap,\n\t\tmapRange,\n\t\tremove,\n\t\tget,\n\t\tput,\n\t};\n}\n\nlet logLines: string[];\nfunction log(message: string | number): void {\n\tif (logLines) {\n\t\tlogLines.push(message.toString());\n\t}\n}\n\nfunction printStringProperty(p?: Property<string, string>): boolean {\n\tlog(`[${p?.key}, ${p?.data}]`);\n\treturn true;\n}\n\nfunction printStringNumProperty(p: Property<string, number>): boolean {\n\tlog(`[${p.key}, ${p.data}]`);\n\treturn true;\n}\n\nexport function simpleTest(): void {\n\tconst a = [\"Aardvark\", \"cute\", \"Baboon\", \"big\", \"Chameleon\", \"colorful\", \"Dingo\", \"wild\"];\n\n\tconst beast = new RedBlackTree<string, string>(compareStrings);\n\tfor (let i = 0; i < a.length; i += 2) {\n\t\tbeast.put(a[i], a[i + 1]);\n\t}\n\tbeast.map((element) => printStringProperty(element));\n\tlog(\"Map B D\");\n\tlog(\"Map Aardvark Dingo\");\n\tlog(\"Map Baboon Chameleon\");\n\tprintStringProperty(beast.get(\"Chameleon\"));\n}\n\nconst clock = (): Trace => Trace.start();\n\nfunction took(desc: string, trace: Trace): number {\n\tconst duration = trace.trace().duration;\n\tlog(`${desc} took ${duration} ms`);\n\treturn duration;\n}\n\nfunction elapsedMicroseconds(trace: Trace): number {\n\treturn trace.trace().duration * 1000;\n}\n\nexport function integerTest1(): number {\n\tconst random = makeRandom(0xdeadbeef, 0xfeedbed);\n\tconst imin = 0;\n\tconst imax = 10000000;\n\tconst intCount = 1100000;\n\tconst beast = new RedBlackTree<number, number>(compareNumbers);\n\n\tconst randInt = (): number => random.integer(imin, imax);\n\tconst pos: number[] = Array.from({ length: intCount });\n\tlet i = 0;\n\tlet redo = false;\n\tfunction onConflict(key: number, currentKey: number): { data: number } {\n\t\tredo = true;\n\t\treturn { data: currentKey };\n\t}\n\tlet conflictCount = 0;\n\tlet start = clock();\n\twhile (i < intCount) {\n\t\tpos[i] = randInt();\n\t\tbeast.put(pos[i], i, onConflict);\n\t\tif (redo) {\n\t\t\tconflictCount++;\n\t\t\tredo = false;\n\t\t} else {\n\t\t\ti++;\n\t\t}\n\t}\n\ttook(\"test gen\", start);\n\tconst errorCount = 0;\n\tstart = clock();\n\tfor (let j = 0, len = pos.length; j < len; j++) {\n\t\tconst cp = pos[j];\n\t\t/* let prop = */ beast.get(cp);\n\t}\n\tconst getdur = took(\"get all keys\", start);\n\tlog(`cost per get is ${((1000 * getdur) / intCount).toFixed(3)} us`);\n\tlog(`duplicates ${conflictCount}, errors ${errorCount}`);\n\treturn errorCount;\n}\n\nexport function fileTest1(): void {\n\tconst content = fs.readFileSync(\n\t\tpath.join(_dirname, \"../../../public/literature/shakespeare.txt\"),\n\t\t\"utf8\",\n\t);\n\tconst a = content.split(\"\\n\");\n\tconst iterCount = a.length >> 2;\n\tconst removeCount = 10;\n\tlog(`len: ${a.length}`);\n\n\tfor (let k = 0; k < iterCount; k++) {\n\t\tconst beast = new RedBlackTree<string, number>(compareStrings);\n\t\tconst linearBeast = LinearDictionary<string, number>(compareStrings);\n\t\tfor (let i = 0, len = a.length; i < len; i++) {\n\t\t\ta[i] = a[i].trim();\n\t\t\tif (a[i].length > 0) {\n\t\t\t\tbeast.put(a[i], i);\n\t\t\t\tlinearBeast.put(a[i], i);\n\t\t\t}\n\t\t}\n\t\tif (k === 0) {\n\t\t\tbeast.map((element) => printStringNumProperty(element));\n\t\t\tlog(\"BTREE...\");\n\t\t}\n\t\tconst removedAnimals: string[] = [];\n\t\tfor (let j = 0; j < removeCount; j++) {\n\t\t\tconst removeIndex = Math.floor(Math.random() * a.length);\n\t\t\tlog(`Removing: ${a[removeIndex]} at ${removeIndex}`);\n\t\t\tbeast.remove(a[removeIndex]);\n\t\t\tlinearBeast.remove(a[removeIndex]);\n\t\t\tremovedAnimals.push(a[removeIndex]);\n\t\t}\n\t\tfor (const animal of a) {\n\t\t\tif (animal.length > 0 && !removedAnimals.includes(animal)) {\n\t\t\t\tconst prop = beast.get(animal);\n\t\t\t\tconst linProp = linearBeast.get(animal);\n\t\t\t\t// log(`Trying key ${animal}`);\n\t\t\t\tif (prop) {\n\t\t\t\t\t// printStringNumProperty(prop);\n\t\t\t\t\tif (\n\t\t\t\t\t\tlinProp === undefined ||\n\t\t\t\t\t\tprop.key !== linProp.key ||\n\t\t\t\t\t\tprop.data !== linProp.data\n\t\t\t\t\t) {\n\t\t\t\t\t\tlog(`Linear BST does not match RB BST at key ${animal}`);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tlog(`hmm...bad key: ${animal}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction printTextSegment(textSegment: ISegmentPrivate, pos: number): boolean {\n\tlog(textSegment.toString());\n\tlog(`at [${pos}, ${pos + textSegment.cachedLength})`);\n\treturn true;\n}\n\nfunction makeCollabTextSegment(text: string): TextSegment {\n\treturn new TextSegment(text);\n}\n\nfunction editFlat(source: string, s: number, dl: number, nt = \"\"): string {\n\treturn source.slice(0, Math.max(0, s)) + nt + source.slice(s + dl, source.length);\n}\n\nlet accumTime = 0;\n\nfunction checkInsertMergeTree(\n\tmergeTree: MergeTree,\n\tpos: number,\n\ttextSegment: TextSegment,\n\tverbose = false,\n): boolean {\n\tlet checkText = new MergeTreeTextHelper(mergeTree).getText(mergeTree.localPerspective);\n\tcheckText = editFlat(checkText, pos, 0, textSegment.text);\n\tconst clockStart = clock();\n\tmergeTree.insertSegments(\n\t\tpos,\n\t\t[textSegment],\n\t\tmergeTree.localPerspective,\n\t\t{ clientId: LocalClientId, seq: UniversalSequenceNumber },\n\t\tundefined,\n\t);\n\taccumTime += elapsedMicroseconds(clockStart);\n\tconst updatedText = new MergeTreeTextHelper(mergeTree).getText(mergeTree.localPerspective);\n\tconst result = checkText === updatedText;\n\tif (!result && verbose) {\n\t\tlog(`mismatch(o): ${checkText}`);\n\t\tlog(`mismatch(u): ${updatedText}`);\n\t}\n\treturn result;\n}\n\nfunction checkMarkRemoveMergeTree(\n\tmergeTree: MergeTree,\n\tstart: number,\n\tend: number,\n\tverbose = false,\n): boolean {\n\tconst helper = new MergeTreeTextHelper(mergeTree);\n\tconst origText = helper.getText(mergeTree.localPerspective);\n\tconst checkText = editFlat(origText, start, end - start);\n\tconst clockStart = clock();\n\tmergeTree.markRangeRemoved(\n\t\tstart,\n\t\tend,\n\t\tmergeTree.localPerspective,\n\t\t{ clientId: LocalClientId, seq: UniversalSequenceNumber },\n\t\t{ op: createRemoveRangeOp(start, end) },\n\t);\n\taccumTime += elapsedMicroseconds(clockStart);\n\tconst updatedText = helper.getText(mergeTree.localPerspective);\n\tconst result = checkText === updatedText;\n\tif (!result && verbose) {\n\t\tlog(`mismatch(o): ${origText}`);\n\t\tlog(`mismatch(c): ${checkText}`);\n\t\tlog(`mismatch(u): ${updatedText}`);\n\t}\n\treturn result;\n}\n\nexport function mergeTreeTest1(): void {\n\tconst mergeTree = new MergeTree();\n\tmergeTree.insertSegments(\n\t\t0,\n\t\t[TextSegment.make(\"the cat is on the mat\")],\n\t\tmergeTree.localPerspective,\n\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\tundefined,\n\t);\n\tconst localPerspective = new LocalDefaultPerspective(mergeTree.collabWindow.clientId);\n\tmergeTree.mapRange(printTextSegment, localPerspective, undefined);\n\tlet fuzzySeg = makeCollabTextSegment(\"fuzzy, fuzzy \");\n\tcheckInsertMergeTree(mergeTree, 4, fuzzySeg);\n\tfuzzySeg = makeCollabTextSegment(\"fuzzy, fuzzy \");\n\tcheckInsertMergeTree(mergeTree, 4, fuzzySeg);\n\tcheckMarkRemoveMergeTree(mergeTree, 4, 13);\n\t// checkRemoveSegTree(segTree, 4, 13);\n\tcheckInsertMergeTree(mergeTree, 4, makeCollabTextSegment(\"fi\"));\n\tmergeTree.mapRange(printTextSegment, localPerspective, undefined);\n\tconst segoff = mergeTree.getContainingSegment(4, mergeTree.localPerspective);\n\tlog(mergeTree.getPosition(segoff!.segment, mergeTree.localPerspective));\n\tlog(new MergeTreeTextHelper(mergeTree).getText(mergeTree.localPerspective));\n\tlog(mergeTree.toString());\n\tTestPack().firstTest();\n}\n\nexport function mergeTreeLargeTest(): void {\n\tconst mergeTree = new MergeTree();\n\tmergeTree.insertSegments(\n\t\t0,\n\t\t[TextSegment.make(\"the cat is on the mat\")],\n\t\tmergeTree.localPerspective,\n\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\tundefined,\n\t);\n\tconst insertCount = 1000000;\n\tconst removeCount = 980000;\n\tconst random = makeRandom(0xdeadbeef, 0xfeedbed);\n\tconst imin = 1;\n\tconst imax = 9;\n\tconst randInt = (): number => random.integer(imin, imax);\n\tfunction randomString(len: number, c: string): string {\n\t\tlet str = \"\";\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tstr += c;\n\t\t}\n\t\treturn str;\n\t}\n\taccumTime = 0;\n\tlet accumTreeSize = 0;\n\tlet treeCount = 0;\n\tfor (let i = 0; i < insertCount; i++) {\n\t\tconst slen = randInt();\n\t\tconst s = randomString(slen, String.fromCodePoint(48 + slen));\n\t\tconst preLen = mergeTree.getLength(mergeTree.localPerspective);\n\t\tconst pos = random.integer(0, preLen);\n\t\tconst clockStart = clock();\n\t\tmergeTree.insertSegments(\n\t\t\tpos,\n\t\t\t[TextSegment.make(s)],\n\t\t\tmergeTree.localPerspective,\n\t\t\t{ clientId: LocalClientId, seq: UniversalSequenceNumber },\n\t\t\tundefined,\n\t\t);\n\t\taccumTime += elapsedMicroseconds(clockStart);\n\t\tif (i > 0 && 0 === i % 50000) {\n\t\t\tconst perIter = (accumTime / (i + 1)).toFixed(3);\n\t\t\ttreeCount++;\n\t\t\taccumTreeSize += mergeTree.getLength(mergeTree.localPerspective);\n\t\t\tconst averageTreeSize = (accumTreeSize / treeCount).toFixed(3);\n\t\t\tlog(\n\t\t\t\t`i: ${i} time: ${accumTime}us which is average ${perIter} per insert with average tree size ${averageTreeSize}`,\n\t\t\t);\n\t\t}\n\t}\n\tlog(process.memoryUsage().heapUsed);\n\taccumTime = 0;\n\taccumTreeSize = 0;\n\ttreeCount = 0;\n\tfor (let i = 0; i < removeCount; i++) {\n\t\tconst dlen = randInt();\n\t\tconst preLen = mergeTree.getLength(mergeTree.localPerspective);\n\t\tconst pos = random.integer(0, preLen);\n\t\t// Log(itree.toString());\n\t\tconst clockStart = clock();\n\t\tmergeTree.markRangeRemoved(\n\t\t\tpos,\n\t\t\tpos + dlen,\n\t\t\tmergeTree.localPerspective,\n\t\t\t{ clientId: LocalClientId, seq: UniversalSequenceNumber },\n\t\t\tundefined as never,\n\t\t);\n\t\taccumTime += elapsedMicroseconds(clockStart);\n\n\t\tif (i > 0 && 0 === i % 50000) {\n\t\t\tconst perIter = (accumTime / (i + 1)).toFixed(3);\n\t\t\ttreeCount++;\n\t\t\taccumTreeSize += mergeTree.getLength(mergeTree.localPerspective);\n\t\t\tconst averageTreeSize = (accumTreeSize / treeCount).toFixed(3);\n\t\t\tlog(\n\t\t\t\t`i: ${i} time: ${accumTime}us which is average ${perIter} per del with average tree size ${averageTreeSize}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nexport function mergeTreeCheckedTest(): number {\n\tconst mergeTree = new MergeTree();\n\tmergeTree.insertSegments(\n\t\t0,\n\t\t[TextSegment.make(\"the cat is on the mat\")],\n\t\tmergeTree.localPerspective,\n\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\tundefined,\n\t);\n\tconst insertCount = 2000;\n\tconst removeCount = 1400;\n\tconst largeRemoveCount = 20;\n\tconst random = makeRandom(0xdeadbeef, 0xfeedbed);\n\n\tconst imin = 1;\n\tconst imax = 9;\n\tconst randInt = (): number => random.integer(imin, imax);\n\tconst randLargeInt = (): number => random.integer(10, 1000);\n\tfunction randomString(len: number, c: string): string {\n\t\tlet str = \"\";\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tstr += c;\n\t\t}\n\t\treturn str;\n\t}\n\taccumTime = 0;\n\tlet accumTreeSize = 0;\n\tlet treeCount = 0;\n\tlet errorCount = 0;\n\tfor (let i = 0; i < insertCount; i++) {\n\t\tconst slen = randInt();\n\t\tconst s = randomString(slen, String.fromCodePoint(48 + slen));\n\t\tconst preLen = mergeTree.getLength(mergeTree.localPerspective);\n\t\tconst pos = random.integer(0, preLen);\n\t\tif (!checkInsertMergeTree(mergeTree, pos, makeCollabTextSegment(s), true)) {\n\t\t\tlog(\n\t\t\t\t`i: ${i} preLen ${preLen} pos: ${pos} slen: ${slen} s: ${s} itree len: ${mergeTree.getLength(\n\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t)}`,\n\t\t\t);\n\t\t\tlog(mergeTree.toString());\n\t\t\terrorCount++;\n\t\t\tbreak;\n\t\t}\n\t\tif (i > 0 && 0 === i % 1000) {\n\t\t\tconst perIter = (accumTime / (i + 1)).toFixed(3);\n\t\t\ttreeCount++;\n\t\t\taccumTreeSize += mergeTree.getLength(mergeTree.localPerspective);\n\t\t\tconst averageTreeSize = (accumTreeSize / treeCount).toFixed(3);\n\t\t\tlog(\n\t\t\t\t`i: ${i} time: ${accumTime}us which is average ${perIter} per insert with average tree size ${averageTreeSize}`,\n\t\t\t);\n\t\t}\n\t}\n\taccumTime = 0;\n\taccumTreeSize = 0;\n\ttreeCount = 0;\n\tfor (let i = 0; i < largeRemoveCount; i++) {\n\t\tconst dlen = randLargeInt();\n\t\tconst preLen = mergeTree.getLength(mergeTree.localPerspective);\n\t\tconst pos = random.integer(0, preLen);\n\t\t// log(itree.toString());\n\t\tif (!checkMarkRemoveMergeTree(mergeTree, pos, pos + dlen, true)) {\n\t\t\tlog(\n\t\t\t\t`i: ${i} preLen ${preLen} pos: ${pos} dlen: ${dlen} itree len: ${mergeTree.getLength(\n\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t)}`,\n\t\t\t);\n\t\t\tlog(mergeTree.toString());\n\t\t\tbreak;\n\t\t}\n\t\tif (i > 0 && 0 === i % 10) {\n\t\t\tconst perIter = (accumTime / (i + 1)).toFixed(3);\n\t\t\ttreeCount++;\n\t\t\taccumTreeSize += mergeTree.getLength(mergeTree.localPerspective);\n\t\t\tconst averageTreeSize = (accumTreeSize / treeCount).toFixed(3);\n\t\t\tlog(\n\t\t\t\t`i: ${i} time: ${accumTime}us which is average ${perIter} per large del with average tree size ${averageTreeSize}`,\n\t\t\t);\n\t\t}\n\t}\n\taccumTime = 0;\n\taccumTreeSize = 0;\n\ttreeCount = 0;\n\tfor (let i = 0; i < removeCount; i++) {\n\t\tconst dlen = randInt();\n\t\tconst preLen = mergeTree.getLength(mergeTree.localPerspective);\n\t\tconst pos = random.integer(0, preLen);\n\t\t// log(itree.toString());\n\t\tif (i & 1) {\n\t\t\tif (!checkMarkRemoveMergeTree(mergeTree, pos, pos + dlen, true)) {\n\t\t\t\tlog(\n\t\t\t\t\t`mr i: ${i} preLen ${preLen} pos: ${pos} dlen: ${dlen} itree len: ${mergeTree.getLength(\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t)}`,\n\t\t\t\t);\n\t\t\t\tlog(mergeTree.toString());\n\t\t\t\terrorCount++;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} else {\n\t\t\tif (!checkMarkRemoveMergeTree(mergeTree, pos, pos + dlen, true)) {\n\t\t\t\tlog(\n\t\t\t\t\t`i: ${i} preLen ${preLen} pos: ${pos} dlen: ${dlen} itree len: ${mergeTree.getLength(\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t)}`,\n\t\t\t\t);\n\t\t\t\tlog(mergeTree.toString());\n\t\t\t\terrorCount++;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (i > 0 && 0 === i % 1000) {\n\t\t\tconst perIter = (accumTime / (i + 1)).toFixed(3);\n\t\t\ttreeCount++;\n\t\t\taccumTreeSize += mergeTree.getLength(mergeTree.localPerspective);\n\t\t\tconst averageTreeSize = (accumTreeSize / treeCount).toFixed(3);\n\t\t\tlog(\n\t\t\t\t`i: ${i} time: ${accumTime}us which is average ${perIter} per del with average tree size ${averageTreeSize}`,\n\t\t\t);\n\t\t}\n\t}\n\taccumTime = 0;\n\taccumTreeSize = 0;\n\ttreeCount = 0;\n\tfor (let i = 0; i < insertCount; i++) {\n\t\tconst slen = randInt();\n\t\tconst s = randomString(slen, String.fromCodePoint(48 + slen));\n\t\tconst preLen = mergeTree.getLength(mergeTree.localPerspective);\n\t\tconst pos = random.integer(0, preLen);\n\t\tif (!checkInsertMergeTree(mergeTree, pos, makeCollabTextSegment(s), true)) {\n\t\t\tlog(\n\t\t\t\t`i: ${i} preLen ${preLen} pos: ${pos} slen: ${slen} s: ${s} itree len: ${mergeTree.getLength(\n\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t)}`,\n\t\t\t);\n\t\t\tlog(mergeTree.toString());\n\t\t\terrorCount++;\n\t\t\tbreak;\n\t\t}\n\t\tif (i > 0 && 0 === i % 1000) {\n\t\t\tconst perIter = (accumTime / (i + 1)).toFixed(3);\n\t\t\ttreeCount++;\n\t\t\taccumTreeSize += mergeTree.getLength(mergeTree.localPerspective);\n\t\t\tconst averageTreeSize = (accumTreeSize / treeCount).toFixed(3);\n\t\t\tlog(\n\t\t\t\t`i: ${i} time: ${accumTime}us which is average ${perIter} per insert with average tree size ${averageTreeSize}`,\n\t\t\t);\n\t\t}\n\t}\n\taccumTime = 0;\n\taccumTreeSize = 0;\n\ttreeCount = 0;\n\tfor (let i = 0; i < removeCount; i++) {\n\t\tconst dlen = randInt();\n\t\tconst preLen = mergeTree.getLength(mergeTree.localPerspective);\n\t\tconst pos = random.integer(0, preLen);\n\t\t// log(itree.toString());\n\t\tif (i & 1) {\n\t\t\tif (!checkMarkRemoveMergeTree(mergeTree, pos, pos + dlen, true)) {\n\t\t\t\tlog(\n\t\t\t\t\t`i: ${i} preLen ${preLen} pos: ${pos} dlen: ${dlen} itree len: ${mergeTree.getLength(\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t)}`,\n\t\t\t\t);\n\t\t\t\tlog(mergeTree.toString());\n\t\t\t\terrorCount++;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} else {\n\t\t\tif (!checkMarkRemoveMergeTree(mergeTree, pos, pos + dlen, true)) {\n\t\t\t\tlog(\n\t\t\t\t\t`i: ${i} preLen ${preLen} pos: ${pos} dlen: ${dlen} itree len: ${mergeTree.getLength(\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t)}`,\n\t\t\t\t);\n\t\t\t\tlog(mergeTree.toString());\n\t\t\t\terrorCount++;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (i > 0 && 0 === i % 1000) {\n\t\t\tconst perIter = (accumTime / (i + 1)).toFixed(3);\n\t\t\ttreeCount++;\n\t\t\taccumTreeSize += mergeTree.getLength(mergeTree.localPerspective);\n\t\t\tconst averageTreeSize = (accumTreeSize / treeCount).toFixed(3);\n\t\t\tlog(\n\t\t\t\t`i: ${i} time: ${accumTime}us which is average ${perIter} per del with average tree size ${averageTreeSize}`,\n\t\t\t);\n\t\t}\n\t}\n\treturn errorCount;\n}\n\ntype SharedStringJSONSegment = IJSONTextSegment & IJSONMarkerSegment;\n\nexport function TestPack(verbose = true): {\n\tfirstTest: () => void;\n\trandolicious: () => number;\n\tclientServer: (startFile?: string, initRounds?: number) => number;\n\tmanyMergeTrees: () => void;\n} {\n\tconst random = makeRandom(0xdeadbeef, 0xfeedbed);\n\tconst minSegCount = 1;\n\tconst maxSegCount = 1000;\n\tconst randSmallSegmentCount = (): number => random.integer(1, 4);\n\tconst randSegmentCount = (): number => random.integer(minSegCount, maxSegCount);\n\tconst randTextLength = (): number => random.integer(1, 5);\n\tconst zedCode = 48;\n\tfunction randomString(len: number, c: string): string {\n\t\tlet str = \"\";\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tstr += c;\n\t\t}\n\t\treturn str;\n\t}\n\n\tlet getTextTime = 0;\n\tlet getTextCalls = 0;\n\tconst catchUpTime = 0;\n\tconst catchUps = 0;\n\n\tfunction reportTiming(client: TestClient): void {\n\t\tif (!verbose) {\n\t\t\treturn;\n\t\t}\n\t\tconst aveTime = (client.accumTime / client.accumOps).toFixed(1);\n\t\tconst stats = getStats(client.mergeTree);\n\t\tconst windowTime = stats.windowTime!;\n\t\tconst packTime = stats.packTime;\n\t\tconst aveWindowTime = ((windowTime || 0) / client.accumOps).toFixed(1);\n\t\tconst avePackTime = ((packTime ?? 0) / client.accumOps).toFixed(1);\n\t\tconst aveExtraWindowTime = (client.accumWindowTime / client.accumOps).toFixed(1);\n\t\tconst aveWindow = (client.accumWindow / client.accumOps).toFixed(1);\n\t\tconst adjTime = (\n\t\t\t(client.accumTime - (windowTime - client.accumWindowTime)) /\n\t\t\tclient.accumOps\n\t\t).toFixed(1);\n\t\tconst aveGetTextTime = (getTextTime / getTextCalls).toFixed(1);\n\t\tlet aveCatchUpTime = \"off\";\n\t\tif (catchUps > 0) {\n\t\t\taveCatchUpTime = (catchUpTime / catchUps).toFixed(1);\n\t\t}\n\t\tlog(`get text time: ${aveGetTextTime} catch up ${aveCatchUpTime}`);\n\t\tlog(\n\t\t\t`accum time ${client.accumTime} us ops: ${client.accumOps} ave time ${aveTime} - wtime ${adjTime} pack ${avePackTime} ave window ${aveWindow}`,\n\t\t);\n\t\tlog(\n\t\t\t`accum window time ${client.accumWindowTime} us ave window time total ${aveWindowTime} not in ops ${aveExtraWindowTime}; max ${client.maxWindowTime}`,\n\t\t);\n\t}\n\n\tfunction manyMergeTrees(): void {\n\t\tconst mergeTreeCount = 2000000;\n\t\tconst a = <MergeTree[]>Array.from({ length: mergeTreeCount });\n\t\tfor (let i = 0; i < mergeTreeCount; i++) {\n\t\t\ta[i] = new MergeTree();\n\t\t}\n\t\tfor (;;) {\n\t\t\t// infinite loop\n\t\t}\n\t}\n\n\tfunction clientServer(startFile?: string, initRounds = 1000): number {\n\t\tconst clientCount = 5;\n\t\tconst fileSegCount = 0;\n\t\tlet initString = \"\";\n\n\t\tif (!startFile) {\n\t\t\tinitString = \"don't ask for whom the bell tolls; it tolls for thee\";\n\t\t}\n\t\tconst server = new TestServer();\n\t\tserver.insertTextLocal(0, initString);\n\t\tserver.measureOps = true;\n\t\tif (startFile) {\n\t\t\tloadTextFromFile(startFile, server.mergeTree, fileSegCount);\n\t\t}\n\n\t\tconst clients: TestClient[] = Array.from({ length: clientCount });\n\t\tfor (let i = 0; i < clientCount; i++) {\n\t\t\tclients[i] = new TestClient();\n\t\t\tclients[i].insertTextLocal(0, initString);\n\t\t\tclients[i].measureOps = true;\n\t\t\tif (startFile) {\n\t\t\t\tloadTextFromFile(startFile, clients[i].mergeTree, fileSegCount);\n\t\t\t}\n\t\t\tclients[i].startOrUpdateCollaboration(`Fred${i}`);\n\t\t}\n\t\tserver.startOrUpdateCollaboration(\"theServer\");\n\t\tserver.addClients(clients);\n\n\t\tfunction checkTextMatch(): boolean {\n\t\t\t// log(`checking text match @${server.getCurrentSeq()}`);\n\t\t\tconst clockStart = clock();\n\t\t\tconst serverText = server.getText();\n\t\t\tgetTextTime += elapsedMicroseconds(clockStart);\n\t\t\tgetTextCalls++;\n\t\t\tfor (const client of clients) {\n\t\t\t\tconst cliText = client.getText();\n\t\t\t\tif (cliText !== serverText) {\n\t\t\t\t\tlog(\n\t\t\t\t\t\t`mismatch @${server.getCurrentSeq()} client @${client.getCurrentSeq()} id: ${client.getClientId()}`,\n\t\t\t\t\t);\n\t\t\t\t\t// log(serverText);\n\t\t\t\t\t// log(cliText);\n\t\t\t\t\tconst diffParts = JsDiff.diffChars(serverText, cliText);\n\t\t\t\t\tfor (const diffPart of diffParts) {\n\t\t\t\t\t\tlet annotes = \"\";\n\t\t\t\t\t\tif (diffPart.added) {\n\t\t\t\t\t\t\tannotes += \"added \";\n\t\t\t\t\t\t} else if (diffPart.removed) {\n\t\t\t\t\t\t\tannotes += \"removed \";\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (diffPart.count) {\n\t\t\t\t\t\t\tannotes += `count: ${diffPart.count}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlog(`text: ${diffPart.value} ${annotes}`);\n\t\t\t\t\t}\n\t\t\t\t\tlog(server.mergeTree.toString());\n\t\t\t\t\tlog(client.mergeTree.toString());\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tconst rounds = initRounds;\n\n\t\tfunction clientProcessSome(client: TestClient, all = false): void {\n\t\t\tconst cliMsgCount = client.getMessageCount();\n\t\t\tconst countToApply = all\n\t\t\t\t? cliMsgCount\n\t\t\t\t: random.integer(Math.floor((2 * cliMsgCount) / 3), cliMsgCount);\n\t\t\tclient.applyMessages(countToApply);\n\t\t}\n\n\t\tfunction serverProcessSome(_server: TestClient, all = false): boolean {\n\t\t\tconst svrMsgCount = _server.getMessageCount();\n\t\t\tconst countToApply = all\n\t\t\t\t? svrMsgCount\n\t\t\t\t: random.integer(Math.floor((2 * svrMsgCount) / 3), svrMsgCount);\n\t\t\treturn _server.applyMessages(countToApply);\n\t\t}\n\n\t\tfunction randomSpateOfInserts(client: TestClient, charIndex: number): void {\n\t\t\tconst textLen = randTextLength();\n\t\t\tconst text = randomString(\n\t\t\t\ttextLen,\n\t\t\t\tString.fromCodePoint(zedCode + ((client.getCurrentSeq() + charIndex) % 50)),\n\t\t\t);\n\t\t\tconst preLen = client.getLength();\n\t\t\tconst pos = random.integer(0, preLen);\n\t\t\tconst insertTextOp = client.insertTextLocal(pos, text);\n\t\t\tserver.enqueueMsg(client.makeOpMessage(insertTextOp!, UnassignedSequenceNumber));\n\n\t\t\tif (TestClient.useCheckQ) {\n\t\t\t\tclient.enqueueTestString();\n\t\t\t}\n\t\t}\n\n\t\tfunction randomSpateOfRemoves(client: TestClient): void {\n\t\t\tconst dlen = randTextLength();\n\t\t\tconst preLen = client.getLength();\n\t\t\tconst pos = random.integer(0, preLen);\n\t\t\tconst op = client.removeRangeLocal(pos, pos + dlen);\n\t\t\tserver.enqueueMsg(client.makeOpMessage(op!));\n\t\t\tif (TestClient.useCheckQ) {\n\t\t\t\tclient.enqueueTestString();\n\t\t\t}\n\t\t}\n\n\t\tfunction randomWordMove(client: TestClient): void {\n\t\t\tconst word1 = client.findRandomWord();\n\t\t\tif (word1) {\n\t\t\t\tconst removeStart = word1.pos;\n\t\t\t\tconst removeEnd = removeStart + word1.text.length;\n\t\t\t\tconst removeOp = client.removeRangeLocal(removeStart, removeEnd);\n\t\t\t\tserver.enqueueMsg(client.makeOpMessage(removeOp!, UnassignedSequenceNumber));\n\t\t\t\tif (TestClient.useCheckQ) {\n\t\t\t\t\tclient.enqueueTestString();\n\t\t\t\t}\n\t\t\t\tlet word2 = client.findRandomWord();\n\t\t\t\twhile (!word2) {\n\t\t\t\t\tword2 = client.findRandomWord();\n\t\t\t\t}\n\t\t\t\tconst pos = word2.pos + word2.text.length;\n\t\t\t\tconst insertOp = client.insertTextLocal(pos, word1.text);\n\t\t\t\tserver.enqueueMsg(client.makeOpMessage(insertOp!, UnassignedSequenceNumber));\n\n\t\t\t\tif (TestClient.useCheckQ) {\n\t\t\t\t\tclient.enqueueTestString();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet errorCount = 0;\n\n\t\tconst extractSnapTime = 0;\n\t\tconst extractSnapOps = 0;\n\t\tfunction finishRound(roundCount: number): number | undefined {\n\t\t\t// Process remaining messages\n\t\t\tif (serverProcessSome(server, true)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfor (const client of clients) {\n\t\t\t\tclientProcessSome(client, true);\n\t\t\t}\n\n\t\t\tif (0 === roundCount % 100) {\n\t\t\t\tconst clockStart = clock();\n\t\t\t\tif (checkTextMatch()) {\n\t\t\t\t\tlog(`round: ${roundCount} BREAK`);\n\t\t\t\t\terrorCount++;\n\t\t\t\t\treturn errorCount;\n\t\t\t\t}\n\t\t\t\tcheckTime += elapsedMicroseconds(clockStart);\n\t\t\t\tif (verbose) {\n\t\t\t\t\tlog(`wall clock is ${((Date.now() - startTime) / 1000).toFixed(1)}`);\n\t\t\t\t}\n\t\t\t\tconst stats = getStats(server.mergeTree);\n\t\t\t\tconst liveAve = (stats.liveCount / stats.nodeCount).toFixed(1);\n\t\t\t\tconst posLeaves = stats.leafCount - stats.removedLeafCount;\n\t\t\t\tlet aveExtractSnapTime = \"off\";\n\t\t\t\tif (extractSnapOps > 0) {\n\t\t\t\t\taveExtractSnapTime = (extractSnapTime / extractSnapOps).toFixed(1);\n\t\t\t\t}\n\t\t\t\tlog(\n\t\t\t\t\t`round: ${roundCount} seq ${server.seq} char count ${server.getLength()} height ${\n\t\t\t\t\t\tstats.maxHeight\n\t\t\t\t\t} lv ${stats.leafCount} rml ${stats.removedLeafCount} p ${posLeaves} nodes ${\n\t\t\t\t\t\tstats.nodeCount\n\t\t\t\t\t} pop ${liveAve} histo ${stats.histo}`,\n\t\t\t\t);\n\t\t\t\tif (extractSnapOps > 0) {\n\t\t\t\t\taveExtractSnapTime = (extractSnapTime / extractSnapOps).toFixed(1);\n\t\t\t\t\tlog(`ave extract snap time ${aveExtractSnapTime}`);\n\t\t\t\t}\n\t\t\t\treportTiming(server);\n\t\t\t\treportTiming(clients[2]);\n\t\t\t\tlet totalTime = server.accumTime + server.accumWindowTime;\n\t\t\t\tfor (const client of clients) {\n\t\t\t\t\ttotalTime += client.accumTime + client.accumWindowTime;\n\t\t\t\t}\n\t\t\t\tif (verbose) {\n\t\t\t\t\tlog(\n\t\t\t\t\t\t`total time ${(totalTime / 1000000).toFixed(1)} check time ${(checkTime / 1000000).toFixed(1)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// log(server.getText());\n\t\t\t\t// log(server.mergeTree.toString());\n\t\t\t}\n\t\t\treturn errorCount;\n\t\t}\n\n\t\tfunction round(roundCount: number): void {\n\t\t\tfor (const client of clients) {\n\t\t\t\tconst insertSegmentCount = randSmallSegmentCount();\n\t\t\t\tfor (let j = 0; j < insertSegmentCount; j++) {\n\t\t\t\t\tif (startFile) {\n\t\t\t\t\t\trandomWordMove(client);\n\t\t\t\t\t} else {\n\t\t\t\t\t\trandomSpateOfInserts(client, j);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (serverProcessSome(server)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tclientProcessSome(client);\n\n\t\t\t\tlet removeSegmentCount = Math.floor((3 * insertSegmentCount) / 4);\n\t\t\t\tif (removeSegmentCount < 1) {\n\t\t\t\t\tremoveSegmentCount = 1;\n\t\t\t\t}\n\t\t\t\tfor (let j = 0; j < removeSegmentCount; j++) {\n\t\t\t\t\tif (startFile) {\n\t\t\t\t\t\trandomWordMove(client);\n\t\t\t\t\t} else {\n\t\t\t\t\t\trandomSpateOfRemoves(client);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (serverProcessSome(server)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tclientProcessSome(client);\n\t\t\t}\n\t\t\tfinishRound(roundCount);\n\t\t}\n\n\t\tconst startTime = Date.now();\n\t\tlet checkTime = 0;\n\n\t\tfor (let i = 0; i < rounds; i++) {\n\t\t\tround(i);\n\t\t\tif (errorCount > 0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\ttail();\n\n\t\tfunction tail(): void {\n\t\t\treportTiming(server);\n\t\t\treportTiming(clients[2]);\n\t\t\t// log(server.getText());\n\t\t\t// log(server.mergeTree.toString());\n\t\t}\n\t\treturn errorCount;\n\t}\n\n\tfunction randolicious(): number {\n\t\tconst insertRounds = 40;\n\t\tconst removeRounds = 32;\n\n\t\tconst cliA = new TestClient();\n\t\tcliA.insertTextLocal(0, \"a stitch in time saves nine\");\n\t\tcliA.startOrUpdateCollaboration(\"FredA\");\n\t\tconst cliB = new TestClient();\n\t\tcliB.insertTextLocal(0, \"a stitch in time saves nine\");\n\t\tcliB.startOrUpdateCollaboration(\"FredB\");\n\t\tfunction checkTextMatch(checkSeq: number): boolean {\n\t\t\tlet error = false;\n\t\t\tif (cliA.getCurrentSeq() !== checkSeq) {\n\t\t\t\tlog(`client A has seq number ${cliA.getCurrentSeq()} mismatch with ${checkSeq}`);\n\t\t\t\terror = true;\n\t\t\t}\n\t\t\tif (cliB.getCurrentSeq() !== checkSeq) {\n\t\t\t\tlog(`client B has seq number ${cliB.getCurrentSeq()} mismatch with ${checkSeq}`);\n\t\t\t\terror = true;\n\t\t\t}\n\t\t\tconst aText = cliA.getText();\n\t\t\tconst bText = cliB.getText();\n\t\t\tif (aText !== bText) {\n\t\t\t\tlog(`mismatch @${checkSeq}:`);\n\t\t\t\tlog(aText);\n\t\t\t\tlog(bText);\n\t\t\t\terror = true;\n\t\t\t}\n\t\t\tif (!nodeOrdinalsHaveIntegrity(cliA.mergeTree.root)) {\n\t\t\t\terror = true;\n\t\t\t}\n\t\t\tif (!nodeOrdinalsHaveIntegrity(cliB.mergeTree.root)) {\n\t\t\t\terror = true;\n\t\t\t}\n\t\t\treturn error;\n\t\t}\n\n\t\tlet min = 0;\n\t\tcliA.accumTime = 0;\n\t\tcliB.accumTime = 0;\n\n\t\tfunction insertTest(): boolean {\n\t\t\tfor (let i = 0; i < insertRounds; i++) {\n\t\t\t\tlet insertCount = randSegmentCount();\n\t\t\t\tlet sequenceNumber = cliA.getCurrentSeq() + 1;\n\t\t\t\tlet firstSeq = sequenceNumber;\n\t\t\t\tconst cliAMsgs: ISequencedDocumentMessage[] = [];\n\t\t\t\tfor (let j = 0; j < insertCount; j++) {\n\t\t\t\t\tconst textLen = randTextLength();\n\t\t\t\t\tconst text = randomString(\n\t\t\t\t\t\ttextLen,\n\t\t\t\t\t\tString.fromCodePoint(zedCode + (sequenceNumber % 50)),\n\t\t\t\t\t);\n\t\t\t\t\tconst preLen = cliA.getLength();\n\t\t\t\t\tconst pos = random.integer(0, preLen);\n\n\t\t\t\t\tconst msg = cliA.makeOpMessage(cliA.insertTextLocal(pos, text)!, sequenceNumber++);\n\t\t\t\t\tmsg.minimumSequenceNumber = min;\n\t\t\t\t\tcliAMsgs.push(msg);\n\t\t\t\t\tcliB.applyMsg(msg);\n\t\t\t\t}\n\t\t\t\tfor (let k = firstSeq; k < sequenceNumber; k++) {\n\t\t\t\t\tcliA.applyMsg(cliAMsgs.shift()!);\n\t\t\t\t}\n\t\t\t\tif (checkTextMatch(sequenceNumber - 1)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tmin = sequenceNumber - 1;\n\n\t\t\t\tinsertCount = randSegmentCount();\n\t\t\t\tsequenceNumber = cliA.getCurrentSeq() + 1;\n\t\t\t\tfirstSeq = sequenceNumber;\n\t\t\t\tconst cliBMsgs: ISequencedDocumentMessage[] = [];\n\t\t\t\tfor (let j = 0; j < insertCount; j++) {\n\t\t\t\t\tconst textLen = randTextLength();\n\t\t\t\t\tconst text = randomString(\n\t\t\t\t\t\ttextLen,\n\t\t\t\t\t\tString.fromCodePoint(zedCode + (sequenceNumber % 50)),\n\t\t\t\t\t);\n\t\t\t\t\tconst preLen = cliB.getLength();\n\t\t\t\t\tconst pos = random.integer(0, preLen);\n\t\t\t\t\tconst msg = cliB.makeOpMessage(cliB.insertTextLocal(pos, text)!, sequenceNumber++);\n\t\t\t\t\tmsg.minimumSequenceNumber = min;\n\t\t\t\t\tcliBMsgs.push(msg);\n\t\t\t\t\tcliA.applyMsg(msg);\n\t\t\t\t}\n\t\t\t\tfor (let k = firstSeq; k < sequenceNumber; k++) {\n\t\t\t\t\tcliB.applyMsg(cliBMsgs.shift()!);\n\t\t\t\t}\n\t\t\t\tif (checkTextMatch(sequenceNumber - 1)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tmin = sequenceNumber - 1;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tfunction removeTest(): boolean {\n\t\t\tfor (let i = 0; i < removeRounds; i++) {\n\t\t\t\tlet removeCount = randSegmentCount();\n\t\t\t\tlet sequenceNumber = cliA.getCurrentSeq() + 1;\n\t\t\t\tlet firstSeq = sequenceNumber;\n\t\t\t\tconst cliAMsgs: ISequencedDocumentMessage[] = [];\n\t\t\t\tfor (let j = 0; j < removeCount; j++) {\n\t\t\t\t\tconst dlen = randTextLength();\n\t\t\t\t\tconst maxStartPos = cliA.getLength() - dlen;\n\t\t\t\t\tconst pos = random.integer(0, maxStartPos);\n\t\t\t\t\tconst msg = cliA.makeOpMessage(\n\t\t\t\t\t\tcliA.removeRangeLocal(pos, pos + dlen)!,\n\t\t\t\t\t\tsequenceNumber++,\n\t\t\t\t\t);\n\t\t\t\t\tmsg.minimumSequenceNumber = min;\n\t\t\t\t\tcliAMsgs.push(msg);\n\t\t\t\t\tcliB.applyMsg(msg);\n\t\t\t\t}\n\t\t\t\tfor (let k = firstSeq; k < sequenceNumber; k++) {\n\t\t\t\t\tcliA.applyMsg(cliAMsgs.shift()!);\n\t\t\t\t}\n\t\t\t\tif (checkTextMatch(sequenceNumber - 1)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tmin = sequenceNumber - 1;\n\n\t\t\t\tremoveCount = randSegmentCount();\n\t\t\t\tsequenceNumber = cliA.getCurrentSeq() + 1;\n\t\t\t\tfirstSeq = sequenceNumber;\n\t\t\t\tconst cliBMsgs: ISequencedDocumentMessage[] = [];\n\t\t\t\tfor (let j = 0; j < removeCount; j++) {\n\t\t\t\t\tconst dlen = randTextLength();\n\t\t\t\t\tconst maxStartPos = cliB.getLength() - dlen;\n\t\t\t\t\tconst pos = random.integer(0, maxStartPos);\n\t\t\t\t\tconst msg = cliB.makeOpMessage(\n\t\t\t\t\t\tcliB.removeRangeLocal(pos, pos + dlen)!,\n\t\t\t\t\t\tsequenceNumber++,\n\t\t\t\t\t);\n\t\t\t\t\tmsg.minimumSequenceNumber = min;\n\t\t\t\t\tcliBMsgs.push(msg);\n\t\t\t\t\tcliA.applyMsg(msg);\n\t\t\t\t}\n\t\t\t\tfor (let k = firstSeq; k < sequenceNumber; k++) {\n\t\t\t\t\tcliB.applyMsg(cliBMsgs.shift()!);\n\t\t\t\t}\n\t\t\t\tif (checkTextMatch(sequenceNumber - 1)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tmin = sequenceNumber - 1;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\tlet errorCount = 0;\n\t\tif (insertTest()) {\n\t\t\tlog(cliA.mergeTree.toString());\n\t\t\tlog(cliB.mergeTree.toString());\n\t\t\terrorCount++;\n\t\t} else {\n\t\t\tlog(`sequence number: ${cliA.getCurrentSeq()} min: ${cliA.getCollabWindow().minSeq}`);\n\t\t\t// log(cliA.mergeTree.toString());\n\n\t\t\tlog(`testing remove at ${cliA.getCurrentSeq()} and ${cliB.getCurrentSeq()}`);\n\t\t\tif (removeTest()) {\n\t\t\t\tlog(cliA.mergeTree.toString());\n\t\t\t\tlog(cliB.mergeTree.toString());\n\t\t\t\terrorCount++;\n\t\t\t}\n\t\t}\n\t\tlog(`sequence number: ${cliA.getCurrentSeq()} min: ${cliA.getCollabWindow().minSeq}`);\n\t\t// log(cliA.mergeTree.toString());\n\t\t// log(cliB.mergeTree.toString());\n\t\t// log(cliA.getText());\n\t\tconst aveWindow = ((minSegCount + maxSegCount) / 2).toFixed(1);\n\t\tconst aveTime = (cliA.accumTime / cliA.accumOps).toFixed(3);\n\t\tconst aveWindowTime = (cliA.accumWindowTime / cliA.accumOps).toFixed(3);\n\t\tif (verbose) {\n\t\t\tlog(\n\t\t\t\t`accum time ${cliA.accumTime} us ops: ${cliA.accumOps} ave window ${aveWindow} ave time ${aveTime}`,\n\t\t\t);\n\t\t\tlog(\n\t\t\t\t`accum window time ${cliA.accumWindowTime} us ave window time ${aveWindowTime}; max ${cliA.maxWindowTime}`,\n\t\t\t);\n\t\t}\n\t\t// log(cliB.getText());\n\t\treturn errorCount;\n\t}\n\n\tconst clientNames = [\"Ed\", \"Ted\", \"Ned\", \"Harv\", \"Marv\", \"Glenda\", \"Susan\"];\n\tfunction firstTest(): void {\n\t\tlet cli = new TestClient();\n\t\tcli.insertTextLocal(0, \"on the mat.\");\n\t\tcli.startOrUpdateCollaboration(\"Fred1\");\n\t\tfor (const cname of clientNames) {\n\t\t\tcli.addLongClientId(cname);\n\t\t}\n\t\tcli.insertTextRemote(0, \"that \", undefined, 1, 0, \"1\");\n\t\tif (verbose) {\n\t\t\tlog(cli.mergeTree.toString());\n\t\t}\n\t\tcli.insertTextRemote(0, \"fat \", undefined, 2, 0, \"2\");\n\t\tif (verbose) {\n\t\t\tlog(cli.mergeTree.toString());\n\t\t}\n\t\tcli.insertTextLocal(5, \"cat \");\n\t\tif (verbose) {\n\t\t\tlog(cli.mergeTree.toString());\n\t\t}\n\t\tif (verbose) {\n\t\t\tfor (let i = 0; i < 4; i++) {\n\t\t\t\tfor (let j = 0; j < 3; j++) {\n\t\t\t\t\tlog(cli.relText(i, j));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcli.mergeTree.ackOp(createLocalOpArgs(MergeTreeDeltaType.INSERT, 3));\n\t\tif (verbose) {\n\t\t\tlog(cli.mergeTree.toString());\n\t\t\tfor (let clientId = 0; clientId < 4; clientId++) {\n\t\t\t\tfor (let refSeq = 0; refSeq < 4; refSeq++) {\n\t\t\t\t\tlog(cli.relText(clientId, refSeq));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcli.insertMarkerRemote(\n\t\t\t0,\n\t\t\t{ refType: ReferenceType.Tile },\n\t\t\t{ [reservedTileLabelsKey]: [\"peach\"] },\n\t\t\t5,\n\t\t\t0,\n\t\t\t\"2\",\n\t\t);\n\t\tcli.insertTextRemote(6, \"very \", undefined, 6, 2, \"2\");\n\t\tif (verbose) {\n\t\t\tlog(cli.mergeTree.toString());\n\t\t\tfor (let clientId = 0; clientId < 4; clientId++) {\n\t\t\t\tfor (let refSeq = 0; refSeq < 7; refSeq++) {\n\t\t\t\t\tlog(cli.relText(clientId, refSeq));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst segs = <SharedStringJSONSegment[]>(\n\t\t\tnew SnapshotLegacy(cli.mergeTree, createChildLogger({ namespace: \"fluid:snapshot\" }))\n\t\t\t\t.extractSync()\n\t\t\t\t.map((seg) => seg.toJSONObject() as JsonSegmentSpecs)\n\t\t);\n\t\tif (verbose) {\n\t\t\tfor (const seg of segs) {\n\t\t\t\tlog(`${specToSegment(seg)}`);\n\t\t\t}\n\t\t}\n\t\tcli = new TestClient();\n\t\tcli.insertTextLocal(0, \" old sock!\");\n\t\tcli.startOrUpdateCollaboration(\"Fred2\");\n\t\tfor (const cname of clientNames) {\n\t\t\tcli.addLongClientId(cname);\n\t\t}\n\t\tcli.insertTextRemote(0, \"abcde\", undefined, 1, 0, \"2\");\n\t\tcli.insertTextRemote(0, \"yyy\", undefined, 2, 0, \"1\");\n\t\tcli.insertTextRemote(2, \"zzz\", undefined, 3, 1, \"3\");\n\t\tcli.insertTextRemote(1, \"EAGLE\", undefined, 4, 1, \"4\");\n\t\tcli.insertTextRemote(4, \"HAS\", undefined, 5, 1, \"5\");\n\t\tcli.insertTextLocal(19, \" LANDED\");\n\t\tcli.insertTextRemote(0, \"yowza: \", undefined, 6, 4, \"2\");\n\t\tcli.mergeTree.ackOp(createLocalOpArgs(MergeTreeDeltaType.INSERT, 7));\n\t\tif (verbose) {\n\t\t\tlog(cli.mergeTree.toString());\n\t\t\tfor (let clientId = 0; clientId < 6; clientId++) {\n\t\t\t\tfor (let refSeq = 0; refSeq < 8; refSeq++) {\n\t\t\t\t\tlog(cli.relText(clientId, refSeq));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcli.applyMsg(cli.makeOpMessage(createRemoveRangeOp(3, 5), 8, 6, \"1\"));\n\t\tif (verbose) {\n\t\t\tlog(cli.mergeTree.toString());\n\t\t\tfor (let clientId = 0; clientId < 6; clientId++) {\n\t\t\t\tfor (let refSeq = 0; refSeq < 9; refSeq++) {\n\t\t\t\t\tlog(cli.relText(clientId, refSeq));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcli = new TestClient();\n\t\tcli.insertTextLocal(0, \"abcdefgh\");\n\t\tcli.startOrUpdateCollaboration(\"Fred3\");\n\t\tfor (const cname of clientNames) {\n\t\t\tcli.addLongClientId(cname);\n\t\t}\n\t\tcli.applyMsg(cli.makeOpMessage(createRemoveRangeOp(1, 3), 1, 0, \"3\"));\n\t\tif (verbose) {\n\t\t\tlog(cli.mergeTree.toString());\n\t\t}\n\t\tcli.insertTextRemote(2, \"zzz\", undefined, 2, 0, \"2\");\n\t\tif (verbose) {\n\t\t\tlog(cli.mergeTree.toString());\n\t\t}\n\t\tcli.insertTextRemote(9, \" chaser\", undefined, 3, 2, \"3\");\n\t\tcli.removeRangeLocal(12, 14);\n\t\tcli.mergeTree.ackOp(createLocalOpArgs(MergeTreeDeltaType.REMOVE, 4));\n\t\tif (verbose) {\n\t\t\tlog(cli.mergeTree.toString());\n\t\t\tfor (let clientId = 0; clientId < 4; clientId++) {\n\t\t\t\tfor (let refSeq = 0; refSeq < 5; refSeq++) {\n\t\t\t\t\tlog(cli.relText(clientId, refSeq));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcli.insertTextLocal(14, \"*yolumba*\");\n\t\tcli.insertTextLocal(17, \"-zanzibar-\");\n\t\tcli.mergeTree.ackOp(createLocalOpArgs(MergeTreeDeltaType.INSERT, 5));\n\t\tcli.insertTextRemote(2, \"(aaa)\", undefined, 6, 4, \"2\");\n\t\tcli.mergeTree.ackOp(createLocalOpArgs(MergeTreeDeltaType.INSERT, 7));\n\t\tif (verbose) {\n\t\t\tlog(cli.mergeTree.toString());\n\t\t\tfor (let clientId = 0; clientId < 4; clientId++) {\n\t\t\t\tfor (let refSeq = 0; refSeq < 8; refSeq++) {\n\t\t\t\t\tlog(cli.relText(clientId, refSeq));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t/*\n cli.removeRangeLocal(3,8);\n cli.removeRangeLocal(5,7);\n cli.ackPendingSegment(8);\n cli.ackPendingSegment(9);\n */\n\t\tcli.applyMsg(cli.makeOpMessage(createRemoveRangeOp(3, 8), 8, 7, \"2\"));\n\t\tcli.applyMsg(cli.makeOpMessage(createRemoveRangeOp(5, 7), 9, 7, \"2\"));\n\t\tif (verbose) {\n\t\t\tlog(cli.mergeTree.toString());\n\t\t\tfor (let clientId = 0; clientId < 4; clientId++) {\n\t\t\t\tfor (let refSeq = 0; refSeq < 10; refSeq++) {\n\t\t\t\t\tlog(cli.relText(clientId, refSeq));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst removeOp = cli.removeRangeLocal(3, 5);\n\t\tcli.applyMsg(cli.makeOpMessage(createRemoveRangeOp(3, 6), 10, 9, \"2\"));\n\t\tcli.applyMsg(cli.makeOpMessage(removeOp!, 11));\n\t\tif (verbose) {\n\t\t\tlog(cli.mergeTree.toString());\n\t\t\tfor (let clientId = 0; clientId < 4; clientId++) {\n\t\t\t\tfor (let refSeq = 0; refSeq < 12; refSeq++) {\n\t\t\t\t\tlog(cli.relText(clientId, refSeq));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn {\n\t\tfirstTest,\n\t\trandolicious,\n\t\tclientServer,\n\t\tmanyMergeTrees,\n\t};\n}\n\nconst createLocalOpArgs = (\n\ttype: MergeTreeDeltaType,\n\tsequenceNumber: number,\n): IMergeTreeDeltaOpArgs => ({\n\top: { type } as IMergeTreeOp,\n\tsequencedMessage: {\n\t\tsequenceNumber,\n\t} as ISequencedDocumentMessage,\n});\n\nexport class RandomPack {\n\trandom: IRandom;\n\tconstructor() {\n\t\tthis.random = makeRandom(0xdeadbeef, 0xfeedbed);\n\t}\n\n\trandInteger(min: number, max: number): number {\n\t\treturn this.random.integer(min, max);\n\t}\n\n\trandString(wordCount: number): string {\n\t\tconst exampleWords = [\n\t\t\t\"giraffe\",\n\t\t\t\"hut\",\n\t\t\t\"aardvark\",\n\t\t\t\"gold\",\n\t\t\t\"hover\",\n\t\t\t\"yurt\",\n\t\t\t\"hot\",\n\t\t\t\"antelope\",\n\t\t\t\"gift\",\n\t\t\t\"banana\",\n\t\t\t\"book\",\n\t\t\t\"airplane\",\n\t\t\t\"kitten\",\n\t\t\t\"moniker\",\n\t\t\t\"lemma\",\n\t\t\t\"doughnut\",\n\t\t\t\"orange\",\n\t\t\t\"tangerine\",\n\t\t];\n\t\tlet buf = \"\";\n\t\tfor (let i = 0; i < wordCount; i++) {\n\t\t\tconst exampleWord = exampleWords[this.randInteger(0, exampleWords.length - 1)];\n\t\t\tif (i > 0) {\n\t\t\t\tbuf += \" \";\n\t\t\t}\n\t\t\tbuf += exampleWord;\n\t\t}\n\t\treturn buf;\n\t}\n}\n\nexport type DocumentNode = string | DocumentTree;\n/**\n * Generate and model documents from the following tree grammar:\n * Row -\\> row[Box*];\n * Box -\\> box[Content];\n * Content -\\> (Row|Paragraph)*;\n * Paragraph -\\> pgtile text;\n * Document -\\> Content\n */\nexport class DocumentTree {\n\tpos = 0;\n\tids: Record<string, number> = { box: 0, row: 0 };\n\tid: string | undefined;\n\tstatic randPack = new RandomPack();\n\n\tconstructor(\n\t\tpublic name: string,\n\t\tpublic children: DocumentNode[],\n\t) {}\n\n\taddToMergeTree(client: TestClient, docNode: DocumentNode): void {\n\t\tif (typeof docNode === \"string\") {\n\t\t\tconst text = docNode;\n\t\t\tclient.insertTextLocal(this.pos, text);\n\t\t\tthis.pos += text.length;\n\t\t} else {\n\t\t\tlet id: number | undefined;\n\t\t\tif (docNode.name === \"pg\") {\n\t\t\t\tclient.insertMarkerLocal(this.pos, ReferenceType.Tile, {\n\t\t\t\t\t[reservedTileLabelsKey]: [docNode.name],\n\t\t\t\t});\n\t\t\t\tthis.pos++;\n\t\t\t} else {\n\t\t\t\tconst trid = docNode.name + this.ids[docNode.name]!.toString();\n\t\t\t\tdocNode.id = trid;\n\t\t\t\tid = this.ids[docNode.name]++;\n\t\t\t\tconst props = {\n\t\t\t\t\t[reservedMarkerIdKey]: trid,\n\t\t\t\t\t[reservedRangeLabelsKey]: [docNode.name],\n\t\t\t\t};\n\t\t\t\tlet behaviors = ReferenceType.Simple;\n\t\t\t\tif (docNode.name === \"row\") {\n\t\t\t\t\tprops[reservedTileLabelsKey] = [\"pg\"];\n\t\t\t\t\tbehaviors |= ReferenceType.Tile;\n\t\t\t\t}\n\n\t\t\t\tclient.insertMarkerLocal(this.pos, behaviors, props);\n\t\t\t\tthis.pos++;\n\t\t\t}\n\t\t\tfor (const child of docNode.children) {\n\t\t\t\tthis.addToMergeTree(client, child);\n\t\t\t}\n\t\t\tif (docNode.name !== \"pg\") {\n\t\t\t\tconst etrid = `end-${docNode.name}${id?.toString()}`;\n\t\t\t\tclient.insertMarkerLocal(this.pos, ReferenceType.Simple, {\n\t\t\t\t\t[reservedMarkerIdKey]: etrid,\n\t\t\t\t\t[reservedRangeLabelsKey]: [docNode.name],\n\t\t\t\t});\n\t\t\t\tthis.pos++;\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic generateDocument(): DocumentTree {\n\t\tconst tree = new DocumentTree(\"Document\", DocumentTree.generateContent(0.6));\n\t\treturn tree;\n\t}\n\n\tstatic generateContent(rowProbability: number): DocumentNode[] {\n\t\tlet _rowProbability = rowProbability;\n\t\tconst items = <DocumentNode[]>[];\n\t\tconst docLen = DocumentTree.randPack.randInteger(7, 25);\n\t\tfor (let i = 0; i < docLen; i++) {\n\t\t\tconst rowThreshold = _rowProbability * 1000;\n\t\t\tconst selector = DocumentTree.randPack.randInteger(1, 1000);\n\t\t\tif (selector >= rowThreshold) {\n\t\t\t\tconst pg = DocumentTree.generateParagraph();\n\t\t\t\titems.push(pg);\n\t\t\t} else {\n\t\t\t\t_rowProbability /= 2;\n\t\t\t\tif (_rowProbability < 0.08) {\n\t\t\t\t\t_rowProbability = 0;\n\t\t\t\t}\n\t\t\t\tconst row = DocumentTree.generateRow(_rowProbability);\n\t\t\t\titems.push(row);\n\t\t\t}\n\t\t}\n\t\treturn items;\n\t}\n\n\t// Model pg tile as tree with single child\n\tstatic generateParagraph(): DocumentTree {\n\t\tconst wordCount = DocumentTree.randPack.randInteger(1, 6);\n\t\tconst text = DocumentTree.randPack.randString(wordCount);\n\t\tconst pgTree = new DocumentTree(\"pg\", [text]);\n\t\treturn pgTree;\n\t}\n\n\tstatic generateRow(rowProbability: number): DocumentTree {\n\t\tconst items = <DocumentNode[]>[];\n\t\tconst rowLen = DocumentTree.randPack.randInteger(1, 5);\n\t\tfor (let i = 0; i < rowLen; i++) {\n\t\t\tconst item = DocumentTree.generateBox(rowProbability);\n\t\t\titems.push(item);\n\t\t}\n\t\treturn new DocumentTree(\"row\", items);\n\t}\n\n\tstatic generateBox(rowProbability: number): DocumentTree {\n\t\treturn new DocumentTree(\"box\", DocumentTree.generateContent(rowProbability));\n\t}\n}\n\nfunction findReplacePerf(filename: string): void {\n\tconst client = new TestClient();\n\tloadTextFromFile(filename, client.mergeTree);\n\n\tconst clockStart = clock();\n\n\tlet cFetches = 0;\n\tlet cReplaces = 0;\n\tfor (let pos = 0; pos < client.getLength(); ) {\n\t\tconst curSegOff = client.getContainingSegment<ISegmentPrivate>(pos);\n\t\tcFetches++;\n\n\t\tconst curSeg = curSegOff?.segment;\n\t\tconst textSeg = <TextSegment>curSeg;\n\t\tif (textSeg !== null) {\n\t\t\tconst text = textSeg.text;\n\t\t\tconst i = text.indexOf(\"the\");\n\t\t\tif (i >= 0) {\n\t\t\t\tclient.mergeTree.markRangeRemoved(\n\t\t\t\t\tpos + i,\n\t\t\t\t\tpos + i + 3,\n\t\t\t\t\tclient.mergeTree.localPerspective,\n\t\t\t\t\t{ clientId: client.getClientId(), seq: 1 },\n\t\t\t\t\tundefined as never,\n\t\t\t\t);\n\t\t\t\tclient.mergeTree.insertSegments(\n\t\t\t\t\tpos + i,\n\t\t\t\t\t[TextSegment.make(\"teh\")],\n\t\t\t\t\tclient.mergeTree.localPerspective,\n\t\t\t\t\t{ seq: 1, clientId: client.getClientId() },\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tpos = pos + i + 3;\n\t\t\t\tcReplaces++;\n\t\t\t} else {\n\t\t\t\tpos += curSeg!.cachedLength - curSegOff!.offset!;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst elapsed = elapsedMicroseconds(clockStart);\n\tlog(`${cFetches} fetches and ${cReplaces} replaces took ${elapsed} microseconds`);\n}\n\nconst baseDir = \"../../src/test/literature\";\nconst testTimeout = 60000;\n\ndescribe(\"Routerlicious\", () => {\n\tdescribe(\"merge-tree\", () => {\n\t\tbeforeEach(() => {\n\t\t\tlogLines = [];\n\t\t});\n\t\tit(\"firstTest\", () => {\n\t\t\tconst testPack = TestPack(true);\n\t\t\ttestPack.firstTest();\n\t\t});\n\n\t\tit(\"randolicious\", () => {\n\t\t\tconst testPack = TestPack(false);\n\t\t\tassert(testPack.randolicious() === 0, logLines.join(\"\\n\"));\n\t\t}).timeout(testTimeout);\n\n\t\tit(\"mergeTreeCheckedTest\", () => {\n\t\t\tassert(mergeTreeCheckedTest() === 0, logLines.join(\"\\n\"));\n\t\t}).timeout(testTimeout);\n\n\t\tit(\"beastTest\", () => {\n\t\t\tconst testPack = TestPack(false);\n\t\t\tconst filename = path.join(_dirname, baseDir, \"pp.txt\");\n\t\t\tassert(testPack.clientServer(filename, 250) === 0, logLines.join(\"\\n\"));\n\t\t}).timeout(testTimeout);\n\n\t\tit(\"findReplPerf\", () => {\n\t\t\tconst filename = path.join(_dirname, baseDir, \"pp10.txt\");\n\t\t\tfindReplacePerf(filename);\n\t\t}).timeout(testTimeout);\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"beastTest.spec.js","sourceRoot":"","sources":["../../src/test/beastTest.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/consistent-type-assertions, no-bitwise */\n/* eslint-disable @typescript-eslint/no-unnecessary-type-assertion */\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n/* eslint-disable @typescript-eslint/no-base-to-string */\n\nimport { strict as assert } from \"node:assert\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nimport { Trace } from \"@fluid-internal/client-utils\";\nimport { type IRandom, makeRandom } from \"@fluid-private/stochastic-test-utils\";\nimport type { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\nimport { createChildLogger } from \"@fluidframework/telemetry-utils/internal\";\nimport JsDiff from \"diff\";\n\nimport { MergeTreeTextHelper } from \"../MergeTreeTextHelper.js\";\nimport {\n\ttype KeyComparer,\n\ttype Property,\n\ttype PropertyAction,\n\tRedBlackTree,\n\ttype SortedDictionary,\n} from \"../collections/index.js\";\nimport {\n\tLocalClientId,\n\tUnassignedSequenceNumber,\n\tUniversalSequenceNumber,\n} from \"../constants.js\";\nimport { MergeTree } from \"../mergeTree.js\";\nimport type { IMergeTreeDeltaOpArgs } from \"../mergeTreeDeltaCallback.js\";\nimport {\n\ttype IJSONMarkerSegment,\n\tcompareNumbers,\n\tcompareStrings,\n\treservedMarkerIdKey,\n\ttype ISegmentPrivate,\n} from \"../mergeTreeNodes.js\";\nimport { createRemoveRangeOp } from \"../opBuilder.js\";\nimport { type IMergeTreeOp, MergeTreeDeltaType, ReferenceType } from \"../ops.js\";\nimport { LocalDefaultPerspective } from \"../perspective.js\";\nimport { reservedRangeLabelsKey, reservedTileLabelsKey } from \"../referencePositions.js\";\nimport type { JsonSegmentSpecs } from \"../snapshotChunks.js\";\nimport { SnapshotLegacy } from \"../snapshotlegacy.js\";\nimport { type IJSONTextSegment, TextSegment } from \"../textSegment.js\";\n\nimport { _dirname } from \"./dirname.cjs\";\nimport { TestClient, getStats, specToSegment } from \"./testClient.js\";\nimport { TestServer } from \"./testServer.js\";\nimport { loadTextFromFile, nodeOrdinalsHaveIntegrity } from \"./testUtils.js\";\n\nfunction LinearDictionary<TKey, TData>(\n\tcompareKeys: KeyComparer<TKey>,\n): SortedDictionary<TKey, TData> {\n\tconst props: Property<TKey, TData>[] = [];\n\tconst compareProps = (a: Property<TKey, TData>, b: Property<TKey, TData>): number =>\n\t\tcompareKeys(a.key, b.key);\n\tfunction mapRange<TAccum>(\n\t\taction: PropertyAction<TKey, TData>,\n\t\taccum?: TAccum,\n\t\tstart?: TKey,\n\t\tend?: TKey,\n\t): void {\n\t\tlet _start = start;\n\t\tlet _end = end;\n\n\t\tif (props.length > 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- using ??= could change behavior if value is falsy\n\t\tif (_start === undefined) {\n\t\t\t_start = min()!.key;\n\t\t}\n\t\t// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- using ??= could change behavior if value is falsy\n\t\tif (_end === undefined) {\n\t\t\t_end = max()!.key;\n\t\t}\n\t\tfor (let i = 0, len = props.length; i < len; i++) {\n\t\t\tif (compareKeys(_start, props[i].key) <= 0) {\n\t\t\t\tconst ecmp = compareKeys(_end, props[i].key);\n\t\t\t\tif (ecmp < 0) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (!action(props[i], accum)) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction map<TAccum>(action: PropertyAction<TKey, TData>, accum?: TAccum): void {\n\t\tmapRange(action, accum);\n\t}\n\n\tfunction min(): Property<TKey, TData> | undefined {\n\t\tif (props.length > 0) {\n\t\t\treturn props[0];\n\t\t}\n\t}\n\tfunction max(): Property<TKey, TData> | undefined {\n\t\tif (props.length > 0) {\n\t\t\treturn props[props.length - 1];\n\t\t}\n\t}\n\n\tfunction get(key: TKey): Property<TKey, TData> | undefined {\n\t\tfor (let i = 0, len = props.length; i < len; i++) {\n\t\t\tif (props[i].key === key) {\n\t\t\t\treturn props[i];\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction put(key: TKey, data: TData): void {\n\t\tif (key !== undefined) {\n\t\t\tif (data === undefined) {\n\t\t\t\tremove(key);\n\t\t\t} else {\n\t\t\t\tprops.push({ key, data });\n\t\t\t\tprops.sort(compareProps); // Go to insertion sort if too slow\n\t\t\t}\n\t\t}\n\t}\n\tfunction remove(key: TKey): void {\n\t\tif (key !== undefined) {\n\t\t\tfor (let i = 0, len = props.length; i < len; i++) {\n\t\t\t\tif (props[i].key === key) {\n\t\t\t\t\tprops[i] = props[len - 1];\n\t\t\t\t\tprops.length--;\n\t\t\t\t\tprops.sort(compareProps);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn {\n\t\tmin,\n\t\tmax,\n\t\tmap,\n\t\tmapRange,\n\t\tremove,\n\t\tget,\n\t\tput,\n\t};\n}\n\nlet logLines: string[];\nfunction log(message: string | number): void {\n\tif (logLines) {\n\t\tlogLines.push(message.toString());\n\t}\n}\n\nfunction printStringProperty(p?: Property<string, string>): boolean {\n\tlog(`[${p?.key}, ${p?.data}]`);\n\treturn true;\n}\n\nfunction printStringNumProperty(p: Property<string, number>): boolean {\n\tlog(`[${p.key}, ${p.data}]`);\n\treturn true;\n}\n\nexport function simpleTest(): void {\n\tconst a = [\"Aardvark\", \"cute\", \"Baboon\", \"big\", \"Chameleon\", \"colorful\", \"Dingo\", \"wild\"];\n\n\tconst beast = new RedBlackTree<string, string>(compareStrings);\n\tfor (let i = 0; i < a.length; i += 2) {\n\t\tbeast.put(a[i], a[i + 1]);\n\t}\n\tbeast.map((element) => printStringProperty(element));\n\tlog(\"Map B D\");\n\tlog(\"Map Aardvark Dingo\");\n\tlog(\"Map Baboon Chameleon\");\n\tprintStringProperty(beast.get(\"Chameleon\"));\n}\n\nconst clock = (): Trace => Trace.start();\n\nfunction took(desc: string, trace: Trace): number {\n\tconst duration = trace.trace().duration;\n\tlog(`${desc} took ${duration} ms`);\n\treturn duration;\n}\n\nfunction elapsedMicroseconds(trace: Trace): number {\n\treturn trace.trace().duration * 1000;\n}\n\nexport function integerTest1(): number {\n\tconst random = makeRandom(0xdeadbeef, 0xfeedbed);\n\tconst imin = 0;\n\tconst imax = 10000000;\n\tconst intCount = 1100000;\n\tconst beast = new RedBlackTree<number, number>(compareNumbers);\n\n\tconst randInt = (): number => random.integer(imin, imax);\n\tconst pos: number[] = Array.from({ length: intCount });\n\tlet i = 0;\n\tlet redo = false;\n\tfunction onConflict(key: number, currentKey: number): { data: number } {\n\t\tredo = true;\n\t\treturn { data: currentKey };\n\t}\n\tlet conflictCount = 0;\n\tlet start = clock();\n\twhile (i < intCount) {\n\t\tpos[i] = randInt();\n\t\tbeast.put(pos[i], i, onConflict);\n\t\tif (redo) {\n\t\t\tconflictCount++;\n\t\t\tredo = false;\n\t\t} else {\n\t\t\ti++;\n\t\t}\n\t}\n\ttook(\"test gen\", start);\n\tconst errorCount = 0;\n\tstart = clock();\n\tfor (let j = 0, len = pos.length; j < len; j++) {\n\t\tconst cp = pos[j];\n\t\t/* let prop = */ beast.get(cp);\n\t}\n\tconst getdur = took(\"get all keys\", start);\n\tlog(`cost per get is ${((1000 * getdur) / intCount).toFixed(3)} us`);\n\tlog(`duplicates ${conflictCount}, errors ${errorCount}`);\n\treturn errorCount;\n}\n\nexport function fileTest1(): void {\n\tconst content = fs.readFileSync(\n\t\tpath.join(_dirname, \"../../../public/literature/shakespeare.txt\"),\n\t\t\"utf8\",\n\t);\n\tconst a = content.split(\"\\n\");\n\tconst iterCount = a.length >> 2;\n\tconst removeCount = 10;\n\tlog(`len: ${a.length}`);\n\n\tfor (let k = 0; k < iterCount; k++) {\n\t\tconst beast = new RedBlackTree<string, number>(compareStrings);\n\t\tconst linearBeast = LinearDictionary<string, number>(compareStrings);\n\t\tfor (let i = 0, len = a.length; i < len; i++) {\n\t\t\ta[i] = a[i].trim();\n\t\t\tif (a[i].length > 0) {\n\t\t\t\tbeast.put(a[i], i);\n\t\t\t\tlinearBeast.put(a[i], i);\n\t\t\t}\n\t\t}\n\t\tif (k === 0) {\n\t\t\tbeast.map((element) => printStringNumProperty(element));\n\t\t\tlog(\"BTREE...\");\n\t\t}\n\t\tconst removedAnimals: string[] = [];\n\t\tfor (let j = 0; j < removeCount; j++) {\n\t\t\tconst removeIndex = Math.floor(Math.random() * a.length);\n\t\t\tlog(`Removing: ${a[removeIndex]} at ${removeIndex}`);\n\t\t\tbeast.remove(a[removeIndex]);\n\t\t\tlinearBeast.remove(a[removeIndex]);\n\t\t\tremovedAnimals.push(a[removeIndex]);\n\t\t}\n\t\tfor (const animal of a) {\n\t\t\tif (animal.length > 0 && !removedAnimals.includes(animal)) {\n\t\t\t\tconst prop = beast.get(animal);\n\t\t\t\tconst linProp = linearBeast.get(animal);\n\t\t\t\t// log(`Trying key ${animal}`);\n\t\t\t\tif (prop) {\n\t\t\t\t\t// printStringNumProperty(prop);\n\t\t\t\t\tif (\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/prefer-optional-chain -- TODO: ADO#58520 Code owners should verify if this code change is safe and make it if so or update this comment otherwise\n\t\t\t\t\t\tlinProp === undefined ||\n\t\t\t\t\t\tprop.key !== linProp.key ||\n\t\t\t\t\t\tprop.data !== linProp.data\n\t\t\t\t\t) {\n\t\t\t\t\t\tlog(`Linear BST does not match RB BST at key ${animal}`);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tlog(`hmm...bad key: ${animal}`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction printTextSegment(textSegment: ISegmentPrivate, pos: number): boolean {\n\tlog(textSegment.toString());\n\tlog(`at [${pos}, ${pos + textSegment.cachedLength})`);\n\treturn true;\n}\n\nfunction makeCollabTextSegment(text: string): TextSegment {\n\treturn new TextSegment(text);\n}\n\nfunction editFlat(source: string, s: number, dl: number, nt = \"\"): string {\n\treturn source.slice(0, Math.max(0, s)) + nt + source.slice(s + dl, source.length);\n}\n\nlet accumTime = 0;\n\nfunction checkInsertMergeTree(\n\tmergeTree: MergeTree,\n\tpos: number,\n\ttextSegment: TextSegment,\n\tverbose = false,\n): boolean {\n\tlet checkText = new MergeTreeTextHelper(mergeTree).getText(mergeTree.localPerspective);\n\tcheckText = editFlat(checkText, pos, 0, textSegment.text);\n\tconst clockStart = clock();\n\tmergeTree.insertSegments(\n\t\tpos,\n\t\t[textSegment],\n\t\tmergeTree.localPerspective,\n\t\t{ clientId: LocalClientId, seq: UniversalSequenceNumber },\n\t\tundefined,\n\t);\n\taccumTime += elapsedMicroseconds(clockStart);\n\tconst updatedText = new MergeTreeTextHelper(mergeTree).getText(mergeTree.localPerspective);\n\tconst result = checkText === updatedText;\n\tif (!result && verbose) {\n\t\tlog(`mismatch(o): ${checkText}`);\n\t\tlog(`mismatch(u): ${updatedText}`);\n\t}\n\treturn result;\n}\n\nfunction checkMarkRemoveMergeTree(\n\tmergeTree: MergeTree,\n\tstart: number,\n\tend: number,\n\tverbose = false,\n): boolean {\n\tconst helper = new MergeTreeTextHelper(mergeTree);\n\tconst origText = helper.getText(mergeTree.localPerspective);\n\tconst checkText = editFlat(origText, start, end - start);\n\tconst clockStart = clock();\n\tmergeTree.markRangeRemoved(\n\t\tstart,\n\t\tend,\n\t\tmergeTree.localPerspective,\n\t\t{ clientId: LocalClientId, seq: UniversalSequenceNumber },\n\t\t{ op: createRemoveRangeOp(start, end) },\n\t);\n\taccumTime += elapsedMicroseconds(clockStart);\n\tconst updatedText = helper.getText(mergeTree.localPerspective);\n\tconst result = checkText === updatedText;\n\tif (!result && verbose) {\n\t\tlog(`mismatch(o): ${origText}`);\n\t\tlog(`mismatch(c): ${checkText}`);\n\t\tlog(`mismatch(u): ${updatedText}`);\n\t}\n\treturn result;\n}\n\nexport function mergeTreeTest1(): void {\n\tconst mergeTree = new MergeTree();\n\tmergeTree.insertSegments(\n\t\t0,\n\t\t[TextSegment.make(\"the cat is on the mat\")],\n\t\tmergeTree.localPerspective,\n\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\tundefined,\n\t);\n\tconst localPerspective = new LocalDefaultPerspective(mergeTree.collabWindow.clientId);\n\tmergeTree.mapRange(printTextSegment, localPerspective, undefined);\n\tlet fuzzySeg = makeCollabTextSegment(\"fuzzy, fuzzy \");\n\tcheckInsertMergeTree(mergeTree, 4, fuzzySeg);\n\tfuzzySeg = makeCollabTextSegment(\"fuzzy, fuzzy \");\n\tcheckInsertMergeTree(mergeTree, 4, fuzzySeg);\n\tcheckMarkRemoveMergeTree(mergeTree, 4, 13);\n\t// checkRemoveSegTree(segTree, 4, 13);\n\tcheckInsertMergeTree(mergeTree, 4, makeCollabTextSegment(\"fi\"));\n\tmergeTree.mapRange(printTextSegment, localPerspective, undefined);\n\tconst segoff = mergeTree.getContainingSegment(4, mergeTree.localPerspective);\n\tlog(mergeTree.getPosition(segoff!.segment, mergeTree.localPerspective));\n\tlog(new MergeTreeTextHelper(mergeTree).getText(mergeTree.localPerspective));\n\tlog(mergeTree.toString());\n\tTestPack().firstTest();\n}\n\nexport function mergeTreeLargeTest(): void {\n\tconst mergeTree = new MergeTree();\n\tmergeTree.insertSegments(\n\t\t0,\n\t\t[TextSegment.make(\"the cat is on the mat\")],\n\t\tmergeTree.localPerspective,\n\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\tundefined,\n\t);\n\tconst insertCount = 1000000;\n\tconst removeCount = 980000;\n\tconst random = makeRandom(0xdeadbeef, 0xfeedbed);\n\tconst imin = 1;\n\tconst imax = 9;\n\tconst randInt = (): number => random.integer(imin, imax);\n\tfunction randomString(len: number, c: string): string {\n\t\tlet str = \"\";\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tstr += c;\n\t\t}\n\t\treturn str;\n\t}\n\taccumTime = 0;\n\tlet accumTreeSize = 0;\n\tlet treeCount = 0;\n\tfor (let i = 0; i < insertCount; i++) {\n\t\tconst slen = randInt();\n\t\tconst s = randomString(slen, String.fromCodePoint(48 + slen));\n\t\tconst preLen = mergeTree.getLength(mergeTree.localPerspective);\n\t\tconst pos = random.integer(0, preLen);\n\t\tconst clockStart = clock();\n\t\tmergeTree.insertSegments(\n\t\t\tpos,\n\t\t\t[TextSegment.make(s)],\n\t\t\tmergeTree.localPerspective,\n\t\t\t{ clientId: LocalClientId, seq: UniversalSequenceNumber },\n\t\t\tundefined,\n\t\t);\n\t\taccumTime += elapsedMicroseconds(clockStart);\n\t\tif (i > 0 && 0 === i % 50000) {\n\t\t\tconst perIter = (accumTime / (i + 1)).toFixed(3);\n\t\t\ttreeCount++;\n\t\t\taccumTreeSize += mergeTree.getLength(mergeTree.localPerspective);\n\t\t\tconst averageTreeSize = (accumTreeSize / treeCount).toFixed(3);\n\t\t\tlog(\n\t\t\t\t`i: ${i} time: ${accumTime}us which is average ${perIter} per insert with average tree size ${averageTreeSize}`,\n\t\t\t);\n\t\t}\n\t}\n\tlog(process.memoryUsage().heapUsed);\n\taccumTime = 0;\n\taccumTreeSize = 0;\n\ttreeCount = 0;\n\tfor (let i = 0; i < removeCount; i++) {\n\t\tconst dlen = randInt();\n\t\tconst preLen = mergeTree.getLength(mergeTree.localPerspective);\n\t\tconst pos = random.integer(0, preLen);\n\t\t// Log(itree.toString());\n\t\tconst clockStart = clock();\n\t\tmergeTree.markRangeRemoved(\n\t\t\tpos,\n\t\t\tpos + dlen,\n\t\t\tmergeTree.localPerspective,\n\t\t\t{ clientId: LocalClientId, seq: UniversalSequenceNumber },\n\t\t\tundefined as never,\n\t\t);\n\t\taccumTime += elapsedMicroseconds(clockStart);\n\n\t\tif (i > 0 && 0 === i % 50000) {\n\t\t\tconst perIter = (accumTime / (i + 1)).toFixed(3);\n\t\t\ttreeCount++;\n\t\t\taccumTreeSize += mergeTree.getLength(mergeTree.localPerspective);\n\t\t\tconst averageTreeSize = (accumTreeSize / treeCount).toFixed(3);\n\t\t\tlog(\n\t\t\t\t`i: ${i} time: ${accumTime}us which is average ${perIter} per del with average tree size ${averageTreeSize}`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nexport function mergeTreeCheckedTest(): number {\n\tconst mergeTree = new MergeTree();\n\tmergeTree.insertSegments(\n\t\t0,\n\t\t[TextSegment.make(\"the cat is on the mat\")],\n\t\tmergeTree.localPerspective,\n\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\tundefined,\n\t);\n\tconst insertCount = 2000;\n\tconst removeCount = 1400;\n\tconst largeRemoveCount = 20;\n\tconst random = makeRandom(0xdeadbeef, 0xfeedbed);\n\n\tconst imin = 1;\n\tconst imax = 9;\n\tconst randInt = (): number => random.integer(imin, imax);\n\tconst randLargeInt = (): number => random.integer(10, 1000);\n\tfunction randomString(len: number, c: string): string {\n\t\tlet str = \"\";\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tstr += c;\n\t\t}\n\t\treturn str;\n\t}\n\taccumTime = 0;\n\tlet accumTreeSize = 0;\n\tlet treeCount = 0;\n\tlet errorCount = 0;\n\tfor (let i = 0; i < insertCount; i++) {\n\t\tconst slen = randInt();\n\t\tconst s = randomString(slen, String.fromCodePoint(48 + slen));\n\t\tconst preLen = mergeTree.getLength(mergeTree.localPerspective);\n\t\tconst pos = random.integer(0, preLen);\n\t\tif (!checkInsertMergeTree(mergeTree, pos, makeCollabTextSegment(s), true)) {\n\t\t\tlog(\n\t\t\t\t`i: ${i} preLen ${preLen} pos: ${pos} slen: ${slen} s: ${s} itree len: ${mergeTree.getLength(\n\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t)}`,\n\t\t\t);\n\t\t\tlog(mergeTree.toString());\n\t\t\terrorCount++;\n\t\t\tbreak;\n\t\t}\n\t\tif (i > 0 && 0 === i % 1000) {\n\t\t\tconst perIter = (accumTime / (i + 1)).toFixed(3);\n\t\t\ttreeCount++;\n\t\t\taccumTreeSize += mergeTree.getLength(mergeTree.localPerspective);\n\t\t\tconst averageTreeSize = (accumTreeSize / treeCount).toFixed(3);\n\t\t\tlog(\n\t\t\t\t`i: ${i} time: ${accumTime}us which is average ${perIter} per insert with average tree size ${averageTreeSize}`,\n\t\t\t);\n\t\t}\n\t}\n\taccumTime = 0;\n\taccumTreeSize = 0;\n\ttreeCount = 0;\n\tfor (let i = 0; i < largeRemoveCount; i++) {\n\t\tconst dlen = randLargeInt();\n\t\tconst preLen = mergeTree.getLength(mergeTree.localPerspective);\n\t\tconst pos = random.integer(0, preLen);\n\t\t// log(itree.toString());\n\t\tif (!checkMarkRemoveMergeTree(mergeTree, pos, pos + dlen, true)) {\n\t\t\tlog(\n\t\t\t\t`i: ${i} preLen ${preLen} pos: ${pos} dlen: ${dlen} itree len: ${mergeTree.getLength(\n\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t)}`,\n\t\t\t);\n\t\t\tlog(mergeTree.toString());\n\t\t\tbreak;\n\t\t}\n\t\tif (i > 0 && 0 === i % 10) {\n\t\t\tconst perIter = (accumTime / (i + 1)).toFixed(3);\n\t\t\ttreeCount++;\n\t\t\taccumTreeSize += mergeTree.getLength(mergeTree.localPerspective);\n\t\t\tconst averageTreeSize = (accumTreeSize / treeCount).toFixed(3);\n\t\t\tlog(\n\t\t\t\t`i: ${i} time: ${accumTime}us which is average ${perIter} per large del with average tree size ${averageTreeSize}`,\n\t\t\t);\n\t\t}\n\t}\n\taccumTime = 0;\n\taccumTreeSize = 0;\n\ttreeCount = 0;\n\tfor (let i = 0; i < removeCount; i++) {\n\t\tconst dlen = randInt();\n\t\tconst preLen = mergeTree.getLength(mergeTree.localPerspective);\n\t\tconst pos = random.integer(0, preLen);\n\t\t// log(itree.toString());\n\t\tif (i & 1) {\n\t\t\tif (!checkMarkRemoveMergeTree(mergeTree, pos, pos + dlen, true)) {\n\t\t\t\tlog(\n\t\t\t\t\t`mr i: ${i} preLen ${preLen} pos: ${pos} dlen: ${dlen} itree len: ${mergeTree.getLength(\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t)}`,\n\t\t\t\t);\n\t\t\t\tlog(mergeTree.toString());\n\t\t\t\terrorCount++;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} else {\n\t\t\tif (!checkMarkRemoveMergeTree(mergeTree, pos, pos + dlen, true)) {\n\t\t\t\tlog(\n\t\t\t\t\t`i: ${i} preLen ${preLen} pos: ${pos} dlen: ${dlen} itree len: ${mergeTree.getLength(\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t)}`,\n\t\t\t\t);\n\t\t\t\tlog(mergeTree.toString());\n\t\t\t\terrorCount++;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (i > 0 && 0 === i % 1000) {\n\t\t\tconst perIter = (accumTime / (i + 1)).toFixed(3);\n\t\t\ttreeCount++;\n\t\t\taccumTreeSize += mergeTree.getLength(mergeTree.localPerspective);\n\t\t\tconst averageTreeSize = (accumTreeSize / treeCount).toFixed(3);\n\t\t\tlog(\n\t\t\t\t`i: ${i} time: ${accumTime}us which is average ${perIter} per del with average tree size ${averageTreeSize}`,\n\t\t\t);\n\t\t}\n\t}\n\taccumTime = 0;\n\taccumTreeSize = 0;\n\ttreeCount = 0;\n\tfor (let i = 0; i < insertCount; i++) {\n\t\tconst slen = randInt();\n\t\tconst s = randomString(slen, String.fromCodePoint(48 + slen));\n\t\tconst preLen = mergeTree.getLength(mergeTree.localPerspective);\n\t\tconst pos = random.integer(0, preLen);\n\t\tif (!checkInsertMergeTree(mergeTree, pos, makeCollabTextSegment(s), true)) {\n\t\t\tlog(\n\t\t\t\t`i: ${i} preLen ${preLen} pos: ${pos} slen: ${slen} s: ${s} itree len: ${mergeTree.getLength(\n\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t)}`,\n\t\t\t);\n\t\t\tlog(mergeTree.toString());\n\t\t\terrorCount++;\n\t\t\tbreak;\n\t\t}\n\t\tif (i > 0 && 0 === i % 1000) {\n\t\t\tconst perIter = (accumTime / (i + 1)).toFixed(3);\n\t\t\ttreeCount++;\n\t\t\taccumTreeSize += mergeTree.getLength(mergeTree.localPerspective);\n\t\t\tconst averageTreeSize = (accumTreeSize / treeCount).toFixed(3);\n\t\t\tlog(\n\t\t\t\t`i: ${i} time: ${accumTime}us which is average ${perIter} per insert with average tree size ${averageTreeSize}`,\n\t\t\t);\n\t\t}\n\t}\n\taccumTime = 0;\n\taccumTreeSize = 0;\n\ttreeCount = 0;\n\tfor (let i = 0; i < removeCount; i++) {\n\t\tconst dlen = randInt();\n\t\tconst preLen = mergeTree.getLength(mergeTree.localPerspective);\n\t\tconst pos = random.integer(0, preLen);\n\t\t// log(itree.toString());\n\t\tif (i & 1) {\n\t\t\tif (!checkMarkRemoveMergeTree(mergeTree, pos, pos + dlen, true)) {\n\t\t\t\tlog(\n\t\t\t\t\t`i: ${i} preLen ${preLen} pos: ${pos} dlen: ${dlen} itree len: ${mergeTree.getLength(\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t)}`,\n\t\t\t\t);\n\t\t\t\tlog(mergeTree.toString());\n\t\t\t\terrorCount++;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t} else {\n\t\t\tif (!checkMarkRemoveMergeTree(mergeTree, pos, pos + dlen, true)) {\n\t\t\t\tlog(\n\t\t\t\t\t`i: ${i} preLen ${preLen} pos: ${pos} dlen: ${dlen} itree len: ${mergeTree.getLength(\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t)}`,\n\t\t\t\t);\n\t\t\t\tlog(mergeTree.toString());\n\t\t\t\terrorCount++;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (i > 0 && 0 === i % 1000) {\n\t\t\tconst perIter = (accumTime / (i + 1)).toFixed(3);\n\t\t\ttreeCount++;\n\t\t\taccumTreeSize += mergeTree.getLength(mergeTree.localPerspective);\n\t\t\tconst averageTreeSize = (accumTreeSize / treeCount).toFixed(3);\n\t\t\tlog(\n\t\t\t\t`i: ${i} time: ${accumTime}us which is average ${perIter} per del with average tree size ${averageTreeSize}`,\n\t\t\t);\n\t\t}\n\t}\n\treturn errorCount;\n}\n\ntype SharedStringJSONSegment = IJSONTextSegment & IJSONMarkerSegment;\n\nexport function TestPack(verbose = true): {\n\tfirstTest: () => void;\n\trandolicious: () => number;\n\tclientServer: (startFile?: string, initRounds?: number) => number;\n\tmanyMergeTrees: () => void;\n} {\n\tconst random = makeRandom(0xdeadbeef, 0xfeedbed);\n\tconst minSegCount = 1;\n\tconst maxSegCount = 1000;\n\tconst randSmallSegmentCount = (): number => random.integer(1, 4);\n\tconst randSegmentCount = (): number => random.integer(minSegCount, maxSegCount);\n\tconst randTextLength = (): number => random.integer(1, 5);\n\tconst zedCode = 48;\n\tfunction randomString(len: number, c: string): string {\n\t\tlet str = \"\";\n\t\tfor (let i = 0; i < len; i++) {\n\t\t\tstr += c;\n\t\t}\n\t\treturn str;\n\t}\n\n\tlet getTextTime = 0;\n\tlet getTextCalls = 0;\n\tconst catchUpTime = 0;\n\tconst catchUps = 0;\n\n\tfunction reportTiming(client: TestClient): void {\n\t\tif (!verbose) {\n\t\t\treturn;\n\t\t}\n\t\tconst aveTime = (client.accumTime / client.accumOps).toFixed(1);\n\t\tconst stats = getStats(client.mergeTree);\n\t\tconst windowTime = stats.windowTime!;\n\t\tconst packTime = stats.packTime;\n\t\tconst aveWindowTime = ((windowTime || 0) / client.accumOps).toFixed(1);\n\t\tconst avePackTime = ((packTime ?? 0) / client.accumOps).toFixed(1);\n\t\tconst aveExtraWindowTime = (client.accumWindowTime / client.accumOps).toFixed(1);\n\t\tconst aveWindow = (client.accumWindow / client.accumOps).toFixed(1);\n\t\tconst adjTime = (\n\t\t\t(client.accumTime - (windowTime - client.accumWindowTime)) /\n\t\t\tclient.accumOps\n\t\t).toFixed(1);\n\t\tconst aveGetTextTime = (getTextTime / getTextCalls).toFixed(1);\n\t\tlet aveCatchUpTime = \"off\";\n\t\tif (catchUps > 0) {\n\t\t\taveCatchUpTime = (catchUpTime / catchUps).toFixed(1);\n\t\t}\n\t\tlog(`get text time: ${aveGetTextTime} catch up ${aveCatchUpTime}`);\n\t\tlog(\n\t\t\t`accum time ${client.accumTime} us ops: ${client.accumOps} ave time ${aveTime} - wtime ${adjTime} pack ${avePackTime} ave window ${aveWindow}`,\n\t\t);\n\t\tlog(\n\t\t\t`accum window time ${client.accumWindowTime} us ave window time total ${aveWindowTime} not in ops ${aveExtraWindowTime}; max ${client.maxWindowTime}`,\n\t\t);\n\t}\n\n\tfunction manyMergeTrees(): void {\n\t\tconst mergeTreeCount = 2000000;\n\t\tconst a = <MergeTree[]>Array.from({ length: mergeTreeCount });\n\t\tfor (let i = 0; i < mergeTreeCount; i++) {\n\t\t\ta[i] = new MergeTree();\n\t\t}\n\t\tfor (;;) {\n\t\t\t// infinite loop\n\t\t}\n\t}\n\n\tfunction clientServer(startFile?: string, initRounds = 1000): number {\n\t\tconst clientCount = 5;\n\t\tconst fileSegCount = 0;\n\t\tlet initString = \"\";\n\n\t\tif (!startFile) {\n\t\t\tinitString = \"don't ask for whom the bell tolls; it tolls for thee\";\n\t\t}\n\t\tconst server = new TestServer();\n\t\tserver.insertTextLocal(0, initString);\n\t\tserver.measureOps = true;\n\t\tif (startFile) {\n\t\t\tloadTextFromFile(startFile, server.mergeTree, fileSegCount);\n\t\t}\n\n\t\tconst clients: TestClient[] = Array.from({ length: clientCount });\n\t\tfor (let i = 0; i < clientCount; i++) {\n\t\t\tclients[i] = new TestClient();\n\t\t\tclients[i].insertTextLocal(0, initString);\n\t\t\tclients[i].measureOps = true;\n\t\t\tif (startFile) {\n\t\t\t\tloadTextFromFile(startFile, clients[i].mergeTree, fileSegCount);\n\t\t\t}\n\t\t\tclients[i].startOrUpdateCollaboration(`Fred${i}`);\n\t\t}\n\t\tserver.startOrUpdateCollaboration(\"theServer\");\n\t\tserver.addClients(clients);\n\n\t\tfunction checkTextMatch(): boolean {\n\t\t\t// log(`checking text match @${server.getCurrentSeq()}`);\n\t\t\tconst clockStart = clock();\n\t\t\tconst serverText = server.getText();\n\t\t\tgetTextTime += elapsedMicroseconds(clockStart);\n\t\t\tgetTextCalls++;\n\t\t\tfor (const client of clients) {\n\t\t\t\tconst cliText = client.getText();\n\t\t\t\tif (cliText !== serverText) {\n\t\t\t\t\tlog(\n\t\t\t\t\t\t`mismatch @${server.getCurrentSeq()} client @${client.getCurrentSeq()} id: ${client.getClientId()}`,\n\t\t\t\t\t);\n\t\t\t\t\t// log(serverText);\n\t\t\t\t\t// log(cliText);\n\t\t\t\t\tconst diffParts = JsDiff.diffChars(serverText, cliText);\n\t\t\t\t\tfor (const diffPart of diffParts) {\n\t\t\t\t\t\tlet annotes = \"\";\n\t\t\t\t\t\tif (diffPart.added) {\n\t\t\t\t\t\t\tannotes += \"added \";\n\t\t\t\t\t\t} else if (diffPart.removed) {\n\t\t\t\t\t\t\tannotes += \"removed \";\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (diffPart.count) {\n\t\t\t\t\t\t\tannotes += `count: ${diffPart.count}`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tlog(`text: ${diffPart.value} ${annotes}`);\n\t\t\t\t\t}\n\t\t\t\t\tlog(server.mergeTree.toString());\n\t\t\t\t\tlog(client.mergeTree.toString());\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tconst rounds = initRounds;\n\n\t\tfunction clientProcessSome(client: TestClient, all = false): void {\n\t\t\tconst cliMsgCount = client.getMessageCount();\n\t\t\tconst countToApply = all\n\t\t\t\t? cliMsgCount\n\t\t\t\t: random.integer(Math.floor((2 * cliMsgCount) / 3), cliMsgCount);\n\t\t\tclient.applyMessages(countToApply);\n\t\t}\n\n\t\tfunction serverProcessSome(_server: TestClient, all = false): boolean {\n\t\t\tconst svrMsgCount = _server.getMessageCount();\n\t\t\tconst countToApply = all\n\t\t\t\t? svrMsgCount\n\t\t\t\t: random.integer(Math.floor((2 * svrMsgCount) / 3), svrMsgCount);\n\t\t\treturn _server.applyMessages(countToApply);\n\t\t}\n\n\t\tfunction randomSpateOfInserts(client: TestClient, charIndex: number): void {\n\t\t\tconst textLen = randTextLength();\n\t\t\tconst text = randomString(\n\t\t\t\ttextLen,\n\t\t\t\tString.fromCodePoint(zedCode + ((client.getCurrentSeq() + charIndex) % 50)),\n\t\t\t);\n\t\t\tconst preLen = client.getLength();\n\t\t\tconst pos = random.integer(0, preLen);\n\t\t\tconst insertTextOp = client.insertTextLocal(pos, text);\n\t\t\tserver.enqueueMsg(client.makeOpMessage(insertTextOp!, UnassignedSequenceNumber));\n\n\t\t\tif (TestClient.useCheckQ) {\n\t\t\t\tclient.enqueueTestString();\n\t\t\t}\n\t\t}\n\n\t\tfunction randomSpateOfRemoves(client: TestClient): void {\n\t\t\tconst dlen = randTextLength();\n\t\t\tconst preLen = client.getLength();\n\t\t\tconst pos = random.integer(0, preLen);\n\t\t\tconst op = client.removeRangeLocal(pos, pos + dlen);\n\t\t\tserver.enqueueMsg(client.makeOpMessage(op!));\n\t\t\tif (TestClient.useCheckQ) {\n\t\t\t\tclient.enqueueTestString();\n\t\t\t}\n\t\t}\n\n\t\tfunction randomWordMove(client: TestClient): void {\n\t\t\tconst word1 = client.findRandomWord();\n\t\t\tif (word1) {\n\t\t\t\tconst removeStart = word1.pos;\n\t\t\t\tconst removeEnd = removeStart + word1.text.length;\n\t\t\t\tconst removeOp = client.removeRangeLocal(removeStart, removeEnd);\n\t\t\t\tserver.enqueueMsg(client.makeOpMessage(removeOp!, UnassignedSequenceNumber));\n\t\t\t\tif (TestClient.useCheckQ) {\n\t\t\t\t\tclient.enqueueTestString();\n\t\t\t\t}\n\t\t\t\tlet word2 = client.findRandomWord();\n\t\t\t\twhile (!word2) {\n\t\t\t\t\tword2 = client.findRandomWord();\n\t\t\t\t}\n\t\t\t\tconst pos = word2.pos + word2.text.length;\n\t\t\t\tconst insertOp = client.insertTextLocal(pos, word1.text);\n\t\t\t\tserver.enqueueMsg(client.makeOpMessage(insertOp!, UnassignedSequenceNumber));\n\n\t\t\t\tif (TestClient.useCheckQ) {\n\t\t\t\t\tclient.enqueueTestString();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet errorCount = 0;\n\n\t\tconst extractSnapTime = 0;\n\t\tconst extractSnapOps = 0;\n\t\tfunction finishRound(roundCount: number): number | undefined {\n\t\t\t// Process remaining messages\n\t\t\tif (serverProcessSome(server, true)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfor (const client of clients) {\n\t\t\t\tclientProcessSome(client, true);\n\t\t\t}\n\n\t\t\tif (0 === roundCount % 100) {\n\t\t\t\tconst clockStart = clock();\n\t\t\t\tif (checkTextMatch()) {\n\t\t\t\t\tlog(`round: ${roundCount} BREAK`);\n\t\t\t\t\terrorCount++;\n\t\t\t\t\treturn errorCount;\n\t\t\t\t}\n\t\t\t\tcheckTime += elapsedMicroseconds(clockStart);\n\t\t\t\tif (verbose) {\n\t\t\t\t\tlog(`wall clock is ${((Date.now() - startTime) / 1000).toFixed(1)}`);\n\t\t\t\t}\n\t\t\t\tconst stats = getStats(server.mergeTree);\n\t\t\t\tconst liveAve = (stats.liveCount / stats.nodeCount).toFixed(1);\n\t\t\t\tconst posLeaves = stats.leafCount - stats.removedLeafCount;\n\t\t\t\tlet aveExtractSnapTime = \"off\";\n\t\t\t\tif (extractSnapOps > 0) {\n\t\t\t\t\taveExtractSnapTime = (extractSnapTime / extractSnapOps).toFixed(1);\n\t\t\t\t}\n\t\t\t\tlog(\n\t\t\t\t\t`round: ${roundCount} seq ${server.seq} char count ${server.getLength()} height ${\n\t\t\t\t\t\tstats.maxHeight\n\t\t\t\t\t} lv ${stats.leafCount} rml ${stats.removedLeafCount} p ${posLeaves} nodes ${\n\t\t\t\t\t\tstats.nodeCount\n\t\t\t\t\t} pop ${liveAve} histo ${stats.histo}`,\n\t\t\t\t);\n\t\t\t\tif (extractSnapOps > 0) {\n\t\t\t\t\taveExtractSnapTime = (extractSnapTime / extractSnapOps).toFixed(1);\n\t\t\t\t\tlog(`ave extract snap time ${aveExtractSnapTime}`);\n\t\t\t\t}\n\t\t\t\treportTiming(server);\n\t\t\t\treportTiming(clients[2]);\n\t\t\t\tlet totalTime = server.accumTime + server.accumWindowTime;\n\t\t\t\tfor (const client of clients) {\n\t\t\t\t\ttotalTime += client.accumTime + client.accumWindowTime;\n\t\t\t\t}\n\t\t\t\tif (verbose) {\n\t\t\t\t\tlog(\n\t\t\t\t\t\t`total time ${(totalTime / 1000000).toFixed(1)} check time ${(checkTime / 1000000).toFixed(1)}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t// log(server.getText());\n\t\t\t\t// log(server.mergeTree.toString());\n\t\t\t}\n\t\t\treturn errorCount;\n\t\t}\n\n\t\tfunction round(roundCount: number): void {\n\t\t\tfor (const client of clients) {\n\t\t\t\tconst insertSegmentCount = randSmallSegmentCount();\n\t\t\t\tfor (let j = 0; j < insertSegmentCount; j++) {\n\t\t\t\t\tif (startFile) {\n\t\t\t\t\t\trandomWordMove(client);\n\t\t\t\t\t} else {\n\t\t\t\t\t\trandomSpateOfInserts(client, j);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (serverProcessSome(server)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tclientProcessSome(client);\n\n\t\t\t\tlet removeSegmentCount = Math.floor((3 * insertSegmentCount) / 4);\n\t\t\t\tif (removeSegmentCount < 1) {\n\t\t\t\t\tremoveSegmentCount = 1;\n\t\t\t\t}\n\t\t\t\tfor (let j = 0; j < removeSegmentCount; j++) {\n\t\t\t\t\tif (startFile) {\n\t\t\t\t\t\trandomWordMove(client);\n\t\t\t\t\t} else {\n\t\t\t\t\t\trandomSpateOfRemoves(client);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (serverProcessSome(server)) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tclientProcessSome(client);\n\t\t\t}\n\t\t\tfinishRound(roundCount);\n\t\t}\n\n\t\tconst startTime = Date.now();\n\t\tlet checkTime = 0;\n\n\t\tfor (let i = 0; i < rounds; i++) {\n\t\t\tround(i);\n\t\t\tif (errorCount > 0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\ttail();\n\n\t\tfunction tail(): void {\n\t\t\treportTiming(server);\n\t\t\treportTiming(clients[2]);\n\t\t\t// log(server.getText());\n\t\t\t// log(server.mergeTree.toString());\n\t\t}\n\t\treturn errorCount;\n\t}\n\n\tfunction randolicious(): number {\n\t\tconst insertRounds = 40;\n\t\tconst removeRounds = 32;\n\n\t\tconst cliA = new TestClient();\n\t\tcliA.insertTextLocal(0, \"a stitch in time saves nine\");\n\t\tcliA.startOrUpdateCollaboration(\"FredA\");\n\t\tconst cliB = new TestClient();\n\t\tcliB.insertTextLocal(0, \"a stitch in time saves nine\");\n\t\tcliB.startOrUpdateCollaboration(\"FredB\");\n\t\tfunction checkTextMatch(checkSeq: number): boolean {\n\t\t\tlet error = false;\n\t\t\tif (cliA.getCurrentSeq() !== checkSeq) {\n\t\t\t\tlog(`client A has seq number ${cliA.getCurrentSeq()} mismatch with ${checkSeq}`);\n\t\t\t\terror = true;\n\t\t\t}\n\t\t\tif (cliB.getCurrentSeq() !== checkSeq) {\n\t\t\t\tlog(`client B has seq number ${cliB.getCurrentSeq()} mismatch with ${checkSeq}`);\n\t\t\t\terror = true;\n\t\t\t}\n\t\t\tconst aText = cliA.getText();\n\t\t\tconst bText = cliB.getText();\n\t\t\tif (aText !== bText) {\n\t\t\t\tlog(`mismatch @${checkSeq}:`);\n\t\t\t\tlog(aText);\n\t\t\t\tlog(bText);\n\t\t\t\terror = true;\n\t\t\t}\n\t\t\tif (!nodeOrdinalsHaveIntegrity(cliA.mergeTree.root)) {\n\t\t\t\terror = true;\n\t\t\t}\n\t\t\tif (!nodeOrdinalsHaveIntegrity(cliB.mergeTree.root)) {\n\t\t\t\terror = true;\n\t\t\t}\n\t\t\treturn error;\n\t\t}\n\n\t\tlet min = 0;\n\t\tcliA.accumTime = 0;\n\t\tcliB.accumTime = 0;\n\n\t\tfunction insertTest(): boolean {\n\t\t\tfor (let i = 0; i < insertRounds; i++) {\n\t\t\t\tlet insertCount = randSegmentCount();\n\t\t\t\tlet sequenceNumber = cliA.getCurrentSeq() + 1;\n\t\t\t\tlet firstSeq = sequenceNumber;\n\t\t\t\tconst cliAMsgs: ISequencedDocumentMessage[] = [];\n\t\t\t\tfor (let j = 0; j < insertCount; j++) {\n\t\t\t\t\tconst textLen = randTextLength();\n\t\t\t\t\tconst text = randomString(\n\t\t\t\t\t\ttextLen,\n\t\t\t\t\t\tString.fromCodePoint(zedCode + (sequenceNumber % 50)),\n\t\t\t\t\t);\n\t\t\t\t\tconst preLen = cliA.getLength();\n\t\t\t\t\tconst pos = random.integer(0, preLen);\n\n\t\t\t\t\tconst msg = cliA.makeOpMessage(cliA.insertTextLocal(pos, text)!, sequenceNumber++);\n\t\t\t\t\tmsg.minimumSequenceNumber = min;\n\t\t\t\t\tcliAMsgs.push(msg);\n\t\t\t\t\tcliB.applyMsg(msg);\n\t\t\t\t}\n\t\t\t\tfor (let k = firstSeq; k < sequenceNumber; k++) {\n\t\t\t\t\tcliA.applyMsg(cliAMsgs.shift()!);\n\t\t\t\t}\n\t\t\t\tif (checkTextMatch(sequenceNumber - 1)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tmin = sequenceNumber - 1;\n\n\t\t\t\tinsertCount = randSegmentCount();\n\t\t\t\tsequenceNumber = cliA.getCurrentSeq() + 1;\n\t\t\t\tfirstSeq = sequenceNumber;\n\t\t\t\tconst cliBMsgs: ISequencedDocumentMessage[] = [];\n\t\t\t\tfor (let j = 0; j < insertCount; j++) {\n\t\t\t\t\tconst textLen = randTextLength();\n\t\t\t\t\tconst text = randomString(\n\t\t\t\t\t\ttextLen,\n\t\t\t\t\t\tString.fromCodePoint(zedCode + (sequenceNumber % 50)),\n\t\t\t\t\t);\n\t\t\t\t\tconst preLen = cliB.getLength();\n\t\t\t\t\tconst pos = random.integer(0, preLen);\n\t\t\t\t\tconst msg = cliB.makeOpMessage(cliB.insertTextLocal(pos, text)!, sequenceNumber++);\n\t\t\t\t\tmsg.minimumSequenceNumber = min;\n\t\t\t\t\tcliBMsgs.push(msg);\n\t\t\t\t\tcliA.applyMsg(msg);\n\t\t\t\t}\n\t\t\t\tfor (let k = firstSeq; k < sequenceNumber; k++) {\n\t\t\t\t\tcliB.applyMsg(cliBMsgs.shift()!);\n\t\t\t\t}\n\t\t\t\tif (checkTextMatch(sequenceNumber - 1)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tmin = sequenceNumber - 1;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\n\t\tfunction removeTest(): boolean {\n\t\t\tfor (let i = 0; i < removeRounds; i++) {\n\t\t\t\tlet removeCount = randSegmentCount();\n\t\t\t\tlet sequenceNumber = cliA.getCurrentSeq() + 1;\n\t\t\t\tlet firstSeq = sequenceNumber;\n\t\t\t\tconst cliAMsgs: ISequencedDocumentMessage[] = [];\n\t\t\t\tfor (let j = 0; j < removeCount; j++) {\n\t\t\t\t\tconst dlen = randTextLength();\n\t\t\t\t\tconst maxStartPos = cliA.getLength() - dlen;\n\t\t\t\t\tconst pos = random.integer(0, maxStartPos);\n\t\t\t\t\tconst msg = cliA.makeOpMessage(\n\t\t\t\t\t\tcliA.removeRangeLocal(pos, pos + dlen)!,\n\t\t\t\t\t\tsequenceNumber++,\n\t\t\t\t\t);\n\t\t\t\t\tmsg.minimumSequenceNumber = min;\n\t\t\t\t\tcliAMsgs.push(msg);\n\t\t\t\t\tcliB.applyMsg(msg);\n\t\t\t\t}\n\t\t\t\tfor (let k = firstSeq; k < sequenceNumber; k++) {\n\t\t\t\t\tcliA.applyMsg(cliAMsgs.shift()!);\n\t\t\t\t}\n\t\t\t\tif (checkTextMatch(sequenceNumber - 1)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tmin = sequenceNumber - 1;\n\n\t\t\t\tremoveCount = randSegmentCount();\n\t\t\t\tsequenceNumber = cliA.getCurrentSeq() + 1;\n\t\t\t\tfirstSeq = sequenceNumber;\n\t\t\t\tconst cliBMsgs: ISequencedDocumentMessage[] = [];\n\t\t\t\tfor (let j = 0; j < removeCount; j++) {\n\t\t\t\t\tconst dlen = randTextLength();\n\t\t\t\t\tconst maxStartPos = cliB.getLength() - dlen;\n\t\t\t\t\tconst pos = random.integer(0, maxStartPos);\n\t\t\t\t\tconst msg = cliB.makeOpMessage(\n\t\t\t\t\t\tcliB.removeRangeLocal(pos, pos + dlen)!,\n\t\t\t\t\t\tsequenceNumber++,\n\t\t\t\t\t);\n\t\t\t\t\tmsg.minimumSequenceNumber = min;\n\t\t\t\t\tcliBMsgs.push(msg);\n\t\t\t\t\tcliA.applyMsg(msg);\n\t\t\t\t}\n\t\t\t\tfor (let k = firstSeq; k < sequenceNumber; k++) {\n\t\t\t\t\tcliB.applyMsg(cliBMsgs.shift()!);\n\t\t\t\t}\n\t\t\t\tif (checkTextMatch(sequenceNumber - 1)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tmin = sequenceNumber - 1;\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t\tlet errorCount = 0;\n\t\tif (insertTest()) {\n\t\t\tlog(cliA.mergeTree.toString());\n\t\t\tlog(cliB.mergeTree.toString());\n\t\t\terrorCount++;\n\t\t} else {\n\t\t\tlog(`sequence number: ${cliA.getCurrentSeq()} min: ${cliA.getCollabWindow().minSeq}`);\n\t\t\t// log(cliA.mergeTree.toString());\n\n\t\t\tlog(`testing remove at ${cliA.getCurrentSeq()} and ${cliB.getCurrentSeq()}`);\n\t\t\tif (removeTest()) {\n\t\t\t\tlog(cliA.mergeTree.toString());\n\t\t\t\tlog(cliB.mergeTree.toString());\n\t\t\t\terrorCount++;\n\t\t\t}\n\t\t}\n\t\tlog(`sequence number: ${cliA.getCurrentSeq()} min: ${cliA.getCollabWindow().minSeq}`);\n\t\t// log(cliA.mergeTree.toString());\n\t\t// log(cliB.mergeTree.toString());\n\t\t// log(cliA.getText());\n\t\tconst aveWindow = ((minSegCount + maxSegCount) / 2).toFixed(1);\n\t\tconst aveTime = (cliA.accumTime / cliA.accumOps).toFixed(3);\n\t\tconst aveWindowTime = (cliA.accumWindowTime / cliA.accumOps).toFixed(3);\n\t\tif (verbose) {\n\t\t\tlog(\n\t\t\t\t`accum time ${cliA.accumTime} us ops: ${cliA.accumOps} ave window ${aveWindow} ave time ${aveTime}`,\n\t\t\t);\n\t\t\tlog(\n\t\t\t\t`accum window time ${cliA.accumWindowTime} us ave window time ${aveWindowTime}; max ${cliA.maxWindowTime}`,\n\t\t\t);\n\t\t}\n\t\t// log(cliB.getText());\n\t\treturn errorCount;\n\t}\n\n\tconst clientNames = [\"Ed\", \"Ted\", \"Ned\", \"Harv\", \"Marv\", \"Glenda\", \"Susan\"];\n\tfunction firstTest(): void {\n\t\tlet cli = new TestClient();\n\t\tcli.insertTextLocal(0, \"on the mat.\");\n\t\tcli.startOrUpdateCollaboration(\"Fred1\");\n\t\tfor (const cname of clientNames) {\n\t\t\tcli.addLongClientId(cname);\n\t\t}\n\t\tcli.insertTextRemote(0, \"that \", undefined, 1, 0, \"1\");\n\t\tif (verbose) {\n\t\t\tlog(cli.mergeTree.toString());\n\t\t}\n\t\tcli.insertTextRemote(0, \"fat \", undefined, 2, 0, \"2\");\n\t\tif (verbose) {\n\t\t\tlog(cli.mergeTree.toString());\n\t\t}\n\t\tcli.insertTextLocal(5, \"cat \");\n\t\tif (verbose) {\n\t\t\tlog(cli.mergeTree.toString());\n\t\t}\n\t\tif (verbose) {\n\t\t\tfor (let i = 0; i < 4; i++) {\n\t\t\t\tfor (let j = 0; j < 3; j++) {\n\t\t\t\t\tlog(cli.relText(i, j));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcli.mergeTree.ackOp(createLocalOpArgs(MergeTreeDeltaType.INSERT, 3));\n\t\tif (verbose) {\n\t\t\tlog(cli.mergeTree.toString());\n\t\t\tfor (let clientId = 0; clientId < 4; clientId++) {\n\t\t\t\tfor (let refSeq = 0; refSeq < 4; refSeq++) {\n\t\t\t\t\tlog(cli.relText(clientId, refSeq));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcli.insertMarkerRemote(\n\t\t\t0,\n\t\t\t{ refType: ReferenceType.Tile },\n\t\t\t{ [reservedTileLabelsKey]: [\"peach\"] },\n\t\t\t5,\n\t\t\t0,\n\t\t\t\"2\",\n\t\t);\n\t\tcli.insertTextRemote(6, \"very \", undefined, 6, 2, \"2\");\n\t\tif (verbose) {\n\t\t\tlog(cli.mergeTree.toString());\n\t\t\tfor (let clientId = 0; clientId < 4; clientId++) {\n\t\t\t\tfor (let refSeq = 0; refSeq < 7; refSeq++) {\n\t\t\t\t\tlog(cli.relText(clientId, refSeq));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst segs = <SharedStringJSONSegment[]>(\n\t\t\tnew SnapshotLegacy(cli.mergeTree, createChildLogger({ namespace: \"fluid:snapshot\" }))\n\t\t\t\t.extractSync()\n\t\t\t\t.map((seg) => seg.toJSONObject() as JsonSegmentSpecs)\n\t\t);\n\t\tif (verbose) {\n\t\t\tfor (const seg of segs) {\n\t\t\t\tlog(`${specToSegment(seg)}`);\n\t\t\t}\n\t\t}\n\t\tcli = new TestClient();\n\t\tcli.insertTextLocal(0, \" old sock!\");\n\t\tcli.startOrUpdateCollaboration(\"Fred2\");\n\t\tfor (const cname of clientNames) {\n\t\t\tcli.addLongClientId(cname);\n\t\t}\n\t\tcli.insertTextRemote(0, \"abcde\", undefined, 1, 0, \"2\");\n\t\tcli.insertTextRemote(0, \"yyy\", undefined, 2, 0, \"1\");\n\t\tcli.insertTextRemote(2, \"zzz\", undefined, 3, 1, \"3\");\n\t\tcli.insertTextRemote(1, \"EAGLE\", undefined, 4, 1, \"4\");\n\t\tcli.insertTextRemote(4, \"HAS\", undefined, 5, 1, \"5\");\n\t\tcli.insertTextLocal(19, \" LANDED\");\n\t\tcli.insertTextRemote(0, \"yowza: \", undefined, 6, 4, \"2\");\n\t\tcli.mergeTree.ackOp(createLocalOpArgs(MergeTreeDeltaType.INSERT, 7));\n\t\tif (verbose) {\n\t\t\tlog(cli.mergeTree.toString());\n\t\t\tfor (let clientId = 0; clientId < 6; clientId++) {\n\t\t\t\tfor (let refSeq = 0; refSeq < 8; refSeq++) {\n\t\t\t\t\tlog(cli.relText(clientId, refSeq));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcli.applyMsg(cli.makeOpMessage(createRemoveRangeOp(3, 5), 8, 6, \"1\"));\n\t\tif (verbose) {\n\t\t\tlog(cli.mergeTree.toString());\n\t\t\tfor (let clientId = 0; clientId < 6; clientId++) {\n\t\t\t\tfor (let refSeq = 0; refSeq < 9; refSeq++) {\n\t\t\t\t\tlog(cli.relText(clientId, refSeq));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcli = new TestClient();\n\t\tcli.insertTextLocal(0, \"abcdefgh\");\n\t\tcli.startOrUpdateCollaboration(\"Fred3\");\n\t\tfor (const cname of clientNames) {\n\t\t\tcli.addLongClientId(cname);\n\t\t}\n\t\tcli.applyMsg(cli.makeOpMessage(createRemoveRangeOp(1, 3), 1, 0, \"3\"));\n\t\tif (verbose) {\n\t\t\tlog(cli.mergeTree.toString());\n\t\t}\n\t\tcli.insertTextRemote(2, \"zzz\", undefined, 2, 0, \"2\");\n\t\tif (verbose) {\n\t\t\tlog(cli.mergeTree.toString());\n\t\t}\n\t\tcli.insertTextRemote(9, \" chaser\", undefined, 3, 2, \"3\");\n\t\tcli.removeRangeLocal(12, 14);\n\t\tcli.mergeTree.ackOp(createLocalOpArgs(MergeTreeDeltaType.REMOVE, 4));\n\t\tif (verbose) {\n\t\t\tlog(cli.mergeTree.toString());\n\t\t\tfor (let clientId = 0; clientId < 4; clientId++) {\n\t\t\t\tfor (let refSeq = 0; refSeq < 5; refSeq++) {\n\t\t\t\t\tlog(cli.relText(clientId, refSeq));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcli.insertTextLocal(14, \"*yolumba*\");\n\t\tcli.insertTextLocal(17, \"-zanzibar-\");\n\t\tcli.mergeTree.ackOp(createLocalOpArgs(MergeTreeDeltaType.INSERT, 5));\n\t\tcli.insertTextRemote(2, \"(aaa)\", undefined, 6, 4, \"2\");\n\t\tcli.mergeTree.ackOp(createLocalOpArgs(MergeTreeDeltaType.INSERT, 7));\n\t\tif (verbose) {\n\t\t\tlog(cli.mergeTree.toString());\n\t\t\tfor (let clientId = 0; clientId < 4; clientId++) {\n\t\t\t\tfor (let refSeq = 0; refSeq < 8; refSeq++) {\n\t\t\t\t\tlog(cli.relText(clientId, refSeq));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t/*\n cli.removeRangeLocal(3,8);\n cli.removeRangeLocal(5,7);\n cli.ackPendingSegment(8);\n cli.ackPendingSegment(9);\n */\n\t\tcli.applyMsg(cli.makeOpMessage(createRemoveRangeOp(3, 8), 8, 7, \"2\"));\n\t\tcli.applyMsg(cli.makeOpMessage(createRemoveRangeOp(5, 7), 9, 7, \"2\"));\n\t\tif (verbose) {\n\t\t\tlog(cli.mergeTree.toString());\n\t\t\tfor (let clientId = 0; clientId < 4; clientId++) {\n\t\t\t\tfor (let refSeq = 0; refSeq < 10; refSeq++) {\n\t\t\t\t\tlog(cli.relText(clientId, refSeq));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconst removeOp = cli.removeRangeLocal(3, 5);\n\t\tcli.applyMsg(cli.makeOpMessage(createRemoveRangeOp(3, 6), 10, 9, \"2\"));\n\t\tcli.applyMsg(cli.makeOpMessage(removeOp!, 11));\n\t\tif (verbose) {\n\t\t\tlog(cli.mergeTree.toString());\n\t\t\tfor (let clientId = 0; clientId < 4; clientId++) {\n\t\t\t\tfor (let refSeq = 0; refSeq < 12; refSeq++) {\n\t\t\t\t\tlog(cli.relText(clientId, refSeq));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn {\n\t\tfirstTest,\n\t\trandolicious,\n\t\tclientServer,\n\t\tmanyMergeTrees,\n\t};\n}\n\nconst createLocalOpArgs = (\n\ttype: MergeTreeDeltaType,\n\tsequenceNumber: number,\n): IMergeTreeDeltaOpArgs => ({\n\top: { type } as IMergeTreeOp,\n\tsequencedMessage: {\n\t\tsequenceNumber,\n\t} as ISequencedDocumentMessage,\n});\n\nexport class RandomPack {\n\trandom: IRandom;\n\tconstructor() {\n\t\tthis.random = makeRandom(0xdeadbeef, 0xfeedbed);\n\t}\n\n\trandInteger(min: number, max: number): number {\n\t\treturn this.random.integer(min, max);\n\t}\n\n\trandString(wordCount: number): string {\n\t\tconst exampleWords = [\n\t\t\t\"giraffe\",\n\t\t\t\"hut\",\n\t\t\t\"aardvark\",\n\t\t\t\"gold\",\n\t\t\t\"hover\",\n\t\t\t\"yurt\",\n\t\t\t\"hot\",\n\t\t\t\"antelope\",\n\t\t\t\"gift\",\n\t\t\t\"banana\",\n\t\t\t\"book\",\n\t\t\t\"airplane\",\n\t\t\t\"kitten\",\n\t\t\t\"moniker\",\n\t\t\t\"lemma\",\n\t\t\t\"doughnut\",\n\t\t\t\"orange\",\n\t\t\t\"tangerine\",\n\t\t];\n\t\tlet buf = \"\";\n\t\tfor (let i = 0; i < wordCount; i++) {\n\t\t\tconst exampleWord = exampleWords[this.randInteger(0, exampleWords.length - 1)];\n\t\t\tif (i > 0) {\n\t\t\t\tbuf += \" \";\n\t\t\t}\n\t\t\tbuf += exampleWord;\n\t\t}\n\t\treturn buf;\n\t}\n}\n\nexport type DocumentNode = string | DocumentTree;\n/**\n * Generate and model documents from the following tree grammar:\n * Row -\\> row[Box*];\n * Box -\\> box[Content];\n * Content -\\> (Row|Paragraph)*;\n * Paragraph -\\> pgtile text;\n * Document -\\> Content\n */\nexport class DocumentTree {\n\tpos = 0;\n\tids: Record<string, number> = { box: 0, row: 0 };\n\tid: string | undefined;\n\tstatic randPack = new RandomPack();\n\n\tconstructor(\n\t\tpublic name: string,\n\t\tpublic children: DocumentNode[],\n\t) {}\n\n\taddToMergeTree(client: TestClient, docNode: DocumentNode): void {\n\t\tif (typeof docNode === \"string\") {\n\t\t\tconst text = docNode;\n\t\t\tclient.insertTextLocal(this.pos, text);\n\t\t\tthis.pos += text.length;\n\t\t} else {\n\t\t\tlet id: number | undefined;\n\t\t\tif (docNode.name === \"pg\") {\n\t\t\t\tclient.insertMarkerLocal(this.pos, ReferenceType.Tile, {\n\t\t\t\t\t[reservedTileLabelsKey]: [docNode.name],\n\t\t\t\t});\n\t\t\t\tthis.pos++;\n\t\t\t} else {\n\t\t\t\tconst trid = docNode.name + this.ids[docNode.name]!.toString();\n\t\t\t\tdocNode.id = trid;\n\t\t\t\tid = this.ids[docNode.name]++;\n\t\t\t\tconst props = {\n\t\t\t\t\t[reservedMarkerIdKey]: trid,\n\t\t\t\t\t[reservedRangeLabelsKey]: [docNode.name],\n\t\t\t\t};\n\t\t\t\tlet behaviors = ReferenceType.Simple;\n\t\t\t\tif (docNode.name === \"row\") {\n\t\t\t\t\tprops[reservedTileLabelsKey] = [\"pg\"];\n\t\t\t\t\tbehaviors |= ReferenceType.Tile;\n\t\t\t\t}\n\n\t\t\t\tclient.insertMarkerLocal(this.pos, behaviors, props);\n\t\t\t\tthis.pos++;\n\t\t\t}\n\t\t\tfor (const child of docNode.children) {\n\t\t\t\tthis.addToMergeTree(client, child);\n\t\t\t}\n\t\t\tif (docNode.name !== \"pg\") {\n\t\t\t\tconst etrid = `end-${docNode.name}${id?.toString()}`;\n\t\t\t\tclient.insertMarkerLocal(this.pos, ReferenceType.Simple, {\n\t\t\t\t\t[reservedMarkerIdKey]: etrid,\n\t\t\t\t\t[reservedRangeLabelsKey]: [docNode.name],\n\t\t\t\t});\n\t\t\t\tthis.pos++;\n\t\t\t}\n\t\t}\n\t}\n\n\tstatic generateDocument(): DocumentTree {\n\t\tconst tree = new DocumentTree(\"Document\", DocumentTree.generateContent(0.6));\n\t\treturn tree;\n\t}\n\n\tstatic generateContent(rowProbability: number): DocumentNode[] {\n\t\tlet _rowProbability = rowProbability;\n\t\tconst items = <DocumentNode[]>[];\n\t\tconst docLen = DocumentTree.randPack.randInteger(7, 25);\n\t\tfor (let i = 0; i < docLen; i++) {\n\t\t\tconst rowThreshold = _rowProbability * 1000;\n\t\t\tconst selector = DocumentTree.randPack.randInteger(1, 1000);\n\t\t\tif (selector >= rowThreshold) {\n\t\t\t\tconst pg = DocumentTree.generateParagraph();\n\t\t\t\titems.push(pg);\n\t\t\t} else {\n\t\t\t\t_rowProbability /= 2;\n\t\t\t\tif (_rowProbability < 0.08) {\n\t\t\t\t\t_rowProbability = 0;\n\t\t\t\t}\n\t\t\t\tconst row = DocumentTree.generateRow(_rowProbability);\n\t\t\t\titems.push(row);\n\t\t\t}\n\t\t}\n\t\treturn items;\n\t}\n\n\t// Model pg tile as tree with single child\n\tstatic generateParagraph(): DocumentTree {\n\t\tconst wordCount = DocumentTree.randPack.randInteger(1, 6);\n\t\tconst text = DocumentTree.randPack.randString(wordCount);\n\t\tconst pgTree = new DocumentTree(\"pg\", [text]);\n\t\treturn pgTree;\n\t}\n\n\tstatic generateRow(rowProbability: number): DocumentTree {\n\t\tconst items = <DocumentNode[]>[];\n\t\tconst rowLen = DocumentTree.randPack.randInteger(1, 5);\n\t\tfor (let i = 0; i < rowLen; i++) {\n\t\t\tconst item = DocumentTree.generateBox(rowProbability);\n\t\t\titems.push(item);\n\t\t}\n\t\treturn new DocumentTree(\"row\", items);\n\t}\n\n\tstatic generateBox(rowProbability: number): DocumentTree {\n\t\treturn new DocumentTree(\"box\", DocumentTree.generateContent(rowProbability));\n\t}\n}\n\nfunction findReplacePerf(filename: string): void {\n\tconst client = new TestClient();\n\tloadTextFromFile(filename, client.mergeTree);\n\n\tconst clockStart = clock();\n\n\tlet cFetches = 0;\n\tlet cReplaces = 0;\n\tfor (let pos = 0; pos < client.getLength(); ) {\n\t\tconst curSegOff = client.getContainingSegment<ISegmentPrivate>(pos);\n\t\tcFetches++;\n\n\t\tconst curSeg = curSegOff?.segment;\n\t\tconst textSeg = <TextSegment>curSeg;\n\t\tif (textSeg !== null) {\n\t\t\tconst text = textSeg.text;\n\t\t\tconst i = text.indexOf(\"the\");\n\t\t\tif (i >= 0) {\n\t\t\t\tclient.mergeTree.markRangeRemoved(\n\t\t\t\t\tpos + i,\n\t\t\t\t\tpos + i + 3,\n\t\t\t\t\tclient.mergeTree.localPerspective,\n\t\t\t\t\t{ clientId: client.getClientId(), seq: 1 },\n\t\t\t\t\tundefined as never,\n\t\t\t\t);\n\t\t\t\tclient.mergeTree.insertSegments(\n\t\t\t\t\tpos + i,\n\t\t\t\t\t[TextSegment.make(\"teh\")],\n\t\t\t\t\tclient.mergeTree.localPerspective,\n\t\t\t\t\t{ seq: 1, clientId: client.getClientId() },\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tpos = pos + i + 3;\n\t\t\t\tcReplaces++;\n\t\t\t} else {\n\t\t\t\tpos += curSeg!.cachedLength - curSegOff!.offset!;\n\t\t\t}\n\t\t}\n\t}\n\n\tconst elapsed = elapsedMicroseconds(clockStart);\n\tlog(`${cFetches} fetches and ${cReplaces} replaces took ${elapsed} microseconds`);\n}\n\nconst baseDir = \"../../src/test/literature\";\nconst testTimeout = 60000;\n\ndescribe(\"Routerlicious\", () => {\n\tdescribe(\"merge-tree\", () => {\n\t\tbeforeEach(() => {\n\t\t\tlogLines = [];\n\t\t});\n\t\tit(\"firstTest\", () => {\n\t\t\tconst testPack = TestPack(true);\n\t\t\ttestPack.firstTest();\n\t\t});\n\n\t\tit(\"randolicious\", () => {\n\t\t\tconst testPack = TestPack(false);\n\t\t\tassert(testPack.randolicious() === 0, logLines.join(\"\\n\"));\n\t\t}).timeout(testTimeout);\n\n\t\tit(\"mergeTreeCheckedTest\", () => {\n\t\t\tassert(mergeTreeCheckedTest() === 0, logLines.join(\"\\n\"));\n\t\t}).timeout(testTimeout);\n\n\t\tit(\"beastTest\", () => {\n\t\t\tconst testPack = TestPack(false);\n\t\t\tconst filename = path.join(_dirname, baseDir, \"pp.txt\");\n\t\t\tassert(testPack.clientServer(filename, 250) === 0, logLines.join(\"\\n\"));\n\t\t}).timeout(testTimeout);\n\n\t\tit(\"findReplPerf\", () => {\n\t\t\tconst filename = path.join(_dirname, baseDir, \"pp10.txt\");\n\t\t\tfindReplacePerf(filename);\n\t\t}).timeout(testTimeout);\n\t});\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testServer.d.ts","sourceRoot":"","sources":["../../src/test/testServer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAkB,MAAM,qCAAqC,CAAC;AAC3E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAC;AAG7F,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,UAAU,SAAS;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CACjB;AAOD;;;GAGG;AACH,qBAAa,UAAW,SAAQ,UAAU;IACzC,GAAG,SAAK;IACR,OAAO,EAAE,UAAU,EAAE,CAAM;IAC3B,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,CAA0C;IAC3E,WAAW,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAoD;gBACjF,OAAO,CAAC,EAAE,WAAW;IAIjC,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI;IAWvC,QAAQ,CAAC,GAAG,EAAE,yBAAyB,GAAG,OAAO;IAajD,wBAAwB,CAAC,GAAG,EAAE,yBAAyB,GAAG,IAAI;IAc9D,OAAO,CAAC,GAAG,EAAE,yBAAyB,GAAG,yBAAyB;IAYlE,OAAO,CAAC,MAAM,CAAK;IAEnB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;
|
|
1
|
+
{"version":3,"file":"testServer.d.ts","sourceRoot":"","sources":["../../src/test/testServer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAkB,MAAM,qCAAqC,CAAC;AAC3E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAC;AAG7F,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,UAAU,SAAS;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CACjB;AAOD;;;GAGG;AACH,qBAAa,UAAW,SAAQ,UAAU;IACzC,GAAG,SAAK;IACR,OAAO,EAAE,UAAU,EAAE,CAAM;IAC3B,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,CAA0C;IAC3E,WAAW,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAoD;gBACjF,OAAO,CAAC,EAAE,WAAW;IAIjC,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI;IAWvC,QAAQ,CAAC,GAAG,EAAE,yBAAyB,GAAG,OAAO;IAajD,wBAAwB,CAAC,GAAG,EAAE,yBAAyB,GAAG,IAAI;IAc9D,OAAO,CAAC,GAAG,EAAE,yBAAyB,GAAG,yBAAyB;IAYlE,OAAO,CAAC,MAAM,CAAK;IAEnB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CA2CxC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACrC,WAAW,EAAE,gBAAgB,EAC7B,MAAM,EAAE,UAAU,EAClB,GAAG,EAAE,yBAAyB,GAC5B,OAAO,CAcT"}
|
package/lib/test/testServer.js
CHANGED
|
@@ -87,7 +87,9 @@ export class TestServer extends TestClient {
|
|
|
87
87
|
}
|
|
88
88
|
if (this.clients) {
|
|
89
89
|
let minCli = this.clientSeqNumbers.peek()?.value;
|
|
90
|
-
if (
|
|
90
|
+
if (
|
|
91
|
+
// eslint-disable-next-line @typescript-eslint/prefer-optional-chain -- TODO: ADO#58520 Code owners should verify if this code change is safe and make it if so or update this comment otherwise
|
|
92
|
+
minCli &&
|
|
91
93
|
minCli.clientId === msg.clientId &&
|
|
92
94
|
minCli.refSeq < msg.referenceSequenceNumber) {
|
|
93
95
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testServer.js","sourceRoot":"","sources":["../../src/test/testServer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"testServer.js","sourceRoot":"","sources":["../../src/test/testServer.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { Heap, type IComparer } from \"@fluidframework/core-utils/internal\";\nimport type { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport { MergeTreeTextHelper } from \"../MergeTreeTextHelper.js\";\nimport { RedBlackTree } from \"../collections/index.js\";\nimport { compareNumbers } from \"../mergeTreeNodes.js\";\nimport { PriorPerspective } from \"../perspective.js\";\nimport type { PropertySet } from \"../properties.js\";\n\nimport { TestClient } from \"./testClient.js\";\n\ninterface ClientSeq {\n\trefSeq: number;\n\tclientId: string;\n}\n\nconst clientSeqComparer: IComparer<ClientSeq> = {\n\tmin: { refSeq: -1, clientId: \"\" },\n\tcompare: (a, b) => a.refSeq - b.refSeq,\n};\n\n/**\n * Server for tests. Simulates client communication by directing placing\n * messages in client queues.\n */\nexport class TestServer extends TestClient {\n\tseq = 1;\n\tclients: TestClient[] = [];\n\tclientSeqNumbers: Heap<ClientSeq> = new Heap<ClientSeq>(clientSeqComparer);\n\tupstreamMap: RedBlackTree<number, number> = new RedBlackTree<number, number>(compareNumbers);\n\tconstructor(options?: PropertySet) {\n\t\tsuper(options);\n\t}\n\n\taddClients(clients: TestClient[]): void {\n\t\tthis.clientSeqNumbers = new Heap<ClientSeq>(clientSeqComparer);\n\t\tthis.clients = clients;\n\t\tfor (const client of clients) {\n\t\t\tthis.clientSeqNumbers.add({\n\t\t\t\trefSeq: client.getCurrentSeq(),\n\t\t\t\tclientId: client.longClientId ?? \"\",\n\t\t\t});\n\t\t}\n\t}\n\n\tapplyMsg(msg: ISequencedDocumentMessage): boolean {\n\t\tsuper.applyMsg(msg);\n\t\tif (TestClient.useCheckQ) {\n\t\t\tconst clientId = this.getShortClientId(msg.clientId as string);\n\t\t\tconst perspective = new PriorPerspective(msg.referenceSequenceNumber, clientId);\n\t\t\treturn checkTextMatchRelative(perspective, this, msg);\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// TODO: remove mappings when no longer needed using min seq\n\t// in upstream message\n\ttransformUpstreamMessage(msg: ISequencedDocumentMessage): void {\n\t\tif (msg.referenceSequenceNumber > 0) {\n\t\t\tmsg.referenceSequenceNumber =\n\t\t\t\tthis.upstreamMap.get(msg.referenceSequenceNumber)?.data ?? 0;\n\t\t}\n\t\tmsg.origin = {\n\t\t\tid: \"A\",\n\t\t\tsequenceNumber: msg.sequenceNumber,\n\t\t\tminimumSequenceNumber: msg.minimumSequenceNumber,\n\t\t};\n\t\tthis.upstreamMap.put(msg.sequenceNumber, this.seq);\n\t\tmsg.sequenceNumber = -1;\n\t}\n\n\tcopyMsg(msg: ISequencedDocumentMessage): ISequencedDocumentMessage {\n\t\treturn {\n\t\t\tclientId: msg.clientId,\n\t\t\tclientSequenceNumber: msg.clientSequenceNumber,\n\t\t\tcontents: msg.contents,\n\t\t\tminimumSequenceNumber: msg.minimumSequenceNumber,\n\t\t\treferenceSequenceNumber: msg.referenceSequenceNumber,\n\t\t\tsequenceNumber: msg.sequenceNumber,\n\t\t\ttype: msg.type,\n\t\t} as unknown as ISequencedDocumentMessage;\n\t}\n\n\tprivate minSeq = 0;\n\n\tapplyMessages(msgCount: number): boolean {\n\t\tlet _msgCount = msgCount;\n\t\twhile (_msgCount > 0) {\n\t\t\tconst msg = this.dequeueMsg();\n\t\t\tif (msg) {\n\t\t\t\tif (msg.sequenceNumber >= 0) {\n\t\t\t\t\tthis.transformUpstreamMessage(msg);\n\t\t\t\t}\n\t\t\t\tmsg.sequenceNumber = this.seq++;\n\t\t\t\tmsg.minimumSequenceNumber = this.minSeq;\n\t\t\t\tif (this.applyMsg(msg)) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (this.clients) {\n\t\t\t\t\tlet minCli = this.clientSeqNumbers.peek()?.value;\n\t\t\t\t\tif (\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/prefer-optional-chain -- TODO: ADO#58520 Code owners should verify if this code change is safe and make it if so or update this comment otherwise\n\t\t\t\t\t\tminCli &&\n\t\t\t\t\t\tminCli.clientId === msg.clientId &&\n\t\t\t\t\t\tminCli.refSeq < msg.referenceSequenceNumber\n\t\t\t\t\t) {\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\t\tconst cliSeq = this.clientSeqNumbers.get()!;\n\t\t\t\t\t\tconst oldSeq = cliSeq.refSeq;\n\t\t\t\t\t\tcliSeq.refSeq = msg.referenceSequenceNumber;\n\t\t\t\t\t\tthis.clientSeqNumbers.add(cliSeq);\n\t\t\t\t\t\tminCli = this.clientSeqNumbers.peek()?.value;\n\t\t\t\t\t\tif (minCli && minCli.refSeq > oldSeq) {\n\t\t\t\t\t\t\tmsg.minimumSequenceNumber = minCli.refSeq;\n\t\t\t\t\t\t\tthis.minSeq = minCli.refSeq;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (const client of this.clients) {\n\t\t\t\t\t\tclient.enqueueMsg(msg);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t_msgCount--;\n\t\t}\n\t\treturn false;\n\t}\n}\n\n/**\n * Used for in-memory testing. This will queue a reference string for each client message.\n */\nexport function checkTextMatchRelative(\n\tperspective: PriorPerspective,\n\tserver: TestServer,\n\tmsg: ISequencedDocumentMessage,\n): boolean {\n\tconst client = server.clients[perspective.clientId];\n\tconst serverText = new MergeTreeTextHelper(server.mergeTree).getText(perspective);\n\tconst cliText = client.checkQ.shift()?.data;\n\tif (cliText === undefined || cliText !== serverText) {\n\t\tconsole.log(`mismatch `);\n\t\tconsole.log(msg);\n\t\t// eslint-disable-next-line @typescript-eslint/no-base-to-string\n\t\tconsole.log(server.mergeTree.toString());\n\t\t// eslint-disable-next-line @typescript-eslint/no-base-to-string\n\t\tconsole.log(client.mergeTree.toString());\n\t\treturn true;\n\t}\n\treturn false;\n}\n"]}
|