@fluidframework/merge-tree 2.30.0 → 2.31.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 (308) hide show
  1. package/CHANGELOG.md +403 -399
  2. package/api-report/merge-tree.legacy.alpha.api.md +1 -0
  3. package/dist/MergeTreeTextHelper.d.ts +9 -3
  4. package/dist/MergeTreeTextHelper.d.ts.map +1 -1
  5. package/dist/MergeTreeTextHelper.js +5 -5
  6. package/dist/MergeTreeTextHelper.js.map +1 -1
  7. package/dist/client.d.ts +7 -13
  8. package/dist/client.d.ts.map +1 -1
  9. package/dist/client.js +136 -110
  10. package/dist/client.js.map +1 -1
  11. package/dist/endOfTreeSegment.d.ts +12 -8
  12. package/dist/endOfTreeSegment.d.ts.map +1 -1
  13. package/dist/endOfTreeSegment.js +2 -4
  14. package/dist/endOfTreeSegment.js.map +1 -1
  15. package/dist/index.d.ts +6 -3
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +2 -3
  18. package/dist/index.js.map +1 -1
  19. package/dist/mergeTree.d.ts +37 -23
  20. package/dist/mergeTree.d.ts.map +1 -1
  21. package/dist/mergeTree.js +400 -483
  22. package/dist/mergeTree.js.map +1 -1
  23. package/dist/mergeTreeDeltaCallback.d.ts +4 -8
  24. package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
  25. package/dist/mergeTreeDeltaCallback.js.map +1 -1
  26. package/dist/mergeTreeNodes.d.ts +32 -10
  27. package/dist/mergeTreeNodes.d.ts.map +1 -1
  28. package/dist/mergeTreeNodes.js +43 -28
  29. package/dist/mergeTreeNodes.js.map +1 -1
  30. package/dist/partialLengths.d.ts +2 -2
  31. package/dist/partialLengths.d.ts.map +1 -1
  32. package/dist/partialLengths.js +181 -109
  33. package/dist/partialLengths.js.map +1 -1
  34. package/dist/perspective.d.ts +8 -27
  35. package/dist/perspective.d.ts.map +1 -1
  36. package/dist/perspective.js +7 -67
  37. package/dist/perspective.js.map +1 -1
  38. package/dist/revertibles.d.ts.map +1 -1
  39. package/dist/revertibles.js +2 -2
  40. package/dist/revertibles.js.map +1 -1
  41. package/dist/segmentInfos.d.ts +20 -106
  42. package/dist/segmentInfos.d.ts.map +1 -1
  43. package/dist/segmentInfos.js +28 -42
  44. package/dist/segmentInfos.js.map +1 -1
  45. package/dist/segmentPropertiesManager.d.ts +1 -14
  46. package/dist/segmentPropertiesManager.d.ts.map +1 -1
  47. package/dist/segmentPropertiesManager.js +3 -17
  48. package/dist/segmentPropertiesManager.js.map +1 -1
  49. package/dist/snapshotLoader.d.ts.map +1 -1
  50. package/dist/snapshotLoader.js +62 -19
  51. package/dist/snapshotLoader.js.map +1 -1
  52. package/dist/snapshotV1.d.ts.map +1 -1
  53. package/dist/snapshotV1.js +55 -24
  54. package/dist/snapshotV1.js.map +1 -1
  55. package/dist/snapshotlegacy.d.ts.map +1 -1
  56. package/dist/snapshotlegacy.js +6 -9
  57. package/dist/snapshotlegacy.js.map +1 -1
  58. package/dist/stamps.d.ts +1 -1
  59. package/dist/stamps.js +1 -1
  60. package/dist/stamps.js.map +1 -1
  61. package/dist/test/Insertion.perf.spec.js +6 -51
  62. package/dist/test/Insertion.perf.spec.js.map +1 -1
  63. package/dist/test/PartialLengths.perf.spec.js +18 -25
  64. package/dist/test/PartialLengths.perf.spec.js.map +1 -1
  65. package/dist/test/Removal.perf.spec.js +13 -41
  66. package/dist/test/Removal.perf.spec.js.map +1 -1
  67. package/dist/test/beastTest.spec.d.ts.map +1 -1
  68. package/dist/test/beastTest.spec.js +41 -66
  69. package/dist/test/beastTest.spec.js.map +1 -1
  70. package/dist/test/client.annotateMarker.spec.js +1 -11
  71. package/dist/test/client.annotateMarker.spec.js.map +1 -1
  72. package/dist/test/client.applyMsg.spec.js +14 -14
  73. package/dist/test/client.applyMsg.spec.js.map +1 -1
  74. package/dist/test/client.getPosition.spec.js +1 -1
  75. package/dist/test/client.getPosition.spec.js.map +1 -1
  76. package/dist/test/client.localReference.spec.js +1 -1
  77. package/dist/test/client.localReference.spec.js.map +1 -1
  78. package/dist/test/client.rollback.spec.js +49 -58
  79. package/dist/test/client.rollback.spec.js.map +1 -1
  80. package/dist/test/client.rollbackFarm.spec.js +1 -1
  81. package/dist/test/client.rollbackFarm.spec.js.map +1 -1
  82. package/dist/test/client.searchForMarker.spec.js +4 -21
  83. package/dist/test/client.searchForMarker.spec.js.map +1 -1
  84. package/dist/test/index.d.ts +2 -2
  85. package/dist/test/index.d.ts.map +1 -1
  86. package/dist/test/index.js +2 -6
  87. package/dist/test/index.js.map +1 -1
  88. package/dist/test/mergeTree.annotate.deltaCallback.spec.js +14 -59
  89. package/dist/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
  90. package/dist/test/mergeTree.annotate.spec.js +47 -63
  91. package/dist/test/mergeTree.annotate.spec.js.map +1 -1
  92. package/dist/test/mergeTree.insert.deltaCallback.spec.js +9 -62
  93. package/dist/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
  94. package/dist/test/mergeTree.insertingWalk.spec.js +59 -125
  95. package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
  96. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +12 -93
  97. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
  98. package/dist/test/mergeTree.markRangeRemoved.spec.js +10 -7
  99. package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  100. package/dist/test/mergeTree.walk.spec.js +2 -14
  101. package/dist/test/mergeTree.walk.spec.js.map +1 -1
  102. package/dist/test/mergeTreeOperationRunner.js +2 -2
  103. package/dist/test/mergeTreeOperationRunner.js.map +1 -1
  104. package/dist/test/obliterate.concurrent.spec.js +18 -23
  105. package/dist/test/obliterate.concurrent.spec.js.map +1 -1
  106. package/dist/test/obliterate.partialLength.spec.js +166 -136
  107. package/dist/test/obliterate.partialLength.spec.js.map +1 -1
  108. package/dist/test/obliterate.spec.js +16 -126
  109. package/dist/test/obliterate.spec.js.map +1 -1
  110. package/dist/test/partialLength.spec.js +28 -196
  111. package/dist/test/partialLength.spec.js.map +1 -1
  112. package/dist/test/perspective.spec.js +34 -0
  113. package/dist/test/perspective.spec.js.map +1 -1
  114. package/dist/test/propertyManager.spec.js +1 -1
  115. package/dist/test/propertyManager.spec.js.map +1 -1
  116. package/dist/test/resetPendingSegmentsToOp.spec.js +0 -2
  117. package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  118. package/dist/test/segmentGroupCollection.spec.js +10 -4
  119. package/dist/test/segmentGroupCollection.spec.js.map +1 -1
  120. package/dist/test/testClient.d.ts +1 -0
  121. package/dist/test/testClient.d.ts.map +1 -1
  122. package/dist/test/testClient.js +16 -26
  123. package/dist/test/testClient.js.map +1 -1
  124. package/dist/test/testClientLogger.d.ts.map +1 -1
  125. package/dist/test/testClientLogger.js +3 -10
  126. package/dist/test/testClientLogger.js.map +1 -1
  127. package/dist/test/testServer.d.ts +2 -1
  128. package/dist/test/testServer.d.ts.map +1 -1
  129. package/dist/test/testServer.js +7 -5
  130. package/dist/test/testServer.js.map +1 -1
  131. package/dist/test/testUtils.d.ts +36 -56
  132. package/dist/test/testUtils.d.ts.map +1 -1
  133. package/dist/test/testUtils.js +68 -77
  134. package/dist/test/testUtils.js.map +1 -1
  135. package/dist/test/text.d.ts +2 -2
  136. package/dist/test/text.d.ts.map +1 -1
  137. package/dist/test/text.js +5 -2
  138. package/dist/test/text.js.map +1 -1
  139. package/dist/textSegment.d.ts +0 -6
  140. package/dist/textSegment.d.ts.map +1 -1
  141. package/dist/textSegment.js.map +1 -1
  142. package/dist/zamboni.d.ts.map +1 -1
  143. package/dist/zamboni.js +53 -26
  144. package/dist/zamboni.js.map +1 -1
  145. package/lib/MergeTreeTextHelper.d.ts +9 -3
  146. package/lib/MergeTreeTextHelper.d.ts.map +1 -1
  147. package/lib/MergeTreeTextHelper.js +5 -5
  148. package/lib/MergeTreeTextHelper.js.map +1 -1
  149. package/lib/client.d.ts +7 -13
  150. package/lib/client.d.ts.map +1 -1
  151. package/lib/client.js +117 -116
  152. package/lib/client.js.map +1 -1
  153. package/lib/endOfTreeSegment.d.ts +12 -8
  154. package/lib/endOfTreeSegment.d.ts.map +1 -1
  155. package/lib/endOfTreeSegment.js +2 -4
  156. package/lib/endOfTreeSegment.js.map +1 -1
  157. package/lib/index.d.ts +6 -3
  158. package/lib/index.d.ts.map +1 -1
  159. package/lib/index.js +1 -1
  160. package/lib/index.js.map +1 -1
  161. package/lib/mergeTree.d.ts +37 -23
  162. package/lib/mergeTree.d.ts.map +1 -1
  163. package/lib/mergeTree.js +381 -488
  164. package/lib/mergeTree.js.map +1 -1
  165. package/lib/mergeTreeDeltaCallback.d.ts +4 -8
  166. package/lib/mergeTreeDeltaCallback.d.ts.map +1 -1
  167. package/lib/mergeTreeDeltaCallback.js.map +1 -1
  168. package/lib/mergeTreeNodes.d.ts +32 -10
  169. package/lib/mergeTreeNodes.d.ts.map +1 -1
  170. package/lib/mergeTreeNodes.js +42 -29
  171. package/lib/mergeTreeNodes.js.map +1 -1
  172. package/lib/partialLengths.d.ts +2 -2
  173. package/lib/partialLengths.d.ts.map +1 -1
  174. package/lib/partialLengths.js +160 -111
  175. package/lib/partialLengths.js.map +1 -1
  176. package/lib/perspective.d.ts +8 -27
  177. package/lib/perspective.d.ts.map +1 -1
  178. package/lib/perspective.js +8 -68
  179. package/lib/perspective.js.map +1 -1
  180. package/lib/revertibles.d.ts.map +1 -1
  181. package/lib/revertibles.js +2 -2
  182. package/lib/revertibles.js.map +1 -1
  183. package/lib/segmentInfos.d.ts +20 -106
  184. package/lib/segmentInfos.d.ts.map +1 -1
  185. package/lib/segmentInfos.js +26 -37
  186. package/lib/segmentInfos.js.map +1 -1
  187. package/lib/segmentPropertiesManager.d.ts +1 -14
  188. package/lib/segmentPropertiesManager.d.ts.map +1 -1
  189. package/lib/segmentPropertiesManager.js +2 -16
  190. package/lib/segmentPropertiesManager.js.map +1 -1
  191. package/lib/snapshotLoader.d.ts.map +1 -1
  192. package/lib/snapshotLoader.js +39 -19
  193. package/lib/snapshotLoader.js.map +1 -1
  194. package/lib/snapshotV1.d.ts.map +1 -1
  195. package/lib/snapshotV1.js +34 -26
  196. package/lib/snapshotV1.js.map +1 -1
  197. package/lib/snapshotlegacy.d.ts.map +1 -1
  198. package/lib/snapshotlegacy.js +7 -10
  199. package/lib/snapshotlegacy.js.map +1 -1
  200. package/lib/stamps.d.ts +1 -1
  201. package/lib/stamps.js +1 -1
  202. package/lib/stamps.js.map +1 -1
  203. package/lib/test/Insertion.perf.spec.js +6 -51
  204. package/lib/test/Insertion.perf.spec.js.map +1 -1
  205. package/lib/test/PartialLengths.perf.spec.js +18 -25
  206. package/lib/test/PartialLengths.perf.spec.js.map +1 -1
  207. package/lib/test/Removal.perf.spec.js +13 -41
  208. package/lib/test/Removal.perf.spec.js.map +1 -1
  209. package/lib/test/beastTest.spec.d.ts.map +1 -1
  210. package/lib/test/beastTest.spec.js +42 -67
  211. package/lib/test/beastTest.spec.js.map +1 -1
  212. package/lib/test/client.annotateMarker.spec.js +1 -11
  213. package/lib/test/client.annotateMarker.spec.js.map +1 -1
  214. package/lib/test/client.applyMsg.spec.js +14 -14
  215. package/lib/test/client.applyMsg.spec.js.map +1 -1
  216. package/lib/test/client.getPosition.spec.js +1 -1
  217. package/lib/test/client.getPosition.spec.js.map +1 -1
  218. package/lib/test/client.localReference.spec.js +1 -1
  219. package/lib/test/client.localReference.spec.js.map +1 -1
  220. package/lib/test/client.rollback.spec.js +50 -59
  221. package/lib/test/client.rollback.spec.js.map +1 -1
  222. package/lib/test/client.rollbackFarm.spec.js +1 -1
  223. package/lib/test/client.rollbackFarm.spec.js.map +1 -1
  224. package/lib/test/client.searchForMarker.spec.js +4 -21
  225. package/lib/test/client.searchForMarker.spec.js.map +1 -1
  226. package/lib/test/index.d.ts +2 -2
  227. package/lib/test/index.d.ts.map +1 -1
  228. package/lib/test/index.js +1 -1
  229. package/lib/test/index.js.map +1 -1
  230. package/lib/test/mergeTree.annotate.deltaCallback.spec.js +15 -60
  231. package/lib/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
  232. package/lib/test/mergeTree.annotate.spec.js +48 -64
  233. package/lib/test/mergeTree.annotate.spec.js.map +1 -1
  234. package/lib/test/mergeTree.insert.deltaCallback.spec.js +10 -63
  235. package/lib/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
  236. package/lib/test/mergeTree.insertingWalk.spec.js +61 -127
  237. package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
  238. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +13 -94
  239. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
  240. package/lib/test/mergeTree.markRangeRemoved.spec.js +10 -7
  241. package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  242. package/lib/test/mergeTree.walk.spec.js +2 -14
  243. package/lib/test/mergeTree.walk.spec.js.map +1 -1
  244. package/lib/test/mergeTreeOperationRunner.js +3 -3
  245. package/lib/test/mergeTreeOperationRunner.js.map +1 -1
  246. package/lib/test/obliterate.concurrent.spec.js +18 -23
  247. package/lib/test/obliterate.concurrent.spec.js.map +1 -1
  248. package/lib/test/obliterate.partialLength.spec.js +167 -137
  249. package/lib/test/obliterate.partialLength.spec.js.map +1 -1
  250. package/lib/test/obliterate.spec.js +17 -127
  251. package/lib/test/obliterate.spec.js.map +1 -1
  252. package/lib/test/partialLength.spec.js +29 -197
  253. package/lib/test/partialLength.spec.js.map +1 -1
  254. package/lib/test/perspective.spec.js +34 -0
  255. package/lib/test/perspective.spec.js.map +1 -1
  256. package/lib/test/propertyManager.spec.js +2 -2
  257. package/lib/test/propertyManager.spec.js.map +1 -1
  258. package/lib/test/resetPendingSegmentsToOp.spec.js +0 -2
  259. package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  260. package/lib/test/segmentGroupCollection.spec.js +10 -4
  261. package/lib/test/segmentGroupCollection.spec.js.map +1 -1
  262. package/lib/test/testClient.d.ts +1 -0
  263. package/lib/test/testClient.d.ts.map +1 -1
  264. package/lib/test/testClient.js +18 -28
  265. package/lib/test/testClient.js.map +1 -1
  266. package/lib/test/testClientLogger.d.ts.map +1 -1
  267. package/lib/test/testClientLogger.js +3 -10
  268. package/lib/test/testClientLogger.js.map +1 -1
  269. package/lib/test/testServer.d.ts +2 -1
  270. package/lib/test/testServer.d.ts.map +1 -1
  271. package/lib/test/testServer.js +7 -5
  272. package/lib/test/testServer.js.map +1 -1
  273. package/lib/test/testUtils.d.ts +36 -56
  274. package/lib/test/testUtils.d.ts.map +1 -1
  275. package/lib/test/testUtils.js +66 -48
  276. package/lib/test/testUtils.js.map +1 -1
  277. package/lib/test/text.d.ts +2 -2
  278. package/lib/test/text.d.ts.map +1 -1
  279. package/lib/test/text.js +6 -3
  280. package/lib/test/text.js.map +1 -1
  281. package/lib/textSegment.d.ts +0 -6
  282. package/lib/textSegment.d.ts.map +1 -1
  283. package/lib/textSegment.js.map +1 -1
  284. package/lib/tsdoc-metadata.json +1 -1
  285. package/lib/zamboni.d.ts.map +1 -1
  286. package/lib/zamboni.js +32 -28
  287. package/lib/zamboni.js.map +1 -1
  288. package/package.json +17 -20
  289. package/src/MergeTreeTextHelper.ts +17 -12
  290. package/src/client.ts +141 -197
  291. package/src/endOfTreeSegment.ts +11 -8
  292. package/src/index.ts +4 -3
  293. package/src/mergeTree.ts +482 -633
  294. package/src/mergeTreeDeltaCallback.ts +4 -8
  295. package/src/mergeTreeNodes.ts +66 -45
  296. package/src/partialLengths.ts +181 -137
  297. package/src/perspective.ts +17 -95
  298. package/src/revertibles.ts +2 -7
  299. package/src/segmentInfos.ts +48 -141
  300. package/src/segmentPropertiesManager.ts +2 -16
  301. package/src/snapshotLoader.ts +62 -30
  302. package/src/snapshotV1.ts +36 -28
  303. package/src/snapshotlegacy.ts +7 -16
  304. package/src/stamps.ts +1 -1
  305. package/src/textSegment.ts +0 -13
  306. package/src/zamboni.ts +38 -32
  307. package/tsconfig.json +1 -0
  308. package/prettier.config.cjs +0 -8
@@ -1 +1 @@
1
- {"version":3,"file":"mergeTree.annotate.deltaCallback.spec.js","sourceRoot":"","sources":["../../src/test/mergeTree.annotate.deltaCallback.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\nimport { strict as assert } from \"node:assert\";\n\nimport {\n\tLocalClientId,\n\tUnassignedSequenceNumber,\n\tUniversalSequenceNumber,\n} from \"../constants.js\";\nimport { MergeTree } from \"../mergeTree.js\";\nimport { MergeTreeMaintenanceType } from \"../mergeTreeDeltaCallback.js\";\nimport { MergeTreeDeltaType } from \"../ops.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { countOperations, insertSegments, insertText, markRangeRemoved } from \"./testUtils.js\";\n\ndescribe(\"MergeTree\", () => {\n\tlet mergeTree: MergeTree;\n\tconst localClientId = 17;\n\tlet currentSequenceNumber: number;\n\tbeforeEach(() => {\n\t\tmergeTree = new MergeTree();\n\t\tinsertSegments({\n\t\t\tmergeTree,\n\t\t\tpos: 0,\n\t\t\tsegments: [TextSegment.make(\"hello world\")],\n\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\tclientId: LocalClientId,\n\t\t\tseq: UniversalSequenceNumber,\n\t\t\topArgs: undefined,\n\t\t});\n\n\t\tcurrentSequenceNumber = 0;\n\t\tmergeTree.startCollaboration(\n\t\t\tlocalClientId,\n\t\t\t/* minSeq: */ currentSequenceNumber,\n\t\t\t/* currentSeq: */ currentSequenceNumber,\n\t\t);\n\t});\n\n\tdescribe(\"annotateRange\", () => {\n\t\tit(\"Event on annotation\", () => {\n\t\t\tconst count = countOperations(mergeTree);\n\n\t\t\tmergeTree.annotateRange(\n\t\t\t\t4,\n\t\t\t\t6,\n\t\t\t\t{\n\t\t\t\t\tprops: { foo: \"bar\" },\n\t\t\t\t},\n\t\t\t\tcurrentSequenceNumber,\n\t\t\t\tlocalClientId,\n\t\t\t\tUnassignedSequenceNumber,\n\t\t\t\tundefined as never,\n\t\t\t);\n\n\t\t\tassert.deepStrictEqual(count, {\n\t\t\t\t[MergeTreeDeltaType.ANNOTATE]: 1,\n\t\t\t\t[MergeTreeMaintenanceType.SPLIT]: 2,\n\t\t\t});\n\t\t});\n\n\t\tit(\"No event on annotation of empty range\", () => {\n\t\t\tconst count = countOperations(mergeTree);\n\t\t\tmergeTree.annotateRange(\n\t\t\t\t3,\n\t\t\t\t3,\n\t\t\t\t{\n\t\t\t\t\tprops: { foo: \"bar\" },\n\t\t\t\t},\n\t\t\t\tcurrentSequenceNumber,\n\t\t\t\tlocalClientId,\n\t\t\t\t++currentSequenceNumber,\n\t\t\t\tundefined as never,\n\t\t\t);\n\n\t\t\tassert.deepStrictEqual(count, {\n\t\t\t\t[MergeTreeMaintenanceType.SPLIT]: 1,\n\t\t\t});\n\t\t});\n\n\t\tit(\"Annotate over local insertion\", () => {\n\t\t\tinsertText({\n\t\t\t\tmergeTree,\n\t\t\t\tpos: 4,\n\t\t\t\trefSeq: currentSequenceNumber,\n\t\t\t\tclientId: localClientId,\n\t\t\t\tseq: UnassignedSequenceNumber,\n\t\t\t\ttext: \"a\",\n\t\t\t\tprops: undefined,\n\t\t\t\topArgs: undefined,\n\t\t\t});\n\n\t\t\tconst count = countOperations(mergeTree);\n\n\t\t\tmergeTree.annotateRange(\n\t\t\t\t3,\n\t\t\t\t8,\n\t\t\t\t{\n\t\t\t\t\tprops: { foo: \"bar\" },\n\t\t\t\t},\n\t\t\t\tcurrentSequenceNumber,\n\t\t\t\tlocalClientId,\n\t\t\t\tUnassignedSequenceNumber,\n\t\t\t\tundefined as never,\n\t\t\t);\n\n\t\t\tassert.deepStrictEqual(count, {\n\t\t\t\t[MergeTreeDeltaType.ANNOTATE]: 1,\n\t\t\t\t[MergeTreeMaintenanceType.SPLIT]: 2,\n\t\t\t});\n\t\t});\n\n\t\tit(\"Annotate over remote insertion\", () => {\n\t\t\tconst remoteClientId: number = 35;\n\t\t\tlet remoteSequenceNumber = currentSequenceNumber;\n\n\t\t\tinsertText({\n\t\t\t\tmergeTree,\n\t\t\t\tpos: 4,\n\t\t\t\trefSeq: remoteSequenceNumber,\n\t\t\t\tclientId: remoteClientId,\n\t\t\t\tseq: ++remoteSequenceNumber,\n\t\t\t\ttext: \"a\",\n\t\t\t\tprops: undefined,\n\t\t\t\topArgs: undefined,\n\t\t\t});\n\n\t\t\tconst count = countOperations(mergeTree);\n\n\t\t\tmergeTree.annotateRange(\n\t\t\t\t3,\n\t\t\t\t8,\n\t\t\t\t{\n\t\t\t\t\tprops: { foo: \"bar\" },\n\t\t\t\t},\n\t\t\t\tcurrentSequenceNumber,\n\t\t\t\tlocalClientId,\n\t\t\t\tUnassignedSequenceNumber,\n\t\t\t\tundefined as never,\n\t\t\t);\n\n\t\t\tassert.deepStrictEqual(count, {\n\t\t\t\t[MergeTreeDeltaType.ANNOTATE]: 1,\n\t\t\t\t[MergeTreeMaintenanceType.SPLIT]: 2,\n\t\t\t});\n\t\t});\n\n\t\tit(\"Annotate over remote deletion\", () => {\n\t\t\tconst remoteClientId: number = 35;\n\t\t\tlet remoteSequenceNumber = currentSequenceNumber;\n\n\t\t\tmarkRangeRemoved({\n\t\t\t\tmergeTree,\n\t\t\t\tstart: 4,\n\t\t\t\tend: 6,\n\t\t\t\trefSeq: remoteSequenceNumber,\n\t\t\t\tclientId: remoteClientId,\n\t\t\t\tseq: ++remoteSequenceNumber,\n\t\t\t\toverwrite: false,\n\t\t\t\topArgs: undefined as never,\n\t\t\t});\n\n\t\t\tconst count = countOperations(mergeTree);\n\n\t\t\tmergeTree.annotateRange(\n\t\t\t\t3,\n\t\t\t\t8,\n\t\t\t\t{\n\t\t\t\t\tprops: { foo: \"bar\" },\n\t\t\t\t},\n\t\t\t\tcurrentSequenceNumber,\n\t\t\t\tlocalClientId,\n\t\t\t\tUnassignedSequenceNumber,\n\t\t\t\tundefined as never,\n\t\t\t);\n\n\t\t\tassert.deepStrictEqual(count, {\n\t\t\t\t[MergeTreeDeltaType.ANNOTATE]: 1,\n\t\t\t\t[MergeTreeMaintenanceType.SPLIT]: 2,\n\t\t\t});\n\t\t});\n\n\t\tit(\"Remote annotate within local deletion\", () => {\n\t\t\tconst remoteClientId: number = 35;\n\t\t\tlet remoteSequenceNumber = currentSequenceNumber;\n\n\t\t\tmarkRangeRemoved({\n\t\t\t\tmergeTree,\n\t\t\t\tstart: 3,\n\t\t\t\tend: 8,\n\t\t\t\trefSeq: currentSequenceNumber,\n\t\t\t\tclientId: localClientId,\n\t\t\t\tseq: UnassignedSequenceNumber,\n\t\t\t\toverwrite: false,\n\t\t\t\topArgs: undefined as never,\n\t\t\t});\n\n\t\t\tconst count = countOperations(mergeTree);\n\n\t\t\tmergeTree.annotateRange(\n\t\t\t\t4,\n\t\t\t\t6,\n\t\t\t\t{\n\t\t\t\t\tprops: { foo: \"bar\" },\n\t\t\t\t},\n\t\t\t\tremoteSequenceNumber,\n\t\t\t\tremoteClientId,\n\t\t\t\t++remoteSequenceNumber,\n\t\t\t\tundefined as never,\n\t\t\t);\n\n\t\t\tassert.deepStrictEqual(count, {\n\t\t\t\t[MergeTreeMaintenanceType.SPLIT]: 2,\n\t\t\t});\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"mergeTree.annotate.deltaCallback.spec.js","sourceRoot":"","sources":["../../src/test/mergeTree.annotate.deltaCallback.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\nimport { strict as assert } from \"node:assert\";\n\nimport { MergeTree } from \"../mergeTree.js\";\nimport { MergeTreeMaintenanceType } from \"../mergeTreeDeltaCallback.js\";\nimport { MergeTreeDeltaType } from \"../ops.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { countOperations, makeRemoteClient } from \"./testUtils.js\";\n\ndescribe(\"MergeTree\", () => {\n\tlet mergeTree: MergeTree;\n\tconst localClientId = 17;\n\tlet currentSequenceNumber: number;\n\tbeforeEach(() => {\n\t\tmergeTree = new MergeTree();\n\t\tmergeTree.insertSegments(\n\t\t\t0,\n\t\t\t[TextSegment.make(\"hello world\")],\n\t\t\tmergeTree.localPerspective,\n\t\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\tundefined,\n\t\t);\n\n\t\tcurrentSequenceNumber = 0;\n\t\tmergeTree.startCollaboration(\n\t\t\tlocalClientId,\n\t\t\t/* minSeq: */ currentSequenceNumber,\n\t\t\t/* currentSeq: */ currentSequenceNumber,\n\t\t);\n\t});\n\n\tdescribe(\"annotateRange\", () => {\n\t\tit(\"Event on annotation\", () => {\n\t\t\tconst count = countOperations(mergeTree);\n\n\t\t\tmergeTree.annotateRange(\n\t\t\t\t4,\n\t\t\t\t6,\n\t\t\t\t{\n\t\t\t\t\tprops: { foo: \"bar\" },\n\t\t\t\t},\n\t\t\t\tmergeTree.localPerspective,\n\t\t\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\t\tundefined as never,\n\t\t\t);\n\n\t\t\tassert.deepStrictEqual(count, {\n\t\t\t\t[MergeTreeDeltaType.ANNOTATE]: 1,\n\t\t\t\t[MergeTreeMaintenanceType.SPLIT]: 2,\n\t\t\t});\n\t\t});\n\n\t\tit(\"No event on annotation of empty range\", () => {\n\t\t\tconst count = countOperations(mergeTree);\n\t\t\tmergeTree.annotateRange(\n\t\t\t\t3,\n\t\t\t\t3,\n\t\t\t\t{\n\t\t\t\t\tprops: { foo: \"bar\" },\n\t\t\t\t},\n\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t{ seq: ++currentSequenceNumber, clientId: localClientId },\n\t\t\t\tundefined as never,\n\t\t\t);\n\n\t\t\tassert.deepStrictEqual(count, {\n\t\t\t\t[MergeTreeMaintenanceType.SPLIT]: 1,\n\t\t\t});\n\t\t});\n\n\t\tit(\"Annotate over local insertion\", () => {\n\t\t\tmergeTree.insertSegments(\n\t\t\t\t4,\n\t\t\t\t[TextSegment.make(\"a\")],\n\t\t\t\tmergeTree.localPerspective,\n\t\t\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\t\tundefined,\n\t\t\t);\n\n\t\t\tconst count = countOperations(mergeTree);\n\n\t\t\tmergeTree.annotateRange(\n\t\t\t\t3,\n\t\t\t\t8,\n\t\t\t\t{\n\t\t\t\t\tprops: { foo: \"bar\" },\n\t\t\t\t},\n\t\t\t\tmergeTree.localPerspective,\n\t\t\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\t\tundefined as never,\n\t\t\t);\n\n\t\t\tassert.deepStrictEqual(count, {\n\t\t\t\t[MergeTreeDeltaType.ANNOTATE]: 1,\n\t\t\t\t[MergeTreeMaintenanceType.SPLIT]: 2,\n\t\t\t});\n\t\t});\n\n\t\tit(\"Annotate over remote insertion\", () => {\n\t\t\tconst remoteClient = makeRemoteClient({ clientId: 35 });\n\t\t\tlet remoteSequenceNumber = currentSequenceNumber;\n\n\t\t\tmergeTree.insertSegments(\n\t\t\t\t4,\n\t\t\t\t[TextSegment.make(\"a\")],\n\t\t\t\tremoteClient.perspectiveAt({ refSeq: remoteSequenceNumber }),\n\t\t\t\tremoteClient.stampAt({ seq: ++remoteSequenceNumber }),\n\t\t\t\tundefined as never,\n\t\t\t);\n\n\t\t\tconst count = countOperations(mergeTree);\n\n\t\t\tmergeTree.annotateRange(\n\t\t\t\t3,\n\t\t\t\t8,\n\t\t\t\t{\n\t\t\t\t\tprops: { foo: \"bar\" },\n\t\t\t\t},\n\t\t\t\tmergeTree.localPerspective,\n\t\t\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\t\tundefined as never,\n\t\t\t);\n\n\t\t\tassert.deepStrictEqual(count, {\n\t\t\t\t[MergeTreeDeltaType.ANNOTATE]: 1,\n\t\t\t\t[MergeTreeMaintenanceType.SPLIT]: 2,\n\t\t\t});\n\t\t});\n\n\t\tit(\"Annotate over remote deletion\", () => {\n\t\t\tconst remoteClient = makeRemoteClient({ clientId: 35 });\n\t\t\tlet remoteSequenceNumber = currentSequenceNumber;\n\n\t\t\tmergeTree.markRangeRemoved(\n\t\t\t\t4,\n\t\t\t\t6,\n\t\t\t\tremoteClient.perspectiveAt({ refSeq: remoteSequenceNumber }),\n\t\t\t\tremoteClient.stampAt({ seq: ++remoteSequenceNumber }),\n\t\t\t\tundefined as never,\n\t\t\t);\n\n\t\t\tconst count = countOperations(mergeTree);\n\n\t\t\tmergeTree.annotateRange(\n\t\t\t\t3,\n\t\t\t\t8,\n\t\t\t\t{\n\t\t\t\t\tprops: { foo: \"bar\" },\n\t\t\t\t},\n\t\t\t\tmergeTree.localPerspective,\n\t\t\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\t\tundefined as never,\n\t\t\t);\n\n\t\t\tassert.deepStrictEqual(count, {\n\t\t\t\t[MergeTreeDeltaType.ANNOTATE]: 1,\n\t\t\t\t[MergeTreeMaintenanceType.SPLIT]: 2,\n\t\t\t});\n\t\t});\n\n\t\tit(\"Remote annotate within local deletion\", () => {\n\t\t\tconst remoteClient = makeRemoteClient({ clientId: 35 });\n\t\t\tlet remoteSequenceNumber = currentSequenceNumber;\n\n\t\t\tmergeTree.markRangeRemoved(\n\t\t\t\t3,\n\t\t\t\t8,\n\t\t\t\tmergeTree.localPerspective,\n\t\t\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\t\tundefined as never,\n\t\t\t);\n\n\t\t\tconst count = countOperations(mergeTree);\n\n\t\t\tmergeTree.annotateRange(\n\t\t\t\t4,\n\t\t\t\t6,\n\t\t\t\t{\n\t\t\t\t\tprops: { foo: \"bar\" },\n\t\t\t\t},\n\t\t\t\tremoteClient.perspectiveAt({ refSeq: remoteSequenceNumber }),\n\t\t\t\tremoteClient.stampAt({ seq: ++remoteSequenceNumber }),\n\t\t\t\tundefined as never,\n\t\t\t);\n\n\t\t\tassert.deepStrictEqual(count, {\n\t\t\t\t[MergeTreeMaintenanceType.SPLIT]: 2,\n\t\t\t});\n\t\t});\n\t});\n});\n"]}
@@ -3,24 +3,24 @@
3
3
  * Licensed under the MIT License.
4
4
  */
5
5
  import { strict as assert } from "node:assert";
6
- import { LocalClientId, UnassignedSequenceNumber, UniversalSequenceNumber, } from "../constants.js";
7
6
  import { MergeTree } from "../mergeTree.js";
8
7
  import { Marker } from "../mergeTreeNodes.js";
9
8
  import { MergeTreeDeltaType, ReferenceType } from "../ops.js";
9
+ import { LocalDefaultPerspective } from "../perspective.js";
10
10
  import { assertMergeNode } from "../segmentInfos.js";
11
11
  import { TextSegment } from "../textSegment.js";
12
- import { insertSegments } from "./testUtils.js";
12
+ import { makeRemoteClient } from "./testUtils.js";
13
13
  function splitAt(mergeTree, pos) {
14
14
  let segment;
15
15
  mergeTree.mapRange((seg) => {
16
16
  segment = seg;
17
17
  return false;
18
- }, mergeTree.collabWindow.currentSeq, mergeTree.collabWindow.clientId, undefined, pos, pos + 1, true);
18
+ }, new LocalDefaultPerspective(mergeTree.collabWindow.clientId), undefined, pos, pos + 1, true);
19
19
  return segment;
20
20
  }
21
21
  describe("MergeTree", () => {
22
22
  let mergeTree;
23
- const remoteClientId = 35;
23
+ const remoteClient = makeRemoteClient({ clientId: 35 });
24
24
  const localClientId = 17;
25
25
  let currentSequenceNumber;
26
26
  const annotateStart = 1;
@@ -29,41 +29,25 @@ describe("MergeTree", () => {
29
29
  const splitPos = Math.floor((annotateEnd - annotateStart) / 2) + annotateStart;
30
30
  beforeEach(() => {
31
31
  mergeTree = new MergeTree();
32
- insertSegments({
33
- mergeTree,
34
- pos: 0,
35
- segments: [TextSegment.make("hello world!")],
36
- refSeq: UniversalSequenceNumber,
37
- clientId: LocalClientId,
38
- seq: UniversalSequenceNumber,
39
- opArgs: undefined,
40
- });
32
+ mergeTree.insertSegments(0, [TextSegment.make("hello world!")], mergeTree.localPerspective, mergeTree.collabWindow.mintNextLocalOperationStamp(), undefined);
41
33
  currentSequenceNumber = 0;
42
- insertSegments({
43
- mergeTree,
44
- pos: markerPosition,
45
- segments: [Marker.make(ReferenceType.Tile)],
46
- refSeq: currentSequenceNumber,
47
- clientId: remoteClientId,
48
- seq: ++currentSequenceNumber,
49
- opArgs: undefined,
50
- });
34
+ mergeTree.insertSegments(markerPosition, [Marker.make(ReferenceType.Tile)], remoteClient.perspectiveAt({ refSeq: currentSequenceNumber }), remoteClient.stampAt({ seq: ++currentSequenceNumber }), undefined);
51
35
  });
52
36
  describe("annotateRange", () => {
53
37
  describe("not collaborating", () => {
54
38
  it("remote", () => {
55
39
  mergeTree.annotateRange(annotateStart, annotateEnd, {
56
40
  props: { propertySource: "remote" },
57
- }, currentSequenceNumber, remoteClientId, currentSequenceNumber + 1, undefined);
58
- const segmentInfo = mergeTree.getContainingSegment(annotateStart, currentSequenceNumber, localClientId);
41
+ }, remoteClient.perspectiveAt({ refSeq: currentSequenceNumber }), remoteClient.stampAt({ seq: currentSequenceNumber + 1 }), undefined);
42
+ const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
59
43
  const segment = segmentInfo.segment;
60
44
  assert.equal(segment?.properties?.propertySource, "remote");
61
45
  });
62
46
  it("local", () => {
63
47
  mergeTree.annotateRange(annotateStart, annotateEnd, {
64
48
  props: { propertySource: "local" },
65
- }, currentSequenceNumber, localClientId, UnassignedSequenceNumber, undefined);
66
- const segmentInfo = mergeTree.getContainingSegment(annotateStart, currentSequenceNumber, localClientId);
49
+ }, mergeTree.localPerspective, mergeTree.collabWindow.mintNextLocalOperationStamp(), undefined);
50
+ const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
67
51
  const segment = segmentInfo.segment;
68
52
  assert.equal(segment.properties?.propertySource, "local");
69
53
  });
@@ -79,23 +63,23 @@ describe("MergeTree", () => {
79
63
  props: { propertySource: "local" },
80
64
  };
81
65
  beforeEach(() => {
82
- mergeTree.annotateRange(annotateStart, annotateEnd, props, currentSequenceNumber, localClientId, UnassignedSequenceNumber, undefined);
66
+ mergeTree.annotateRange(annotateStart, annotateEnd, props, mergeTree.localPerspective, mergeTree.collabWindow.mintNextLocalOperationStamp(), undefined);
83
67
  });
84
68
  it("unsequenced local", () => {
85
- const segmentInfo = mergeTree.getContainingSegment(annotateStart, currentSequenceNumber, localClientId);
69
+ const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
86
70
  const segment = segmentInfo.segment;
87
71
  assert.equal(segment.properties?.propertySource, "local");
88
72
  });
89
73
  it("unsequenced local after unsequenced local", () => {
90
74
  mergeTree.annotateRange(annotateStart, annotateEnd, {
91
75
  props: { secondProperty: "local" },
92
- }, currentSequenceNumber, localClientId, UnassignedSequenceNumber, undefined);
93
- const segmentInfo = mergeTree.getContainingSegment(annotateStart, currentSequenceNumber, localClientId);
76
+ }, mergeTree.localPerspective, mergeTree.collabWindow.mintNextLocalOperationStamp(), undefined);
77
+ const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
94
78
  const segment = segmentInfo.segment;
95
79
  assert.equal(segment.properties?.secondProperty, "local");
96
80
  });
97
81
  it("unsequenced local split", () => {
98
- const segmentInfo = mergeTree.getContainingSegment(annotateStart, currentSequenceNumber, localClientId);
82
+ const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
99
83
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
100
84
  const splitSegment = splitAt(mergeTree, splitPos);
101
85
  assertMergeNode(splitSegment);
@@ -108,16 +92,16 @@ describe("MergeTree", () => {
108
92
  secondChange: 1,
109
93
  },
110
94
  };
111
- mergeTree.annotateRange(annotateStart, annotateEnd, secondChangeProps, currentSequenceNumber, localClientId, UnassignedSequenceNumber, undefined);
95
+ mergeTree.annotateRange(annotateStart, annotateEnd, secondChangeProps, mergeTree.localPerspective, mergeTree.collabWindow.mintNextLocalOperationStamp(), undefined);
112
96
  const splitOnlyProps = {
113
97
  props: {
114
98
  splitOnly: 1,
115
99
  },
116
100
  };
117
- mergeTree.annotateRange(splitPos, annotateEnd, splitOnlyProps, currentSequenceNumber, localClientId, UnassignedSequenceNumber, undefined);
118
- const segmentInfo = mergeTree.getContainingSegment(annotateStart, currentSequenceNumber, localClientId);
101
+ mergeTree.annotateRange(splitPos, annotateEnd, splitOnlyProps, mergeTree.localPerspective, mergeTree.collabWindow.mintNextLocalOperationStamp(), undefined);
102
+ const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
119
103
  const segment = segmentInfo.segment;
120
- const splitSegmentInfo = mergeTree.getContainingSegment(splitPos, currentSequenceNumber, localClientId);
104
+ const splitSegmentInfo = mergeTree.getContainingSegment(splitPos, mergeTree.localPerspective);
121
105
  const splitSegment = splitSegmentInfo.segment;
122
106
  assert.equal(segment.segmentGroups?.size, 2);
123
107
  assert.equal(segment.properties?.propertySource, "local");
@@ -188,8 +172,8 @@ describe("MergeTree", () => {
188
172
  it("unsequenced local before remote", () => {
189
173
  mergeTree.annotateRange(annotateStart, annotateEnd, {
190
174
  props: { propertySource: "remote", remoteProperty: 1 },
191
- }, currentSequenceNumber, remoteClientId, ++currentSequenceNumber, undefined);
192
- const segmentInfo = mergeTree.getContainingSegment(annotateStart, currentSequenceNumber, localClientId);
175
+ }, remoteClient.perspectiveAt({ refSeq: currentSequenceNumber }), remoteClient.stampAt({ seq: ++currentSequenceNumber }), undefined);
176
+ const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
193
177
  const segment = segmentInfo.segment;
194
178
  assert.equal(segment.segmentGroups?.size, 1);
195
179
  assert.equal(segment.properties?.propertySource, "local");
@@ -207,7 +191,7 @@ describe("MergeTree", () => {
207
191
  sequenceNumber: ++currentSequenceNumber,
208
192
  },
209
193
  });
210
- const segmentInfo = mergeTree.getContainingSegment(annotateStart, currentSequenceNumber, localClientId);
194
+ const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
211
195
  const segment = segmentInfo.segment;
212
196
  assert.equal(segment.segmentGroups?.size, 0);
213
197
  assert.equal(segment.properties?.propertySource, "local");
@@ -226,21 +210,21 @@ describe("MergeTree", () => {
226
210
  });
227
211
  mergeTree.annotateRange(annotateStart, annotateEnd, {
228
212
  props: { propertySource: "remote", remoteProperty: 1 },
229
- }, currentSequenceNumber, remoteClientId, ++currentSequenceNumber, undefined);
230
- const segmentInfo = mergeTree.getContainingSegment(annotateStart, currentSequenceNumber, localClientId);
213
+ }, remoteClient.perspectiveAt({ refSeq: currentSequenceNumber }), remoteClient.stampAt({ seq: ++currentSequenceNumber }), undefined);
214
+ const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
231
215
  const segment = segmentInfo.segment;
232
216
  assert.equal(segment.segmentGroups?.size, 0);
233
217
  assert.equal(segment.properties?.propertySource, "remote");
234
218
  assert.equal(segment.properties?.remoteProperty, 1);
235
219
  });
236
220
  it("three local changes", () => {
237
- const segmentInfo = mergeTree.getContainingSegment(annotateStart, currentSequenceNumber, localClientId);
221
+ const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
238
222
  const segment = segmentInfo.segment;
239
223
  assert.equal(segment.properties?.propertySource, "local");
240
224
  const props2 = {
241
225
  props: { propertySource: "local2", secondSource: 1 },
242
226
  };
243
- mergeTree.annotateRange(annotateStart, annotateEnd, props2, currentSequenceNumber, localClientId, UnassignedSequenceNumber, undefined);
227
+ mergeTree.annotateRange(annotateStart, annotateEnd, props2, mergeTree.localPerspective, mergeTree.collabWindow.mintNextLocalOperationStamp(), undefined);
244
228
  assert.equal(segment.properties?.propertySource, "local2");
245
229
  assert.equal(segment.properties?.secondSource, 1);
246
230
  const props3 = {
@@ -248,7 +232,7 @@ describe("MergeTree", () => {
248
232
  thirdSource: 1,
249
233
  },
250
234
  };
251
- mergeTree.annotateRange(annotateStart, annotateEnd, props3, currentSequenceNumber, localClientId, UnassignedSequenceNumber, undefined);
235
+ mergeTree.annotateRange(annotateStart, annotateEnd, props3, mergeTree.localPerspective, mergeTree.collabWindow.mintNextLocalOperationStamp(), undefined);
252
236
  assert.equal(segment.properties?.propertySource, "local2");
253
237
  assert.equal(segment.properties?.secondSource, 1);
254
238
  assert.equal(segment.properties?.thirdSource, 1);
@@ -298,7 +282,7 @@ describe("MergeTree", () => {
298
282
  it("two local changes with interleaved remote", () => {
299
283
  mergeTree.annotateRange(annotateStart, annotateEnd, {
300
284
  props: { secondSource: "local2" },
301
- }, currentSequenceNumber, localClientId, UnassignedSequenceNumber, undefined);
285
+ }, mergeTree.localPerspective, mergeTree.collabWindow.mintNextLocalOperationStamp(), undefined);
302
286
  mergeTree.ackPendingSegment({
303
287
  op: {
304
288
  pos1: annotateStart,
@@ -312,8 +296,8 @@ describe("MergeTree", () => {
312
296
  });
313
297
  mergeTree.annotateRange(annotateStart, annotateEnd, {
314
298
  props: { propertySource: "remote", remoteOnly: 1, secondSource: "remote" },
315
- }, currentSequenceNumber, remoteClientId, ++currentSequenceNumber, undefined);
316
- const segmentInfo = mergeTree.getContainingSegment(annotateStart, currentSequenceNumber, localClientId);
299
+ }, remoteClient.perspectiveAt({ refSeq: currentSequenceNumber }), remoteClient.stampAt({ seq: ++currentSequenceNumber }), undefined);
300
+ const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
317
301
  const segment = segmentInfo.segment;
318
302
  assert.equal(segment.properties?.remoteOnly, 1);
319
303
  assert.equal(segment.properties?.propertySource, "remote");
@@ -324,18 +308,18 @@ describe("MergeTree", () => {
324
308
  beforeEach(() => {
325
309
  mergeTree.annotateRange(annotateStart, annotateEnd, {
326
310
  props: { propertySource: "remote", remoteProperty: 1 },
327
- }, currentSequenceNumber, remoteClientId, ++currentSequenceNumber, undefined);
328
- const segmentInfo = mergeTree.getContainingSegment(annotateStart, currentSequenceNumber, localClientId);
311
+ }, remoteClient.perspectiveAt({ refSeq: currentSequenceNumber }), remoteClient.stampAt({ seq: ++currentSequenceNumber }), undefined);
312
+ const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
329
313
  assert(segmentInfo.segment?.segmentGroups?.size !== 0);
330
314
  });
331
315
  it("remote only", () => {
332
- const segmentInfo = mergeTree.getContainingSegment(annotateStart, currentSequenceNumber, localClientId);
316
+ const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
333
317
  const segment = segmentInfo.segment;
334
318
  assert.equal(segment.properties?.propertySource, "remote");
335
319
  assert.equal(segment.properties?.remoteProperty, 1);
336
320
  });
337
321
  it("split remote", () => {
338
- const segmentInfo = mergeTree.getContainingSegment(annotateStart, currentSequenceNumber, localClientId);
322
+ const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
339
323
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
340
324
  const splitSegment = splitAt(mergeTree, annotateStart + 1);
341
325
  assertMergeNode(splitSegment);
@@ -346,8 +330,8 @@ describe("MergeTree", () => {
346
330
  it("remote before unsequenced local", () => {
347
331
  mergeTree.annotateRange(annotateStart, annotateEnd, {
348
332
  props: { propertySource: "local" },
349
- }, currentSequenceNumber, localClientId, UnassignedSequenceNumber, undefined);
350
- const segmentInfo = mergeTree.getContainingSegment(annotateStart, currentSequenceNumber, localClientId);
333
+ }, mergeTree.localPerspective, mergeTree.collabWindow.mintNextLocalOperationStamp(), undefined);
334
+ const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
351
335
  const segment = segmentInfo.segment;
352
336
  assert.equal(segment.properties?.propertySource, "local");
353
337
  assert.equal(segment.properties?.remoteProperty, 1);
@@ -356,9 +340,9 @@ describe("MergeTree", () => {
356
340
  const props = {
357
341
  props: { propertySource: "local" },
358
342
  };
359
- const segmentInfo = mergeTree.getContainingSegment(annotateStart, currentSequenceNumber, localClientId);
343
+ const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
360
344
  assert(segmentInfo.segment?.segmentGroups?.empty !== false);
361
- mergeTree.annotateRange(annotateStart, annotateEnd, props, currentSequenceNumber, localClientId, UnassignedSequenceNumber, undefined);
345
+ mergeTree.annotateRange(annotateStart, annotateEnd, props, mergeTree.localPerspective, mergeTree.collabWindow.mintNextLocalOperationStamp(), undefined);
362
346
  assert.equal(segmentInfo.segment?.segmentGroups?.size, 1);
363
347
  mergeTree.ackPendingSegment({
364
348
  op: {
@@ -381,13 +365,13 @@ describe("MergeTree", () => {
381
365
  props: { propertySource: "local" },
382
366
  };
383
367
  beforeEach(() => {
384
- mergeTree.annotateRange(annotateStart, annotateEnd, props, currentSequenceNumber, localClientId, UnassignedSequenceNumber, undefined);
368
+ mergeTree.annotateRange(annotateStart, annotateEnd, props, mergeTree.localPerspective, mergeTree.collabWindow.mintNextLocalOperationStamp(), undefined);
385
369
  });
386
370
  it("unsequenced local after unsequenced local", () => {
387
371
  mergeTree.annotateRange(annotateStart, annotateEnd, {
388
372
  props: { propertySource: "local2", secondProperty: "local" },
389
- }, currentSequenceNumber, localClientId, UnassignedSequenceNumber, undefined);
390
- const segmentInfo = mergeTree.getContainingSegment(annotateStart, currentSequenceNumber, localClientId);
373
+ }, mergeTree.localPerspective, mergeTree.collabWindow.mintNextLocalOperationStamp(), undefined);
374
+ const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
391
375
  const segment = segmentInfo.segment;
392
376
  assert.equal(segment.properties?.propertySource, "local2");
393
377
  assert.equal(segment.properties?.secondProperty, "local");
@@ -395,8 +379,8 @@ describe("MergeTree", () => {
395
379
  it("unsequenced local before remote", () => {
396
380
  mergeTree.annotateRange(annotateStart, annotateEnd, {
397
381
  props: { propertySource: "remote", remoteProperty: 1 },
398
- }, currentSequenceNumber, remoteClientId, ++currentSequenceNumber, undefined);
399
- const segmentInfo = mergeTree.getContainingSegment(annotateStart, currentSequenceNumber, localClientId);
382
+ }, remoteClient.perspectiveAt({ refSeq: currentSequenceNumber }), remoteClient.stampAt({ seq: ++currentSequenceNumber }), undefined);
383
+ const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
400
384
  const segment = segmentInfo.segment;
401
385
  assert.equal(segment.segmentGroups?.size, 1);
402
386
  assert.equal(segment.properties?.propertySource, "local");
@@ -416,8 +400,8 @@ describe("MergeTree", () => {
416
400
  });
417
401
  mergeTree.annotateRange(annotateStart, annotateEnd, {
418
402
  props: { propertySource: "remote", remoteProperty: 1 },
419
- }, currentSequenceNumber, remoteClientId, ++currentSequenceNumber, undefined);
420
- const segmentInfo = mergeTree.getContainingSegment(annotateStart, currentSequenceNumber, localClientId);
403
+ }, remoteClient.perspectiveAt({ refSeq: currentSequenceNumber }), remoteClient.stampAt({ seq: ++currentSequenceNumber }), undefined);
404
+ const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
421
405
  const segment = segmentInfo.segment;
422
406
  assert.equal(segment.segmentGroups?.size, 0);
423
407
  assert.equal(segment.properties?.propertySource, "remote");
@@ -426,7 +410,7 @@ describe("MergeTree", () => {
426
410
  it("two local changes with interleaved remote", () => {
427
411
  mergeTree.annotateRange(annotateStart, annotateEnd, {
428
412
  props: { secondSource: "local2" },
429
- }, currentSequenceNumber, localClientId, UnassignedSequenceNumber, undefined);
413
+ }, mergeTree.localPerspective, mergeTree.collabWindow.mintNextLocalOperationStamp(), undefined);
430
414
  mergeTree.ackPendingSegment({
431
415
  op: {
432
416
  pos1: annotateStart,
@@ -440,8 +424,8 @@ describe("MergeTree", () => {
440
424
  });
441
425
  mergeTree.annotateRange(annotateStart, annotateEnd, {
442
426
  props: { propertySource: "remote", remoteOnly: 1, secondSource: "remote" },
443
- }, currentSequenceNumber, remoteClientId, ++currentSequenceNumber, undefined);
444
- const segmentInfo = mergeTree.getContainingSegment(annotateStart, currentSequenceNumber, localClientId);
427
+ }, remoteClient.perspectiveAt({ refSeq: currentSequenceNumber }), remoteClient.stampAt({ seq: ++currentSequenceNumber }), undefined);
428
+ const segmentInfo = mergeTree.getContainingSegment(annotateStart, mergeTree.localPerspective);
445
429
  const segment = segmentInfo.segment;
446
430
  assert.equal(segment.properties?.remoteOnly, 1);
447
431
  assert.equal(segment.properties?.propertySource, "remote");
@@ -1 +1 @@
1
- {"version":3,"file":"mergeTree.annotate.spec.js","sourceRoot":"","sources":["../../src/test/mergeTree.annotate.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\nimport { strict as assert } from \"node:assert\";\n\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport {\n\tLocalClientId,\n\tUnassignedSequenceNumber,\n\tUniversalSequenceNumber,\n} from \"../constants.js\";\nimport { MergeTree } from \"../mergeTree.js\";\nimport { Marker, type ISegmentPrivate } from \"../mergeTreeNodes.js\";\nimport { MergeTreeDeltaType, ReferenceType } from \"../ops.js\";\nimport { assertMergeNode } from \"../segmentInfos.js\";\nimport type { PropsOrAdjust } from \"../segmentPropertiesManager.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { insertSegments } from \"./testUtils.js\";\n\nfunction splitAt(mergeTree: MergeTree, pos: number): ISegmentPrivate | undefined {\n\tlet segment: ISegmentPrivate | undefined;\n\tmergeTree.mapRange(\n\t\t(seg) => {\n\t\t\tsegment = seg;\n\t\t\treturn false;\n\t\t},\n\t\tmergeTree.collabWindow.currentSeq,\n\t\tmergeTree.collabWindow.clientId,\n\t\tundefined,\n\t\tpos,\n\t\tpos + 1,\n\t\ttrue,\n\t);\n\treturn segment;\n}\n\ndescribe(\"MergeTree\", () => {\n\tlet mergeTree: MergeTree;\n\tconst remoteClientId = 35;\n\tconst localClientId = 17;\n\tlet currentSequenceNumber: number;\n\n\tconst annotateStart = 1;\n\tconst markerPosition = annotateStart + 2;\n\tconst annotateEnd = markerPosition + 2;\n\tconst splitPos = Math.floor((annotateEnd - annotateStart) / 2) + annotateStart;\n\n\tbeforeEach(() => {\n\t\tmergeTree = new MergeTree();\n\t\tinsertSegments({\n\t\t\tmergeTree,\n\t\t\tpos: 0,\n\t\t\tsegments: [TextSegment.make(\"hello world!\")],\n\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\tclientId: LocalClientId,\n\t\t\tseq: UniversalSequenceNumber,\n\t\t\topArgs: undefined as never,\n\t\t});\n\n\t\tcurrentSequenceNumber = 0;\n\t\tinsertSegments({\n\t\t\tmergeTree,\n\t\t\tpos: markerPosition,\n\t\t\tsegments: [Marker.make(ReferenceType.Tile)],\n\t\t\trefSeq: currentSequenceNumber,\n\t\t\tclientId: remoteClientId,\n\t\t\tseq: ++currentSequenceNumber,\n\t\t\topArgs: undefined as never,\n\t\t});\n\t});\n\n\tdescribe(\"annotateRange\", () => {\n\t\tdescribe(\"not collaborating\", () => {\n\t\t\tit(\"remote\", () => {\n\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\tannotateStart,\n\t\t\t\t\tannotateEnd,\n\t\t\t\t\t{\n\t\t\t\t\t\tprops: { propertySource: \"remote\" },\n\t\t\t\t\t},\n\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\tremoteClientId,\n\t\t\t\t\tcurrentSequenceNumber + 1,\n\t\t\t\t\tundefined as never,\n\t\t\t\t);\n\n\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\tannotateStart,\n\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\tlocalClientId,\n\t\t\t\t);\n\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\t\t\t\tassert.equal(segment?.properties?.propertySource, \"remote\");\n\t\t\t});\n\n\t\t\tit(\"local\", () => {\n\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\tannotateStart,\n\t\t\t\t\tannotateEnd,\n\t\t\t\t\t{\n\t\t\t\t\t\tprops: { propertySource: \"local\" },\n\t\t\t\t\t},\n\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\tlocalClientId,\n\t\t\t\t\tUnassignedSequenceNumber,\n\t\t\t\t\tundefined as never,\n\t\t\t\t);\n\n\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\tannotateStart,\n\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\tlocalClientId,\n\t\t\t\t);\n\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\t\t\t\tassert.equal(segment.properties?.propertySource, \"local\");\n\t\t\t});\n\t\t});\n\t\tdescribe(\"collaborating\", () => {\n\t\t\tbeforeEach(() => {\n\t\t\t\tmergeTree.startCollaboration(\n\t\t\t\t\tlocalClientId,\n\t\t\t\t\t/* minSeq: */ currentSequenceNumber,\n\t\t\t\t\t/* currentSeq: */ currentSequenceNumber,\n\t\t\t\t);\n\t\t\t});\n\t\t\tdescribe(\"local first\", () => {\n\t\t\t\tconst props: PropsOrAdjust = {\n\t\t\t\t\tprops: { propertySource: \"local\" },\n\t\t\t\t};\n\t\t\t\tbeforeEach(() => {\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\tprops,\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t\tUnassignedSequenceNumber,\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"unsequenced local\", () => {\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local\");\n\t\t\t\t});\n\n\t\t\t\tit(\"unsequenced local after unsequenced local\", () => {\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprops: { secondProperty: \"local\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t\tUnassignedSequenceNumber,\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\t\t\t\t\tassert.equal(segment.properties?.secondProperty, \"local\");\n\t\t\t\t});\n\n\t\t\t\tit(\"unsequenced local split\", () => {\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t);\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\tconst splitSegment = splitAt(mergeTree, splitPos)!;\n\t\t\t\t\tassertMergeNode(splitSegment);\n\t\t\t\t\tassert.notEqual(segmentInfo.segment?.ordinal, splitSegment.ordinal);\n\t\t\t\t\tassert.equal(splitSegment.properties?.propertySource, \"local\");\n\t\t\t\t});\n\n\t\t\t\tit(\"unsequenced local after unsequenced local split\", () => {\n\t\t\t\t\tconst secondChangeProps: PropsOrAdjust = {\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tsecondChange: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\tsecondChangeProps,\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t\tUnassignedSequenceNumber,\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst splitOnlyProps: PropsOrAdjust = {\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tsplitOnly: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tsplitPos,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\tsplitOnlyProps,\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t\tUnassignedSequenceNumber,\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\n\t\t\t\t\tconst splitSegmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tsplitPos,\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t);\n\t\t\t\t\tconst splitSegment = splitSegmentInfo.segment as ISegmentPrivate;\n\n\t\t\t\t\tassert.equal(segment.segmentGroups?.size, 2);\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local\");\n\t\t\t\t\tassert.equal(segment.properties?.secondChange, 1);\n\t\t\t\t\tassert(!segment.properties?.splitOnly);\n\n\t\t\t\t\tassert.equal(splitSegment.segmentGroups?.size, 3);\n\t\t\t\t\tassert.equal(splitSegment.properties?.propertySource, \"local\");\n\t\t\t\t\tassert.equal(splitSegment.properties?.secondChange, 1);\n\t\t\t\t\tassert.equal(splitSegment.properties?.splitOnly, 1);\n\n\t\t\t\t\tmergeTree.ackPendingSegment({\n\t\t\t\t\t\top: {\n\t\t\t\t\t\t\tpos1: annotateStart,\n\t\t\t\t\t\t\tpos2: annotateEnd,\n\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsequencedMessage: {\n\t\t\t\t\t\t\tsequenceNumber: ++currentSequenceNumber,\n\t\t\t\t\t\t} as unknown as ISequencedDocumentMessage,\n\t\t\t\t\t});\n\n\t\t\t\t\tassert.equal(segment.segmentGroups?.size, 1);\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local\");\n\t\t\t\t\tassert.equal(segment.properties?.secondChange, 1);\n\t\t\t\t\tassert(!segment.properties?.splitOnly);\n\n\t\t\t\t\tassert.equal(splitSegment?.segmentGroups?.size, 2);\n\t\t\t\t\tassert.equal(splitSegment.properties?.propertySource, \"local\");\n\t\t\t\t\tassert.equal(splitSegment.properties?.secondChange, 1);\n\t\t\t\t\tassert.equal(splitSegment.properties?.splitOnly, 1);\n\n\t\t\t\t\tmergeTree.ackPendingSegment({\n\t\t\t\t\t\top: {\n\t\t\t\t\t\t\tpos1: annotateStart,\n\t\t\t\t\t\t\tpos2: annotateEnd,\n\t\t\t\t\t\t\t...secondChangeProps,\n\t\t\t\t\t\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsequencedMessage: {\n\t\t\t\t\t\t\tsequenceNumber: ++currentSequenceNumber,\n\t\t\t\t\t\t} as unknown as ISequencedDocumentMessage,\n\t\t\t\t\t});\n\n\t\t\t\t\tassert.equal(segment.segmentGroups?.size, 0);\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local\");\n\t\t\t\t\tassert.equal(segment.properties?.secondChange, 1);\n\t\t\t\t\tassert(!segment.properties?.splitOnly);\n\n\t\t\t\t\tassert.equal(splitSegment.segmentGroups?.size, 1);\n\t\t\t\t\tassert.equal(splitSegment.properties?.propertySource, \"local\");\n\t\t\t\t\tassert.equal(splitSegment.properties?.secondChange, 1);\n\t\t\t\t\tassert.equal(splitSegment.properties?.splitOnly, 1);\n\n\t\t\t\t\tmergeTree.ackPendingSegment({\n\t\t\t\t\t\top: {\n\t\t\t\t\t\t\tpos1: splitPos,\n\t\t\t\t\t\t\tpos2: annotateEnd,\n\t\t\t\t\t\t\t...splitOnlyProps,\n\t\t\t\t\t\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsequencedMessage: {\n\t\t\t\t\t\t\tsequenceNumber: ++currentSequenceNumber,\n\t\t\t\t\t\t} as unknown as ISequencedDocumentMessage,\n\t\t\t\t\t});\n\n\t\t\t\t\tassert.equal(segment.segmentGroups?.size, 0);\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local\");\n\t\t\t\t\tassert.equal(segment.properties?.secondChange, 1);\n\t\t\t\t\tassert(!segment.properties?.splitOnly);\n\n\t\t\t\t\tassert.equal(splitSegment.segmentGroups?.size, 0);\n\t\t\t\t\tassert.equal(splitSegment.properties?.propertySource, \"local\");\n\t\t\t\t\tassert.equal(splitSegment.properties?.secondChange, 1);\n\t\t\t\t\tassert.equal(splitSegment.properties?.splitOnly, 1);\n\t\t\t\t});\n\n\t\t\t\tit(\"unsequenced local before remote\", () => {\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprops: { propertySource: \"remote\", remoteProperty: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tremoteClientId,\n\t\t\t\t\t\t++currentSequenceNumber,\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\n\t\t\t\t\tassert.equal(segment.segmentGroups?.size, 1);\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local\");\n\t\t\t\t\tassert.equal(segment.properties?.remoteProperty, 1);\n\t\t\t\t});\n\n\t\t\t\tit(\"sequenced local\", () => {\n\t\t\t\t\tmergeTree.ackPendingSegment({\n\t\t\t\t\t\top: {\n\t\t\t\t\t\t\tpos1: annotateStart,\n\t\t\t\t\t\t\tpos2: annotateEnd,\n\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsequencedMessage: {\n\t\t\t\t\t\t\tsequenceNumber: ++currentSequenceNumber,\n\t\t\t\t\t\t} as unknown as ISequencedDocumentMessage,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\t\t\t\t\tassert.equal(segment.segmentGroups?.size, 0);\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local\");\n\t\t\t\t});\n\n\t\t\t\tit(\"sequenced local before remote\", () => {\n\t\t\t\t\tmergeTree.ackPendingSegment({\n\t\t\t\t\t\top: {\n\t\t\t\t\t\t\tpos1: annotateStart,\n\t\t\t\t\t\t\tpos2: annotateEnd,\n\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsequencedMessage: {\n\t\t\t\t\t\t\tsequenceNumber: ++currentSequenceNumber,\n\t\t\t\t\t\t} as unknown as ISequencedDocumentMessage,\n\t\t\t\t\t});\n\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprops: { propertySource: \"remote\", remoteProperty: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tremoteClientId,\n\t\t\t\t\t\t++currentSequenceNumber,\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\n\t\t\t\t\tassert.equal(segment.segmentGroups?.size, 0);\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"remote\");\n\t\t\t\t\tassert.equal(segment.properties?.remoteProperty, 1);\n\t\t\t\t});\n\n\t\t\t\tit(\"three local changes\", () => {\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local\");\n\n\t\t\t\t\tconst props2: PropsOrAdjust = {\n\t\t\t\t\t\tprops: { propertySource: \"local2\", secondSource: 1 },\n\t\t\t\t\t};\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\tprops2,\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t\tUnassignedSequenceNumber,\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local2\");\n\t\t\t\t\tassert.equal(segment.properties?.secondSource, 1);\n\n\t\t\t\t\tconst props3: PropsOrAdjust = {\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tthirdSource: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\tprops3,\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t\tUnassignedSequenceNumber,\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local2\");\n\t\t\t\t\tassert.equal(segment.properties?.secondSource, 1);\n\t\t\t\t\tassert.equal(segment.properties?.thirdSource, 1);\n\n\t\t\t\t\tmergeTree.ackPendingSegment({\n\t\t\t\t\t\top: {\n\t\t\t\t\t\t\tpos1: annotateStart,\n\t\t\t\t\t\t\tpos2: annotateEnd,\n\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsequencedMessage: {\n\t\t\t\t\t\t\tsequenceNumber: ++currentSequenceNumber,\n\t\t\t\t\t\t} as unknown as ISequencedDocumentMessage,\n\t\t\t\t\t});\n\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local2\");\n\t\t\t\t\tassert.equal(segment.properties?.secondSource, 1);\n\t\t\t\t\tassert.equal(segment.properties?.thirdSource, 1);\n\n\t\t\t\t\tmergeTree.ackPendingSegment({\n\t\t\t\t\t\top: {\n\t\t\t\t\t\t\tpos1: annotateStart,\n\t\t\t\t\t\t\tpos2: annotateEnd,\n\t\t\t\t\t\t\t...props2,\n\t\t\t\t\t\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsequencedMessage: {\n\t\t\t\t\t\t\tsequenceNumber: ++currentSequenceNumber,\n\t\t\t\t\t\t} as unknown as ISequencedDocumentMessage,\n\t\t\t\t\t});\n\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local2\");\n\t\t\t\t\tassert.equal(segment.properties?.secondSource, 1);\n\t\t\t\t\tassert.equal(segment.properties?.thirdSource, 1);\n\n\t\t\t\t\tmergeTree.ackPendingSegment({\n\t\t\t\t\t\top: {\n\t\t\t\t\t\t\tpos1: annotateStart,\n\t\t\t\t\t\t\tpos2: annotateEnd,\n\t\t\t\t\t\t\t...props3,\n\t\t\t\t\t\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsequencedMessage: {\n\t\t\t\t\t\t\tsequenceNumber: ++currentSequenceNumber,\n\t\t\t\t\t\t} as unknown as ISequencedDocumentMessage,\n\t\t\t\t\t});\n\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local2\");\n\t\t\t\t\tassert.equal(segment.properties?.secondSource, 1);\n\t\t\t\t\tassert.equal(segment.properties?.thirdSource, 1);\n\t\t\t\t});\n\n\t\t\t\tit(\"two local changes with interleaved remote\", () => {\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprops: { secondSource: \"local2\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t\tUnassignedSequenceNumber,\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tmergeTree.ackPendingSegment({\n\t\t\t\t\t\top: {\n\t\t\t\t\t\t\tpos1: annotateStart,\n\t\t\t\t\t\t\tpos2: annotateEnd,\n\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsequencedMessage: {\n\t\t\t\t\t\t\tsequenceNumber: ++currentSequenceNumber,\n\t\t\t\t\t\t} as unknown as ISequencedDocumentMessage,\n\t\t\t\t\t});\n\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprops: { propertySource: \"remote\", remoteOnly: 1, secondSource: \"remote\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tremoteClientId,\n\t\t\t\t\t\t++currentSequenceNumber,\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\n\t\t\t\t\tassert.equal(segment.properties?.remoteOnly, 1);\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"remote\");\n\t\t\t\t\tassert.equal(segment.properties?.secondSource, \"local2\");\n\t\t\t\t});\n\t\t\t});\n\t\t\tdescribe(\"remote first\", () => {\n\t\t\t\tbeforeEach(() => {\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprops: { propertySource: \"remote\", remoteProperty: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tremoteClientId,\n\t\t\t\t\t\t++currentSequenceNumber,\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t);\n\t\t\t\t\tassert(segmentInfo.segment?.segmentGroups?.size !== 0);\n\t\t\t\t});\n\t\t\t\tit(\"remote only\", () => {\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"remote\");\n\t\t\t\t\tassert.equal(segment.properties?.remoteProperty, 1);\n\t\t\t\t});\n\n\t\t\t\tit(\"split remote\", () => {\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t);\n\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\tconst splitSegment = splitAt(mergeTree, annotateStart + 1)!;\n\t\t\t\t\tassertMergeNode(splitSegment);\n\t\t\t\t\tassert.notEqual(segmentInfo.segment?.ordinal, splitSegment.ordinal);\n\t\t\t\t\tassert.equal(splitSegment.properties?.propertySource, \"remote\");\n\t\t\t\t\tassert.equal(splitSegment.properties?.remoteProperty, 1);\n\t\t\t\t});\n\n\t\t\t\tit(\"remote before unsequenced local\", () => {\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprops: { propertySource: \"local\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t\tUnassignedSequenceNumber,\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local\");\n\t\t\t\t\tassert.equal(segment.properties?.remoteProperty, 1);\n\t\t\t\t});\n\n\t\t\t\tit(\"remote before sequenced local\", () => {\n\t\t\t\t\tconst props: PropsOrAdjust = {\n\t\t\t\t\t\tprops: { propertySource: \"local\" },\n\t\t\t\t\t};\n\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t);\n\t\t\t\t\tassert(segmentInfo.segment?.segmentGroups?.empty !== false);\n\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\tprops,\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t\tUnassignedSequenceNumber,\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tassert.equal(segmentInfo.segment?.segmentGroups?.size, 1);\n\n\t\t\t\t\tmergeTree.ackPendingSegment({\n\t\t\t\t\t\top: {\n\t\t\t\t\t\t\tpos1: annotateStart,\n\t\t\t\t\t\t\tpos2: annotateEnd,\n\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsequencedMessage: {\n\t\t\t\t\t\t\tsequenceNumber: ++currentSequenceNumber,\n\t\t\t\t\t\t} as unknown as ISequencedDocumentMessage,\n\t\t\t\t\t});\n\n\t\t\t\t\tassert(segmentInfo.segment?.segmentGroups?.empty);\n\t\t\t\t\tassert.equal(segmentInfo.segment?.properties?.propertySource, \"local\");\n\t\t\t\t\tassert.equal(segmentInfo.segment?.properties?.remoteProperty, 1);\n\t\t\t\t});\n\t\t\t});\n\t\t\tdescribe(\"local with rewrite first\", () => {\n\t\t\t\tconst props: PropsOrAdjust = {\n\t\t\t\t\tprops: { propertySource: \"local\" },\n\t\t\t\t};\n\t\t\t\tbeforeEach(() => {\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\tprops,\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t\tUnassignedSequenceNumber,\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"unsequenced local after unsequenced local\", () => {\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprops: { propertySource: \"local2\", secondProperty: \"local\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t\tUnassignedSequenceNumber,\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local2\");\n\t\t\t\t\tassert.equal(segment.properties?.secondProperty, \"local\");\n\t\t\t\t});\n\n\t\t\t\tit(\"unsequenced local before remote\", () => {\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprops: { propertySource: \"remote\", remoteProperty: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tremoteClientId,\n\t\t\t\t\t\t++currentSequenceNumber,\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\n\t\t\t\t\tassert.equal(segment.segmentGroups?.size, 1);\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local\");\n\t\t\t\t\tassert.equal(segment.properties?.remoteProperty, 1);\n\t\t\t\t});\n\n\t\t\t\tit(\"sequenced local before remote\", () => {\n\t\t\t\t\tmergeTree.ackPendingSegment({\n\t\t\t\t\t\top: {\n\t\t\t\t\t\t\tpos1: annotateStart,\n\t\t\t\t\t\t\tpos2: annotateEnd,\n\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsequencedMessage: {\n\t\t\t\t\t\t\tsequenceNumber: ++currentSequenceNumber,\n\t\t\t\t\t\t} as unknown as ISequencedDocumentMessage,\n\t\t\t\t\t});\n\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprops: { propertySource: \"remote\", remoteProperty: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tremoteClientId,\n\t\t\t\t\t\t++currentSequenceNumber,\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\n\t\t\t\t\tassert.equal(segment.segmentGroups?.size, 0);\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"remote\");\n\t\t\t\t\tassert.equal(segment.properties?.remoteProperty, 1);\n\t\t\t\t});\n\n\t\t\t\tit(\"two local changes with interleaved remote\", () => {\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprops: { secondSource: \"local2\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t\tUnassignedSequenceNumber,\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tmergeTree.ackPendingSegment({\n\t\t\t\t\t\top: {\n\t\t\t\t\t\t\tpos1: annotateStart,\n\t\t\t\t\t\t\tpos2: annotateEnd,\n\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsequencedMessage: {\n\t\t\t\t\t\t\tsequenceNumber: ++currentSequenceNumber,\n\t\t\t\t\t\t} as unknown as ISequencedDocumentMessage,\n\t\t\t\t\t});\n\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprops: { propertySource: \"remote\", remoteOnly: 1, secondSource: \"remote\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tremoteClientId,\n\t\t\t\t\t\t++currentSequenceNumber,\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tcurrentSequenceNumber,\n\t\t\t\t\t\tlocalClientId,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\n\t\t\t\t\tassert.equal(segment.properties?.remoteOnly, 1);\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"remote\");\n\t\t\t\t\tassert.equal(segment.properties?.secondSource, \"local2\");\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t});\n});\n"]}
1
+ {"version":3,"file":"mergeTree.annotate.spec.js","sourceRoot":"","sources":["../../src/test/mergeTree.annotate.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\nimport { strict as assert } from \"node:assert\";\n\nimport { ISequencedDocumentMessage } from \"@fluidframework/driver-definitions/internal\";\n\nimport { MergeTree } from \"../mergeTree.js\";\nimport { Marker, type ISegmentPrivate } from \"../mergeTreeNodes.js\";\nimport { MergeTreeDeltaType, ReferenceType } from \"../ops.js\";\nimport { LocalDefaultPerspective } from \"../perspective.js\";\nimport { assertMergeNode } from \"../segmentInfos.js\";\nimport type { PropsOrAdjust } from \"../segmentPropertiesManager.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { makeRemoteClient } from \"./testUtils.js\";\n\nfunction splitAt(mergeTree: MergeTree, pos: number): ISegmentPrivate | undefined {\n\tlet segment: ISegmentPrivate | undefined;\n\tmergeTree.mapRange(\n\t\t(seg) => {\n\t\t\tsegment = seg;\n\t\t\treturn false;\n\t\t},\n\t\tnew LocalDefaultPerspective(mergeTree.collabWindow.clientId),\n\t\tundefined,\n\t\tpos,\n\t\tpos + 1,\n\t\ttrue,\n\t);\n\treturn segment;\n}\n\ndescribe(\"MergeTree\", () => {\n\tlet mergeTree: MergeTree;\n\tconst remoteClient = makeRemoteClient({ clientId: 35 });\n\tconst localClientId = 17;\n\tlet currentSequenceNumber: number;\n\n\tconst annotateStart = 1;\n\tconst markerPosition = annotateStart + 2;\n\tconst annotateEnd = markerPosition + 2;\n\tconst splitPos = Math.floor((annotateEnd - annotateStart) / 2) + annotateStart;\n\n\tbeforeEach(() => {\n\t\tmergeTree = new MergeTree();\n\t\tmergeTree.insertSegments(\n\t\t\t0,\n\t\t\t[TextSegment.make(\"hello world!\")],\n\t\t\tmergeTree.localPerspective,\n\t\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\tundefined,\n\t\t);\n\n\t\tcurrentSequenceNumber = 0;\n\t\tmergeTree.insertSegments(\n\t\t\tmarkerPosition,\n\t\t\t[Marker.make(ReferenceType.Tile)],\n\t\t\tremoteClient.perspectiveAt({ refSeq: currentSequenceNumber }),\n\t\t\tremoteClient.stampAt({ seq: ++currentSequenceNumber }),\n\t\t\tundefined,\n\t\t);\n\t});\n\n\tdescribe(\"annotateRange\", () => {\n\t\tdescribe(\"not collaborating\", () => {\n\t\t\tit(\"remote\", () => {\n\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\tannotateStart,\n\t\t\t\t\tannotateEnd,\n\t\t\t\t\t{\n\t\t\t\t\t\tprops: { propertySource: \"remote\" },\n\t\t\t\t\t},\n\t\t\t\t\tremoteClient.perspectiveAt({ refSeq: currentSequenceNumber }),\n\t\t\t\t\tremoteClient.stampAt({ seq: currentSequenceNumber + 1 }),\n\t\t\t\t\tundefined as never,\n\t\t\t\t);\n\n\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\tannotateStart,\n\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t);\n\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\t\t\t\tassert.equal(segment?.properties?.propertySource, \"remote\");\n\t\t\t});\n\n\t\t\tit(\"local\", () => {\n\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\tannotateStart,\n\t\t\t\t\tannotateEnd,\n\t\t\t\t\t{\n\t\t\t\t\t\tprops: { propertySource: \"local\" },\n\t\t\t\t\t},\n\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\t\t\tundefined as never,\n\t\t\t\t);\n\n\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\tannotateStart,\n\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t);\n\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\t\t\t\tassert.equal(segment.properties?.propertySource, \"local\");\n\t\t\t});\n\t\t});\n\t\tdescribe(\"collaborating\", () => {\n\t\t\tbeforeEach(() => {\n\t\t\t\tmergeTree.startCollaboration(\n\t\t\t\t\tlocalClientId,\n\t\t\t\t\t/* minSeq: */ currentSequenceNumber,\n\t\t\t\t\t/* currentSeq: */ currentSequenceNumber,\n\t\t\t\t);\n\t\t\t});\n\t\t\tdescribe(\"local first\", () => {\n\t\t\t\tconst props: PropsOrAdjust = {\n\t\t\t\t\tprops: { propertySource: \"local\" },\n\t\t\t\t};\n\t\t\t\tbeforeEach(() => {\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\tprops,\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"unsequenced local\", () => {\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local\");\n\t\t\t\t});\n\n\t\t\t\tit(\"unsequenced local after unsequenced local\", () => {\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprops: { secondProperty: \"local\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\t\t\t\t\tassert.equal(segment.properties?.secondProperty, \"local\");\n\t\t\t\t});\n\n\t\t\t\tit(\"unsequenced local split\", () => {\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t);\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\tconst splitSegment = splitAt(mergeTree, splitPos)!;\n\t\t\t\t\tassertMergeNode(splitSegment);\n\t\t\t\t\tassert.notEqual(segmentInfo.segment?.ordinal, splitSegment.ordinal);\n\t\t\t\t\tassert.equal(splitSegment.properties?.propertySource, \"local\");\n\t\t\t\t});\n\n\t\t\t\tit(\"unsequenced local after unsequenced local split\", () => {\n\t\t\t\t\tconst secondChangeProps: PropsOrAdjust = {\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tsecondChange: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\tsecondChangeProps,\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst splitOnlyProps: PropsOrAdjust = {\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tsplitOnly: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tsplitPos,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\tsplitOnlyProps,\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\n\t\t\t\t\tconst splitSegmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tsplitPos,\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t);\n\t\t\t\t\tconst splitSegment = splitSegmentInfo.segment as ISegmentPrivate;\n\n\t\t\t\t\tassert.equal(segment.segmentGroups?.size, 2);\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local\");\n\t\t\t\t\tassert.equal(segment.properties?.secondChange, 1);\n\t\t\t\t\tassert(!segment.properties?.splitOnly);\n\n\t\t\t\t\tassert.equal(splitSegment.segmentGroups?.size, 3);\n\t\t\t\t\tassert.equal(splitSegment.properties?.propertySource, \"local\");\n\t\t\t\t\tassert.equal(splitSegment.properties?.secondChange, 1);\n\t\t\t\t\tassert.equal(splitSegment.properties?.splitOnly, 1);\n\n\t\t\t\t\tmergeTree.ackPendingSegment({\n\t\t\t\t\t\top: {\n\t\t\t\t\t\t\tpos1: annotateStart,\n\t\t\t\t\t\t\tpos2: annotateEnd,\n\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsequencedMessage: {\n\t\t\t\t\t\t\tsequenceNumber: ++currentSequenceNumber,\n\t\t\t\t\t\t} as unknown as ISequencedDocumentMessage,\n\t\t\t\t\t});\n\n\t\t\t\t\tassert.equal(segment.segmentGroups?.size, 1);\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local\");\n\t\t\t\t\tassert.equal(segment.properties?.secondChange, 1);\n\t\t\t\t\tassert(!segment.properties?.splitOnly);\n\n\t\t\t\t\tassert.equal(splitSegment?.segmentGroups?.size, 2);\n\t\t\t\t\tassert.equal(splitSegment.properties?.propertySource, \"local\");\n\t\t\t\t\tassert.equal(splitSegment.properties?.secondChange, 1);\n\t\t\t\t\tassert.equal(splitSegment.properties?.splitOnly, 1);\n\n\t\t\t\t\tmergeTree.ackPendingSegment({\n\t\t\t\t\t\top: {\n\t\t\t\t\t\t\tpos1: annotateStart,\n\t\t\t\t\t\t\tpos2: annotateEnd,\n\t\t\t\t\t\t\t...secondChangeProps,\n\t\t\t\t\t\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsequencedMessage: {\n\t\t\t\t\t\t\tsequenceNumber: ++currentSequenceNumber,\n\t\t\t\t\t\t} as unknown as ISequencedDocumentMessage,\n\t\t\t\t\t});\n\n\t\t\t\t\tassert.equal(segment.segmentGroups?.size, 0);\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local\");\n\t\t\t\t\tassert.equal(segment.properties?.secondChange, 1);\n\t\t\t\t\tassert(!segment.properties?.splitOnly);\n\n\t\t\t\t\tassert.equal(splitSegment.segmentGroups?.size, 1);\n\t\t\t\t\tassert.equal(splitSegment.properties?.propertySource, \"local\");\n\t\t\t\t\tassert.equal(splitSegment.properties?.secondChange, 1);\n\t\t\t\t\tassert.equal(splitSegment.properties?.splitOnly, 1);\n\n\t\t\t\t\tmergeTree.ackPendingSegment({\n\t\t\t\t\t\top: {\n\t\t\t\t\t\t\tpos1: splitPos,\n\t\t\t\t\t\t\tpos2: annotateEnd,\n\t\t\t\t\t\t\t...splitOnlyProps,\n\t\t\t\t\t\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsequencedMessage: {\n\t\t\t\t\t\t\tsequenceNumber: ++currentSequenceNumber,\n\t\t\t\t\t\t} as unknown as ISequencedDocumentMessage,\n\t\t\t\t\t});\n\n\t\t\t\t\tassert.equal(segment.segmentGroups?.size, 0);\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local\");\n\t\t\t\t\tassert.equal(segment.properties?.secondChange, 1);\n\t\t\t\t\tassert(!segment.properties?.splitOnly);\n\n\t\t\t\t\tassert.equal(splitSegment.segmentGroups?.size, 0);\n\t\t\t\t\tassert.equal(splitSegment.properties?.propertySource, \"local\");\n\t\t\t\t\tassert.equal(splitSegment.properties?.secondChange, 1);\n\t\t\t\t\tassert.equal(splitSegment.properties?.splitOnly, 1);\n\t\t\t\t});\n\n\t\t\t\tit(\"unsequenced local before remote\", () => {\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprops: { propertySource: \"remote\", remoteProperty: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tremoteClient.perspectiveAt({ refSeq: currentSequenceNumber }),\n\t\t\t\t\t\tremoteClient.stampAt({ seq: ++currentSequenceNumber }),\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\n\t\t\t\t\tassert.equal(segment.segmentGroups?.size, 1);\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local\");\n\t\t\t\t\tassert.equal(segment.properties?.remoteProperty, 1);\n\t\t\t\t});\n\n\t\t\t\tit(\"sequenced local\", () => {\n\t\t\t\t\tmergeTree.ackPendingSegment({\n\t\t\t\t\t\top: {\n\t\t\t\t\t\t\tpos1: annotateStart,\n\t\t\t\t\t\t\tpos2: annotateEnd,\n\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsequencedMessage: {\n\t\t\t\t\t\t\tsequenceNumber: ++currentSequenceNumber,\n\t\t\t\t\t\t} as unknown as ISequencedDocumentMessage,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\t\t\t\t\tassert.equal(segment.segmentGroups?.size, 0);\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local\");\n\t\t\t\t});\n\n\t\t\t\tit(\"sequenced local before remote\", () => {\n\t\t\t\t\tmergeTree.ackPendingSegment({\n\t\t\t\t\t\top: {\n\t\t\t\t\t\t\tpos1: annotateStart,\n\t\t\t\t\t\t\tpos2: annotateEnd,\n\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsequencedMessage: {\n\t\t\t\t\t\t\tsequenceNumber: ++currentSequenceNumber,\n\t\t\t\t\t\t} as unknown as ISequencedDocumentMessage,\n\t\t\t\t\t});\n\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprops: { propertySource: \"remote\", remoteProperty: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tremoteClient.perspectiveAt({ refSeq: currentSequenceNumber }),\n\t\t\t\t\t\tremoteClient.stampAt({ seq: ++currentSequenceNumber }),\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\n\t\t\t\t\tassert.equal(segment.segmentGroups?.size, 0);\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"remote\");\n\t\t\t\t\tassert.equal(segment.properties?.remoteProperty, 1);\n\t\t\t\t});\n\n\t\t\t\tit(\"three local changes\", () => {\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local\");\n\n\t\t\t\t\tconst props2: PropsOrAdjust = {\n\t\t\t\t\t\tprops: { propertySource: \"local2\", secondSource: 1 },\n\t\t\t\t\t};\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\tprops2,\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local2\");\n\t\t\t\t\tassert.equal(segment.properties?.secondSource, 1);\n\n\t\t\t\t\tconst props3: PropsOrAdjust = {\n\t\t\t\t\t\tprops: {\n\t\t\t\t\t\t\tthirdSource: 1,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\tprops3,\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local2\");\n\t\t\t\t\tassert.equal(segment.properties?.secondSource, 1);\n\t\t\t\t\tassert.equal(segment.properties?.thirdSource, 1);\n\n\t\t\t\t\tmergeTree.ackPendingSegment({\n\t\t\t\t\t\top: {\n\t\t\t\t\t\t\tpos1: annotateStart,\n\t\t\t\t\t\t\tpos2: annotateEnd,\n\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsequencedMessage: {\n\t\t\t\t\t\t\tsequenceNumber: ++currentSequenceNumber,\n\t\t\t\t\t\t} as unknown as ISequencedDocumentMessage,\n\t\t\t\t\t});\n\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local2\");\n\t\t\t\t\tassert.equal(segment.properties?.secondSource, 1);\n\t\t\t\t\tassert.equal(segment.properties?.thirdSource, 1);\n\n\t\t\t\t\tmergeTree.ackPendingSegment({\n\t\t\t\t\t\top: {\n\t\t\t\t\t\t\tpos1: annotateStart,\n\t\t\t\t\t\t\tpos2: annotateEnd,\n\t\t\t\t\t\t\t...props2,\n\t\t\t\t\t\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsequencedMessage: {\n\t\t\t\t\t\t\tsequenceNumber: ++currentSequenceNumber,\n\t\t\t\t\t\t} as unknown as ISequencedDocumentMessage,\n\t\t\t\t\t});\n\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local2\");\n\t\t\t\t\tassert.equal(segment.properties?.secondSource, 1);\n\t\t\t\t\tassert.equal(segment.properties?.thirdSource, 1);\n\n\t\t\t\t\tmergeTree.ackPendingSegment({\n\t\t\t\t\t\top: {\n\t\t\t\t\t\t\tpos1: annotateStart,\n\t\t\t\t\t\t\tpos2: annotateEnd,\n\t\t\t\t\t\t\t...props3,\n\t\t\t\t\t\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsequencedMessage: {\n\t\t\t\t\t\t\tsequenceNumber: ++currentSequenceNumber,\n\t\t\t\t\t\t} as unknown as ISequencedDocumentMessage,\n\t\t\t\t\t});\n\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local2\");\n\t\t\t\t\tassert.equal(segment.properties?.secondSource, 1);\n\t\t\t\t\tassert.equal(segment.properties?.thirdSource, 1);\n\t\t\t\t});\n\n\t\t\t\tit(\"two local changes with interleaved remote\", () => {\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprops: { secondSource: \"local2\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tmergeTree.ackPendingSegment({\n\t\t\t\t\t\top: {\n\t\t\t\t\t\t\tpos1: annotateStart,\n\t\t\t\t\t\t\tpos2: annotateEnd,\n\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsequencedMessage: {\n\t\t\t\t\t\t\tsequenceNumber: ++currentSequenceNumber,\n\t\t\t\t\t\t} as unknown as ISequencedDocumentMessage,\n\t\t\t\t\t});\n\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprops: { propertySource: \"remote\", remoteOnly: 1, secondSource: \"remote\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tremoteClient.perspectiveAt({ refSeq: currentSequenceNumber }),\n\t\t\t\t\t\tremoteClient.stampAt({ seq: ++currentSequenceNumber }),\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\n\t\t\t\t\tassert.equal(segment.properties?.remoteOnly, 1);\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"remote\");\n\t\t\t\t\tassert.equal(segment.properties?.secondSource, \"local2\");\n\t\t\t\t});\n\t\t\t});\n\t\t\tdescribe(\"remote first\", () => {\n\t\t\t\tbeforeEach(() => {\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprops: { propertySource: \"remote\", remoteProperty: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tremoteClient.perspectiveAt({ refSeq: currentSequenceNumber }),\n\t\t\t\t\t\tremoteClient.stampAt({ seq: ++currentSequenceNumber }),\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t);\n\t\t\t\t\tassert(segmentInfo.segment?.segmentGroups?.size !== 0);\n\t\t\t\t});\n\t\t\t\tit(\"remote only\", () => {\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"remote\");\n\t\t\t\t\tassert.equal(segment.properties?.remoteProperty, 1);\n\t\t\t\t});\n\n\t\t\t\tit(\"split remote\", () => {\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t);\n\n\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t\t\t\t\tconst splitSegment = splitAt(mergeTree, annotateStart + 1)!;\n\t\t\t\t\tassertMergeNode(splitSegment);\n\t\t\t\t\tassert.notEqual(segmentInfo.segment?.ordinal, splitSegment.ordinal);\n\t\t\t\t\tassert.equal(splitSegment.properties?.propertySource, \"remote\");\n\t\t\t\t\tassert.equal(splitSegment.properties?.remoteProperty, 1);\n\t\t\t\t});\n\n\t\t\t\tit(\"remote before unsequenced local\", () => {\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprops: { propertySource: \"local\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local\");\n\t\t\t\t\tassert.equal(segment.properties?.remoteProperty, 1);\n\t\t\t\t});\n\n\t\t\t\tit(\"remote before sequenced local\", () => {\n\t\t\t\t\tconst props: PropsOrAdjust = {\n\t\t\t\t\t\tprops: { propertySource: \"local\" },\n\t\t\t\t\t};\n\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t);\n\t\t\t\t\tassert(segmentInfo.segment?.segmentGroups?.empty !== false);\n\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\tprops,\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tassert.equal(segmentInfo.segment?.segmentGroups?.size, 1);\n\n\t\t\t\t\tmergeTree.ackPendingSegment({\n\t\t\t\t\t\top: {\n\t\t\t\t\t\t\tpos1: annotateStart,\n\t\t\t\t\t\t\tpos2: annotateEnd,\n\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsequencedMessage: {\n\t\t\t\t\t\t\tsequenceNumber: ++currentSequenceNumber,\n\t\t\t\t\t\t} as unknown as ISequencedDocumentMessage,\n\t\t\t\t\t});\n\n\t\t\t\t\tassert(segmentInfo.segment?.segmentGroups?.empty);\n\t\t\t\t\tassert.equal(segmentInfo.segment?.properties?.propertySource, \"local\");\n\t\t\t\t\tassert.equal(segmentInfo.segment?.properties?.remoteProperty, 1);\n\t\t\t\t});\n\t\t\t});\n\t\t\tdescribe(\"local with rewrite first\", () => {\n\t\t\t\tconst props: PropsOrAdjust = {\n\t\t\t\t\tprops: { propertySource: \"local\" },\n\t\t\t\t};\n\t\t\t\tbeforeEach(() => {\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\tprops,\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tit(\"unsequenced local after unsequenced local\", () => {\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprops: { propertySource: \"local2\", secondProperty: \"local\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local2\");\n\t\t\t\t\tassert.equal(segment.properties?.secondProperty, \"local\");\n\t\t\t\t});\n\n\t\t\t\tit(\"unsequenced local before remote\", () => {\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprops: { propertySource: \"remote\", remoteProperty: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tremoteClient.perspectiveAt({ refSeq: currentSequenceNumber }),\n\t\t\t\t\t\tremoteClient.stampAt({ seq: ++currentSequenceNumber }),\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\n\t\t\t\t\tassert.equal(segment.segmentGroups?.size, 1);\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"local\");\n\t\t\t\t\tassert.equal(segment.properties?.remoteProperty, 1);\n\t\t\t\t});\n\n\t\t\t\tit(\"sequenced local before remote\", () => {\n\t\t\t\t\tmergeTree.ackPendingSegment({\n\t\t\t\t\t\top: {\n\t\t\t\t\t\t\tpos1: annotateStart,\n\t\t\t\t\t\t\tpos2: annotateEnd,\n\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsequencedMessage: {\n\t\t\t\t\t\t\tsequenceNumber: ++currentSequenceNumber,\n\t\t\t\t\t\t} as unknown as ISequencedDocumentMessage,\n\t\t\t\t\t});\n\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprops: { propertySource: \"remote\", remoteProperty: 1 },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tremoteClient.perspectiveAt({ refSeq: currentSequenceNumber }),\n\t\t\t\t\t\tremoteClient.stampAt({ seq: ++currentSequenceNumber }),\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\n\t\t\t\t\tassert.equal(segment.segmentGroups?.size, 0);\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"remote\");\n\t\t\t\t\tassert.equal(segment.properties?.remoteProperty, 1);\n\t\t\t\t});\n\n\t\t\t\tit(\"two local changes with interleaved remote\", () => {\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprops: { secondSource: \"local2\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t\tmergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tmergeTree.ackPendingSegment({\n\t\t\t\t\t\top: {\n\t\t\t\t\t\t\tpos1: annotateStart,\n\t\t\t\t\t\t\tpos2: annotateEnd,\n\t\t\t\t\t\t\t...props,\n\t\t\t\t\t\t\ttype: MergeTreeDeltaType.ANNOTATE,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsequencedMessage: {\n\t\t\t\t\t\t\tsequenceNumber: ++currentSequenceNumber,\n\t\t\t\t\t\t} as unknown as ISequencedDocumentMessage,\n\t\t\t\t\t});\n\n\t\t\t\t\tmergeTree.annotateRange(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tannotateEnd,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tprops: { propertySource: \"remote\", remoteOnly: 1, secondSource: \"remote\" },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tremoteClient.perspectiveAt({ refSeq: currentSequenceNumber }),\n\t\t\t\t\t\tremoteClient.stampAt({ seq: ++currentSequenceNumber }),\n\t\t\t\t\t\tundefined as never,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst segmentInfo = mergeTree.getContainingSegment(\n\t\t\t\t\t\tannotateStart,\n\t\t\t\t\t\tmergeTree.localPerspective,\n\t\t\t\t\t);\n\t\t\t\t\tconst segment = segmentInfo.segment as ISegmentPrivate;\n\n\t\t\t\t\tassert.equal(segment.properties?.remoteOnly, 1);\n\t\t\t\t\tassert.equal(segment.properties?.propertySource, \"remote\");\n\t\t\t\t\tassert.equal(segment.properties?.secondSource, \"local2\");\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t});\n});\n"]}