@fluidframework/merge-tree 2.117.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/CHANGELOG.md +36 -2
  2. package/README.md +53 -50
  3. package/{api-extractor.json → api-extractor/api-extractor-model.json} +1 -1
  4. package/dist/MergeTreeTextHelper.js +1 -0
  5. package/dist/MergeTreeTextHelper.js.map +1 -1
  6. package/dist/attributionCollection.js +6 -4
  7. package/dist/attributionCollection.js.map +1 -1
  8. package/dist/attributionPolicy.js +3 -4
  9. package/dist/attributionPolicy.js.map +1 -1
  10. package/dist/client.js +27 -10
  11. package/dist/client.js.map +1 -1
  12. package/dist/collections/rbTree.d.ts.map +1 -1
  13. package/dist/collections/rbTree.js +3 -0
  14. package/dist/collections/rbTree.js.map +1 -1
  15. package/dist/endOfTreeSegment.d.ts.map +1 -1
  16. package/dist/endOfTreeSegment.js +25 -26
  17. package/dist/endOfTreeSegment.js.map +1 -1
  18. package/dist/localReference.js +17 -7
  19. package/dist/localReference.js.map +1 -1
  20. package/dist/mergeTree.d.ts.map +1 -1
  21. package/dist/mergeTree.js +90 -74
  22. package/dist/mergeTree.js.map +1 -1
  23. package/dist/mergeTreeNodeWalk.js +5 -5
  24. package/dist/mergeTreeNodeWalk.js.map +1 -1
  25. package/dist/mergeTreeNodes.d.ts.map +1 -1
  26. package/dist/mergeTreeNodes.js +117 -90
  27. package/dist/mergeTreeNodes.js.map +1 -1
  28. package/dist/mergeTreeTracking.js +4 -0
  29. package/dist/mergeTreeTracking.js.map +1 -1
  30. package/dist/opBuilder.js +9 -10
  31. package/dist/opBuilder.js.map +1 -1
  32. package/dist/ordinal.js +1 -2
  33. package/dist/ordinal.js.map +1 -1
  34. package/dist/partialLengths.js +109 -73
  35. package/dist/partialLengths.js.map +1 -1
  36. package/dist/perspective.js +31 -11
  37. package/dist/perspective.js.map +1 -1
  38. package/dist/properties.js +6 -7
  39. package/dist/properties.js.map +1 -1
  40. package/dist/referencePositions.d.ts.map +1 -1
  41. package/dist/referencePositions.js +7 -7
  42. package/dist/referencePositions.js.map +1 -1
  43. package/dist/revertibles.js +4 -5
  44. package/dist/revertibles.js.map +1 -1
  45. package/dist/segmentGroupCollection.js +2 -0
  46. package/dist/segmentGroupCollection.js.map +1 -1
  47. package/dist/segmentInfos.d.ts.map +1 -1
  48. package/dist/segmentInfos.js +5 -5
  49. package/dist/segmentInfos.js.map +1 -1
  50. package/dist/segmentPropertiesManager.js +3 -5
  51. package/dist/segmentPropertiesManager.js.map +1 -1
  52. package/dist/sequencePlace.js +3 -3
  53. package/dist/sequencePlace.js.map +1 -1
  54. package/dist/snapshotChunks.d.ts.map +1 -1
  55. package/dist/snapshotChunks.js +6 -6
  56. package/dist/snapshotChunks.js.map +1 -1
  57. package/dist/snapshotLoader.js +85 -70
  58. package/dist/snapshotLoader.js.map +1 -1
  59. package/dist/snapshotV1.d.ts.map +1 -1
  60. package/dist/snapshotV1.js +34 -14
  61. package/dist/snapshotV1.js.map +1 -1
  62. package/dist/snapshotlegacy.d.ts.map +1 -1
  63. package/dist/snapshotlegacy.js +18 -10
  64. package/dist/snapshotlegacy.js.map +1 -1
  65. package/dist/sortedSet.js +1 -3
  66. package/dist/sortedSet.js.map +1 -1
  67. package/dist/stamps.js +11 -12
  68. package/dist/stamps.js.map +1 -1
  69. package/dist/test/attributionCollection.spec.js +1 -1
  70. package/dist/test/attributionCollection.spec.js.map +1 -1
  71. package/dist/test/beastTest.spec.js +15 -11
  72. package/dist/test/beastTest.spec.js.map +1 -1
  73. package/dist/test/client.apis.spec.js +2 -3
  74. package/dist/test/client.apis.spec.js.map +1 -1
  75. package/dist/test/client.replay.spec.js +17 -7
  76. package/dist/test/client.replay.spec.js.map +1 -1
  77. package/dist/test/clientTestHelper.js +7 -4
  78. package/dist/test/clientTestHelper.js.map +1 -1
  79. package/dist/test/mergeTreeOperationRunner.js +26 -16
  80. package/dist/test/mergeTreeOperationRunner.js.map +1 -1
  81. package/dist/test/obliterateOperations.d.ts.map +1 -1
  82. package/dist/test/revertibles.spec.js +1 -2
  83. package/dist/test/revertibles.spec.js.map +1 -1
  84. package/dist/test/snapshot.utils.d.ts.map +1 -1
  85. package/dist/test/snapshot.utils.js +7 -5
  86. package/dist/test/snapshot.utils.js.map +1 -1
  87. package/dist/test/stamps.spec.js +17 -7
  88. package/dist/test/stamps.spec.js.map +1 -1
  89. package/dist/test/testClient.d.ts.map +1 -1
  90. package/dist/test/testClient.js +19 -17
  91. package/dist/test/testClient.js.map +1 -1
  92. package/dist/test/testClientLogger.d.ts.map +1 -1
  93. package/dist/test/testClientLogger.js +12 -8
  94. package/dist/test/testClientLogger.js.map +1 -1
  95. package/dist/test/testServer.js +7 -7
  96. package/dist/test/testServer.js.map +1 -1
  97. package/dist/test/testUtils.d.ts +0 -1
  98. package/dist/test/testUtils.d.ts.map +1 -1
  99. package/dist/test/testUtils.js +9 -10
  100. package/dist/test/testUtils.js.map +1 -1
  101. package/dist/test/text.js +2 -3
  102. package/dist/test/text.js.map +1 -1
  103. package/dist/test/wordUnitTests.spec.js +1 -2
  104. package/dist/test/wordUnitTests.spec.js.map +1 -1
  105. package/dist/textSegment.js +3 -2
  106. package/dist/textSegment.js.map +1 -1
  107. package/dist/zamboni.js +20 -10
  108. package/dist/zamboni.js.map +1 -1
  109. package/lib/MergeTreeTextHelper.js +1 -0
  110. package/lib/MergeTreeTextHelper.js.map +1 -1
  111. package/lib/attributionCollection.js +4 -2
  112. package/lib/attributionCollection.js.map +1 -1
  113. package/lib/client.js +10 -3
  114. package/lib/client.js.map +1 -1
  115. package/lib/collections/rbTree.d.ts.map +1 -1
  116. package/lib/collections/rbTree.js +3 -0
  117. package/lib/collections/rbTree.js.map +1 -1
  118. package/lib/endOfTreeSegment.d.ts.map +1 -1
  119. package/lib/endOfTreeSegment.js +25 -26
  120. package/lib/endOfTreeSegment.js.map +1 -1
  121. package/lib/legacy.d.ts +1 -1
  122. package/lib/localReference.js +12 -2
  123. package/lib/localReference.js.map +1 -1
  124. package/lib/mergeTree.d.ts.map +1 -1
  125. package/lib/mergeTree.js +68 -62
  126. package/lib/mergeTree.js.map +1 -1
  127. package/lib/mergeTreeNodes.d.ts.map +1 -1
  128. package/lib/mergeTreeNodes.js +111 -84
  129. package/lib/mergeTreeNodes.js.map +1 -1
  130. package/lib/mergeTreeTracking.js +4 -0
  131. package/lib/mergeTreeTracking.js.map +1 -1
  132. package/lib/partialLengths.js +89 -63
  133. package/lib/partialLengths.js.map +1 -1
  134. package/lib/perspective.js +12 -2
  135. package/lib/perspective.js.map +1 -1
  136. package/lib/public.d.ts +1 -1
  137. package/lib/referencePositions.d.ts.map +1 -1
  138. package/lib/segmentGroupCollection.js +2 -0
  139. package/lib/segmentGroupCollection.js.map +1 -1
  140. package/lib/segmentInfos.d.ts.map +1 -1
  141. package/lib/segmentPropertiesManager.js +1 -3
  142. package/lib/segmentPropertiesManager.js.map +1 -1
  143. package/lib/snapshotChunks.d.ts.map +1 -1
  144. package/lib/snapshotChunks.js +2 -1
  145. package/lib/snapshotChunks.js.map +1 -1
  146. package/lib/snapshotLoader.js +68 -63
  147. package/lib/snapshotLoader.js.map +1 -1
  148. package/lib/snapshotV1.d.ts.map +1 -1
  149. package/lib/snapshotV1.js +17 -7
  150. package/lib/snapshotV1.js.map +1 -1
  151. package/lib/snapshotlegacy.d.ts.map +1 -1
  152. package/lib/snapshotlegacy.js +18 -10
  153. package/lib/snapshotlegacy.js.map +1 -1
  154. package/lib/sortedSet.js +1 -3
  155. package/lib/sortedSet.js.map +1 -1
  156. package/lib/test/attributionCollection.spec.js +1 -1
  157. package/lib/test/attributionCollection.spec.js.map +1 -1
  158. package/lib/test/beastTest.spec.js +7 -3
  159. package/lib/test/beastTest.spec.js.map +1 -1
  160. package/lib/test/clientTestHelper.js +7 -4
  161. package/lib/test/clientTestHelper.js.map +1 -1
  162. package/lib/test/obliterateOperations.d.ts.map +1 -1
  163. package/lib/test/snapshot.utils.d.ts.map +1 -1
  164. package/lib/test/snapshot.utils.js +5 -3
  165. package/lib/test/snapshot.utils.js.map +1 -1
  166. package/lib/test/testClient.d.ts.map +1 -1
  167. package/lib/test/testClient.js +16 -14
  168. package/lib/test/testClient.js.map +1 -1
  169. package/lib/test/testClientLogger.d.ts.map +1 -1
  170. package/lib/test/testClientLogger.js +10 -6
  171. package/lib/test/testClientLogger.js.map +1 -1
  172. package/lib/test/testServer.js +5 -5
  173. package/lib/test/testServer.js.map +1 -1
  174. package/lib/test/testUtils.d.ts +0 -1
  175. package/lib/test/testUtils.d.ts.map +1 -1
  176. package/lib/textSegment.js +3 -2
  177. package/lib/textSegment.js.map +1 -1
  178. package/package.json +39 -58
  179. package/src/snapshotChunks.ts +10 -6
  180. package/tsconfig.json +1 -1
  181. package/internal.d.ts +0 -11
  182. package/legacy.d.ts +0 -11
  183. /package/api-extractor/{api-extractor.current.json → api-extractor-report.current.json} +0 -0
  184. /package/api-extractor/{api-extractor.legacy.json → api-extractor-report.legacy.json} +0 -0
@@ -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\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
+ {"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"]}
@@ -35,14 +35,17 @@ function clientNameOf(client) {
35
35
  * would be a bit cleaner.
36
36
  */
37
37
  export class ClientTestHelper {
38
+ clients;
38
39
  idxFromName(name) {
39
40
  return (name.codePointAt(0) ?? 0) - ("A".codePointAt(0) ?? 0);
40
41
  }
42
+ logger;
43
+ ops = [];
44
+ clientToLastAppliedSeq = new Map();
45
+ perClientOps;
46
+ disconnectedClientOps = new Map();
47
+ seq = 0;
41
48
  constructor(options = {}) {
42
- this.ops = [];
43
- this.clientToLastAppliedSeq = new Map();
44
- this.disconnectedClientOps = new Map();
45
- this.seq = 0;
46
49
  this.clients = createClientsAtInitialState({
47
50
  initialState: "",
48
51
  options: {
@@ -1 +1 @@
1
- {"version":3,"file":"clientTestHelper.js","sourceRoot":"","sources":["../../src/test/clientTestHelper.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 { strict as assert } from \"node:assert\";\n\nimport type { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport type { IMergeTreeOp, IMergeTreeOptions, InteriorSequencePlace } from \"../index.js\";\nimport type { SegmentGroup } from \"../mergeTreeNodes.js\";\n\nimport type { TestClient } from \"./testClient.js\";\nimport { TestClientLogger, createClientsAtInitialState } from \"./testClientLogger.js\";\n\nconst ClientIds = [\"A\", \"B\", \"C\", \"D\"] as const;\ntype ClientName = (typeof ClientIds)[number];\n\nfunction isClientId(s: unknown): s is ClientName {\n\treturn ClientIds.includes(s as ClientName);\n}\n\nfunction clientNameOf(client: TestClient): ClientName {\n\tconst { longClientId } = client;\n\tassert(isClientId(longClientId), \"Client ID is not a valid client name\");\n\treturn longClientId;\n}\n\n/**\n * Helper for authoring tests which perform operations on a number of clients.\n * This class essentially serves the role of the server in that it maintains a sequencing order of ops as well as information\n * about the latest op that each client has applied.\n *\n * When using this class, *do not* perform operations which may submit ops on clients directly: it does not currently wire up client events\n * to the server. Instead, use methods on the helper and pass the client name they should apply to as the first argument.\n *\n * It is analogous to MockContainerRuntimeFactory in the test-runtime-utils package, though the APIs are not completely equivalent\n * (see for example differences noted on disconnect and reconnect).\n *\n * This helper is also designed to support advancing only some clients to a given sequence number\n * (not all clients must be synchronized at the same time).\n *\n * This allows testing sequences of operations where clients have varying refSeqs, rather than having all clients advance refSeq\n * in lockstep.\n *\n * @remarks\n * If we wired the server up to \"delta\" events on the client, it would be reasonable to rename this to `MockServer` and the API for tests\n * would be a bit cleaner.\n */\nexport class ClientTestHelper {\n\tclients: Record<ClientName, TestClient> & { all: TestClient[] };\n\n\tidxFromName(name: ClientName): number {\n\t\treturn (name.codePointAt(0) ?? 0) - (\"A\".codePointAt(0) ?? 0);\n\t}\n\n\tlogger: TestClientLogger;\n\n\tops: ISequencedDocumentMessage[] = [];\n\tclientToLastAppliedSeq = new Map<ClientName, number>();\n\n\tperClientOps: ISequencedDocumentMessage[][];\n\tprivate readonly disconnectedClientOps = new Map<\n\t\tClientName,\n\t\t{ op: IMergeTreeOp; segmentGroup: SegmentGroup }[]\n\t>();\n\n\tprivate seq: number = 0;\n\n\tpublic constructor(options: IMergeTreeOptions = {}) {\n\t\tthis.clients = createClientsAtInitialState(\n\t\t\t{\n\t\t\t\tinitialState: \"\",\n\t\t\t\toptions: {\n\t\t\t\t\tmergeTreeEnableObliterate: true,\n\t\t\t\t\tmergeTreeEnableObliterateReconnect: true,\n\t\t\t\t\t...options,\n\t\t\t\t},\n\t\t\t},\n\t\t\t...ClientIds,\n\t\t);\n\t\tthis.logger = new TestClientLogger(this.clients.all);\n\t\tthis.perClientOps = this.clients.all.map(() => []);\n\t}\n\n\tprivate addMessage(client: TestClient, op: IMergeTreeOp): void {\n\t\tconst disconnectedQueue = this.disconnectedClientOps.get(clientNameOf(client));\n\t\tif (disconnectedQueue === undefined) {\n\t\t\tconst message = client.makeOpMessage(op, ++this.seq);\n\t\t\tthis.ops.push(message);\n\t\t\t// This implementation (specifically, that of applying ops / synchronizing clients) assumes messages\n\t\t\t// are pushed sequentially starting with seq 1.\n\t\t\tassert(\n\t\t\t\tmessage.sequenceNumber === this.ops.length,\n\t\t\t\t\"Partial sync test helper invariant violated\",\n\t\t\t);\n\t\t} else {\n\t\t\t// Client is not currently connected.\n\t\t\tconst segmentGroup = client.peekPendingSegmentGroups();\n\t\t\tassert(segmentGroup !== undefined, \"Client should have a pending segment group\");\n\t\t\tdisconnectedQueue.push({ op, segmentGroup });\n\t\t}\n\t}\n\n\tpublic insertText(clientName: ClientName, pos: number, text: string): void {\n\t\tconst client = this.clients[clientName];\n\t\tconst insertOp = client.insertTextLocal(pos, text);\n\t\tif (insertOp) {\n\t\t\tthis.addMessage(client, insertOp);\n\t\t}\n\t}\n\n\tpublic removeRange(clientName: ClientName, start: number, end: number): void {\n\t\tconst client = this.clients[clientName];\n\t\tthis.addMessage(client, client.removeRangeLocal(start, end));\n\t}\n\n\tpublic obliterateRange(\n\t\tclientName: ClientName,\n\t\tstart: number | InteriorSequencePlace,\n\t\tend: number | InteriorSequencePlace,\n\t): void {\n\t\tconst client = this.clients[clientName];\n\t\tthis.addMessage(client, client.obliterateRangeLocal(start, end));\n\t}\n\n\tpublic advanceClientToSeq(clientName: ClientName, seq: number): void {\n\t\tconst client = this.clients[clientName];\n\t\tconst lastApplied = this.clientToLastAppliedSeq.get(clientName);\n\t\tassert(seq > 0, \"Can only advance clients to sequence numbers that exist\");\n\t\tassert(\n\t\t\tthis.ops.length >= seq,\n\t\t\t\"Cannot attempt to advance clients to sequence numbers that don't yet exist\",\n\t\t);\n\t\tlet startIndex: number;\n\t\tif (lastApplied === undefined) {\n\t\t\tstartIndex = 0;\n\t\t} else {\n\t\t\tif (lastApplied >= seq) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstartIndex = lastApplied;\n\t\t}\n\t\tfor (let i = startIndex; i < seq; i++) {\n\t\t\tconst nextMessage = this.ops[i];\n\t\t\tclient.applyMsg(nextMessage);\n\t\t\tthis.clientToLastAppliedSeq.set(clientName, nextMessage.sequenceNumber);\n\t\t}\n\t}\n\n\t/**\n\t * Sends all known ops to the procieded client ids.\n\t */\n\tpublic advanceClients(...clientNames: ClientName[]): void {\n\t\tconst latestSeq = this.ops[this.ops.length - 1].sequenceNumber;\n\t\tfor (const name of clientNames) {\n\t\t\tthis.advanceClientToSeq(name, latestSeq);\n\t\t}\n\t}\n\n\tpublic processAllOps(): void {\n\t\tconst latestSeq = this.ops[this.ops.length - 1].sequenceNumber;\n\t\tfor (const name of ClientIds) {\n\t\t\tthis.advanceClientToSeq(name, latestSeq);\n\t\t}\n\t}\n\n\t/**\n\t * Causes the provided clients to \"disconnect\" by isolating their outbound queue from the op stream.\n\t * These clients will still receive ops from this helper just like all other clients.\n\t * When a client reconnects (see {@link reconnect}), the helper will rebase all of the client's pending ops (that they submitted since\n\t * `disconnect` was called) and re-add them to the op stream.\n\t *\n\t * BEWARE: This is slightly different from what the mocks in test-runtime-utils do in two ways:\n\t *\n\t * 1. Those mocks actually wipe outstanding ops submitted by the disconnected clients from the op stream and rebases those as well.\n\t * 2. Those mocks freeze the inbound queue of the disconnected clients as well as the outbound queue.\n\t *\n\t * E.g. (pseudocode; syntax is different for those mocks and these):\n\t *\n\t * ```typescript\n\t * B.submitLocalOp1()\n\t * B.submitLocalOp2()\n\t * disconnect(B)\n\t * A.submitLocalOp1()\n\t * B.submitLocalOp3()\n\t * processAllOps()\n\t * ```\n\t *\n\t * the test-runtime-mocks will...\n\t *\n\t * - have none of B's local ops be receieved by A in the processAllOps() line\n\t * - have B not receive A's local op 1\n\t *\n\t * whereas this helper will...\n\t *\n\t * - have B's local ops 1 and 2 be received by A, but not its third local op\n\t * - have B receive acks for its first two local ops as well as A's op in the processAllOps() line\n\t *\n\t * This operation is a no-op if called multiple times on the same client with no intervening reconnects.\n\t */\n\tpublic disconnect(...clientNames: ClientName[]): void {\n\t\tfor (const clientName of clientNames) {\n\t\t\tconst client = this.clients[clientName];\n\t\t\tif (this.isDisconnected(client)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.disconnectedClientOps.set(clientName, []);\n\t\t}\n\t}\n\n\t/**\n\t * Reconnects clients which have been disconnected. No-ops on any client which is already connected.\n\t * For disconnected clients, any pending ops they have will be resubmitted using the resubmit flow, see {@link disconnect} for details and an example.\n\t *\n\t * @remarks\n\t * If reconnecting multiple clients, the order that their ops will be resubmitted in will match the order in the array\n\t */\n\tpublic reconnect(...clientNames: ClientName[]): void {\n\t\tfor (const clientName of clientNames) {\n\t\t\tconst submittedOps = this.disconnectedClientOps.get(clientName);\n\t\t\tif (submittedOps === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.disconnectedClientOps.delete(clientName);\n\t\t\tconst client = this.clients[clientName];\n\t\t\tfor (const { op, segmentGroup } of submittedOps) {\n\t\t\t\tconst rebasedOp = client.regeneratePendingOp(op, segmentGroup, false);\n\t\t\t\tthis.addMessage(client, rebasedOp);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate isDisconnected(client: TestClient): boolean {\n\t\treturn this.disconnectedClientOps.has(clientNameOf(client));\n\t}\n}\n"]}
1
+ {"version":3,"file":"clientTestHelper.js","sourceRoot":"","sources":["../../src/test/clientTestHelper.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 { strict as assert } from \"node:assert\";\n\nimport type { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport type { IMergeTreeOp, IMergeTreeOptions, InteriorSequencePlace } from \"../index.js\";\nimport type { SegmentGroup } from \"../mergeTreeNodes.js\";\n\nimport type { TestClient } from \"./testClient.js\";\nimport { TestClientLogger, createClientsAtInitialState } from \"./testClientLogger.js\";\n\nconst ClientIds = [\"A\", \"B\", \"C\", \"D\"] as const;\ntype ClientName = (typeof ClientIds)[number];\n\nfunction isClientId(s: unknown): s is ClientName {\n\treturn ClientIds.includes(s as ClientName);\n}\n\nfunction clientNameOf(client: TestClient): ClientName {\n\tconst { longClientId } = client;\n\tassert(isClientId(longClientId), \"Client ID is not a valid client name\");\n\treturn longClientId;\n}\n\n/**\n * Helper for authoring tests which perform operations on a number of clients.\n * This class essentially serves the role of the server in that it maintains a sequencing order of ops as well as information\n * about the latest op that each client has applied.\n *\n * When using this class, *do not* perform operations which may submit ops on clients directly: it does not currently wire up client events\n * to the server. Instead, use methods on the helper and pass the client name they should apply to as the first argument.\n *\n * It is analogous to MockContainerRuntimeFactory in the test-runtime-utils package, though the APIs are not completely equivalent\n * (see for example differences noted on disconnect and reconnect).\n *\n * This helper is also designed to support advancing only some clients to a given sequence number\n * (not all clients must be synchronized at the same time).\n *\n * This allows testing sequences of operations where clients have varying refSeqs, rather than having all clients advance refSeq\n * in lockstep.\n *\n * @remarks\n * If we wired the server up to \"delta\" events on the client, it would be reasonable to rename this to `MockServer` and the API for tests\n * would be a bit cleaner.\n */\nexport class ClientTestHelper {\n\tclients: Record<ClientName, TestClient> & { all: TestClient[] };\n\n\tidxFromName(name: ClientName): number {\n\t\treturn (name.codePointAt(0) ?? 0) - (\"A\".codePointAt(0) ?? 0);\n\t}\n\n\tlogger: TestClientLogger;\n\n\tops: ISequencedDocumentMessage[] = [];\n\tclientToLastAppliedSeq = new Map<ClientName, number>();\n\n\tperClientOps: ISequencedDocumentMessage[][];\n\tprivate readonly disconnectedClientOps = new Map<\n\t\tClientName,\n\t\t{ op: IMergeTreeOp; segmentGroup: SegmentGroup }[]\n\t>();\n\n\tprivate seq: number = 0;\n\n\tpublic constructor(options: IMergeTreeOptions = {}) {\n\t\tthis.clients = createClientsAtInitialState(\n\t\t\t{\n\t\t\t\tinitialState: \"\",\n\t\t\t\toptions: {\n\t\t\t\t\tmergeTreeEnableObliterate: true,\n\t\t\t\t\tmergeTreeEnableObliterateReconnect: true,\n\t\t\t\t\t...options,\n\t\t\t\t},\n\t\t\t},\n\t\t\t...ClientIds,\n\t\t);\n\t\tthis.logger = new TestClientLogger(this.clients.all);\n\t\tthis.perClientOps = this.clients.all.map(() => []);\n\t}\n\n\tprivate addMessage(client: TestClient, op: IMergeTreeOp): void {\n\t\tconst disconnectedQueue = this.disconnectedClientOps.get(clientNameOf(client));\n\t\tif (disconnectedQueue === undefined) {\n\t\t\tconst message = client.makeOpMessage(op, ++this.seq);\n\t\t\tthis.ops.push(message);\n\t\t\t// This implementation (specifically, that of applying ops / synchronizing clients) assumes messages\n\t\t\t// are pushed sequentially starting with seq 1.\n\t\t\tassert(\n\t\t\t\tmessage.sequenceNumber === this.ops.length,\n\t\t\t\t\"Partial sync test helper invariant violated\",\n\t\t\t);\n\t\t} else {\n\t\t\t// Client is not currently connected.\n\t\t\tconst segmentGroup = client.peekPendingSegmentGroups();\n\t\t\tassert(segmentGroup !== undefined, \"Client should have a pending segment group\");\n\t\t\tdisconnectedQueue.push({ op, segmentGroup });\n\t\t}\n\t}\n\n\tpublic insertText(clientName: ClientName, pos: number, text: string): void {\n\t\tconst client = this.clients[clientName];\n\t\tconst insertOp = client.insertTextLocal(pos, text);\n\t\tif (insertOp) {\n\t\t\tthis.addMessage(client, insertOp);\n\t\t}\n\t}\n\n\tpublic removeRange(clientName: ClientName, start: number, end: number): void {\n\t\tconst client = this.clients[clientName];\n\t\tthis.addMessage(client, client.removeRangeLocal(start, end));\n\t}\n\n\tpublic obliterateRange(\n\t\tclientName: ClientName,\n\t\tstart: number | InteriorSequencePlace,\n\t\tend: number | InteriorSequencePlace,\n\t): void {\n\t\tconst client = this.clients[clientName];\n\t\tthis.addMessage(client, client.obliterateRangeLocal(start, end));\n\t}\n\n\tpublic advanceClientToSeq(clientName: ClientName, seq: number): void {\n\t\tconst client = this.clients[clientName];\n\t\tconst lastApplied = this.clientToLastAppliedSeq.get(clientName);\n\t\tassert(seq > 0, \"Can only advance clients to sequence numbers that exist\");\n\t\tassert(\n\t\t\tthis.ops.length >= seq,\n\t\t\t\"Cannot attempt to advance clients to sequence numbers that don't yet exist\",\n\t\t);\n\t\tlet startIndex: number;\n\t\tif (lastApplied === undefined) {\n\t\t\tstartIndex = 0;\n\t\t} else {\n\t\t\tif (lastApplied >= seq) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tstartIndex = lastApplied;\n\t\t}\n\t\tfor (let i = startIndex; i < seq; i++) {\n\t\t\tconst nextMessage = this.ops[i];\n\t\t\tclient.applyMsg(nextMessage);\n\t\t\tthis.clientToLastAppliedSeq.set(clientName, nextMessage.sequenceNumber);\n\t\t}\n\t}\n\n\t/**\n\t * Sends all known ops to the procieded client ids.\n\t */\n\tpublic advanceClients(...clientNames: ClientName[]): void {\n\t\tconst latestSeq = this.ops[this.ops.length - 1].sequenceNumber;\n\t\tfor (const name of clientNames) {\n\t\t\tthis.advanceClientToSeq(name, latestSeq);\n\t\t}\n\t}\n\n\tpublic processAllOps(): void {\n\t\tconst latestSeq = this.ops[this.ops.length - 1].sequenceNumber;\n\t\tfor (const name of ClientIds) {\n\t\t\tthis.advanceClientToSeq(name, latestSeq);\n\t\t}\n\t}\n\n\t/**\n\t * Causes the provided clients to \"disconnect\" by isolating their outbound queue from the op stream.\n\t * These clients will still receive ops from this helper just like all other clients.\n\t * When a client reconnects (see {@link reconnect}), the helper will rebase all of the client's pending ops (that they submitted since\n\t * `disconnect` was called) and re-add them to the op stream.\n\t *\n\t * BEWARE: This is slightly different from what the mocks in test-runtime-utils do in two ways:\n\t *\n\t * 1. Those mocks actually wipe outstanding ops submitted by the disconnected clients from the op stream and rebases those as well.\n\t * 2. Those mocks freeze the inbound queue of the disconnected clients as well as the outbound queue.\n\t *\n\t * E.g. (pseudocode; syntax is different for those mocks and these):\n\t *\n\t * ```typescript\n\t * B.submitLocalOp1()\n\t * B.submitLocalOp2()\n\t * disconnect(B)\n\t * A.submitLocalOp1()\n\t * B.submitLocalOp3()\n\t * processAllOps()\n\t * ```\n\t *\n\t * the test-runtime-mocks will...\n\t *\n\t * - have none of B's local ops be receieved by A in the processAllOps() line\n\t * - have B not receive A's local op 1\n\t *\n\t * whereas this helper will...\n\t *\n\t * - have B's local ops 1 and 2 be received by A, but not its third local op\n\t * - have B receive acks for its first two local ops as well as A's op in the processAllOps() line\n\t *\n\t * This operation is a no-op if called multiple times on the same client with no intervening reconnects.\n\t */\n\tpublic disconnect(...clientNames: ClientName[]): void {\n\t\tfor (const clientName of clientNames) {\n\t\t\tconst client = this.clients[clientName];\n\t\t\tif (this.isDisconnected(client)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.disconnectedClientOps.set(clientName, []);\n\t\t}\n\t}\n\n\t/**\n\t * Reconnects clients which have been disconnected. No-ops on any client which is already connected.\n\t * For disconnected clients, any pending ops they have will be resubmitted using the resubmit flow, see {@link disconnect} for details and an example.\n\t *\n\t * @remarks\n\t * If reconnecting multiple clients, the order that their ops will be resubmitted in will match the order in the array\n\t */\n\tpublic reconnect(...clientNames: ClientName[]): void {\n\t\tfor (const clientName of clientNames) {\n\t\t\tconst submittedOps = this.disconnectedClientOps.get(clientName);\n\t\t\tif (submittedOps === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tthis.disconnectedClientOps.delete(clientName);\n\t\t\tconst client = this.clients[clientName];\n\t\t\tfor (const { op, segmentGroup } of submittedOps) {\n\t\t\t\tconst rebasedOp = client.regeneratePendingOp(op, segmentGroup, false);\n\t\t\t\tthis.addMessage(client, rebasedOp);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate isDisconnected(client: TestClient): boolean {\n\t\treturn this.disconnectedClientOps.has(clientNameOf(client));\n\t}\n}\n"]}