@fluidframework/sequence 2.0.0-rc.1.0.4 → 2.0.0-rc.2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (379) hide show
  1. package/{.eslintrc.js → .eslintrc.cjs} +4 -1
  2. package/{.mocharc.js → .mocharc.cjs} +1 -1
  3. package/CHANGELOG.md +8 -0
  4. package/README.md +2 -2
  5. package/{api-extractor-esm.json → api-extractor-cjs.json} +5 -1
  6. package/api-extractor.json +1 -1
  7. package/api-report/sequence.api.md +15 -27
  8. package/dist/defaultMap.d.ts +10 -16
  9. package/dist/defaultMap.d.ts.map +1 -1
  10. package/dist/defaultMap.js +73 -70
  11. package/dist/defaultMap.js.map +1 -1
  12. package/dist/defaultMapInterfaces.d.ts +1 -8
  13. package/dist/defaultMapInterfaces.d.ts.map +1 -1
  14. package/dist/defaultMapInterfaces.js.map +1 -1
  15. package/dist/index.d.ts +11 -11
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +42 -42
  18. package/dist/index.js.map +1 -1
  19. package/dist/intervalCollection.d.ts +21 -15
  20. package/dist/intervalCollection.d.ts.map +1 -1
  21. package/dist/intervalCollection.js +59 -110
  22. package/dist/intervalCollection.js.map +1 -1
  23. package/dist/intervalIndex/endpointInRangeIndex.d.ts +3 -3
  24. package/dist/intervalIndex/endpointInRangeIndex.d.ts.map +1 -1
  25. package/dist/intervalIndex/endpointInRangeIndex.js +8 -8
  26. package/dist/intervalIndex/endpointInRangeIndex.js.map +1 -1
  27. package/dist/intervalIndex/endpointIndex.d.ts +3 -3
  28. package/dist/intervalIndex/endpointIndex.d.ts.map +1 -1
  29. package/dist/intervalIndex/endpointIndex.js +4 -4
  30. package/dist/intervalIndex/endpointIndex.js.map +1 -1
  31. package/dist/intervalIndex/idIntervalIndex.d.ts +2 -2
  32. package/dist/intervalIndex/idIntervalIndex.d.ts.map +1 -1
  33. package/dist/intervalIndex/idIntervalIndex.js +2 -2
  34. package/dist/intervalIndex/idIntervalIndex.js.map +1 -1
  35. package/dist/intervalIndex/index.d.ts +8 -8
  36. package/dist/intervalIndex/index.d.ts.map +1 -1
  37. package/dist/intervalIndex/index.js +16 -16
  38. package/dist/intervalIndex/index.js.map +1 -1
  39. package/dist/intervalIndex/intervalIndex.d.ts +1 -1
  40. package/dist/intervalIndex/intervalIndex.d.ts.map +1 -1
  41. package/dist/intervalIndex/intervalIndex.js.map +1 -1
  42. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts +7 -10
  43. package/dist/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -1
  44. package/dist/intervalIndex/overlappingIntervalsIndex.js +12 -13
  45. package/dist/intervalIndex/overlappingIntervalsIndex.js.map +1 -1
  46. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts +2 -2
  47. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -1
  48. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js +7 -7
  49. package/dist/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -1
  50. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts +2 -2
  51. package/dist/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -1
  52. package/dist/intervalIndex/sequenceIntervalIndexes.js.map +1 -1
  53. package/dist/intervalIndex/startpointInRangeIndex.d.ts +3 -3
  54. package/dist/intervalIndex/startpointInRangeIndex.d.ts.map +1 -1
  55. package/dist/intervalIndex/startpointInRangeIndex.js +8 -8
  56. package/dist/intervalIndex/startpointInRangeIndex.js.map +1 -1
  57. package/dist/intervalTree.d.ts +1 -1
  58. package/dist/intervalTree.d.ts.map +1 -1
  59. package/dist/intervalTree.js.map +1 -1
  60. package/dist/intervals/index.d.ts +3 -3
  61. package/dist/intervals/index.d.ts.map +1 -1
  62. package/dist/intervals/index.js +16 -16
  63. package/dist/intervals/index.js.map +1 -1
  64. package/dist/intervals/interval.d.ts +2 -2
  65. package/dist/intervals/interval.d.ts.map +1 -1
  66. package/dist/intervals/interval.js +2 -2
  67. package/dist/intervals/interval.js.map +1 -1
  68. package/dist/intervals/intervalUtils.d.ts +3 -3
  69. package/dist/intervals/intervalUtils.d.ts.map +1 -1
  70. package/dist/intervals/intervalUtils.js +1 -1
  71. package/dist/intervals/intervalUtils.js.map +1 -1
  72. package/dist/intervals/sequenceInterval.d.ts +2 -2
  73. package/dist/intervals/sequenceInterval.d.ts.map +1 -1
  74. package/dist/intervals/sequenceInterval.js +22 -23
  75. package/dist/intervals/sequenceInterval.js.map +1 -1
  76. package/dist/localValues.d.ts +2 -2
  77. package/dist/localValues.d.ts.map +1 -1
  78. package/dist/localValues.js.map +1 -1
  79. package/dist/package.json +3 -0
  80. package/dist/packageVersion.d.ts +1 -1
  81. package/dist/packageVersion.js +1 -1
  82. package/dist/packageVersion.js.map +1 -1
  83. package/dist/revertibles.d.ts +12 -12
  84. package/dist/revertibles.d.ts.map +1 -1
  85. package/dist/revertibles.js +26 -26
  86. package/dist/revertibles.js.map +1 -1
  87. package/dist/sequence-alpha.d.ts +172 -13
  88. package/dist/sequence-beta.d.ts +2 -0
  89. package/dist/sequence-public.d.ts +2 -0
  90. package/dist/sequence-untrimmed.d.ts +73 -14
  91. package/dist/sequence.d.ts +48 -5
  92. package/dist/sequence.d.ts.map +1 -1
  93. package/dist/sequence.js +103 -29
  94. package/dist/sequence.js.map +1 -1
  95. package/dist/sequenceFactory.d.ts +4 -1
  96. package/dist/sequenceFactory.d.ts.map +1 -1
  97. package/dist/sequenceFactory.js +8 -5
  98. package/dist/sequenceFactory.js.map +1 -1
  99. package/dist/sharedIntervalCollection.d.ts +2 -2
  100. package/dist/sharedIntervalCollection.d.ts.map +1 -1
  101. package/dist/sharedIntervalCollection.js +5 -5
  102. package/dist/sharedIntervalCollection.js.map +1 -1
  103. package/dist/sharedSequence.d.ts +1 -1
  104. package/dist/sharedSequence.d.ts.map +1 -1
  105. package/dist/sharedSequence.js +2 -2
  106. package/dist/sharedSequence.js.map +1 -1
  107. package/dist/sharedString.d.ts +2 -2
  108. package/dist/sharedString.d.ts.map +1 -1
  109. package/dist/sharedString.js +6 -6
  110. package/dist/sharedString.js.map +1 -1
  111. package/dist/tsdoc-metadata.json +1 -1
  112. package/lib/{defaultMap.d.mts → defaultMap.d.ts} +11 -17
  113. package/lib/defaultMap.d.ts.map +1 -0
  114. package/lib/{defaultMap.mjs → defaultMap.js} +72 -69
  115. package/lib/defaultMap.js.map +1 -0
  116. package/lib/{defaultMapInterfaces.d.mts → defaultMapInterfaces.d.ts} +2 -9
  117. package/lib/defaultMapInterfaces.d.ts.map +1 -0
  118. package/lib/{defaultMapInterfaces.mjs → defaultMapInterfaces.js} +1 -1
  119. package/lib/defaultMapInterfaces.js.map +1 -0
  120. package/lib/{index.d.mts → index.d.ts} +24 -12
  121. package/lib/index.d.ts.map +1 -0
  122. package/lib/{index.mjs → index.js} +11 -11
  123. package/lib/index.js.map +1 -0
  124. package/lib/{intervalCollection.d.mts → intervalCollection.d.ts} +22 -16
  125. package/lib/intervalCollection.d.ts.map +1 -0
  126. package/lib/{intervalCollection.mjs → intervalCollection.js} +23 -74
  127. package/lib/intervalCollection.js.map +1 -0
  128. package/lib/intervalIndex/{endpointInRangeIndex.d.mts → endpointInRangeIndex.d.ts} +4 -4
  129. package/lib/intervalIndex/endpointInRangeIndex.d.ts.map +1 -0
  130. package/lib/intervalIndex/{endpointInRangeIndex.mjs → endpointInRangeIndex.js} +3 -3
  131. package/lib/intervalIndex/endpointInRangeIndex.js.map +1 -0
  132. package/lib/intervalIndex/{endpointIndex.d.mts → endpointIndex.d.ts} +4 -4
  133. package/lib/intervalIndex/endpointIndex.d.ts.map +1 -0
  134. package/lib/intervalIndex/{endpointIndex.mjs → endpointIndex.js} +2 -2
  135. package/lib/intervalIndex/endpointIndex.js.map +1 -0
  136. package/lib/intervalIndex/{idIntervalIndex.d.mts → idIntervalIndex.d.ts} +3 -3
  137. package/lib/intervalIndex/idIntervalIndex.d.ts.map +1 -0
  138. package/lib/intervalIndex/{idIntervalIndex.mjs → idIntervalIndex.js} +2 -2
  139. package/lib/intervalIndex/idIntervalIndex.js.map +1 -0
  140. package/lib/intervalIndex/{index.d.mts → index.d.ts} +9 -9
  141. package/lib/intervalIndex/index.d.ts.map +1 -0
  142. package/lib/intervalIndex/{index.mjs → index.js} +7 -7
  143. package/lib/intervalIndex/index.js.map +1 -0
  144. package/lib/intervalIndex/{intervalIndex.d.mts → intervalIndex.d.ts} +2 -2
  145. package/lib/intervalIndex/intervalIndex.d.ts.map +1 -0
  146. package/lib/intervalIndex/{intervalIndex.mjs → intervalIndex.js} +1 -1
  147. package/lib/intervalIndex/intervalIndex.js.map +1 -0
  148. package/lib/intervalIndex/{intervalIndexUtils.d.mts → intervalIndexUtils.d.ts} +1 -1
  149. package/lib/intervalIndex/intervalIndexUtils.d.ts.map +1 -0
  150. package/lib/intervalIndex/{intervalIndexUtils.mjs → intervalIndexUtils.js} +1 -1
  151. package/lib/intervalIndex/intervalIndexUtils.js.map +1 -0
  152. package/lib/intervalIndex/{overlappingIntervalsIndex.d.mts → overlappingIntervalsIndex.d.ts} +8 -11
  153. package/lib/intervalIndex/overlappingIntervalsIndex.d.ts.map +1 -0
  154. package/lib/intervalIndex/{overlappingIntervalsIndex.mjs → overlappingIntervalsIndex.js} +8 -9
  155. package/lib/intervalIndex/overlappingIntervalsIndex.js.map +1 -0
  156. package/lib/intervalIndex/{overlappingSequenceIntervalsIndex.d.mts → overlappingSequenceIntervalsIndex.d.ts} +3 -3
  157. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.ts.map +1 -0
  158. package/lib/intervalIndex/{overlappingSequenceIntervalsIndex.mjs → overlappingSequenceIntervalsIndex.js} +3 -3
  159. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.js.map +1 -0
  160. package/lib/intervalIndex/{sequenceIntervalIndexes.d.mts → sequenceIntervalIndexes.d.ts} +3 -3
  161. package/lib/intervalIndex/sequenceIntervalIndexes.d.ts.map +1 -0
  162. package/lib/intervalIndex/{sequenceIntervalIndexes.mjs → sequenceIntervalIndexes.js} +1 -1
  163. package/lib/intervalIndex/sequenceIntervalIndexes.js.map +1 -0
  164. package/lib/intervalIndex/{startpointInRangeIndex.d.mts → startpointInRangeIndex.d.ts} +4 -4
  165. package/lib/intervalIndex/startpointInRangeIndex.d.ts.map +1 -0
  166. package/lib/intervalIndex/{startpointInRangeIndex.mjs → startpointInRangeIndex.js} +3 -3
  167. package/lib/intervalIndex/startpointInRangeIndex.js.map +1 -0
  168. package/lib/{intervalTree.d.mts → intervalTree.d.ts} +2 -2
  169. package/lib/intervalTree.d.ts.map +1 -0
  170. package/lib/{intervalTree.mjs → intervalTree.js} +1 -1
  171. package/lib/intervalTree.js.map +1 -0
  172. package/lib/intervals/{index.d.mts → index.d.ts} +4 -4
  173. package/lib/intervals/index.d.ts.map +1 -0
  174. package/lib/intervals/{index.mjs → index.js} +4 -4
  175. package/lib/intervals/index.js.map +1 -0
  176. package/lib/intervals/{interval.d.mts → interval.d.ts} +3 -3
  177. package/lib/intervals/{interval.d.mts.map → interval.d.ts.map} +1 -1
  178. package/lib/intervals/{interval.mjs → interval.js} +2 -2
  179. package/lib/intervals/interval.js.map +1 -0
  180. package/lib/intervals/{intervalUtils.d.mts → intervalUtils.d.ts} +4 -4
  181. package/lib/intervals/intervalUtils.d.ts.map +1 -0
  182. package/lib/intervals/{intervalUtils.mjs → intervalUtils.js} +3 -2
  183. package/lib/intervals/intervalUtils.js.map +1 -0
  184. package/lib/intervals/{sequenceInterval.d.mts → sequenceInterval.d.ts} +3 -3
  185. package/lib/intervals/sequenceInterval.d.ts.map +1 -0
  186. package/lib/intervals/{sequenceInterval.mjs → sequenceInterval.js} +5 -4
  187. package/lib/intervals/{sequenceInterval.mjs.map → sequenceInterval.js.map} +1 -1
  188. package/lib/{localValues.d.mts → localValues.d.ts} +3 -3
  189. package/lib/{localValues.d.mts.map → localValues.d.ts.map} +1 -1
  190. package/lib/{localValues.mjs → localValues.js} +1 -1
  191. package/lib/localValues.js.map +1 -0
  192. package/lib/{packageVersion.d.mts → packageVersion.d.ts} +2 -2
  193. package/lib/packageVersion.d.ts.map +1 -0
  194. package/lib/{packageVersion.mjs → packageVersion.js} +2 -2
  195. package/lib/packageVersion.js.map +1 -0
  196. package/lib/{revertibles.d.mts → revertibles.d.ts} +13 -13
  197. package/lib/revertibles.d.ts.map +1 -0
  198. package/lib/{revertibles.mjs → revertibles.js} +11 -10
  199. package/lib/revertibles.js.map +1 -0
  200. package/lib/{sequence-alpha.d.mts → sequence-alpha.d.ts} +185 -13
  201. package/lib/{sequence-public.d.mts → sequence-beta.d.ts} +15 -0
  202. package/lib/{sequence-beta.d.mts → sequence-public.d.ts} +15 -0
  203. package/lib/{sequence-untrimmed.d.mts → sequence-untrimmed.d.ts} +86 -14
  204. package/lib/{sequence.d.mts → sequence.d.ts} +49 -6
  205. package/lib/sequence.d.ts.map +1 -0
  206. package/lib/{sequence.mjs → sequence.js} +100 -29
  207. package/lib/sequence.js.map +1 -0
  208. package/lib/{sequenceDeltaEvent.d.mts → sequenceDeltaEvent.d.ts} +1 -1
  209. package/lib/sequenceDeltaEvent.d.ts.map +1 -0
  210. package/lib/{sequenceDeltaEvent.mjs → sequenceDeltaEvent.js} +1 -1
  211. package/lib/sequenceDeltaEvent.js.map +1 -0
  212. package/lib/{sequenceFactory.d.mts → sequenceFactory.d.ts} +5 -2
  213. package/lib/sequenceFactory.d.ts.map +1 -0
  214. package/lib/{sequenceFactory.mjs → sequenceFactory.js} +6 -3
  215. package/lib/sequenceFactory.js.map +1 -0
  216. package/lib/{sharedIntervalCollection.d.mts → sharedIntervalCollection.d.ts} +3 -3
  217. package/lib/sharedIntervalCollection.d.ts.map +1 -0
  218. package/lib/{sharedIntervalCollection.mjs → sharedIntervalCollection.js} +4 -4
  219. package/lib/sharedIntervalCollection.js.map +1 -0
  220. package/lib/{sharedSequence.d.mts → sharedSequence.d.ts} +2 -2
  221. package/lib/sharedSequence.d.ts.map +1 -0
  222. package/lib/{sharedSequence.mjs → sharedSequence.js} +2 -2
  223. package/lib/sharedSequence.js.map +1 -0
  224. package/lib/{sharedString.d.mts → sharedString.d.ts} +3 -3
  225. package/lib/sharedString.d.ts.map +1 -0
  226. package/lib/{sharedString.mjs → sharedString.js} +3 -3
  227. package/lib/sharedString.js.map +1 -0
  228. package/lib/test/collections.intervalTree.js +73 -0
  229. package/lib/test/collections.intervalTree.js.map +1 -0
  230. package/lib/test/createSnapshotFiles.js +15 -0
  231. package/lib/test/createSnapshotFiles.js.map +1 -0
  232. package/lib/test/dirname.cjs +16 -0
  233. package/lib/test/dirname.cjs.map +1 -0
  234. package/lib/test/endpointInRangeIndex.spec.js +182 -0
  235. package/lib/test/endpointInRangeIndex.spec.js.map +1 -0
  236. package/lib/test/fuzz/fuzzUtils.js +250 -0
  237. package/lib/test/fuzz/fuzzUtils.js.map +1 -0
  238. package/lib/test/fuzz/intervalCollection.fuzz.spec.js +200 -0
  239. package/lib/test/fuzz/intervalCollection.fuzz.spec.js.map +1 -0
  240. package/lib/test/fuzz/intervalRevertibles.fuzz.spec.js +129 -0
  241. package/lib/test/fuzz/intervalRevertibles.fuzz.spec.js.map +1 -0
  242. package/lib/test/fuzz/sharedString.fuzz.spec.js +91 -0
  243. package/lib/test/fuzz/sharedString.fuzz.spec.js.map +1 -0
  244. package/lib/test/generateSharedStrings.js +138 -0
  245. package/lib/test/generateSharedStrings.js.map +1 -0
  246. package/lib/test/intervalCollection.detached.spec.js +126 -0
  247. package/lib/test/intervalCollection.detached.spec.js.map +1 -0
  248. package/lib/test/intervalCollection.events.spec.js +491 -0
  249. package/lib/test/intervalCollection.events.spec.js.map +1 -0
  250. package/lib/test/intervalCollection.perf.spec.js +88 -0
  251. package/lib/test/intervalCollection.perf.spec.js.map +1 -0
  252. package/lib/test/intervalCollection.snapshot.spec.js +171 -0
  253. package/lib/test/intervalCollection.snapshot.spec.js.map +1 -0
  254. package/lib/test/intervalCollection.spec.js +1660 -0
  255. package/lib/test/intervalCollection.spec.js.map +1 -0
  256. package/lib/test/intervalIndexTestUtils.js +49 -0
  257. package/lib/test/intervalIndexTestUtils.js.map +1 -0
  258. package/lib/test/intervalRebasing.spec.js +589 -0
  259. package/lib/test/intervalRebasing.spec.js.map +1 -0
  260. package/lib/test/intervalStashedOps.spec.js +142 -0
  261. package/lib/test/intervalStashedOps.spec.js.map +1 -0
  262. package/lib/test/intervalTestUtils.js +81 -0
  263. package/lib/test/intervalTestUtils.js.map +1 -0
  264. package/lib/test/marshalling.spec.js +55 -0
  265. package/lib/test/marshalling.spec.js.map +1 -0
  266. package/lib/test/memory/sharedSequence.spec.js +82 -0
  267. package/lib/test/memory/sharedSequence.spec.js.map +1 -0
  268. package/lib/test/memory/sharedString.spec.js +134 -0
  269. package/lib/test/memory/sharedString.spec.js.map +1 -0
  270. package/lib/test/overlappingSequenceIntervalsIndex.spec.js +348 -0
  271. package/lib/test/overlappingSequenceIntervalsIndex.spec.js.map +1 -0
  272. package/lib/test/partialLoad.spec.js +211 -0
  273. package/lib/test/partialLoad.spec.js.map +1 -0
  274. package/lib/test/rebasing.spec.js +81 -0
  275. package/lib/test/rebasing.spec.js.map +1 -0
  276. package/lib/test/reentrancy.spec.js +174 -0
  277. package/lib/test/reentrancy.spec.js.map +1 -0
  278. package/lib/test/revertibles.spec.js +971 -0
  279. package/lib/test/revertibles.spec.js.map +1 -0
  280. package/lib/test/sequenceDeltaEvent.spec.js +2144 -0
  281. package/lib/test/sequenceDeltaEvent.spec.js.map +1 -0
  282. package/lib/test/sharedIntervalCollection.spec.js +159 -0
  283. package/lib/test/sharedIntervalCollection.spec.js.map +1 -0
  284. package/lib/test/sharedString.spec.js +532 -0
  285. package/lib/test/sharedString.spec.js.map +1 -0
  286. package/lib/test/snapshotEmptyProps.spec.js +45 -0
  287. package/lib/test/snapshotEmptyProps.spec.js.map +1 -0
  288. package/lib/test/snapshotVersion.spec.js +149 -0
  289. package/lib/test/snapshotVersion.spec.js.map +1 -0
  290. package/lib/test/startpointInRangeIndex.spec.js +182 -0
  291. package/lib/test/startpointInRangeIndex.spec.js.map +1 -0
  292. package/lib/test/subSequence.spec.js +92 -0
  293. package/lib/test/subSequence.spec.js.map +1 -0
  294. package/lib/test/types/validateSequencePrevious.generated.js +162 -0
  295. package/lib/test/types/validateSequencePrevious.generated.js.map +1 -0
  296. package/lib/test/v1IntervalCollectionHelpers.js +93 -0
  297. package/lib/test/v1IntervalCollectionHelpers.js.map +1 -0
  298. package/package.json +66 -60
  299. package/src/defaultMap.ts +97 -123
  300. package/src/defaultMapInterfaces.ts +1 -9
  301. package/src/index.ts +15 -11
  302. package/src/intervalCollection.ts +57 -84
  303. package/src/intervalIndex/endpointInRangeIndex.ts +4 -4
  304. package/src/intervalIndex/endpointIndex.ts +3 -3
  305. package/src/intervalIndex/idIntervalIndex.ts +3 -4
  306. package/src/intervalIndex/index.ts +8 -8
  307. package/src/intervalIndex/intervalIndex.ts +1 -1
  308. package/src/intervalIndex/overlappingIntervalsIndex.ts +10 -11
  309. package/src/intervalIndex/overlappingSequenceIntervalsIndex.ts +4 -4
  310. package/src/intervalIndex/sequenceIntervalIndexes.ts +2 -2
  311. package/src/intervalIndex/startpointInRangeIndex.ts +4 -4
  312. package/src/intervalTree.ts +1 -1
  313. package/src/intervals/index.ts +3 -3
  314. package/src/intervals/interval.ts +2 -4
  315. package/src/intervals/intervalUtils.ts +3 -3
  316. package/src/intervals/sequenceInterval.ts +3 -4
  317. package/src/localValues.ts +2 -2
  318. package/src/packageVersion.ts +1 -1
  319. package/src/revertibles.ts +13 -13
  320. package/src/sequence.ts +126 -44
  321. package/src/sequenceFactory.ts +5 -2
  322. package/src/sharedIntervalCollection.ts +5 -5
  323. package/src/sharedSequence.ts +1 -1
  324. package/src/sharedString.ts +2 -2
  325. package/tsconfig.cjs.json +7 -0
  326. package/tsconfig.json +2 -5
  327. package/lib/defaultMap.d.mts.map +0 -1
  328. package/lib/defaultMap.mjs.map +0 -1
  329. package/lib/defaultMapInterfaces.d.mts.map +0 -1
  330. package/lib/defaultMapInterfaces.mjs.map +0 -1
  331. package/lib/index.d.mts.map +0 -1
  332. package/lib/index.mjs.map +0 -1
  333. package/lib/intervalCollection.d.mts.map +0 -1
  334. package/lib/intervalCollection.mjs.map +0 -1
  335. package/lib/intervalIndex/endpointInRangeIndex.d.mts.map +0 -1
  336. package/lib/intervalIndex/endpointInRangeIndex.mjs.map +0 -1
  337. package/lib/intervalIndex/endpointIndex.d.mts.map +0 -1
  338. package/lib/intervalIndex/endpointIndex.mjs.map +0 -1
  339. package/lib/intervalIndex/idIntervalIndex.d.mts.map +0 -1
  340. package/lib/intervalIndex/idIntervalIndex.mjs.map +0 -1
  341. package/lib/intervalIndex/index.d.mts.map +0 -1
  342. package/lib/intervalIndex/index.mjs.map +0 -1
  343. package/lib/intervalIndex/intervalIndex.d.mts.map +0 -1
  344. package/lib/intervalIndex/intervalIndex.mjs.map +0 -1
  345. package/lib/intervalIndex/intervalIndexUtils.d.mts.map +0 -1
  346. package/lib/intervalIndex/intervalIndexUtils.mjs.map +0 -1
  347. package/lib/intervalIndex/overlappingIntervalsIndex.d.mts.map +0 -1
  348. package/lib/intervalIndex/overlappingIntervalsIndex.mjs.map +0 -1
  349. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.d.mts.map +0 -1
  350. package/lib/intervalIndex/overlappingSequenceIntervalsIndex.mjs.map +0 -1
  351. package/lib/intervalIndex/sequenceIntervalIndexes.d.mts.map +0 -1
  352. package/lib/intervalIndex/sequenceIntervalIndexes.mjs.map +0 -1
  353. package/lib/intervalIndex/startpointInRangeIndex.d.mts.map +0 -1
  354. package/lib/intervalIndex/startpointInRangeIndex.mjs.map +0 -1
  355. package/lib/intervalTree.d.mts.map +0 -1
  356. package/lib/intervalTree.mjs.map +0 -1
  357. package/lib/intervals/index.d.mts.map +0 -1
  358. package/lib/intervals/index.mjs.map +0 -1
  359. package/lib/intervals/interval.mjs.map +0 -1
  360. package/lib/intervals/intervalUtils.d.mts.map +0 -1
  361. package/lib/intervals/intervalUtils.mjs.map +0 -1
  362. package/lib/intervals/sequenceInterval.d.mts.map +0 -1
  363. package/lib/localValues.mjs.map +0 -1
  364. package/lib/packageVersion.d.mts.map +0 -1
  365. package/lib/packageVersion.mjs.map +0 -1
  366. package/lib/revertibles.d.mts.map +0 -1
  367. package/lib/revertibles.mjs.map +0 -1
  368. package/lib/sequence.d.mts.map +0 -1
  369. package/lib/sequence.mjs.map +0 -1
  370. package/lib/sequenceDeltaEvent.d.mts.map +0 -1
  371. package/lib/sequenceDeltaEvent.mjs.map +0 -1
  372. package/lib/sequenceFactory.d.mts.map +0 -1
  373. package/lib/sequenceFactory.mjs.map +0 -1
  374. package/lib/sharedIntervalCollection.d.mts.map +0 -1
  375. package/lib/sharedIntervalCollection.mjs.map +0 -1
  376. package/lib/sharedSequence.d.mts.map +0 -1
  377. package/lib/sharedSequence.mjs.map +0 -1
  378. package/lib/sharedString.d.mts.map +0 -1
  379. package/lib/sharedString.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequenceDeltaEvent.spec.js","sourceRoot":"","sources":["../../src/test/sequenceDeltaEvent.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 \"assert\";\nimport { isNullOrUndefined } from \"util\";\nimport {\n\tcreateAnnotateRangeOp,\n\tcreateInsertSegmentOp,\n\tcreateRemoveRangeOp,\n\tIMergeTreeDeltaCallbackArgs,\n\tPropertySet,\n\tTextSegment,\n} from \"@fluidframework/merge-tree\";\n// eslint-disable-next-line import/no-internal-modules\nimport { TestClient } from \"@fluidframework/merge-tree/test\";\nimport { SequenceDeltaEvent } from \"../sequenceDeltaEvent.js\";\n\ninterface IExpectedSegmentInfo {\n\toffset: number;\n\tnumChar: number;\n\tprops: PropertySet;\n\tpropDeltas?: PropertySet;\n\ttext?: string;\n}\n\ndescribe(\"non-collab\", () => {\n\tconst userId = \"localUser\";\n\tlet client: TestClient;\n\n\tdescribe(\"insert\", () => {\n\t\tbefore(() => {\n\t\t\tclient = new TestClient();\n\t\t\tclient.startOrUpdateCollaboration(userId);\n\t\t});\n\n\t\tconst initialText = \"done\";\n\t\tconst beginningText = \"What's \";\n\t\tconst middleText = \" is\";\n\t\tconst endText = \" done\";\n\n\t\tit(\"initially\", () => {\n\t\t\tinsertText(0, initialText);\n\t\t});\n\n\t\tit(\"in the beginning\", () => {\n\t\t\tinsertText(0, beginningText);\n\t\t});\n\n\t\tit(\"in the end\", () => {\n\t\t\tinsertText(client.getLength(), endText);\n\t\t});\n\n\t\tit(\"in the middle\", () => {\n\t\t\tinsertText(initialText.length + beginningText.length, middleText);\n\t\t});\n\n\t\tfunction insertText(offset: number, text: string): void {\n\t\t\tlet deltaArgs: IMergeTreeDeltaCallbackArgs | undefined;\n\t\t\tclient.on(\"delta\", (opArgs, delta) => {\n\t\t\t\tdeltaArgs = delta;\n\t\t\t});\n\t\t\tconst op = client.insertTextLocal(offset, text);\n\n\t\t\tassert(deltaArgs);\n\t\t\tassert.equal(deltaArgs.deltaSegments.length, 1);\n\n\t\t\tassert(op);\n\t\t\tconst event = new SequenceDeltaEvent({ op }, deltaArgs, client);\n\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.position, offset);\n\t\t\tassert.equal(event.first.segment.cachedLength, text.length);\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\toffset + text.length,\n\t\t\t);\n\t\t\tconst segment = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment.text, text);\n\t\t}\n\t});\n\n\tdescribe(\"remove\", () => {\n\t\tbefore(() => {\n\t\t\tclient = new TestClient();\n\t\t\tclient.insertTextLocal(0, \"All is well!\");\n\t\t\tclient.startOrUpdateCollaboration(userId);\n\t\t});\n\n\t\tit(\"from the middle\", () => {\n\t\t\tremoveText(3, 7);\n\t\t});\n\n\t\tit(\"from the beginning\", () => {\n\t\t\tremoveText(0, 3);\n\t\t});\n\n\t\tit(\"from the end\", () => {\n\t\t\tremoveText(4, 5);\n\t\t});\n\n\t\tit(\"all\", () => {\n\t\t\tremoveText(0, client.getLength());\n\t\t});\n\n\t\tfunction removeText(start: number, end: number): void {\n\t\t\tlet deltaArgs: IMergeTreeDeltaCallbackArgs | undefined;\n\t\t\tclient.on(\"delta\", (opArgs, delta) => {\n\t\t\t\tdeltaArgs = delta;\n\t\t\t});\n\t\t\tconst op = client.removeRangeLocal(start, end);\n\n\t\t\tassert(deltaArgs);\n\t\t\tassert.equal(deltaArgs.deltaSegments.length, 1);\n\n\t\t\tassert(op);\n\t\t\tconst event = new SequenceDeltaEvent({ op }, deltaArgs, client);\n\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.position, start);\n\t\t\tassert.equal(event.first.segment.cachedLength, end - start);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, end);\n\t\t}\n\t});\n\n\tdescribe(\"annotate\", () => {\n\t\tbefore(() => {\n\t\t\tclient = new TestClient();\n\t\t\tclient.insertTextLocal(0, \"All is well!\");\n\t\t\tclient.startOrUpdateCollaboration(userId);\n\t\t});\n\n\t\tit(\"add property over separate range\", () => {\n\t\t\tannotateText(0, 3, { foo1: \"bar1\" }, [\n\t\t\t\t{ offset: 0, numChar: 3, props: { foo1: \"bar1\" }, propDeltas: { foo1: null } },\n\t\t\t]);\n\n\t\t\tannotateText(3, 7, { foo2: \"bar2\" }, [\n\t\t\t\t{ offset: 3, numChar: 4, props: { foo2: \"bar2\" }, propDeltas: { foo2: null } },\n\t\t\t]);\n\n\t\t\tannotateText(7, client.getLength(), { foo3: \"bar3\" }, [\n\t\t\t\t{ offset: 7, numChar: 5, props: { foo3: \"bar3\" }, propDeltas: { foo3: null } },\n\t\t\t]);\n\t\t});\n\n\t\tit(\"add property over overlapping runs\", () => {\n\t\t\tannotateText(2, 10, { foo: \"bar\" }, [\n\t\t\t\t{\n\t\t\t\t\toffset: 2,\n\t\t\t\t\tnumChar: 1,\n\t\t\t\t\tprops: { foo: \"bar\", foo1: \"bar1\" },\n\t\t\t\t\tpropDeltas: { foo: null },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\toffset: 3,\n\t\t\t\t\tnumChar: 4,\n\t\t\t\t\tprops: { foo: \"bar\", foo2: \"bar2\" },\n\t\t\t\t\tpropDeltas: { foo: null },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\toffset: 7,\n\t\t\t\t\tnumChar: 3,\n\t\t\t\t\tprops: { foo: \"bar\", foo3: \"bar3\" },\n\t\t\t\t\tpropDeltas: { foo: null },\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\tit(\"nullify all properties\", () => {\n\t\t\tannotateText(2, 10, { foo: undefined }, [\n\t\t\t\t{\n\t\t\t\t\toffset: 2,\n\t\t\t\t\tnumChar: 1,\n\t\t\t\t\tprops: { foo: undefined, foo1: \"bar1\" },\n\t\t\t\t\tpropDeltas: { foo: \"bar\" },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\toffset: 3,\n\t\t\t\t\tnumChar: 4,\n\t\t\t\t\tprops: { foo: undefined, foo2: \"bar2\" },\n\t\t\t\t\tpropDeltas: { foo: \"bar\" },\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\toffset: 7,\n\t\t\t\t\tnumChar: 3,\n\t\t\t\t\tprops: { foo: undefined, foo3: \"bar3\" },\n\t\t\t\t\tpropDeltas: { foo: \"bar\" },\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tannotateText(2, 3, { foo1: undefined }, [\n\t\t\t\t{\n\t\t\t\t\toffset: 2,\n\t\t\t\t\tnumChar: 1,\n\t\t\t\t\tprops: { foo: undefined, foo1: undefined },\n\t\t\t\t\tpropDeltas: { foo1: \"bar1\" },\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tannotateText(3, 7, { foo2: undefined }, [\n\t\t\t\t{\n\t\t\t\t\toffset: 3,\n\t\t\t\t\tnumChar: 4,\n\t\t\t\t\tprops: { foo: undefined, foo2: undefined },\n\t\t\t\t\tpropDeltas: { foo2: \"bar2\" },\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tannotateText(7, 10, { foo3: undefined }, [\n\t\t\t\t{\n\t\t\t\t\toffset: 7,\n\t\t\t\t\tnumChar: 3,\n\t\t\t\t\tprops: { foo: undefined, foo3: undefined },\n\t\t\t\t\tpropDeltas: { foo3: \"bar3\" },\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\tfunction annotateText(\n\t\t\tstart: number,\n\t\t\tend: number,\n\t\t\tnewProps: PropertySet,\n\t\t\texpected: IExpectedSegmentInfo[],\n\t\t): void {\n\t\t\tlet deltaArgs: IMergeTreeDeltaCallbackArgs | undefined;\n\t\t\tclient.on(\"delta\", (opArgs, delta) => {\n\t\t\t\tdeltaArgs = delta;\n\t\t\t});\n\t\t\tconst op = client.annotateRangeLocal(start, end, newProps);\n\n\t\t\tassert(deltaArgs);\n\t\t\tassert.equal(deltaArgs.deltaSegments.length, expected.length);\n\n\t\t\tassert(op);\n\t\t\tconst event = new SequenceDeltaEvent({ op }, deltaArgs, client);\n\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, start);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, end);\n\t\t\tassert.equal(event.ranges.length, expected.length);\n\t\t\tfor (let i = 0; i < expected.length; i = i + 1) {\n\t\t\t\tassert.equal(event.ranges[i].position, expected[i].offset);\n\t\t\t\tassert.equal(event.ranges[i].segment.cachedLength, expected[i].numChar);\n\t\t\t\tassert.equal(\n\t\t\t\t\tObject.keys(event.ranges[i].segment.properties ?? {}).length,\n\t\t\t\t\tObject.keys(expected[i].props).length,\n\t\t\t\t);\n\t\t\t\tfor (const key of Object.keys(event.ranges[i].segment.properties ?? {})) {\n\t\t\t\t\tassert.equal(event.ranges[i].segment.properties?.[key], expected[i].props[key]);\n\t\t\t\t}\n\t\t\t\tif (expected[i].propDeltas !== undefined) {\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tObject.keys(event.ranges[i].propertyDeltas).length,\n\t\t\t\t\t\tObject.keys(expected[i].propDeltas ?? {}).length,\n\t\t\t\t\t);\n\t\t\t\t\tfor (const key of Object.keys(event.ranges[i].propertyDeltas)) {\n\t\t\t\t\t\tassert.equal(\n\t\t\t\t\t\t\tevent.ranges[i].propertyDeltas[key],\n\t\t\t\t\t\t\texpected[i].propDeltas?.[key],\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tassert(event.ranges[i].propertyDeltas === undefined);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n});\n\ndescribe(\"collab\", () => {\n\tconst localUserId = \"localUser\";\n\tconst remoteUserId = \"remoteUser\";\n\tlet client: TestClient;\n\n\tdescribe(\"insert\", () => {\n\t\tbeforeEach(() => {\n\t\t\tclient = new TestClient();\n\t\t\tclient.insertTextLocal(0, \"The fox jumps over the dog\");\n\t\t\tclient.startOrUpdateCollaboration(localUserId);\n\t\t});\n\n\t\tit(\"separate regions, local before remote\", () => {\n\t\t\tconst localInsertPos = 4; // before \"brown\"\n\t\t\tconst localInsertText = \"quick brown \";\n\t\t\tconst remoteInsertPos = client.getLength() - 3; // before \"dog\"\n\t\t\tconst remoteInsertText = \"lazy \";\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localInsertMessage = client.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(localInsertPos, localInsertText),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tclient.applyMsg(localInsertMessage);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, localInsertPos);\n\t\t\tassert.equal(event.last.position, localInsertPos);\n\t\t\tassert.equal(event.first.segment.cachedLength, localInsertText.length);\n\t\t\tassert.equal(event.last.segment.cachedLength, localInsertText.length);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, localInsertText);\n\n\t\t\tconst remoteInsertMessage = client.makeOpMessage(\n\t\t\t\tcreateInsertSegmentOp(remoteInsertPos, new TextSegment(remoteInsertText)),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteInsertMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, remoteInsertPos + localInsertText.length);\n\t\t\tassert.equal(event.last.position, remoteInsertPos + localInsertText.length);\n\t\t\tassert.equal(event.first.segment.cachedLength, remoteInsertText.length);\n\t\t\tassert.equal(event.last.segment.cachedLength, remoteInsertText.length);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, remoteInsertText);\n\t\t});\n\n\t\tit(\"separate regions, remote before local\", () => {\n\t\t\tconst localInsertPos = client.getLength() - 3; // before \"dog\"\n\t\t\tconst localInsertText = \"lazy \";\n\t\t\tconst remoteInsertPos = 4; // before \"fox\"\n\t\t\tconst remoteInsertText = \"quick brown \";\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localInsertMessage = client.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(localInsertPos, localInsertText),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, localInsertPos);\n\t\t\tassert.equal(event.last.position, localInsertPos);\n\t\t\tassert.equal(event.first.segment.cachedLength, localInsertText.length);\n\t\t\tassert.equal(event.last.segment.cachedLength, localInsertText.length);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, localInsertText);\n\n\t\t\tconst remoteInsertMessage = client.makeOpMessage(\n\t\t\t\tcreateInsertSegmentOp(remoteInsertPos, new TextSegment(remoteInsertText)),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteInsertMessage);\n\n\t\t\tclient.applyMsg(localInsertMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, remoteInsertPos);\n\t\t\tassert.equal(event.last.position, remoteInsertPos);\n\t\t\tassert.equal(event.first.segment.cachedLength, remoteInsertText.length);\n\t\t\tassert.equal(event.last.segment.cachedLength, remoteInsertText.length);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, remoteInsertText);\n\t\t});\n\n\t\tit(\"at same position, local before remote\", () => {\n\t\t\tconst localInsertPos = 4; // before \"fox\"\n\t\t\tconst localInsertText = \"brown \";\n\t\t\tconst remoteInsertPos = 4; // before \"fox\"\n\t\t\tconst remoteInsertText = \"quick \";\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localInsertMessage = client.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(localInsertPos, localInsertText),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tclient.applyMsg(localInsertMessage);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, localInsertPos);\n\t\t\tassert.equal(event.last.position, localInsertPos);\n\t\t\tassert.equal(event.first.segment.cachedLength, localInsertText.length);\n\t\t\tassert.equal(event.last.segment.cachedLength, localInsertText.length);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, localInsertText);\n\n\t\t\tconst remoteInsertMessage = client.makeOpMessage(\n\t\t\t\tcreateInsertSegmentOp(remoteInsertPos, new TextSegment(remoteInsertText)),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteInsertMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, remoteInsertPos);\n\t\t\tassert.equal(event.last.position, remoteInsertPos);\n\t\t\tassert.equal(event.first.segment.cachedLength, remoteInsertText.length);\n\t\t\tassert.equal(event.last.segment.cachedLength, remoteInsertText.length);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.position, remoteInsertPos);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, remoteInsertText);\n\t\t});\n\n\t\tit(\"at same position, remote before local\", () => {\n\t\t\tconst localInsertPos = 4; // before \"fox\"\n\t\t\tconst localInsertText = \"quick \";\n\t\t\tconst remoteInsertPos = 4; // before \"fox\"\n\t\t\tconst remoteInsertText = \"brown \";\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localInsertMessage = client.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(localInsertPos, localInsertText),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.position, localInsertPos);\n\t\t\tassert.equal(event.last.position, localInsertPos);\n\t\t\tassert.equal(event.first.segment.cachedLength, localInsertText.length);\n\t\t\tassert.equal(event.last.segment.cachedLength, localInsertText.length);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, localInsertText);\n\n\t\t\tconst remoteInsertMessage = client.makeOpMessage(\n\t\t\t\tcreateInsertSegmentOp(remoteInsertPos, new TextSegment(remoteInsertText)),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteInsertMessage);\n\n\t\t\tclient.applyMsg(localInsertMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.position, remoteInsertPos + localInsertText.length);\n\t\t\tassert.equal(event.last.position, remoteInsertPos + localInsertText.length);\n\t\t\tassert.equal(event.first.segment.cachedLength, remoteInsertText.length);\n\t\t\tassert.equal(event.last.segment.cachedLength, remoteInsertText.length);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, remoteInsertText);\n\t\t});\n\n\t\tit(\"overlapping regions, local before remote\", () => {\n\t\t\tconst localInsertPos = 4; // before \"fox\"\n\t\t\tconst localInsertText = \"quick brown \";\n\t\t\tconst remoteInsertPos = 3; // before \"fox\"\n\t\t\tconst remoteInsertText = \" legendary\";\n\n\t\t\t// output: The legendary quick brown fox jumps over the dog\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localInsertMessage = client.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(localInsertPos, localInsertText),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tclient.applyMsg(localInsertMessage);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, localInsertPos);\n\t\t\tassert.equal(event.last.position, localInsertPos);\n\t\t\tassert.equal(event.first.segment.cachedLength, localInsertText.length);\n\t\t\tassert.equal(event.last.segment.cachedLength, localInsertText.length);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, localInsertText);\n\n\t\t\tconst remoteInsertMessage = client.makeOpMessage(\n\t\t\t\tcreateInsertSegmentOp(remoteInsertPos, new TextSegment(remoteInsertText)),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteInsertMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, remoteInsertPos);\n\t\t\tassert.equal(event.last.position, remoteInsertPos);\n\t\t\tassert.equal(event.first.segment.cachedLength, remoteInsertText.length);\n\t\t\tassert.equal(event.last.segment.cachedLength, remoteInsertText.length);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, remoteInsertText);\n\t\t});\n\n\t\tit(\"overlapping regions, remote before local\", () => {\n\t\t\tconst localInsertPos = 3; // before \"fox\"\n\t\t\tconst localInsertText = \" legendary\";\n\t\t\tconst remoteInsertPos = 4; // before \"fox\"\n\t\t\tconst remoteInsertText = \"quick brown \";\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localInsertMessage = client.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(localInsertPos, localInsertText),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, localInsertPos);\n\t\t\tassert.equal(event.last.position, localInsertPos);\n\t\t\tassert.equal(event.first.segment.cachedLength, localInsertText.length);\n\t\t\tassert.equal(event.last.segment.cachedLength, localInsertText.length);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, localInsertText);\n\n\t\t\tconst remoteInsertMessage = client.makeOpMessage(\n\t\t\t\tcreateInsertSegmentOp(remoteInsertPos, new TextSegment(remoteInsertText)),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteInsertMessage);\n\n\t\t\tclient.applyMsg(localInsertMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, remoteInsertPos + localInsertText.length);\n\t\t\tassert.equal(event.last.position, remoteInsertPos + localInsertText.length);\n\t\t\tassert.equal(event.first.segment.cachedLength, remoteInsertText.length);\n\t\t\tassert.equal(event.last.segment.cachedLength, remoteInsertText.length);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, remoteInsertText);\n\t\t});\n\n\t\tit(\"overlapping regions, multiple inserts: local, remote, remoteAfterLocal\", () => {\n\t\t\tconst localInsertPos = 4; // before \"fox\"\n\t\t\tconst localInsertText = \"brown \";\n\t\t\tconst remoteInsertPos1 = 4; // before \"fox\", and before local update\n\t\t\tconst remoteInsertText1 = \"quick \";\n\t\t\t// before \"fox\", but after local update\n\t\t\tconst remoteInsertPos2 =\n\t\t\t\tclient.getLength() - 3 + localInsertText.length + remoteInsertText1.length;\n\t\t\tconst remoteInsertText2 = \"lazy \";\n\n\t\t\t// output: The quick brown fox jumps over the lazy dog\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localInsertMessage = client.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(localInsertPos, localInsertText),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tclient.applyMsg(localInsertMessage);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, localInsertPos);\n\t\t\tassert.equal(event.last.position, localInsertPos);\n\t\t\tassert.equal(event.first.segment.cachedLength, localInsertText.length);\n\t\t\tassert.equal(event.last.segment.cachedLength, localInsertText.length);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, localInsertText);\n\n\t\t\tconst remoteInsertMessage1 = client.makeOpMessage(\n\t\t\t\tcreateInsertSegmentOp(remoteInsertPos1, new TextSegment(remoteInsertText1)),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteInsertMessage1);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, remoteInsertPos1);\n\t\t\tassert.equal(event.last.position, remoteInsertPos1);\n\t\t\tassert.equal(event.first.segment.cachedLength, remoteInsertText1.length);\n\t\t\tassert.equal(event.last.segment.cachedLength, remoteInsertText1.length);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, remoteInsertText1);\n\n\t\t\tconst remoteInsertMessage2 = client.makeOpMessage(\n\t\t\t\tcreateInsertSegmentOp(remoteInsertPos2, new TextSegment(remoteInsertText2)),\n\t\t\t\tcurrentSeqNumber + 3,\n\t\t\t\tcurrentSeqNumber + 1, // refseqnum\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteInsertMessage2);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, remoteInsertPos2);\n\t\t\tassert.equal(event.last.position, remoteInsertPos2);\n\t\t\tassert.equal(event.first.segment.cachedLength, remoteInsertText2.length);\n\t\t\tassert.equal(event.last.segment.cachedLength, remoteInsertText2.length);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tconst segment3 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment3.text, remoteInsertText2);\n\t\t});\n\n\t\tit(\"overlapping regions, multiple inserts: remote, local, localAfterRemote\", () => {\n\t\t\tconst localInsertPos1 = 4; // before \"fox\"\n\t\t\tconst localInsertText1 = \"quick \";\n\t\t\tconst remoteInsertPos = 4; // before \"fox\", and before local update\n\t\t\tconst remoteInsertText = \"brown \";\n\t\t\t// before \"dog\", after local update\n\t\t\tconst localInsertPos2 =\n\t\t\t\tclient.getLength() - 3 + remoteInsertText.length + localInsertText1.length;\n\t\t\tconst localInsertText2 = \"lazy \";\n\n\t\t\t// output: The quick brown fox jumps over the lazy dog\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localInsertMessage1 = client.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(localInsertPos1, localInsertText1),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, localInsertPos1);\n\t\t\tassert.equal(event.last.position, localInsertPos1);\n\t\t\tassert.equal(event.first.segment.cachedLength, localInsertText1.length);\n\t\t\tassert.equal(event.last.segment.cachedLength, localInsertText1.length);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, localInsertText1);\n\n\t\t\tconst remoteInsertMessage = client.makeOpMessage(\n\t\t\t\tcreateInsertSegmentOp(remoteInsertPos, new TextSegment(remoteInsertText)),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteInsertMessage);\n\n\t\t\tclient.applyMsg(localInsertMessage1);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, remoteInsertPos + localInsertText1.length);\n\t\t\tassert.equal(event.last.position, remoteInsertPos + localInsertText1.length);\n\t\t\tassert.equal(event.first.segment.cachedLength, remoteInsertText.length);\n\t\t\tassert.equal(event.last.segment.cachedLength, remoteInsertText.length);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, remoteInsertText);\n\n\t\t\tconst localInsertMessage2 = client.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(localInsertPos2, localInsertText2),\n\t\t\t\tcurrentSeqNumber + 3,\n\t\t\t\tcurrentSeqNumber + 1, // refseqnum\n\t\t\t);\n\n\t\t\tclient.applyMsg(localInsertMessage2);\n\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, localInsertPos2);\n\t\t\tassert.equal(event.last.position, localInsertPos2);\n\t\t\tassert.equal(event.first.segment.cachedLength, localInsertText2.length);\n\t\t\tassert.equal(event.last.segment.cachedLength, localInsertText2.length);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tconst segment3 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment3.text, localInsertText2);\n\t\t});\n\t});\n\n\tdescribe(\"delete\", () => {\n\t\tbeforeEach(() => {\n\t\t\tclient = new TestClient();\n\t\t\tclient.insertTextLocal(0, \"The quick brown fox jumps over the lazy dog\");\n\t\t\tclient.startOrUpdateCollaboration(localUserId);\n\t\t});\n\n\t\tit(\"separate regions, local before remote\", () => {\n\t\t\tconst localRemovePosStart = 4; // \"quick \"\n\t\t\tconst localRemovePosEnd = localRemovePosStart + 6;\n\t\t\tconst remoteRemovePosStart = client.getLength() - 8; // \"lazy \"\n\t\t\tconst remoteRemovePosEnd = remoteRemovePosStart + 5;\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localRemoveMessage = client.makeOpMessage(\n\t\t\t\tclient.removeRangeLocal(localRemovePosStart, localRemovePosEnd),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tclient.applyMsg(localRemoveMessage);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, localRemovePosStart);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, localRemovePosEnd);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, localRemovePosEnd - localRemovePosStart);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, \"quick \");\n\n\t\t\tconst remoteRemoveMessage = client.makeOpMessage(\n\t\t\t\tcreateRemoveRangeOp(remoteRemovePosStart, remoteRemovePosEnd),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteRemoveMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(\n\t\t\t\tevent.first.position,\n\t\t\t\tremoteRemovePosStart - localRemovePosEnd + localRemovePosStart,\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tremoteRemovePosEnd - localRemovePosEnd + localRemovePosStart,\n\t\t\t);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(\n\t\t\t\tevent.first.segment.cachedLength,\n\t\t\t\tremoteRemovePosEnd - remoteRemovePosStart,\n\t\t\t);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, \"lazy \");\n\t\t});\n\n\t\tit(\"separate regions, remote before local\", () => {\n\t\t\tconst localRemovePosStart = 4; // \"quick \"\n\t\t\tconst localRemovePosEnd = localRemovePosStart + 6;\n\t\t\tconst remoteRemovePosStart = client.getLength() - 8; // \"lazy \"\n\t\t\tconst remoteRemovePosEnd = remoteRemovePosStart + 5;\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localRemoveMessage = client.makeOpMessage(\n\t\t\t\tclient.removeRangeLocal(localRemovePosStart, localRemovePosEnd),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, localRemovePosStart);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, localRemovePosEnd);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, localRemovePosEnd - localRemovePosStart);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, \"quick \");\n\n\t\t\tconst remoteRemoveMessage = client.makeOpMessage(\n\t\t\t\tcreateRemoveRangeOp(remoteRemovePosStart, remoteRemovePosEnd),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteRemoveMessage);\n\n\t\t\tclient.applyMsg(localRemoveMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(\n\t\t\t\tevent.first.position,\n\t\t\t\tremoteRemovePosStart - localRemovePosEnd + localRemovePosStart,\n\t\t\t);\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tremoteRemovePosEnd - localRemovePosEnd + localRemovePosStart,\n\t\t\t);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(\n\t\t\t\tevent.first.segment.cachedLength,\n\t\t\t\tremoteRemovePosEnd - remoteRemovePosStart,\n\t\t\t);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, \"lazy \");\n\t\t});\n\n\t\tit(\"overlapping regions, same range, local before remote\", () => {\n\t\t\tconst localRemovePosStart = 4; // \"quick brown \"\n\t\t\tconst localRemovePosEnd = localRemovePosStart + 12;\n\t\t\tconst remoteRemovePosStart = 4; // \"quick brown \"\n\t\t\tconst remoteRemovePosEnd = remoteRemovePosStart + 12;\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tconst events: SequenceDeltaEvent[] = [];\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevents.push(new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client));\n\t\t\t});\n\n\t\t\tconst localRemoveMessage = client.makeOpMessage(\n\t\t\t\tclient.removeRangeLocal(localRemovePosStart, localRemovePosEnd),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tclient.applyMsg(localRemoveMessage);\n\n\t\t\tassert.equal(events.length, 1);\n\t\t\tconst [event] = events;\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, localRemovePosStart);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, localRemovePosEnd);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, localRemovePosEnd - localRemovePosStart);\n\t\t\tconst segment = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment.text, \"quick brown \");\n\n\t\t\tconst remoteRemoveMessage = client.makeOpMessage(\n\t\t\t\tcreateRemoveRangeOp(remoteRemovePosStart, remoteRemovePosEnd),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteRemoveMessage);\n\n\t\t\t// No new event should be emitted since the delta is empty.\n\t\t\tassert.equal(events.length, 1);\n\t\t});\n\n\t\tit(\"overlapping regions, same range, remote before local\", () => {\n\t\t\tconst localRemovePosStart = 4; // \"quick brown \"\n\t\t\tconst localRemovePosEnd = localRemovePosStart + 12;\n\t\t\tconst remoteRemovePosStart = 4; // \"quick brown \"\n\t\t\tconst remoteRemovePosEnd = remoteRemovePosStart + 12;\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tconst events: SequenceDeltaEvent[] = [];\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevents.push(new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client));\n\t\t\t});\n\n\t\t\tconst localRemoveMessage = client.makeOpMessage(\n\t\t\t\tclient.removeRangeLocal(localRemovePosStart, localRemovePosEnd),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tassert.equal(events.length, 1);\n\t\t\tconst [event] = events;\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, localRemovePosStart);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, localRemovePosEnd);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, localRemovePosEnd - localRemovePosStart);\n\t\t\tconst segment = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment.text, \"quick brown \");\n\n\t\t\tconst remoteRemoveMessage = client.makeOpMessage(\n\t\t\t\tcreateRemoveRangeOp(remoteRemovePosStart, remoteRemovePosEnd),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteRemoveMessage);\n\n\t\t\tclient.applyMsg(localRemoveMessage);\n\n\t\t\t// No new event should be emitted since the delta is empty.\n\t\t\tassert.equal(events.length, 1);\n\t\t});\n\n\t\tit(\"overlapping regions, local shadows remote, local before remote\", () => {\n\t\t\tconst localRemovePosStart = 4; // \"quick brown \"\n\t\t\tconst localRemovePosEnd = localRemovePosStart + 12;\n\t\t\tconst remoteRemovePosStart = 10; // \"brown\"\n\t\t\tconst remoteRemovePosEnd = remoteRemovePosStart + 5;\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tconst events: SequenceDeltaEvent[] = [];\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevents.push(new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client));\n\t\t\t});\n\n\t\t\tconst localRemoveMessage = client.makeOpMessage(\n\t\t\t\tclient.removeRangeLocal(localRemovePosStart, localRemovePosEnd),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tclient.applyMsg(localRemoveMessage);\n\n\t\t\tassert.equal(events.length, 1);\n\t\t\tconst [event] = events;\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, localRemovePosStart);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, localRemovePosEnd);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, localRemovePosEnd - localRemovePosStart);\n\t\t\tconst segment = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment.text, \"quick brown \");\n\n\t\t\tconst remoteRemoveMessage = client.makeOpMessage(\n\t\t\t\tcreateRemoveRangeOp(remoteRemovePosStart, remoteRemovePosEnd),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteRemoveMessage);\n\n\t\t\t// No new event should be emitted since the delta is empty.\n\t\t\tassert.equal(events.length, 1);\n\t\t});\n\n\t\tit(\"overlapping regions, local shadows remote, remote before local\", () => {\n\t\t\tconst localRemovePosStart = 4; // \"quick brown \"\n\t\t\tconst localRemovePosEnd = localRemovePosStart + 12;\n\t\t\tconst remoteRemovePosStart = 10; // \"brown\"\n\t\t\tconst remoteRemovePosEnd = remoteRemovePosStart + 5;\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tconst events: SequenceDeltaEvent[] = [];\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevents.push(new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client));\n\t\t\t});\n\t\t\tconst localRemoveMessage = client.makeOpMessage(\n\t\t\t\tclient.removeRangeLocal(localRemovePosStart, localRemovePosEnd),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tassert.equal(events.length, 1);\n\t\t\tconst [event] = events;\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, localRemovePosStart);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, localRemovePosEnd);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, localRemovePosEnd - localRemovePosStart);\n\t\t\tconst segment = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment.text, \"quick brown \");\n\n\t\t\tconst remoteRemoveMessage = client.makeOpMessage(\n\t\t\t\tcreateRemoveRangeOp(remoteRemovePosStart, remoteRemovePosEnd),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteRemoveMessage);\n\n\t\t\tclient.applyMsg(localRemoveMessage);\n\n\t\t\t// No new event should be emitted since the delta is empty.\n\t\t\tassert.equal(events.length, 1);\n\t\t});\n\n\t\tit(\"overlapping regions, local range precedes remote range, local before remote\", () => {\n\t\t\t// space after \"quick\" is the overlap\n\t\t\tconst localRemovePosStart = 4; // \"quick \"\n\t\t\tconst localRemovePosEnd = localRemovePosStart + 6;\n\t\t\tconst remoteRemovePosStart = 9; // \" brown \"\n\t\t\tconst remoteRemovePosEnd = remoteRemovePosStart + 7;\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localRemoveMessage = client.makeOpMessage(\n\t\t\t\tclient.removeRangeLocal(localRemovePosStart, localRemovePosEnd),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tclient.applyMsg(localRemoveMessage);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, localRemovePosStart);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, localRemovePosEnd);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, localRemovePosEnd - localRemovePosStart);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, \"quick \");\n\n\t\t\tconst remoteRemoveMessage = client.makeOpMessage(\n\t\t\t\tcreateRemoveRangeOp(remoteRemovePosStart, remoteRemovePosEnd),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteRemoveMessage);\n\n\t\t\t// start = remoteRemovePosStart - localRemovePosEnd + localRemovePosStart + 1\n\t\t\t// 1 is for overlapping character\n\t\t\tconst start = 4;\n\t\t\t// end = 4 + 7 - 1\n\t\t\tconst end = 10;\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, start);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, end);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, end - start);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, \"brown \");\n\t\t});\n\n\t\tit(\"overlapping regions, local range precedes remote range, remote before local\", () => {\n\t\t\t// space after \"quick\" is the overlap\n\t\t\tconst localRemovePosStart = 4; // \"quick \"\n\t\t\tconst localRemovePosEnd = localRemovePosStart + 6;\n\t\t\tconst remoteRemovePosStart = 9; // \" brown \"\n\t\t\tconst remoteRemovePosEnd = remoteRemovePosStart + 7;\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localRemoveMessage = client.makeOpMessage(\n\t\t\t\tclient.removeRangeLocal(localRemovePosStart, localRemovePosEnd),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, localRemovePosStart);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, localRemovePosEnd);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, localRemovePosEnd - localRemovePosStart);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, \"quick \");\n\n\t\t\tconst remoteRemoveMessage = client.makeOpMessage(\n\t\t\t\tcreateRemoveRangeOp(remoteRemovePosStart, remoteRemovePosEnd),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteRemoveMessage);\n\n\t\t\tclient.applyMsg(localRemoveMessage);\n\n\t\t\t// start = remoteRemovePosStart - localRemovePosEnd + localRemovePosStart + 1\n\t\t\t// 1 is for overlapping character\n\t\t\tconst start = 4;\n\t\t\t// end = 4 + 7 - 1\n\t\t\tconst end = 10;\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, start);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, end);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, end - start);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, \"brown \");\n\t\t});\n\n\t\tit(\"overlapping regions, remote range precedes local range, local before remote\", () => {\n\t\t\t// space after \"quick\" is the overlap\n\t\t\tconst localRemovePosStart = 9; // \" brown \"\n\t\t\tconst localRemovePosEnd = localRemovePosStart + 7;\n\t\t\tconst remoteRemovePosStart = 4; // \"quick \"\n\t\t\tconst remoteRemovePosEnd = remoteRemovePosStart + 6;\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localRemoveMessage = client.makeOpMessage(\n\t\t\t\tclient.removeRangeLocal(localRemovePosStart, localRemovePosEnd),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tclient.applyMsg(localRemoveMessage);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, localRemovePosStart);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, localRemovePosEnd);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, localRemovePosEnd - localRemovePosStart);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, \" brown \");\n\n\t\t\tconst remoteRemoveMessage = client.makeOpMessage(\n\t\t\t\tcreateRemoveRangeOp(remoteRemovePosStart, remoteRemovePosEnd),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteRemoveMessage);\n\n\t\t\t// start = remoteRemovePosStart - localRemovePosEnd + localRemovePosStart + 1\n\t\t\t// 1 is for overlapping character\n\t\t\tconst start = 4;\n\t\t\t// end = 4 + 6 - 1\n\t\t\tconst end = 9;\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, start);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, end);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, end - start);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, \"quick\");\n\t\t});\n\n\t\tit(\"overlapping regions, remote range precedes local range, remote before local\", () => {\n\t\t\t// space after \"quick\" is the overlap\n\t\t\tconst localRemovePosStart = 9; // \" brown \"\n\t\t\tconst localRemovePosEnd = localRemovePosStart + 7;\n\t\t\tconst remoteRemovePosStart = 4; // \"quick \"\n\t\t\tconst remoteRemovePosEnd = remoteRemovePosStart + 6;\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localRemoveMessage = client.makeOpMessage(\n\t\t\t\tclient.removeRangeLocal(localRemovePosStart, localRemovePosEnd),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, localRemovePosStart);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, localRemovePosEnd);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, localRemovePosEnd - localRemovePosStart);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, \" brown \");\n\n\t\t\tconst remoteRemoveMessage = client.makeOpMessage(\n\t\t\t\tcreateRemoveRangeOp(remoteRemovePosStart, remoteRemovePosEnd),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteRemoveMessage);\n\n\t\t\tclient.applyMsg(localRemoveMessage);\n\n\t\t\t// start = remoteRemovePosStart - localRemovePosEnd + localRemovePosStart + 1\n\t\t\t// 1 is for overlapping character\n\t\t\tconst start = 4;\n\t\t\t// end = 4 + 6 - 1\n\t\t\tconst end = 9;\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, start);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, end);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, end - start);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, \"quick\");\n\t\t});\n\n\t\tit(\"overlapping regions, remote shadows local, local before remote\", () => {\n\t\t\tconst localRemovePosStart = 10; // \"brown\"\n\t\t\tconst localRemovePosEnd = localRemovePosStart + 5;\n\t\t\tconst remoteRemovePosStart = 4; // \"quick brown \"\n\t\t\tconst remoteRemovePosEnd = remoteRemovePosStart + 12;\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localRemoveMessage = client.makeOpMessage(\n\t\t\t\tclient.removeRangeLocal(localRemovePosStart, localRemovePosEnd),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tclient.applyMsg(localRemoveMessage);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, localRemovePosStart);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, localRemovePosEnd);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, localRemovePosEnd - localRemovePosStart);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, \"brown\");\n\n\t\t\tconst remoteRemoveMessage = client.makeOpMessage(\n\t\t\t\tcreateRemoveRangeOp(remoteRemovePosStart, remoteRemovePosEnd),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteRemoveMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.ranges.length, 2);\n\t\t\tassert.equal(event.first.position, remoteRemovePosStart);\n\t\t\t// -1 is for split\n\t\t\tassert.equal(event.first.segment.cachedLength, \"quick \".length);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, \"quick \");\n\t\t\tassert.equal(event.ranges[1].position, remoteRemovePosStart);\n\t\t\t// -1 is for split\n\t\t\tassert.equal(event.ranges[1].segment.cachedLength, \" \".length);\n\t\t\tconst segment3 = event.ranges[1].segment as TextSegment;\n\t\t\tassert.equal(segment3.text, \" \");\n\t\t});\n\n\t\tit(\"overlapping regions, remote shadows local, remote before local\", () => {\n\t\t\tconst localRemovePosStart = 10; // \"brown\"\n\t\t\tconst localRemovePosEnd = localRemovePosStart + 5;\n\t\t\tconst remoteRemovePosStart = 4; // \"quick brown \"\n\t\t\tconst remoteRemovePosEnd = remoteRemovePosStart + 12;\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localRemoveMessage = client.makeOpMessage(\n\t\t\t\tclient.removeRangeLocal(localRemovePosStart, localRemovePosEnd),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, localRemovePosStart);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, localRemovePosEnd);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, localRemovePosEnd - localRemovePosStart);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, \"brown\");\n\n\t\t\tconst remoteRemoveMessage = client.makeOpMessage(\n\t\t\t\tcreateRemoveRangeOp(remoteRemovePosStart, remoteRemovePosEnd),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteRemoveMessage);\n\n\t\t\tclient.applyMsg(localRemoveMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.ranges.length, 2);\n\t\t\tassert.equal(event.first.position, remoteRemovePosStart);\n\t\t\t// -1 is for split\n\t\t\tassert.equal(event.first.segment.cachedLength, \"quick \".length);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, \"quick \");\n\t\t\tassert.equal(event.ranges[1].position, remoteRemovePosStart);\n\t\t\t// -1 is for split\n\t\t\tassert.equal(event.ranges[1].segment.cachedLength, \" \".length);\n\t\t\tconst segment3 = event.ranges[1].segment as TextSegment;\n\t\t\tassert.equal(segment3.text, \" \");\n\t\t});\n\t});\n\n\tdescribe(\"annotate\", () => {\n\t\tbeforeEach(() => {\n\t\t\tclient = new TestClient();\n\t\t\tclient.insertTextLocal(0, \"Habits change into character\");\n\t\t\tclient.startOrUpdateCollaboration(localUserId);\n\t\t});\n\n\t\tit(\"same range, same property, local before remote\", () => {\n\t\t\tconst localPosStart = 7; // \"change\"\n\t\t\tconst localPosEnd = localPosStart + 6;\n\t\t\tconst remotePosStart = 7; // \"change\"\n\t\t\tconst remotePosEnd = remotePosStart + 6;\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localMessage = client.makeOpMessage(\n\t\t\t\tclient.annotateRangeLocal(localPosStart, localPosEnd, { foo: \"bar\" }),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tclient.applyMsg(localMessage);\n\n\t\t\tassert(event);\n\t\t\tverifyEventForAnnotate(event, true, localPosStart, localPosEnd, [\n\t\t\t\t{\n\t\t\t\t\tnumChar: localPosEnd - localPosStart,\n\t\t\t\t\toffset: localPosStart,\n\t\t\t\t\tpropDeltas: { foo: null },\n\t\t\t\t\tprops: { foo: \"bar\" },\n\t\t\t\t\ttext: \"change\",\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tconst remoteMessage = client.makeOpMessage(\n\t\t\t\tcreateAnnotateRangeOp(remotePosStart, remotePosEnd, { foo: \"bar\" }),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteMessage);\n\n\t\t\tverifyEventForAnnotate(event, false, remotePosStart, remotePosEnd, [\n\t\t\t\t{\n\t\t\t\t\tnumChar: remotePosEnd - remotePosStart,\n\t\t\t\t\toffset: remotePosStart,\n\t\t\t\t\tpropDeltas: { foo: \"bar\" },\n\t\t\t\t\tprops: { foo: \"bar\" },\n\t\t\t\t\ttext: \"change\",\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\tit(\"same range, same property, remote before local\", () => {\n\t\t\tconst localPosStart = 7; // \"change\"\n\t\t\tconst localPosEnd = localPosStart + 6;\n\t\t\tconst remotePosStart = 7; // \"change\"\n\t\t\tconst remotePosEnd = remotePosStart + 6;\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localMessage = client.makeOpMessage(\n\t\t\t\tclient.annotateRangeLocal(localPosStart, localPosEnd, { foo: \"bar\" }),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tassert(event);\n\t\t\tverifyEventForAnnotate(event, true, localPosStart, localPosEnd, [\n\t\t\t\t{\n\t\t\t\t\tnumChar: localPosEnd - localPosStart,\n\t\t\t\t\toffset: localPosStart,\n\t\t\t\t\tpropDeltas: { foo: null },\n\t\t\t\t\tprops: { foo: \"bar\" },\n\t\t\t\t\ttext: \"change\",\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tconst remoteMessage = client.makeOpMessage(\n\t\t\t\tcreateAnnotateRangeOp(remotePosStart, remotePosEnd, { foo: \"bar\" }),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteMessage);\n\n\t\t\tverifyEventForAnnotate(event, false, remotePosStart, remotePosEnd, [\n\t\t\t\t{\n\t\t\t\t\tnumChar: remotePosEnd - remotePosStart,\n\t\t\t\t\toffset: remotePosStart,\n\t\t\t\t\tprops: { foo: \"bar\" },\n\t\t\t\t\ttext: \"change\",\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tclient.applyMsg(localMessage);\n\t\t});\n\n\t\tit(\"same range, same property, different value, local before remote\", () => {\n\t\t\tconst localPosStart = 7; // \"change\"\n\t\t\tconst localPosEnd = localPosStart + 6;\n\t\t\tconst remotePosStart = 7; // \"change\"\n\t\t\tconst remotePosEnd = remotePosStart + 6;\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localMessage = client.makeOpMessage(\n\t\t\t\tclient.annotateRangeLocal(localPosStart, localPosEnd, { foo: \"bar\" }),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tclient.applyMsg(localMessage);\n\n\t\t\tassert(event);\n\t\t\tverifyEventForAnnotate(event, true, localPosStart, localPosEnd, [\n\t\t\t\t{\n\t\t\t\t\tnumChar: localPosEnd - localPosStart,\n\t\t\t\t\toffset: localPosStart,\n\t\t\t\t\tpropDeltas: { foo: null },\n\t\t\t\t\tprops: { foo: \"bar\" },\n\t\t\t\t\ttext: \"change\",\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tconst remoteMessage = client.makeOpMessage(\n\t\t\t\tcreateAnnotateRangeOp(remotePosStart, remotePosEnd, { foo: \"bardash\" }),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteMessage);\n\n\t\t\tverifyEventForAnnotate(event, false, remotePosStart, remotePosEnd, [\n\t\t\t\t{\n\t\t\t\t\tnumChar: remotePosEnd - remotePosStart,\n\t\t\t\t\toffset: remotePosStart,\n\t\t\t\t\tpropDeltas: { foo: \"bar\" },\n\t\t\t\t\tprops: { foo: \"bardash\" },\n\t\t\t\t\ttext: \"change\",\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\tit(\"same range, same property, different value, remote before local\", () => {\n\t\t\tconst localPosStart = 7; // \"change\"\n\t\t\tconst localPosEnd = localPosStart + 6;\n\t\t\tconst remotePosStart = 7; // \"change\"\n\t\t\tconst remotePosEnd = remotePosStart + 6;\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localMessage = client.makeOpMessage(\n\t\t\t\tclient.annotateRangeLocal(localPosStart, localPosEnd, { foo: \"bar\" }),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tassert(event);\n\t\t\tverifyEventForAnnotate(event, true, localPosStart, localPosEnd, [\n\t\t\t\t{\n\t\t\t\t\tnumChar: localPosEnd - localPosStart,\n\t\t\t\t\toffset: localPosStart,\n\t\t\t\t\tpropDeltas: { foo: null },\n\t\t\t\t\tprops: { foo: \"bar\" },\n\t\t\t\t\ttext: \"change\",\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tconst remoteMessage = client.makeOpMessage(\n\t\t\t\tcreateAnnotateRangeOp(remotePosStart, remotePosEnd, { foo: \"bardash\" }),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteMessage);\n\n\t\t\tclient.applyMsg(localMessage);\n\n\t\t\tverifyEventForAnnotate(event, false, remotePosStart, remotePosEnd, [\n\t\t\t\t{\n\t\t\t\t\tnumChar: remotePosEnd - remotePosStart,\n\t\t\t\t\toffset: remotePosStart,\n\t\t\t\t\tprops: { foo: \"bar\" },\n\t\t\t\t\ttext: \"change\",\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\tit(\"same range, different properties, local before remote\", () => {\n\t\t\tconst localPosStart = 7; // \"change\"\n\t\t\tconst localPosEnd = localPosStart + 6;\n\t\t\tconst remotePosStart = 7; // \"change\"\n\t\t\tconst remotePosEnd = remotePosStart + 6;\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localMessage = client.makeOpMessage(\n\t\t\t\tclient.annotateRangeLocal(localPosStart, localPosEnd, { foo1: \"bar1\" }),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tclient.applyMsg(localMessage);\n\n\t\t\tassert(event);\n\t\t\tverifyEventForAnnotate(event, true, localPosStart, localPosEnd, [\n\t\t\t\t{\n\t\t\t\t\tnumChar: localPosEnd - localPosStart,\n\t\t\t\t\toffset: localPosStart,\n\t\t\t\t\tpropDeltas: { foo1: null },\n\t\t\t\t\tprops: { foo1: \"bar1\" },\n\t\t\t\t\ttext: \"change\",\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tconst remoteMessage = client.makeOpMessage(\n\t\t\t\tcreateAnnotateRangeOp(remotePosStart, remotePosEnd, { foo2: \"bar2\" }),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteMessage);\n\n\t\t\tverifyEventForAnnotate(event, false, remotePosStart, remotePosEnd, [\n\t\t\t\t{\n\t\t\t\t\tnumChar: remotePosEnd - remotePosStart,\n\t\t\t\t\toffset: remotePosStart,\n\t\t\t\t\tpropDeltas: { foo2: null },\n\t\t\t\t\tprops: { foo1: \"bar1\", foo2: \"bar2\" },\n\t\t\t\t\ttext: \"change\",\n\t\t\t\t},\n\t\t\t]);\n\t\t});\n\n\t\tit(\"same range, different properties, remote before local\", () => {\n\t\t\tconst localPosStart = 7; // \"change\"\n\t\t\tconst localPosEnd = localPosStart + 6;\n\t\t\tconst remotePosStart = 7; // \"change\"\n\t\t\tconst remotePosEnd = remotePosStart + 6;\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localMessage = client.makeOpMessage(\n\t\t\t\tclient.annotateRangeLocal(localPosStart, localPosEnd, { foo1: \"bar1\" }),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tassert(event);\n\t\t\tverifyEventForAnnotate(event, true, localPosStart, localPosEnd, [\n\t\t\t\t{\n\t\t\t\t\tnumChar: localPosEnd - localPosStart,\n\t\t\t\t\toffset: localPosStart,\n\t\t\t\t\tpropDeltas: { foo1: null },\n\t\t\t\t\tprops: { foo1: \"bar1\" },\n\t\t\t\t\ttext: \"change\",\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tconst remoteMessage = client.makeOpMessage(\n\t\t\t\tcreateAnnotateRangeOp(remotePosStart, remotePosEnd, { foo2: \"bar2\" }),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteMessage);\n\n\t\t\tverifyEventForAnnotate(event, false, remotePosStart, remotePosEnd, [\n\t\t\t\t{\n\t\t\t\t\tnumChar: remotePosEnd - remotePosStart,\n\t\t\t\t\toffset: remotePosStart,\n\t\t\t\t\tpropDeltas: { foo2: null },\n\t\t\t\t\tprops: { foo1: \"bar1\", foo2: \"bar2\" },\n\t\t\t\t\ttext: \"change\",\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tclient.applyMsg(localMessage);\n\t\t});\n\n\t\tit(\"overlapping ranges, same properties, different values\", () => {\n\t\t\t// initialize as following:\n\t\t\t// - second word has property foo1=bar1\n\t\t\t// - third word has property foo2=bar2\n\t\t\t// - fourth word has property foo3=bar3\n\t\t\tinitialize();\n\n\t\t\t// apply remote operation that has seen \"initialize\" seqnum as following:\n\t\t\t// - apply foo=bar on whole line\n\t\t\tstep1(\n\t\t\t\tclient.mergeTree.collabWindow.currentSeq + 1,\n\t\t\t\tclient.mergeTree.collabWindow.currentSeq,\n\t\t\t);\n\n\t\t\t// apply local operation that has seen \"step1\" seqnum as following:\n\t\t\t// - change foo=bar1 for [firstWordStart, secondWordEnd)\n\t\t\tstep2(\n\t\t\t\tclient.mergeTree.collabWindow.currentSeq + 1,\n\t\t\t\tclient.mergeTree.collabWindow.currentSeq,\n\t\t\t);\n\n\t\t\t// apply remote operation that has not seen \"step2\" seqnum as following:\n\t\t\t// - change foo=bar2 for [thirdWordStart, fourthWordEnd)\n\t\t\tstep3(\n\t\t\t\tclient.mergeTree.collabWindow.currentSeq + 1,\n\t\t\t\tclient.mergeTree.collabWindow.currentSeq - 1,\n\t\t\t);\n\n\t\t\t// apply local operation that has seen \"step3\" seqnum as following:\n\t\t\t// - change foo=bar3 for [secondWordStart, fourthWordEnd)\n\t\t\tstep4(\n\t\t\t\tclient.mergeTree.collabWindow.currentSeq + 1,\n\t\t\t\tclient.mergeTree.collabWindow.currentSeq,\n\t\t\t);\n\t\t});\n\n\t\tconst firstWordStart = 0; // \"Habits\"\n\t\tconst secondWordStart = 7; // \"change\"\n\t\tconst secondWordEnd = 13;\n\t\tconst thirdWordStart = 14; // \"into\"\n\t\tconst thirdWordEnd = 18;\n\t\tconst fourthWordStart = 19; // \"character\"\n\t\tconst fourthWordEnd = 28;\n\n\t\tfunction initialize() {\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localMessage1 = client.makeOpMessage(\n\t\t\t\tclient.annotateRangeLocal(secondWordStart, secondWordEnd, { foo1: \"bar1\" }),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tclient.applyMsg(localMessage1);\n\n\t\t\tassert(event);\n\t\t\tverifyEventForAnnotate(event, true, secondWordStart, secondWordEnd, [\n\t\t\t\t{\n\t\t\t\t\tnumChar: secondWordEnd - secondWordStart,\n\t\t\t\t\toffset: secondWordStart,\n\t\t\t\t\tpropDeltas: { foo1: null },\n\t\t\t\t\tprops: { foo1: \"bar1\" },\n\t\t\t\t\ttext: \"change\",\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tconst localMessage2 = client.makeOpMessage(\n\t\t\t\tclient.annotateRangeLocal(fourthWordStart, fourthWordEnd, { foo3: \"bar3\" }),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber + 1, // refseqnum\n\t\t\t);\n\n\t\t\tclient.applyMsg(localMessage2);\n\n\t\t\tverifyEventForAnnotate(event, true, fourthWordStart, fourthWordEnd, [\n\t\t\t\t{\n\t\t\t\t\tnumChar: fourthWordEnd - fourthWordStart,\n\t\t\t\t\toffset: fourthWordStart,\n\t\t\t\t\tpropDeltas: { foo3: null },\n\t\t\t\t\tprops: { foo3: \"bar3\" },\n\t\t\t\t\ttext: \"character\",\n\t\t\t\t},\n\t\t\t]);\n\n\t\t\tconst remoteMessage1 = client.makeOpMessage(\n\t\t\t\tcreateAnnotateRangeOp(thirdWordStart, thirdWordEnd, { foo2: \"bar2\" }),\n\t\t\t\tcurrentSeqNumber + 3,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteMessage1);\n\n\t\t\tverifyEventForAnnotate(event, false, thirdWordStart, thirdWordEnd, [\n\t\t\t\t{\n\t\t\t\t\tnumChar: thirdWordEnd - thirdWordStart,\n\t\t\t\t\toffset: thirdWordStart,\n\t\t\t\t\tpropDeltas: { foo2: null },\n\t\t\t\t\tprops: { foo2: \"bar2\" },\n\t\t\t\t\ttext: \"into\",\n\t\t\t\t},\n\t\t\t]);\n\t\t}\n\n\t\tfunction step1(seqnum: number, refseqnum: number) {\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst remoteMessage = client.makeOpMessage(\n\t\t\t\tcreateAnnotateRangeOp(firstWordStart, fourthWordEnd, { foo: \"bar\" }),\n\t\t\t\tseqnum,\n\t\t\t\trefseqnum,\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteMessage);\n\n\t\t\tassert(event);\n\t\t\tverifyEventForAnnotate(event, false, firstWordStart, fourthWordEnd, [\n\t\t\t\t{\n\t\t\t\t\tnumChar: secondWordStart - firstWordStart,\n\t\t\t\t\toffset: firstWordStart,\n\t\t\t\t\tpropDeltas: { foo: null },\n\t\t\t\t\tprops: { foo: \"bar\" },\n\t\t\t\t\ttext: \"Habits \",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnumChar: secondWordEnd - secondWordStart,\n\t\t\t\t\toffset: secondWordStart,\n\t\t\t\t\tpropDeltas: { foo: null },\n\t\t\t\t\tprops: { foo: \"bar\", foo1: \"bar1\" },\n\t\t\t\t\ttext: \"change\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnumChar: thirdWordStart - secondWordEnd,\n\t\t\t\t\toffset: secondWordEnd,\n\t\t\t\t\tpropDeltas: { foo: null },\n\t\t\t\t\tprops: { foo: \"bar\" },\n\t\t\t\t\ttext: \" \",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnumChar: thirdWordEnd - thirdWordStart,\n\t\t\t\t\toffset: thirdWordStart,\n\t\t\t\t\tpropDeltas: { foo: null },\n\t\t\t\t\tprops: { foo: \"bar\", foo2: \"bar2\" },\n\t\t\t\t\ttext: \"into\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnumChar: fourthWordStart - thirdWordEnd,\n\t\t\t\t\toffset: thirdWordEnd,\n\t\t\t\t\tpropDeltas: { foo: null },\n\t\t\t\t\tprops: { foo: \"bar\" },\n\t\t\t\t\ttext: \" \",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnumChar: fourthWordEnd - fourthWordStart,\n\t\t\t\t\toffset: fourthWordStart,\n\t\t\t\t\tpropDeltas: { foo: null },\n\t\t\t\t\tprops: { foo: \"bar\", foo3: \"bar3\" },\n\t\t\t\t\ttext: \"character\",\n\t\t\t\t},\n\t\t\t]);\n\t\t}\n\n\t\tfunction step2(seqnum: number, refseqnum: number) {\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localMessage = client.makeOpMessage(\n\t\t\t\tclient.annotateRangeLocal(firstWordStart, secondWordEnd, { foo: \"bar1\" }),\n\t\t\t\tseqnum,\n\t\t\t\trefseqnum,\n\t\t\t);\n\n\t\t\tclient.applyMsg(localMessage);\n\n\t\t\tassert(event);\n\t\t\tverifyEventForAnnotate(event, true, firstWordStart, secondWordEnd, [\n\t\t\t\t{\n\t\t\t\t\tnumChar: secondWordStart - firstWordStart,\n\t\t\t\t\toffset: firstWordStart,\n\t\t\t\t\tpropDeltas: { foo: \"bar\" },\n\t\t\t\t\tprops: { foo: \"bar1\" },\n\t\t\t\t\ttext: \"Habits \",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnumChar: secondWordEnd - secondWordStart,\n\t\t\t\t\toffset: secondWordStart,\n\t\t\t\t\tpropDeltas: { foo: \"bar\" },\n\t\t\t\t\tprops: { foo: \"bar1\", foo1: \"bar1\" },\n\t\t\t\t\ttext: \"change\",\n\t\t\t\t},\n\t\t\t]);\n\t\t}\n\n\t\tfunction step3(seqnum: number, refseqnum: number) {\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst remoteMessage = client.makeOpMessage(\n\t\t\t\tcreateAnnotateRangeOp(thirdWordStart, fourthWordEnd, { foo: \"bar2\" }),\n\t\t\t\tseqnum,\n\t\t\t\trefseqnum,\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteMessage);\n\n\t\t\tassert(event);\n\t\t\tverifyEventForAnnotate(event, false, thirdWordStart, fourthWordEnd, [\n\t\t\t\t{\n\t\t\t\t\tnumChar: thirdWordEnd - thirdWordStart,\n\t\t\t\t\toffset: thirdWordStart,\n\t\t\t\t\tpropDeltas: { foo: \"bar\" },\n\t\t\t\t\tprops: { foo: \"bar2\", foo2: \"bar2\" },\n\t\t\t\t\ttext: \"into\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnumChar: fourthWordStart - thirdWordEnd,\n\t\t\t\t\toffset: thirdWordEnd,\n\t\t\t\t\tpropDeltas: { foo: \"bar\" },\n\t\t\t\t\tprops: { foo: \"bar2\" },\n\t\t\t\t\ttext: \" \",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnumChar: fourthWordEnd - fourthWordStart,\n\t\t\t\t\toffset: fourthWordStart,\n\t\t\t\t\tpropDeltas: { foo: \"bar\" },\n\t\t\t\t\tprops: { foo: \"bar2\", foo3: \"bar3\" },\n\t\t\t\t\ttext: \"character\",\n\t\t\t\t},\n\t\t\t]);\n\t\t}\n\n\t\tfunction step4(seqnum: number, refseqnum: number) {\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localMessage = client.makeOpMessage(\n\t\t\t\tclient.annotateRangeLocal(secondWordStart, fourthWordEnd, { foo: \"bar3\" }),\n\t\t\t\tseqnum,\n\t\t\t\trefseqnum,\n\t\t\t);\n\n\t\t\tclient.applyMsg(localMessage);\n\n\t\t\tassert(event);\n\t\t\tverifyEventForAnnotate(event, true, secondWordStart, fourthWordEnd, [\n\t\t\t\t{\n\t\t\t\t\tnumChar: secondWordEnd - secondWordStart,\n\t\t\t\t\toffset: secondWordStart,\n\t\t\t\t\tpropDeltas: { foo: \"bar1\" },\n\t\t\t\t\tprops: { foo: \"bar3\", foo1: \"bar1\" },\n\t\t\t\t\ttext: \"change\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnumChar: thirdWordStart - secondWordEnd,\n\t\t\t\t\toffset: secondWordEnd,\n\t\t\t\t\tpropDeltas: { foo: \"bar\" },\n\t\t\t\t\tprops: { foo: \"bar3\" },\n\t\t\t\t\ttext: \" \",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnumChar: thirdWordEnd - thirdWordStart,\n\t\t\t\t\toffset: thirdWordStart,\n\t\t\t\t\tpropDeltas: { foo: \"bar2\" },\n\t\t\t\t\tprops: { foo: \"bar3\", foo2: \"bar2\" },\n\t\t\t\t\ttext: \"into\",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnumChar: fourthWordStart - thirdWordEnd,\n\t\t\t\t\toffset: thirdWordEnd,\n\t\t\t\t\tpropDeltas: { foo: \"bar2\" },\n\t\t\t\t\tprops: { foo: \"bar3\" },\n\t\t\t\t\ttext: \" \",\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tnumChar: fourthWordEnd - fourthWordStart,\n\t\t\t\t\toffset: fourthWordStart,\n\t\t\t\t\tpropDeltas: { foo: \"bar2\" },\n\t\t\t\t\tprops: { foo: \"bar3\", foo3: \"bar3\" },\n\t\t\t\t\ttext: \"character\",\n\t\t\t\t},\n\t\t\t]);\n\t\t}\n\n\t\tfunction verifyEventForAnnotate(\n\t\t\tevent: SequenceDeltaEvent,\n\t\t\tisLocal: boolean,\n\t\t\tstart: number,\n\t\t\tend: number,\n\t\t\texpected: IExpectedSegmentInfo[],\n\t\t): void {\n\t\t\tassert(event.isLocal === isLocal);\n\t\t\tassert.equal(event.first.position, start);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, end);\n\t\t\tassert.equal(event.ranges.length, expected.length);\n\t\t\tfor (let i = 0; i < expected.length; i = i + 1) {\n\t\t\t\tassert.equal(event.ranges[i].position, expected[i].offset);\n\t\t\t\tassert.equal(event.ranges[i].segment.cachedLength, expected[i].numChar);\n\t\t\t\tassert.equal(\n\t\t\t\t\tObject.keys(event.ranges[i].segment.properties ?? {}).length,\n\t\t\t\t\tObject.keys(expected[i].props).length,\n\t\t\t\t);\n\t\t\t\tfor (const key of Object.keys(event.ranges[i].segment.properties ?? {})) {\n\t\t\t\t\tassert.equal(event.ranges[i].segment.properties?.[key], expected[i].props[key]);\n\t\t\t\t}\n\t\t\t\tif (expected[i].propDeltas !== undefined) {\n\t\t\t\t\tassert.equal(\n\t\t\t\t\t\tObject.keys(event.ranges[i].propertyDeltas).length,\n\t\t\t\t\t\tObject.keys(expected[i].propDeltas ?? {}).length,\n\t\t\t\t\t);\n\t\t\t\t\tfor (const key of Object.keys(event.ranges[i].propertyDeltas)) {\n\t\t\t\t\t\tassert.equal(\n\t\t\t\t\t\t\tevent.ranges[i].propertyDeltas[key],\n\t\t\t\t\t\t\texpected[i].propDeltas?.[key],\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tassert(\n\t\t\t\t\t\tisNullOrUndefined(event.ranges[i].propertyDeltas) ||\n\t\t\t\t\t\t\tObject.keys(event.ranges[i].propertyDeltas).length === 0,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (expected[i].text !== undefined) {\n\t\t\t\t\tconst segment = event.ranges[i].segment as TextSegment;\n\t\t\t\t\tassert.equal(segment.text, expected[i].text);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\n\tdescribe(\"combination\", () => {\n\t\tbeforeEach(() => {\n\t\t\tclient = new TestClient();\n\t\t\tclient.insertTextLocal(0, \"The brown fox jumps over the lazy dog\");\n\t\t\tclient.startOrUpdateCollaboration(localUserId);\n\t\t});\n\n\t\tit(\"insertPos before deleteRange, insertLocal deleteRemote, local before remote\", () => {\n\t\t\tconst insertPos = 4; // before \"brown\"\n\t\t\tconst insertText = \"quick \";\n\t\t\tconst deleteRangeStart = 29; // \"lazy \"\n\t\t\tconst deleteRangeEnd = 34;\n\t\t\tconst output = \"The quick brown fox jumps over the dog\";\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localInsertMessage = client.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(insertPos, insertText),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tclient.applyMsg(localInsertMessage);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, insertPos);\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tinsertPos + insertText.length,\n\t\t\t);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, insertText.length);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, insertText);\n\n\t\t\tconst remoteRemoveMessage = client.makeOpMessage(\n\t\t\t\tcreateRemoveRangeOp(deleteRangeStart, deleteRangeEnd),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteRemoveMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, deleteRangeStart + insertText.length);\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tdeleteRangeEnd + insertText.length,\n\t\t\t);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, deleteRangeEnd - deleteRangeStart);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, \"lazy \");\n\n\t\t\tassert.equal(client.getText(), output);\n\t\t});\n\n\t\tit(\"insertPos before deleteRange, insertLocal deleteRemote, remote before local\", () => {\n\t\t\tconst insertPos = 4; // before \"brown\"\n\t\t\tconst insertText = \"quick \";\n\t\t\tconst deleteRangeStart = 29; // \"lazy \"\n\t\t\tconst deleteRangeEnd = 34;\n\t\t\tconst output = \"The quick brown fox jumps over the dog\";\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localInsertMessage = client.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(insertPos, insertText),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, insertPos);\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tinsertPos + insertText.length,\n\t\t\t);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, insertText.length);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, insertText);\n\n\t\t\tconst remoteRemoveMessage = client.makeOpMessage(\n\t\t\t\tcreateRemoveRangeOp(deleteRangeStart, deleteRangeEnd),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteRemoveMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, deleteRangeStart + insertText.length);\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tdeleteRangeEnd + insertText.length,\n\t\t\t);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, deleteRangeEnd - deleteRangeStart);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, \"lazy \");\n\n\t\t\tclient.applyMsg(localInsertMessage);\n\n\t\t\tassert.equal(client.getText(), output);\n\t\t});\n\n\t\tit(\"insertPos before deleteRange, deleteLocal insertRemote, local before remote\", () => {\n\t\t\tconst insertPos = 4; // before \"brown\"\n\t\t\tconst insertText = \"quick \";\n\t\t\tconst deleteRangeStart = 29; // \"lazy \"\n\t\t\tconst deleteRangeEnd = 34;\n\t\t\tconst output = \"The quick brown fox jumps over the dog\";\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localRemoveMessage = client.makeOpMessage(\n\t\t\t\tclient.removeRangeLocal(deleteRangeStart, deleteRangeEnd),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tclient.applyMsg(localRemoveMessage);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, deleteRangeStart);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, deleteRangeEnd);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, deleteRangeEnd - deleteRangeStart);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, \"lazy \");\n\n\t\t\tconst remoteInsertMessage = client.makeOpMessage(\n\t\t\t\tcreateInsertSegmentOp(insertPos, new TextSegment(insertText)),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteInsertMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, insertPos);\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tinsertPos + insertText.length,\n\t\t\t);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, insertText.length);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, insertText);\n\n\t\t\tassert.equal(client.getText(), output);\n\t\t});\n\n\t\tit(\"insertPos before deleteRange, deleteLocal insertRemote, remote before local\", () => {\n\t\t\tconst insertPos = 4; // before \"brown\"\n\t\t\tconst insertText = \"quick \";\n\t\t\tconst deleteRangeStart = 29; // \"lazy \"\n\t\t\tconst deleteRangeEnd = 34;\n\t\t\tconst output = \"The quick brown fox jumps over the dog\";\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localRemoveMessage = client.makeOpMessage(\n\t\t\t\tclient.removeRangeLocal(deleteRangeStart, deleteRangeEnd),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, deleteRangeStart);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, deleteRangeEnd);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, deleteRangeEnd - deleteRangeStart);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, \"lazy \");\n\n\t\t\tconst remoteInsertMessage = client.makeOpMessage(\n\t\t\t\tcreateInsertSegmentOp(insertPos, new TextSegment(insertText)),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteInsertMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, insertPos);\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tinsertPos + insertText.length,\n\t\t\t);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, insertText.length);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, insertText);\n\n\t\t\tclient.applyMsg(localRemoveMessage);\n\n\t\t\tassert.equal(client.getText(), output);\n\t\t});\n\n\t\tit(\"insertPos after deleteRange, insertLocal deleteRemote, local before remote\", () => {\n\t\t\tconst insertPos = 29; // before \"lazy\"\n\t\t\tconst insertText = \"black \";\n\t\t\tconst deleteRangeStart = 4; // \"brown \"\n\t\t\tconst deleteRangeEnd = 10;\n\t\t\tconst output = \"The fox jumps over the black lazy dog\";\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localInsertMessage = client.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(insertPos, insertText),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tclient.applyMsg(localInsertMessage);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, insertPos);\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tinsertPos + insertText.length,\n\t\t\t);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, insertText.length);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, insertText);\n\n\t\t\tconst remoteRemoveMessage = client.makeOpMessage(\n\t\t\t\tcreateRemoveRangeOp(deleteRangeStart, deleteRangeEnd),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteRemoveMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, deleteRangeStart);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, deleteRangeEnd);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, deleteRangeEnd - deleteRangeStart);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, \"brown \");\n\n\t\t\tassert.equal(client.getText(), output);\n\t\t});\n\n\t\tit(\"insertPos after deleteRange, insertLocal deleteRemote, remote before local\", () => {\n\t\t\tconst insertPos = 29; // before \"lazy\"\n\t\t\tconst insertText = \"black \";\n\t\t\tconst deleteRangeStart = 4; // \"brown \"\n\t\t\tconst deleteRangeEnd = 10;\n\t\t\tconst output = \"The fox jumps over the black lazy dog\";\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localInsertMessage = client.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(insertPos, insertText),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, insertPos);\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tinsertPos + insertText.length,\n\t\t\t);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, insertText.length);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, insertText);\n\n\t\t\tconst remoteRemoveMessage = client.makeOpMessage(\n\t\t\t\tcreateRemoveRangeOp(deleteRangeStart, deleteRangeEnd),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteRemoveMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, deleteRangeStart);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, deleteRangeEnd);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, deleteRangeEnd - deleteRangeStart);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, \"brown \");\n\n\t\t\tclient.applyMsg(localInsertMessage);\n\n\t\t\tassert.equal(client.getText(), output);\n\t\t});\n\n\t\tit(\"insertPos after deleteRange, deleteLocal insertRemote, local before remote\", () => {\n\t\t\tconst insertPos = 29; // before \"lazy\"\n\t\t\tconst insertText = \"black \";\n\t\t\tconst deleteRangeStart = 4; // \"brown \"\n\t\t\tconst deleteRangeEnd = 10;\n\t\t\tconst output = \"The fox jumps over the black lazy dog\";\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localRemoveMessage = client.makeOpMessage(\n\t\t\t\tclient.removeRangeLocal(deleteRangeStart, deleteRangeEnd),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tclient.applyMsg(localRemoveMessage);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, deleteRangeStart);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, deleteRangeEnd);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, deleteRangeEnd - deleteRangeStart);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, \"brown \");\n\n\t\t\tconst remoteInsertMessage = client.makeOpMessage(\n\t\t\t\tcreateInsertSegmentOp(insertPos, new TextSegment(insertText)),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteInsertMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, insertPos - (deleteRangeEnd - deleteRangeStart));\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tinsertPos - (deleteRangeEnd - deleteRangeStart) + insertText.length,\n\t\t\t);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, insertText.length);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, insertText);\n\n\t\t\tassert.equal(client.getText(), output);\n\t\t});\n\n\t\tit(\"insertPos after deleteRange, deleteLocal insertRemote, remote before local\", () => {\n\t\t\tconst insertPos = 29; // before \"lazy\"\n\t\t\tconst insertText = \"black \";\n\t\t\tconst deleteRangeStart = 4; // \"brown \"\n\t\t\tconst deleteRangeEnd = 10;\n\t\t\tconst output = \"The fox jumps over the black lazy dog\";\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localRemoveMessage = client.makeOpMessage(\n\t\t\t\tclient.removeRangeLocal(deleteRangeStart, deleteRangeEnd),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, deleteRangeStart);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, deleteRangeEnd);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, deleteRangeEnd - deleteRangeStart);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, \"brown \");\n\n\t\t\tconst remoteInsertMessage = client.makeOpMessage(\n\t\t\t\tcreateInsertSegmentOp(insertPos, new TextSegment(insertText)),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteInsertMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, insertPos - (deleteRangeEnd - deleteRangeStart));\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tinsertPos - (deleteRangeEnd - deleteRangeStart) + insertText.length,\n\t\t\t);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, insertText.length);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, insertText);\n\n\t\t\tclient.applyMsg(localRemoveMessage);\n\n\t\t\tassert.equal(client.getText(), output);\n\t\t});\n\n\t\tit(\"insertPos is deleteRangeStart, insertLocal deleteRemote, local before remote\", () => {\n\t\t\tconst insertPos = 29; // before \"lazy\"\n\t\t\tconst insertText = \"black \";\n\t\t\tconst deleteRangeStart = 29; // \"lazy \"\n\t\t\tconst deleteRangeEnd = 34;\n\t\t\tconst output = \"The brown fox jumps over the black dog\";\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localInsertMessage = client.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(insertPos, insertText),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tclient.applyMsg(localInsertMessage);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, insertPos);\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tinsertPos + insertText.length,\n\t\t\t);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, insertText.length);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, insertText);\n\n\t\t\tconst remoteRemoveMessage = client.makeOpMessage(\n\t\t\t\tcreateRemoveRangeOp(deleteRangeStart, deleteRangeEnd),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteRemoveMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, deleteRangeStart + insertText.length);\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tdeleteRangeEnd + insertText.length,\n\t\t\t);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, deleteRangeEnd - deleteRangeStart);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, \"lazy \");\n\t\t\tassert.equal(client.getText(), output);\n\t\t});\n\n\t\tit(\"insertPos is deleteRangeStart, insertLocal deleteRemote, remote before local\", () => {\n\t\t\tconst insertPos = 29; // before \"lazy\"\n\t\t\tconst insertText = \"black \";\n\t\t\tconst deleteRangeStart = 29; // \"lazy \"\n\t\t\tconst deleteRangeEnd = 34;\n\t\t\tconst output = \"The brown fox jumps over the black dog\";\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localInsertMessage = client.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(insertPos, insertText),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, insertPos);\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tinsertPos + insertText.length,\n\t\t\t);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, insertText.length);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, insertText);\n\n\t\t\tconst remoteRemoveMessage = client.makeOpMessage(\n\t\t\t\tcreateRemoveRangeOp(deleteRangeStart, deleteRangeEnd),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteRemoveMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, deleteRangeStart + insertText.length);\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tdeleteRangeEnd + insertText.length,\n\t\t\t);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, deleteRangeEnd - deleteRangeStart);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, \"lazy \");\n\n\t\t\tclient.applyMsg(localInsertMessage);\n\n\t\t\tassert.equal(client.getText(), output);\n\t\t});\n\n\t\tit(\"insertPos is deleteRangeStart, deleteLocal insertRemote, local before remote\", () => {\n\t\t\tconst insertPos = 29; // before \"lazy\"\n\t\t\tconst insertText = \"black \";\n\t\t\tconst deleteRangeStart = 29; // \"lazy \"\n\t\t\tconst deleteRangeEnd = 34;\n\t\t\tconst output = \"The brown fox jumps over the black dog\";\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localRemoveMessage = client.makeOpMessage(\n\t\t\t\tclient.removeRangeLocal(deleteRangeStart, deleteRangeEnd),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tclient.applyMsg(localRemoveMessage);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, deleteRangeStart);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, deleteRangeEnd);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, deleteRangeEnd - deleteRangeStart);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, \"lazy \");\n\n\t\t\tconst remoteInsertMessage = client.makeOpMessage(\n\t\t\t\tcreateInsertSegmentOp(insertPos, new TextSegment(insertText)),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteInsertMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, insertPos);\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tinsertPos + insertText.length,\n\t\t\t);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, insertText.length);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, insertText);\n\n\t\t\tassert.equal(client.getText(), output);\n\t\t});\n\n\t\tit(\"insertPos is deleteRangeStart, deleteLocal insertRemote, remote before local\", () => {\n\t\t\tconst insertPos = 29; // before \"lazy\"\n\t\t\tconst insertText = \"black \";\n\t\t\tconst deleteRangeStart = 29; // \"lazy \"\n\t\t\tconst deleteRangeEnd = 34;\n\t\t\tconst output = \"The brown fox jumps over the black dog\";\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localRemoveMessage = client.makeOpMessage(\n\t\t\t\tclient.removeRangeLocal(deleteRangeStart, deleteRangeEnd),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, deleteRangeStart);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, deleteRangeEnd);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, deleteRangeEnd - deleteRangeStart);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, \"lazy \");\n\n\t\t\tconst remoteInsertMessage = client.makeOpMessage(\n\t\t\t\tcreateInsertSegmentOp(insertPos, new TextSegment(insertText)),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteInsertMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, insertPos);\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tinsertPos + insertText.length,\n\t\t\t);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, insertText.length);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, insertText);\n\n\t\t\tclient.applyMsg(localRemoveMessage);\n\n\t\t\tassert.equal(client.getText(), output);\n\t\t});\n\n\t\tit(\"insertPos is deleteRangeEnd, insertLocal deleteRemote, local before remote\", () => {\n\t\t\tconst insertPos = 34; // after \"lazy\"\n\t\t\tconst insertText = \"black \";\n\t\t\tconst deleteRangeStart = 29; // \"lazy \"\n\t\t\tconst deleteRangeEnd = 34;\n\t\t\tconst output = \"The brown fox jumps over the black dog\";\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localInsertMessage = client.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(insertPos, insertText),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tclient.applyMsg(localInsertMessage);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, insertPos);\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tinsertPos + insertText.length,\n\t\t\t);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, insertText.length);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, insertText);\n\n\t\t\tconst remoteRemoveMessage = client.makeOpMessage(\n\t\t\t\tcreateRemoveRangeOp(deleteRangeStart, deleteRangeEnd),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteRemoveMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, deleteRangeStart);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, deleteRangeEnd);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, deleteRangeEnd - deleteRangeStart);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, \"lazy \");\n\n\t\t\tassert.equal(client.getText(), output);\n\t\t});\n\n\t\tit(\"insertPos is deleteRangeEnd, insertLocal deleteRemote, remote before local\", () => {\n\t\t\tconst insertPos = 34; // after \"lazy\"\n\t\t\tconst insertText = \"black \";\n\t\t\tconst deleteRangeStart = 29; // \"lazy \"\n\t\t\tconst deleteRangeEnd = 34;\n\t\t\tconst output = \"The brown fox jumps over the black dog\";\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localInsertMessage = client.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(insertPos, insertText),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, insertPos);\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tinsertPos + insertText.length,\n\t\t\t);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, insertText.length);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, insertText);\n\n\t\t\tconst remoteRemoveMessage = client.makeOpMessage(\n\t\t\t\tcreateRemoveRangeOp(deleteRangeStart, deleteRangeEnd),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteRemoveMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, deleteRangeStart);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, deleteRangeEnd);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, deleteRangeEnd - deleteRangeStart);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, \"lazy \");\n\n\t\t\tclient.applyMsg(localInsertMessage);\n\n\t\t\tassert.equal(client.getText(), output);\n\t\t});\n\n\t\tit(\"insertPos is deleteRangeEnd, deleteLocal insertRemote, local before remote\", () => {\n\t\t\tconst insertPos = 34; // after \"lazy\"\n\t\t\tconst insertText = \"black \";\n\t\t\tconst deleteRangeStart = 29; // \"lazy \"\n\t\t\tconst deleteRangeEnd = 34;\n\t\t\tconst output = \"The brown fox jumps over the black dog\";\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localRemoveMessage = client.makeOpMessage(\n\t\t\t\tclient.removeRangeLocal(deleteRangeStart, deleteRangeEnd),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, deleteRangeStart);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, deleteRangeEnd);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, deleteRangeEnd - deleteRangeStart);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, \"lazy \");\n\n\t\t\tclient.applyMsg(localRemoveMessage);\n\n\t\t\tconst remoteInsertMessage = client.makeOpMessage(\n\t\t\t\tcreateInsertSegmentOp(insertPos, new TextSegment(insertText)),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteInsertMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, insertPos - (deleteRangeEnd - deleteRangeStart));\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tinsertPos + insertText.length - (deleteRangeEnd - deleteRangeStart),\n\t\t\t);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, insertText.length);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, insertText);\n\n\t\t\tassert.equal(client.getText(), output);\n\t\t});\n\n\t\tit(\"insertPos is deleteRangeEnd, deleteLocal insertRemote, remote before local\", () => {\n\t\t\tconst insertPos = 34; // after \"lazy\"\n\t\t\tconst insertText = \"black \";\n\t\t\tconst deleteRangeStart = 29; // \"lazy \"\n\t\t\tconst deleteRangeEnd = 34;\n\t\t\tconst output = \"The brown fox jumps over the black dog\";\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localRemoveMessage = client.makeOpMessage(\n\t\t\t\tclient.removeRangeLocal(deleteRangeStart, deleteRangeEnd),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, deleteRangeStart);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, deleteRangeEnd);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, deleteRangeEnd - deleteRangeStart);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, \"lazy \");\n\n\t\t\tconst remoteInsertMessage = client.makeOpMessage(\n\t\t\t\tcreateInsertSegmentOp(insertPos, new TextSegment(insertText)),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteInsertMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, insertPos - (deleteRangeEnd - deleteRangeStart));\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tinsertPos + insertText.length - (deleteRangeEnd - deleteRangeStart),\n\t\t\t);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, insertText.length);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, insertText);\n\n\t\t\tclient.applyMsg(localRemoveMessage);\n\n\t\t\tassert.equal(client.getText(), output);\n\t\t});\n\n\t\tit(\"insertPos is deleteRangeStart, insertLocal deleteRemote, local before remote\", () => {\n\t\t\tconst insertPos = 10; // before \"fox\"\n\t\t\tconst insertText = \"black wolf \";\n\t\t\tconst deleteRangeStart = 4; // \"brown fox \"\n\t\t\tconst deleteRangeEnd = 14;\n\t\t\tconst output = \"The black wolf jumps over the lazy dog\";\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localInsertMessage = client.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(insertPos, insertText),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tclient.applyMsg(localInsertMessage);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, insertPos);\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tinsertPos + insertText.length,\n\t\t\t);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, insertText.length);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, insertText);\n\n\t\t\tconst remoteRemoveMessage = client.makeOpMessage(\n\t\t\t\tcreateRemoveRangeOp(deleteRangeStart, deleteRangeEnd),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteRemoveMessage);\n\n\t\t\tconst expectedRangeStart1 = deleteRangeStart;\n\t\t\tconst expectedRangeEnd1 = expectedRangeStart1 + \"brown \".length;\n\t\t\t// merge tree internal: \"brown \" is deleted and then end is calculated\n\t\t\tconst expectedRangeStart2 = deleteRangeStart + insertText.length;\n\t\t\tconst expectedRangeEnd2 = expectedRangeStart2 + \"fox \".length;\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, expectedRangeStart1);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, expectedRangeEnd2);\n\t\t\tassert.equal(event.ranges.length, 2);\n\t\t\tassert.equal(event.first.segment.cachedLength, expectedRangeEnd1 - expectedRangeStart1);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, \"brown \");\n\t\t\tassert.equal(event.ranges[1].position, expectedRangeStart2);\n\t\t\tassert.equal(\n\t\t\t\tevent.ranges[1].segment.cachedLength,\n\t\t\t\texpectedRangeEnd2 - expectedRangeStart2,\n\t\t\t);\n\t\t\tconst segment3 = event.ranges[1].segment as TextSegment;\n\t\t\tassert.equal(segment3.text, \"fox \");\n\t\t\tassert.equal(client.getText(), output);\n\t\t});\n\n\t\tit(\"insertPos is deleteRangeStart, insertLocal deleteRemote, remote before local\", () => {\n\t\t\tconst insertPos = 10; // before \"fox\"\n\t\t\tconst insertText = \"black wolf \";\n\t\t\tconst deleteRangeStart = 4; // \"brown fox \"\n\t\t\tconst deleteRangeEnd = 14;\n\t\t\tconst output = \"The black wolf jumps over the lazy dog\";\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localInsertMessage = client.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(insertPos, insertText),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, insertPos);\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tinsertPos + insertText.length,\n\t\t\t);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, insertText.length);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, insertText);\n\n\t\t\tconst remoteRemoveMessage = client.makeOpMessage(\n\t\t\t\tcreateRemoveRangeOp(deleteRangeStart, deleteRangeEnd),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseq\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteRemoveMessage);\n\n\t\t\tconst expectedRangeStart1 = deleteRangeStart;\n\t\t\tconst expectedRangeEnd1 = expectedRangeStart1 + \"brown \".length;\n\t\t\t// merge tree internal: \"brown \" is deleted and then end is calculated\n\t\t\tconst expectedRangeStart2 = deleteRangeStart + insertText.length;\n\t\t\tconst expectedRangeEnd2 = expectedRangeStart2 + \"fox \".length;\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, expectedRangeStart1);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, expectedRangeEnd2);\n\t\t\tassert.equal(event.ranges.length, 2);\n\t\t\tassert.equal(event.first.segment.cachedLength, expectedRangeEnd1 - expectedRangeStart1);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, \"brown \");\n\t\t\tassert.equal(event.ranges[1].position, expectedRangeStart2);\n\t\t\tassert.equal(\n\t\t\t\tevent.ranges[1].segment.cachedLength,\n\t\t\t\texpectedRangeEnd2 - expectedRangeStart2,\n\t\t\t);\n\t\t\tconst segment3 = event.ranges[1].segment as TextSegment;\n\t\t\tassert.equal(segment3.text, \"fox \");\n\n\t\t\tclient.applyMsg(localInsertMessage);\n\n\t\t\tassert.equal(client.getText(), output);\n\t\t});\n\n\t\tit(\"insertPos is deleteRangeStart, deleteLocal insertRemote, local before remote\", () => {\n\t\t\tconst insertPos = 10; // before \"fox\"\n\t\t\tconst insertText = \"black wolf \";\n\t\t\tconst deleteRangeStart = 4; // \"brown fox \"\n\t\t\tconst deleteRangeEnd = 14;\n\t\t\tconst output = \"The black wolf jumps over the lazy dog\";\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localRemoveMessage = client.makeOpMessage(\n\t\t\t\tclient.removeRangeLocal(deleteRangeStart, deleteRangeEnd),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tclient.applyMsg(localRemoveMessage);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, deleteRangeStart);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, deleteRangeEnd);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, deleteRangeEnd - deleteRangeStart);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, \"brown fox \");\n\n\t\t\tconst remoteInsertMessage = client.makeOpMessage(\n\t\t\t\tcreateInsertSegmentOp(insertPos, new TextSegment(insertText)),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteInsertMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, deleteRangeStart);\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tdeleteRangeStart + insertText.length,\n\t\t\t);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, insertText.length);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, insertText);\n\n\t\t\tassert.equal(client.getText(), output);\n\t\t});\n\n\t\tit(\"insertPos is deleteRangeStart, deleteLocal insertRemote, remote before local\", () => {\n\t\t\tconst insertPos = 10; // before \"fox\"\n\t\t\tconst insertText = \"black wolf \";\n\t\t\tconst deleteRangeStart = 4; // \"brown fox \"\n\t\t\tconst deleteRangeEnd = 14;\n\t\t\tconst output = \"The black wolf jumps over the lazy dog\";\n\n\t\t\tconst currentSeqNumber = client.mergeTree.collabWindow.currentSeq;\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\n\t\t\tconst localRemoveMessage = client.makeOpMessage(\n\t\t\t\tclient.removeRangeLocal(deleteRangeStart, deleteRangeEnd),\n\t\t\t\tcurrentSeqNumber + 2,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t);\n\n\t\t\tassert(event);\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.first.position, deleteRangeStart);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, deleteRangeEnd);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, deleteRangeEnd - deleteRangeStart);\n\t\t\tconst segment1 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment1.text, \"brown fox \");\n\n\t\t\tconst remoteInsertMessage = client.makeOpMessage(\n\t\t\t\tcreateInsertSegmentOp(insertPos, new TextSegment(insertText)),\n\t\t\t\tcurrentSeqNumber + 1,\n\t\t\t\tcurrentSeqNumber, // refseqnum\n\t\t\t\tremoteUserId,\n\t\t\t);\n\n\t\t\tclient.applyMsg(remoteInsertMessage);\n\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.first.position, deleteRangeStart);\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tdeleteRangeStart + insertText.length,\n\t\t\t);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.segment.cachedLength, insertText.length);\n\t\t\tconst segment2 = event.first.segment as TextSegment;\n\t\t\tassert.equal(segment2.text, insertText);\n\n\t\t\tclient.applyMsg(localRemoveMessage);\n\n\t\t\tassert.equal(client.getText(), output);\n\t\t});\n\t});\n});\n\ndescribe(\"SequenceDeltaEvent\", () => {\n\tconst localUserLongId = \"localUser\";\n\tlet client: TestClient;\n\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t});\n\n\tdescribe(\".ranges\", () => {\n\t\tit(\"single segment\", () => {\n\t\t\tconst insertText = \"text\";\n\t\t\tlet deltaArgs: IMergeTreeDeltaCallbackArgs | undefined;\n\t\t\tclient.on(\"delta\", (opArgs, delta) => {\n\t\t\t\tdeltaArgs = delta;\n\t\t\t});\n\t\t\tconst op = client.insertTextLocal(0, insertText);\n\n\t\t\tassert(deltaArgs);\n\t\t\tassert.equal(deltaArgs.deltaSegments.length, 1);\n\n\t\t\tassert(op);\n\t\t\tconst event = new SequenceDeltaEvent({ op }, deltaArgs, client);\n\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.ranges.length, 1);\n\t\t\tassert.equal(event.first.position, 0);\n\t\t\tassert.equal(event.first.segment.cachedLength, insertText.length);\n\t\t\tassert.equal(event.last.position + event.last.segment.cachedLength, insertText.length);\n\t\t});\n\n\t\tit(\"multiple continuous segments\", () => {\n\t\t\tconst insertText = \"text\";\n\t\t\tconst segmentCount = 5;\n\t\t\tfor (let i = 0; i < segmentCount + 2; i = i + 1) {\n\t\t\t\tclient.insertTextLocal(0, insertText);\n\t\t\t}\n\n\t\t\tlet deltaArgs: IMergeTreeDeltaCallbackArgs | undefined;\n\t\t\tclient.on(\"delta\", (opArgs, delta) => {\n\t\t\t\tdeltaArgs = delta;\n\t\t\t});\n\t\t\tconst op = client.annotateRangeLocal(\n\t\t\t\tinsertText.length,\n\t\t\t\tclient.getLength() - insertText.length,\n\t\t\t\t{\n\t\t\t\t\tfoo: \"bar\",\n\t\t\t\t},\n\t\t\t);\n\n\t\t\tassert(deltaArgs);\n\t\t\tassert.equal(deltaArgs.deltaSegments.length, segmentCount);\n\n\t\t\tassert(op);\n\t\t\tconst event = new SequenceDeltaEvent({ op }, deltaArgs, client);\n\n\t\t\tassert(event.isLocal);\n\t\t\tassert.equal(event.ranges.length, segmentCount);\n\t\t\tassert.equal(event.first.position, insertText.length);\n\t\t\tfor (let i = 0; i < segmentCount; i = i + 1) {\n\t\t\t\tassert.equal(event.ranges[i].position, (i + 1) * insertText.length);\n\t\t\t\tassert.equal(event.ranges[i].segment.cachedLength, insertText.length);\n\t\t\t\tassert.equal(event.ranges[i].propertyDeltas.foo, null);\n\t\t\t}\n\t\t\tassert.equal(\n\t\t\t\tevent.last.position + event.last.segment.cachedLength,\n\t\t\t\tclient.getLength() - insertText.length,\n\t\t\t);\n\t\t});\n\n\t\tit(\"multiple noncontinuous segments\", () => {\n\t\t\tconst textCount = 4;\n\t\t\tconst segmentCount = 5;\n\t\t\tfor (let i = 0; i < segmentCount; i = i + 1) {\n\t\t\t\tconst op = client.insertTextLocal(0, `${i}`.repeat(textCount));\n\t\t\t\tclient.applyMsg(\n\t\t\t\t\tclient.makeOpMessage(op, client.mergeTree.collabWindow.currentSeq + 1),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst remoteRemoveMessage = client.makeOpMessage(\n\t\t\t\tcreateRemoveRangeOp(0, client.getLength()),\n\t\t\t\tclient.mergeTree.collabWindow.currentSeq + 1,\n\t\t\t);\n\t\t\tremoteRemoveMessage.clientSequenceNumber = 0;\n\t\t\tremoteRemoveMessage.clientId = \"remote user\";\n\n\t\t\tfor (let i = 0; i < segmentCount; i = i + 1) {\n\t\t\t\tclient.insertTextLocal(i * 2 * textCount, \"b\".repeat(textCount));\n\t\t\t}\n\n\t\t\tlet event: SequenceDeltaEvent | undefined;\n\t\t\tclient.on(\"delta\", (clientArgs, mergeTreeArgs) => {\n\t\t\t\tevent = new SequenceDeltaEvent(clientArgs, mergeTreeArgs, client);\n\t\t\t});\n\t\t\tclient.applyMsg(remoteRemoveMessage);\n\n\t\t\tassert(event);\n\t\t\tassert(!event.isLocal);\n\t\t\tassert.equal(event.ranges.length, segmentCount);\n\t\t\tfor (let i = 0; i < segmentCount; i = i + 1) {\n\t\t\t\tassert.equal(event.ranges[i].position, (i + 1) * textCount);\n\t\t\t\tassert.equal(event.ranges[i].segment.cachedLength, textCount);\n\t\t\t}\n\t\t});\n\t});\n});\n"]}