@fluidframework/merge-tree 2.30.0 → 2.31.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. package/CHANGELOG.md +403 -399
  2. package/api-report/merge-tree.legacy.alpha.api.md +1 -0
  3. package/dist/MergeTreeTextHelper.d.ts +9 -3
  4. package/dist/MergeTreeTextHelper.d.ts.map +1 -1
  5. package/dist/MergeTreeTextHelper.js +5 -5
  6. package/dist/MergeTreeTextHelper.js.map +1 -1
  7. package/dist/client.d.ts +7 -13
  8. package/dist/client.d.ts.map +1 -1
  9. package/dist/client.js +136 -110
  10. package/dist/client.js.map +1 -1
  11. package/dist/endOfTreeSegment.d.ts +12 -8
  12. package/dist/endOfTreeSegment.d.ts.map +1 -1
  13. package/dist/endOfTreeSegment.js +2 -4
  14. package/dist/endOfTreeSegment.js.map +1 -1
  15. package/dist/index.d.ts +6 -3
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +2 -3
  18. package/dist/index.js.map +1 -1
  19. package/dist/mergeTree.d.ts +37 -23
  20. package/dist/mergeTree.d.ts.map +1 -1
  21. package/dist/mergeTree.js +400 -483
  22. package/dist/mergeTree.js.map +1 -1
  23. package/dist/mergeTreeDeltaCallback.d.ts +4 -8
  24. package/dist/mergeTreeDeltaCallback.d.ts.map +1 -1
  25. package/dist/mergeTreeDeltaCallback.js.map +1 -1
  26. package/dist/mergeTreeNodes.d.ts +32 -10
  27. package/dist/mergeTreeNodes.d.ts.map +1 -1
  28. package/dist/mergeTreeNodes.js +43 -28
  29. package/dist/mergeTreeNodes.js.map +1 -1
  30. package/dist/partialLengths.d.ts +2 -2
  31. package/dist/partialLengths.d.ts.map +1 -1
  32. package/dist/partialLengths.js +181 -109
  33. package/dist/partialLengths.js.map +1 -1
  34. package/dist/perspective.d.ts +8 -27
  35. package/dist/perspective.d.ts.map +1 -1
  36. package/dist/perspective.js +7 -67
  37. package/dist/perspective.js.map +1 -1
  38. package/dist/revertibles.d.ts.map +1 -1
  39. package/dist/revertibles.js +2 -2
  40. package/dist/revertibles.js.map +1 -1
  41. package/dist/segmentInfos.d.ts +20 -106
  42. package/dist/segmentInfos.d.ts.map +1 -1
  43. package/dist/segmentInfos.js +28 -42
  44. package/dist/segmentInfos.js.map +1 -1
  45. package/dist/segmentPropertiesManager.d.ts +1 -14
  46. package/dist/segmentPropertiesManager.d.ts.map +1 -1
  47. package/dist/segmentPropertiesManager.js +3 -17
  48. package/dist/segmentPropertiesManager.js.map +1 -1
  49. package/dist/snapshotLoader.d.ts.map +1 -1
  50. package/dist/snapshotLoader.js +62 -19
  51. package/dist/snapshotLoader.js.map +1 -1
  52. package/dist/snapshotV1.d.ts.map +1 -1
  53. package/dist/snapshotV1.js +55 -24
  54. package/dist/snapshotV1.js.map +1 -1
  55. package/dist/snapshotlegacy.d.ts.map +1 -1
  56. package/dist/snapshotlegacy.js +6 -9
  57. package/dist/snapshotlegacy.js.map +1 -1
  58. package/dist/stamps.d.ts +1 -1
  59. package/dist/stamps.js +1 -1
  60. package/dist/stamps.js.map +1 -1
  61. package/dist/test/Insertion.perf.spec.js +6 -51
  62. package/dist/test/Insertion.perf.spec.js.map +1 -1
  63. package/dist/test/PartialLengths.perf.spec.js +18 -25
  64. package/dist/test/PartialLengths.perf.spec.js.map +1 -1
  65. package/dist/test/Removal.perf.spec.js +13 -41
  66. package/dist/test/Removal.perf.spec.js.map +1 -1
  67. package/dist/test/beastTest.spec.d.ts.map +1 -1
  68. package/dist/test/beastTest.spec.js +41 -66
  69. package/dist/test/beastTest.spec.js.map +1 -1
  70. package/dist/test/client.annotateMarker.spec.js +1 -11
  71. package/dist/test/client.annotateMarker.spec.js.map +1 -1
  72. package/dist/test/client.applyMsg.spec.js +14 -14
  73. package/dist/test/client.applyMsg.spec.js.map +1 -1
  74. package/dist/test/client.getPosition.spec.js +1 -1
  75. package/dist/test/client.getPosition.spec.js.map +1 -1
  76. package/dist/test/client.localReference.spec.js +1 -1
  77. package/dist/test/client.localReference.spec.js.map +1 -1
  78. package/dist/test/client.rollback.spec.js +49 -58
  79. package/dist/test/client.rollback.spec.js.map +1 -1
  80. package/dist/test/client.rollbackFarm.spec.js +1 -1
  81. package/dist/test/client.rollbackFarm.spec.js.map +1 -1
  82. package/dist/test/client.searchForMarker.spec.js +4 -21
  83. package/dist/test/client.searchForMarker.spec.js.map +1 -1
  84. package/dist/test/index.d.ts +2 -2
  85. package/dist/test/index.d.ts.map +1 -1
  86. package/dist/test/index.js +2 -6
  87. package/dist/test/index.js.map +1 -1
  88. package/dist/test/mergeTree.annotate.deltaCallback.spec.js +14 -59
  89. package/dist/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
  90. package/dist/test/mergeTree.annotate.spec.js +47 -63
  91. package/dist/test/mergeTree.annotate.spec.js.map +1 -1
  92. package/dist/test/mergeTree.insert.deltaCallback.spec.js +9 -62
  93. package/dist/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
  94. package/dist/test/mergeTree.insertingWalk.spec.js +59 -125
  95. package/dist/test/mergeTree.insertingWalk.spec.js.map +1 -1
  96. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +12 -93
  97. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
  98. package/dist/test/mergeTree.markRangeRemoved.spec.js +10 -7
  99. package/dist/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  100. package/dist/test/mergeTree.walk.spec.js +2 -14
  101. package/dist/test/mergeTree.walk.spec.js.map +1 -1
  102. package/dist/test/mergeTreeOperationRunner.js +2 -2
  103. package/dist/test/mergeTreeOperationRunner.js.map +1 -1
  104. package/dist/test/obliterate.concurrent.spec.js +18 -23
  105. package/dist/test/obliterate.concurrent.spec.js.map +1 -1
  106. package/dist/test/obliterate.partialLength.spec.js +166 -136
  107. package/dist/test/obliterate.partialLength.spec.js.map +1 -1
  108. package/dist/test/obliterate.spec.js +16 -126
  109. package/dist/test/obliterate.spec.js.map +1 -1
  110. package/dist/test/partialLength.spec.js +28 -196
  111. package/dist/test/partialLength.spec.js.map +1 -1
  112. package/dist/test/perspective.spec.js +34 -0
  113. package/dist/test/perspective.spec.js.map +1 -1
  114. package/dist/test/propertyManager.spec.js +1 -1
  115. package/dist/test/propertyManager.spec.js.map +1 -1
  116. package/dist/test/resetPendingSegmentsToOp.spec.js +0 -2
  117. package/dist/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  118. package/dist/test/segmentGroupCollection.spec.js +10 -4
  119. package/dist/test/segmentGroupCollection.spec.js.map +1 -1
  120. package/dist/test/testClient.d.ts +1 -0
  121. package/dist/test/testClient.d.ts.map +1 -1
  122. package/dist/test/testClient.js +16 -26
  123. package/dist/test/testClient.js.map +1 -1
  124. package/dist/test/testClientLogger.d.ts.map +1 -1
  125. package/dist/test/testClientLogger.js +3 -10
  126. package/dist/test/testClientLogger.js.map +1 -1
  127. package/dist/test/testServer.d.ts +2 -1
  128. package/dist/test/testServer.d.ts.map +1 -1
  129. package/dist/test/testServer.js +7 -5
  130. package/dist/test/testServer.js.map +1 -1
  131. package/dist/test/testUtils.d.ts +36 -56
  132. package/dist/test/testUtils.d.ts.map +1 -1
  133. package/dist/test/testUtils.js +68 -77
  134. package/dist/test/testUtils.js.map +1 -1
  135. package/dist/test/text.d.ts +2 -2
  136. package/dist/test/text.d.ts.map +1 -1
  137. package/dist/test/text.js +5 -2
  138. package/dist/test/text.js.map +1 -1
  139. package/dist/textSegment.d.ts +0 -6
  140. package/dist/textSegment.d.ts.map +1 -1
  141. package/dist/textSegment.js.map +1 -1
  142. package/dist/zamboni.d.ts.map +1 -1
  143. package/dist/zamboni.js +53 -26
  144. package/dist/zamboni.js.map +1 -1
  145. package/lib/MergeTreeTextHelper.d.ts +9 -3
  146. package/lib/MergeTreeTextHelper.d.ts.map +1 -1
  147. package/lib/MergeTreeTextHelper.js +5 -5
  148. package/lib/MergeTreeTextHelper.js.map +1 -1
  149. package/lib/client.d.ts +7 -13
  150. package/lib/client.d.ts.map +1 -1
  151. package/lib/client.js +117 -116
  152. package/lib/client.js.map +1 -1
  153. package/lib/endOfTreeSegment.d.ts +12 -8
  154. package/lib/endOfTreeSegment.d.ts.map +1 -1
  155. package/lib/endOfTreeSegment.js +2 -4
  156. package/lib/endOfTreeSegment.js.map +1 -1
  157. package/lib/index.d.ts +6 -3
  158. package/lib/index.d.ts.map +1 -1
  159. package/lib/index.js +1 -1
  160. package/lib/index.js.map +1 -1
  161. package/lib/mergeTree.d.ts +37 -23
  162. package/lib/mergeTree.d.ts.map +1 -1
  163. package/lib/mergeTree.js +381 -488
  164. package/lib/mergeTree.js.map +1 -1
  165. package/lib/mergeTreeDeltaCallback.d.ts +4 -8
  166. package/lib/mergeTreeDeltaCallback.d.ts.map +1 -1
  167. package/lib/mergeTreeDeltaCallback.js.map +1 -1
  168. package/lib/mergeTreeNodes.d.ts +32 -10
  169. package/lib/mergeTreeNodes.d.ts.map +1 -1
  170. package/lib/mergeTreeNodes.js +42 -29
  171. package/lib/mergeTreeNodes.js.map +1 -1
  172. package/lib/partialLengths.d.ts +2 -2
  173. package/lib/partialLengths.d.ts.map +1 -1
  174. package/lib/partialLengths.js +160 -111
  175. package/lib/partialLengths.js.map +1 -1
  176. package/lib/perspective.d.ts +8 -27
  177. package/lib/perspective.d.ts.map +1 -1
  178. package/lib/perspective.js +8 -68
  179. package/lib/perspective.js.map +1 -1
  180. package/lib/revertibles.d.ts.map +1 -1
  181. package/lib/revertibles.js +2 -2
  182. package/lib/revertibles.js.map +1 -1
  183. package/lib/segmentInfos.d.ts +20 -106
  184. package/lib/segmentInfos.d.ts.map +1 -1
  185. package/lib/segmentInfos.js +26 -37
  186. package/lib/segmentInfos.js.map +1 -1
  187. package/lib/segmentPropertiesManager.d.ts +1 -14
  188. package/lib/segmentPropertiesManager.d.ts.map +1 -1
  189. package/lib/segmentPropertiesManager.js +2 -16
  190. package/lib/segmentPropertiesManager.js.map +1 -1
  191. package/lib/snapshotLoader.d.ts.map +1 -1
  192. package/lib/snapshotLoader.js +39 -19
  193. package/lib/snapshotLoader.js.map +1 -1
  194. package/lib/snapshotV1.d.ts.map +1 -1
  195. package/lib/snapshotV1.js +34 -26
  196. package/lib/snapshotV1.js.map +1 -1
  197. package/lib/snapshotlegacy.d.ts.map +1 -1
  198. package/lib/snapshotlegacy.js +7 -10
  199. package/lib/snapshotlegacy.js.map +1 -1
  200. package/lib/stamps.d.ts +1 -1
  201. package/lib/stamps.js +1 -1
  202. package/lib/stamps.js.map +1 -1
  203. package/lib/test/Insertion.perf.spec.js +6 -51
  204. package/lib/test/Insertion.perf.spec.js.map +1 -1
  205. package/lib/test/PartialLengths.perf.spec.js +18 -25
  206. package/lib/test/PartialLengths.perf.spec.js.map +1 -1
  207. package/lib/test/Removal.perf.spec.js +13 -41
  208. package/lib/test/Removal.perf.spec.js.map +1 -1
  209. package/lib/test/beastTest.spec.d.ts.map +1 -1
  210. package/lib/test/beastTest.spec.js +42 -67
  211. package/lib/test/beastTest.spec.js.map +1 -1
  212. package/lib/test/client.annotateMarker.spec.js +1 -11
  213. package/lib/test/client.annotateMarker.spec.js.map +1 -1
  214. package/lib/test/client.applyMsg.spec.js +14 -14
  215. package/lib/test/client.applyMsg.spec.js.map +1 -1
  216. package/lib/test/client.getPosition.spec.js +1 -1
  217. package/lib/test/client.getPosition.spec.js.map +1 -1
  218. package/lib/test/client.localReference.spec.js +1 -1
  219. package/lib/test/client.localReference.spec.js.map +1 -1
  220. package/lib/test/client.rollback.spec.js +50 -59
  221. package/lib/test/client.rollback.spec.js.map +1 -1
  222. package/lib/test/client.rollbackFarm.spec.js +1 -1
  223. package/lib/test/client.rollbackFarm.spec.js.map +1 -1
  224. package/lib/test/client.searchForMarker.spec.js +4 -21
  225. package/lib/test/client.searchForMarker.spec.js.map +1 -1
  226. package/lib/test/index.d.ts +2 -2
  227. package/lib/test/index.d.ts.map +1 -1
  228. package/lib/test/index.js +1 -1
  229. package/lib/test/index.js.map +1 -1
  230. package/lib/test/mergeTree.annotate.deltaCallback.spec.js +15 -60
  231. package/lib/test/mergeTree.annotate.deltaCallback.spec.js.map +1 -1
  232. package/lib/test/mergeTree.annotate.spec.js +48 -64
  233. package/lib/test/mergeTree.annotate.spec.js.map +1 -1
  234. package/lib/test/mergeTree.insert.deltaCallback.spec.js +10 -63
  235. package/lib/test/mergeTree.insert.deltaCallback.spec.js.map +1 -1
  236. package/lib/test/mergeTree.insertingWalk.spec.js +61 -127
  237. package/lib/test/mergeTree.insertingWalk.spec.js.map +1 -1
  238. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +13 -94
  239. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
  240. package/lib/test/mergeTree.markRangeRemoved.spec.js +10 -7
  241. package/lib/test/mergeTree.markRangeRemoved.spec.js.map +1 -1
  242. package/lib/test/mergeTree.walk.spec.js +2 -14
  243. package/lib/test/mergeTree.walk.spec.js.map +1 -1
  244. package/lib/test/mergeTreeOperationRunner.js +3 -3
  245. package/lib/test/mergeTreeOperationRunner.js.map +1 -1
  246. package/lib/test/obliterate.concurrent.spec.js +18 -23
  247. package/lib/test/obliterate.concurrent.spec.js.map +1 -1
  248. package/lib/test/obliterate.partialLength.spec.js +167 -137
  249. package/lib/test/obliterate.partialLength.spec.js.map +1 -1
  250. package/lib/test/obliterate.spec.js +17 -127
  251. package/lib/test/obliterate.spec.js.map +1 -1
  252. package/lib/test/partialLength.spec.js +29 -197
  253. package/lib/test/partialLength.spec.js.map +1 -1
  254. package/lib/test/perspective.spec.js +34 -0
  255. package/lib/test/perspective.spec.js.map +1 -1
  256. package/lib/test/propertyManager.spec.js +2 -2
  257. package/lib/test/propertyManager.spec.js.map +1 -1
  258. package/lib/test/resetPendingSegmentsToOp.spec.js +0 -2
  259. package/lib/test/resetPendingSegmentsToOp.spec.js.map +1 -1
  260. package/lib/test/segmentGroupCollection.spec.js +10 -4
  261. package/lib/test/segmentGroupCollection.spec.js.map +1 -1
  262. package/lib/test/testClient.d.ts +1 -0
  263. package/lib/test/testClient.d.ts.map +1 -1
  264. package/lib/test/testClient.js +18 -28
  265. package/lib/test/testClient.js.map +1 -1
  266. package/lib/test/testClientLogger.d.ts.map +1 -1
  267. package/lib/test/testClientLogger.js +3 -10
  268. package/lib/test/testClientLogger.js.map +1 -1
  269. package/lib/test/testServer.d.ts +2 -1
  270. package/lib/test/testServer.d.ts.map +1 -1
  271. package/lib/test/testServer.js +7 -5
  272. package/lib/test/testServer.js.map +1 -1
  273. package/lib/test/testUtils.d.ts +36 -56
  274. package/lib/test/testUtils.d.ts.map +1 -1
  275. package/lib/test/testUtils.js +66 -48
  276. package/lib/test/testUtils.js.map +1 -1
  277. package/lib/test/text.d.ts +2 -2
  278. package/lib/test/text.d.ts.map +1 -1
  279. package/lib/test/text.js +6 -3
  280. package/lib/test/text.js.map +1 -1
  281. package/lib/textSegment.d.ts +0 -6
  282. package/lib/textSegment.d.ts.map +1 -1
  283. package/lib/textSegment.js.map +1 -1
  284. package/lib/tsdoc-metadata.json +1 -1
  285. package/lib/zamboni.d.ts.map +1 -1
  286. package/lib/zamboni.js +32 -28
  287. package/lib/zamboni.js.map +1 -1
  288. package/package.json +17 -20
  289. package/src/MergeTreeTextHelper.ts +17 -12
  290. package/src/client.ts +141 -197
  291. package/src/endOfTreeSegment.ts +11 -8
  292. package/src/index.ts +4 -3
  293. package/src/mergeTree.ts +482 -633
  294. package/src/mergeTreeDeltaCallback.ts +4 -8
  295. package/src/mergeTreeNodes.ts +66 -45
  296. package/src/partialLengths.ts +181 -137
  297. package/src/perspective.ts +17 -95
  298. package/src/revertibles.ts +2 -7
  299. package/src/segmentInfos.ts +48 -141
  300. package/src/segmentPropertiesManager.ts +2 -16
  301. package/src/snapshotLoader.ts +62 -30
  302. package/src/snapshotV1.ts +36 -28
  303. package/src/snapshotlegacy.ts +7 -16
  304. package/src/stamps.ts +1 -1
  305. package/src/textSegment.ts +0 -13
  306. package/src/zamboni.ts +38 -32
  307. package/tsconfig.json +1 -0
  308. package/prettier.config.cjs +0 -8
@@ -6,7 +6,6 @@
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  /* eslint-disable @typescript-eslint/no-non-null-assertion */
8
8
  const node_assert_1 = require("node:assert");
9
- const constants_js_1 = require("../constants.js");
10
9
  const mergeTreeNodes_js_1 = require("../mergeTreeNodes.js");
11
10
  const ops_js_1 = require("../ops.js");
12
11
  const textSegment_js_1 = require("../textSegment.js");
@@ -18,20 +17,12 @@ describe("client.rollback", () => {
18
17
  let client;
19
18
  beforeEach(() => {
20
19
  client = new testClient_js_1.TestClient();
21
- (0, testUtils_js_1.insertSegments)({
22
- mergeTree: client.mergeTree,
23
- pos: 0,
24
- segments: [textSegment_js_1.TextSegment.make("")],
25
- refSeq: constants_js_1.UniversalSequenceNumber,
26
- clientId: client.getClientId(),
27
- seq: constants_js_1.UniversalSequenceNumber,
28
- opArgs: undefined,
29
- });
20
+ client.mergeTree.insertSegments(0, [textSegment_js_1.TextSegment.make("")], client.mergeTree.localPerspective, client.mergeTree.collabWindow.mintNextLocalOperationStamp(), undefined);
30
21
  client.startOrUpdateCollaboration(localUserLongId);
31
22
  });
32
23
  it("Should rollback insert on empty string", () => {
33
24
  client.insertTextLocal(0, "abcd");
34
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
25
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
35
26
  node_assert_1.strict.equal(client.getText(), "");
36
27
  });
37
28
  it("Should rollback insert marker", () => {
@@ -39,7 +30,7 @@ describe("client.rollback", () => {
39
30
  client.insertMarkerLocal(1, ops_js_1.ReferenceType.Simple, {
40
31
  [mergeTreeNodes_js_1.reservedMarkerIdKey]: "markerId",
41
32
  });
42
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
33
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
43
34
  node_assert_1.strict.equal(client.getText(), "abc");
44
35
  const marker = client.getMarkerFromId("markerId");
45
36
  node_assert_1.strict.equal(marker, undefined);
@@ -48,10 +39,10 @@ describe("client.rollback", () => {
48
39
  client.insertTextLocal(0, "ghi");
49
40
  client.insertTextLocal(0, "def");
50
41
  client.insertTextLocal(0, "abc");
51
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
42
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
52
43
  node_assert_1.strict.equal(client.getText(), "defghi");
53
44
  (0, testUtils_js_1.validatePartialLengths)(client.getClientId(), client.mergeTree);
54
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
45
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
55
46
  node_assert_1.strict.equal(client.getText(), "ghi");
56
47
  (0, testUtils_js_1.validatePartialLengths)(client.getClientId(), client.mergeTree);
57
48
  });
@@ -59,8 +50,8 @@ describe("client.rollback", () => {
59
50
  client.insertTextLocal(0, "aefg");
60
51
  client.insertTextLocal(1, "bd");
61
52
  client.insertTextLocal(2, "c");
62
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
63
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
53
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
54
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
64
55
  node_assert_1.strict.equal(client.getText(), "aefg");
65
56
  (0, testUtils_js_1.validatePartialLengths)(client.getClientId(), client.mergeTree);
66
57
  });
@@ -69,7 +60,7 @@ describe("client.rollback", () => {
69
60
  client.insertTextLocal(1, "bcd");
70
61
  const segmentGroup = client.peekPendingSegmentGroups();
71
62
  const segment = segmentGroup.segments[0];
72
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.INSERT }, segmentGroup);
63
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.INSERT }, segmentGroup);
73
64
  // do some work and move the client's min seq forward, so zamboni runs
74
65
  for (const c of "hello world") {
75
66
  client.applyMsg(client.makeOpMessage(client.insertTextLocal(client.getLength(), c), client.getCurrentSeq() + 1, client.getCurrentSeq(), undefined, client.getCurrentSeq()));
@@ -82,7 +73,7 @@ describe("client.rollback", () => {
82
73
  });
83
74
  const marker = client.getMarkerFromId("markerId");
84
75
  client.annotateMarker(marker, { foo: "bar" });
85
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
76
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
86
77
  const properties = marker.getProperties();
87
78
  node_assert_1.strict.equal(properties?.foo, undefined);
88
79
  });
@@ -93,7 +84,7 @@ describe("client.rollback", () => {
93
84
  });
94
85
  const marker = client.getMarkerFromId("markerId");
95
86
  client.annotateMarker(marker, { foo: "baz" });
96
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
87
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
97
88
  const properties = marker.getProperties();
98
89
  node_assert_1.strict.equal(properties?.foo, "bar");
99
90
  });
@@ -105,7 +96,7 @@ describe("client.rollback", () => {
105
96
  const marker = client.getMarkerFromId("markerId");
106
97
  // eslint-disable-next-line unicorn/no-null
107
98
  client.annotateMarker(marker, { foo: null });
108
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
99
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
109
100
  const properties = marker.getProperties();
110
101
  node_assert_1.strict.equal(properties?.foo, "bar");
111
102
  });
@@ -116,7 +107,7 @@ describe("client.rollback", () => {
116
107
  });
117
108
  const marker = client.getMarkerFromId("markerId");
118
109
  client.annotateMarker(marker, { [mergeTreeNodes_js_1.reservedMarkerIdKey]: "markerId", abc: "def" });
119
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
110
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
120
111
  const properties = marker.getProperties();
121
112
  node_assert_1.strict.equal(properties?.foo, "bar");
122
113
  node_assert_1.strict.equal(properties?.abc, undefined);
@@ -133,7 +124,7 @@ describe("client.rollback", () => {
133
124
  // eslint-disable-next-line unicorn/no-null
134
125
  foo: null,
135
126
  });
136
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
127
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
137
128
  const properties = marker.getProperties();
138
129
  node_assert_1.strict.equal(properties?.foo, "bar");
139
130
  node_assert_1.strict.equal(properties?.abc, undefined);
@@ -141,7 +132,7 @@ describe("client.rollback", () => {
141
132
  it("Should rollback annotate causes split string", () => {
142
133
  client.insertTextLocal(0, "abcdefg");
143
134
  client.annotateRangeLocal(1, 3, { foo: "bar" });
144
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
135
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
145
136
  for (let i = 0; i < 4; i++) {
146
137
  const props = client.getPropertiesAtPosition(i);
147
138
  (0, node_assert_1.strict)(props === undefined || props.foo === undefined);
@@ -151,7 +142,7 @@ describe("client.rollback", () => {
151
142
  client.insertTextLocal(0, "abfg");
152
143
  client.insertTextLocal(1, "cde");
153
144
  client.annotateRangeLocal(1, 6, { foo: "bar" });
154
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
145
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
155
146
  for (let i = 0; i < 7; i++) {
156
147
  const props = client.getPropertiesAtPosition(i);
157
148
  (0, node_assert_1.strict)(props === undefined || props.foo === undefined);
@@ -161,8 +152,8 @@ describe("client.rollback", () => {
161
152
  client.insertTextLocal(0, "abfg");
162
153
  client.annotateRangeLocal(0, 4, { foo: "bar" });
163
154
  client.insertTextLocal(1, "cde");
164
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
165
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
155
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
156
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
166
157
  node_assert_1.strict.equal(client.getText(), "abfg");
167
158
  for (let i = 0; i < 4; i++) {
168
159
  const props = client.getPropertiesAtPosition(i);
@@ -175,14 +166,14 @@ describe("client.rollback", () => {
175
166
  client.annotateRangeLocal(2, 4, { foo: "two" });
176
167
  client.annotateRangeLocal(0, 3, { foo: "three" });
177
168
  client.insertTextLocal(1, "b");
178
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
169
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
179
170
  let props = client.getPropertiesAtPosition(3);
180
171
  (0, node_assert_1.strict)(props !== undefined && props.foo === "two");
181
172
  for (let i = 0; i < 3; i++) {
182
173
  props = client.getPropertiesAtPosition(i);
183
174
  (0, node_assert_1.strict)(props !== undefined && props.foo === "three");
184
175
  }
185
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
176
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
186
177
  for (let i = 0; i < 2; i++) {
187
178
  props = client.getPropertiesAtPosition(i);
188
179
  (0, node_assert_1.strict)(props !== undefined && props.foo === "one");
@@ -191,14 +182,14 @@ describe("client.rollback", () => {
191
182
  props = client.getPropertiesAtPosition(i);
192
183
  (0, node_assert_1.strict)(props !== undefined && props.foo === "two");
193
184
  }
194
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
185
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
195
186
  props = client.getPropertiesAtPosition(3);
196
187
  (0, node_assert_1.strict)(props === undefined || props.foo === undefined);
197
188
  for (let i = 0; i < 3; i++) {
198
189
  props = client.getPropertiesAtPosition(i);
199
190
  (0, node_assert_1.strict)(props !== undefined && props.foo === "one");
200
191
  }
201
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
192
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
202
193
  node_assert_1.strict.equal(client.getText(), "acde");
203
194
  for (let i = 0; i < 4; i++) {
204
195
  props = client.getPropertiesAtPosition(i);
@@ -209,7 +200,7 @@ describe("client.rollback", () => {
209
200
  client.insertTextLocal(0, "abcde");
210
201
  client.annotateRangeLocal(2, 3, { foo: "bar" });
211
202
  client.annotateRangeLocal(1, 4, { foo: "bar" });
212
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
203
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
213
204
  for (let i = 0; i < 5; i++) {
214
205
  const props = client.getPropertiesAtPosition(i);
215
206
  if (i === 2) {
@@ -225,7 +216,7 @@ describe("client.rollback", () => {
225
216
  client.annotateRangeLocal(2, 3, { foo: "bar" });
226
217
  const segmentGroup = client.peekPendingSegmentGroups();
227
218
  const segment = segmentGroup.segments[0];
228
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, segmentGroup);
219
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, segmentGroup);
229
220
  // do some work and move the client's min seq forward, so zamboni runs
230
221
  for (const c of "hello world") {
231
222
  client.applyMsg(client.makeOpMessage(client.insertTextLocal(client.getLength(), c), client.getCurrentSeq() + 1, client.getCurrentSeq(), undefined, client.getCurrentSeq()));
@@ -235,7 +226,7 @@ describe("client.rollback", () => {
235
226
  it("Should rollback delete on single segment", () => {
236
227
  client.insertTextLocal(0, "abcd");
237
228
  client.removeRangeLocal(0, 4);
238
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());
229
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());
239
230
  node_assert_1.strict.equal(client.getText(), "abcd");
240
231
  });
241
232
  it("Should rollback delete which causes split segments", () => {
@@ -246,7 +237,7 @@ describe("client.rollback", () => {
246
237
  node_assert_1.strict.equal(client.getText(), "abcde");
247
238
  deltaEvent = true;
248
239
  });
249
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());
240
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());
250
241
  node_assert_1.strict.equal(client.getText(), "abcde");
251
242
  node_assert_1.strict.equal(deltaEvent, true);
252
243
  });
@@ -282,7 +273,7 @@ describe("client.rollback", () => {
282
273
  }
283
274
  }
284
275
  });
285
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());
276
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());
286
277
  node_assert_1.strict.equal(client.getText(), "abcde");
287
278
  node_assert_1.strict.equal(deltaCount, 3);
288
279
  (0, node_assert_1.strict)(bFound);
@@ -295,7 +286,7 @@ describe("client.rollback", () => {
295
286
  client.insertTextLocal(client.getLength(), c);
296
287
  }
297
288
  client.removeRangeLocal(1, 4);
298
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());
289
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());
299
290
  // The insertion position calculation will be wrong if the blocks aren't updated correctly
300
291
  client.insertTextLocal(text.length - 1, "+");
301
292
  const expectedText = `${text.slice(0, Math.max(0, text.length - 1))}+${text[text.length - 1]}`;
@@ -312,7 +303,7 @@ describe("client.rollback", () => {
312
303
  const ref2 = client.createLocalReferencePosition(segInfo3.segment, 1, ops_js_1.ReferenceType.Simple, undefined);
313
304
  const refStay = client.createLocalReferencePosition(segInfo3.segment, 1, ops_js_1.ReferenceType.StayOnRemove, undefined);
314
305
  client.removeRangeLocal(0, 7);
315
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());
306
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());
316
307
  node_assert_1.strict.equal(client.getText(), "abcdefg");
317
308
  const segInfo1After = client.getContainingSegment(2);
318
309
  node_assert_1.strict.notEqual(segInfo1After, undefined);
@@ -330,7 +321,7 @@ describe("client.rollback", () => {
330
321
  client.removeRangeLocal(1, 4);
331
322
  const segmentGroup = client.peekPendingSegmentGroups();
332
323
  const segment = segmentGroup.segments[0];
333
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, segmentGroup);
324
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, segmentGroup);
334
325
  // do some work and move the client's min seq forward, so zamboni runs
335
326
  for (const c of "hello world") {
336
327
  client.applyMsg(client.makeOpMessage(client.insertTextLocal(client.getLength(), c), client.getCurrentSeq() + 1, client.getCurrentSeq(), undefined, client.getCurrentSeq()));
@@ -342,7 +333,7 @@ describe("client.rollback", () => {
342
333
  client.insertTextLocal(3, "123");
343
334
  client.annotateRangeLocal(2, 5, { foo: "bar" });
344
335
  client.removeRangeLocal(3, 7);
345
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());
336
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());
346
337
  node_assert_1.strict.equal(client.getText(), "abc123defg");
347
338
  for (let i = 0; i < client.getText().length; i++) {
348
339
  const props = client.getPropertiesAtPosition(i);
@@ -353,14 +344,14 @@ describe("client.rollback", () => {
353
344
  (0, node_assert_1.strict)(props === undefined || props.foo === undefined);
354
345
  }
355
346
  }
356
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
347
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
357
348
  for (let i = 0; i < client.getText().length; i++) {
358
349
  const props = client.getPropertiesAtPosition(i);
359
350
  (0, node_assert_1.strict)(props === undefined || props.foo === undefined);
360
351
  }
361
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
352
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
362
353
  node_assert_1.strict.equal(client.getText(), "abcdefg");
363
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
354
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
364
355
  node_assert_1.strict.equal(client.getText(), "");
365
356
  });
366
357
  it("Should rollback multiple removes across split segments", () => {
@@ -370,24 +361,24 @@ describe("client.rollback", () => {
370
361
  client.removeRangeLocal(2, 5);
371
362
  client.removeRangeLocal(3, 7);
372
363
  client.removeRangeLocal(2, 4);
373
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());
364
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());
374
365
  node_assert_1.strict.equal(client.getText(), "abye");
375
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());
366
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());
376
367
  node_assert_1.strict.equal(client.getText(), "abyz23de");
377
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());
368
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());
378
369
  node_assert_1.strict.equal(client.getText(), "abc1xyz23de");
379
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
370
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
380
371
  node_assert_1.strict.equal(client.getText(), "abc123de");
381
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
372
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
382
373
  node_assert_1.strict.equal(client.getText(), "abcde");
383
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
374
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
384
375
  node_assert_1.strict.equal(client.getText(), "");
385
376
  });
386
377
  it("Should annotate a previously removed range", () => {
387
378
  client.insertTextLocal(0, "abcdefg");
388
379
  client.insertTextLocal(3, "123");
389
380
  client.removeRangeLocal(2, 8);
390
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());
381
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());
391
382
  node_assert_1.strict.equal(client.getText(), "abc123defg");
392
383
  client.annotateRangeLocal(2, 8, { foo: "bar" });
393
384
  for (let i = 0; i < client.getText().length; i++) {
@@ -399,14 +390,14 @@ describe("client.rollback", () => {
399
390
  (0, node_assert_1.strict)(props === undefined || props.foo === undefined);
400
391
  }
401
392
  }
402
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
393
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
403
394
  for (let i = 0; i < client.getText().length; i++) {
404
395
  const props = client.getPropertiesAtPosition(i);
405
396
  (0, node_assert_1.strict)(props === undefined || props.foo === undefined);
406
397
  }
407
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
398
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
408
399
  node_assert_1.strict.equal(client.getText(), "abcdefg");
409
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
400
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
410
401
  node_assert_1.strict.equal(client.getText(), "");
411
402
  });
412
403
  it("Should rollback overlapping annotates and remove", () => {
@@ -414,10 +405,10 @@ describe("client.rollback", () => {
414
405
  client.annotateRangeLocal(0, 6, { foo: "one" });
415
406
  client.annotateRangeLocal(5, 10, { foo: "two" });
416
407
  client.removeRangeLocal(4, 8);
417
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());
408
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());
418
409
  node_assert_1.strict.equal(client.getPropertiesAtPosition(4)?.foo, "one");
419
410
  node_assert_1.strict.equal(client.getPropertiesAtPosition(5)?.foo, "two");
420
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
411
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
421
412
  for (let i = 0; i < client.getText().length; i++) {
422
413
  const props = client.getPropertiesAtPosition(i);
423
414
  if (i >= 0 && i < 6) {
@@ -427,18 +418,18 @@ describe("client.rollback", () => {
427
418
  (0, node_assert_1.strict)(props === undefined || props.foo === undefined);
428
419
  }
429
420
  }
430
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
421
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());
431
422
  for (let i = 0; i < client.getText().length; i++) {
432
423
  const props = client.getPropertiesAtPosition(i);
433
424
  (0, node_assert_1.strict)(props === undefined || props.foo === undefined);
434
425
  }
435
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
426
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());
436
427
  node_assert_1.strict.equal(client.getText(), "");
437
428
  });
438
429
  it("Should function properly after rollback with local ops", () => {
439
430
  client.insertTextLocal(0, "abcdefg");
440
431
  client.removeRangeLocal(1, 5);
441
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());
432
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());
442
433
  client.removeRangeLocal(2, 4);
443
434
  node_assert_1.strict.equal(client.getText(), "abefg");
444
435
  client.annotateRangeLocal(2, 5, { foo: "bar" });
@@ -466,7 +457,7 @@ describe("client.rollback", () => {
466
457
  c.applyMsg(msg);
467
458
  logger.validate({ baseText: "12345" });
468
459
  client.removeRangeLocal(1, 4);
469
- client.rollback?.({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());
460
+ client.rollback({ type: ops_js_1.MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());
470
461
  msg = remoteClient.makeOpMessage(remoteClient.removeRangeLocal(2, 3), ++seq);
471
462
  for (const c of clients) {
472
463
  c.applyMsg(msg);
@@ -1 +1 @@
1
- {"version":3,"file":"client.rollback.spec.js","sourceRoot":"","sources":["../../src/test/client.rollback.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { UniversalSequenceNumber } from \"../constants.js\";\nimport {\n\tISegmentPrivate,\n\tMarker,\n\tSegmentGroup,\n\treservedMarkerIdKey,\n} from \"../mergeTreeNodes.js\";\nimport { MergeTreeDeltaType, ReferenceType } from \"../ops.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { TestClientLogger } from \"./testClientLogger.js\";\nimport { insertSegments, validatePartialLengths } from \"./testUtils.js\";\n\ndescribe(\"client.rollback\", () => {\n\tconst localUserLongId = \"localUser\";\n\tlet client: TestClient;\n\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tinsertSegments({\n\t\t\tmergeTree: client.mergeTree,\n\t\t\tpos: 0,\n\t\t\tsegments: [TextSegment.make(\"\")],\n\t\t\trefSeq: UniversalSequenceNumber,\n\t\t\tclientId: client.getClientId(),\n\t\t\tseq: UniversalSequenceNumber,\n\t\t\topArgs: undefined,\n\t\t});\n\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t});\n\n\tit(\"Should rollback insert on empty string\", () => {\n\t\tclient.insertTextLocal(0, \"abcd\");\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should rollback insert marker\", () => {\n\t\tclient.insertTextLocal(0, \"abc\");\n\t\tclient.insertMarkerLocal(1, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t});\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abc\");\n\t\tconst marker = client.getMarkerFromId(\"markerId\");\n\t\tassert.equal(marker, undefined);\n\t});\n\tit(\"Should rollback insert and validate the partial lengths\", () => {\n\t\tclient.insertTextLocal(0, \"ghi\");\n\t\tclient.insertTextLocal(0, \"def\");\n\t\tclient.insertTextLocal(0, \"abc\");\n\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"defghi\");\n\t\tvalidatePartialLengths(client.getClientId(), client.mergeTree);\n\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"ghi\");\n\t\tvalidatePartialLengths(client.getClientId(), client.mergeTree);\n\t});\n\tit(\"Should rollback multiple inserts with split segments\", () => {\n\t\tclient.insertTextLocal(0, \"aefg\");\n\t\tclient.insertTextLocal(1, \"bd\");\n\t\tclient.insertTextLocal(2, \"c\");\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"aefg\");\n\t\tvalidatePartialLengths(client.getClientId(), client.mergeTree);\n\t});\n\tit(\"Should zamboni rolled back insert\", () => {\n\t\tclient.insertTextLocal(0, \"aefg\");\n\t\tclient.insertTextLocal(1, \"bcd\");\n\t\tconst segmentGroup = client.peekPendingSegmentGroups() as SegmentGroup;\n\t\tconst segment = segmentGroup.segments[0];\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.INSERT }, segmentGroup);\n\n\t\t// do some work and move the client's min seq forward, so zamboni runs\n\t\tfor (const c of \"hello world\") {\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(\n\t\t\t\t\tclient.insertTextLocal(client.getLength(), c),\n\t\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t\tundefined,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tassert.equal(segment.parent, undefined);\n\t});\n\tit(\"Should rollback annotate marker\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\tclient.annotateMarker(marker, { foo: \"bar\" });\n\t\tclient.rollback?.(\n\t\t\t{ type: MergeTreeDeltaType.ANNOTATE },\n\t\t\tclient.peekPendingSegmentGroups(),\n\t\t);\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, undefined);\n\t});\n\tit(\"Should rollback annotate marker overwriting property\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tfoo: \"bar\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\tclient.annotateMarker(marker, { foo: \"baz\" });\n\t\tclient.rollback?.(\n\t\t\t{ type: MergeTreeDeltaType.ANNOTATE },\n\t\t\tclient.peekPendingSegmentGroups(),\n\t\t);\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, \"bar\");\n\t});\n\tit(\"Should rollback annotate marker removing property\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tfoo: \"bar\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\t// eslint-disable-next-line unicorn/no-null\n\t\tclient.annotateMarker(marker, { foo: null });\n\t\tclient.rollback?.(\n\t\t\t{ type: MergeTreeDeltaType.ANNOTATE },\n\t\t\tclient.peekPendingSegmentGroups(),\n\t\t);\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, \"bar\");\n\t});\n\tit(\"Should rollback annotate marker rewrite\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tfoo: \"bar\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\tclient.annotateMarker(marker, { [reservedMarkerIdKey]: \"markerId\", abc: \"def\" });\n\t\tclient.rollback?.(\n\t\t\t{ type: MergeTreeDeltaType.ANNOTATE },\n\t\t\tclient.peekPendingSegmentGroups(),\n\t\t);\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, \"bar\");\n\t\tassert.equal(properties?.abc, undefined);\n\t});\n\tit(\"Should rollback annotate rewrite with explicit null\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tfoo: \"bar\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\tclient.annotateMarker(marker, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tabc: \"def\",\n\t\t\t// eslint-disable-next-line unicorn/no-null\n\t\t\tfoo: null,\n\t\t});\n\t\tclient.rollback?.(\n\t\t\t{ type: MergeTreeDeltaType.ANNOTATE },\n\t\t\tclient.peekPendingSegmentGroups(),\n\t\t);\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, \"bar\");\n\t\tassert.equal(properties?.abc, undefined);\n\t});\n\tit(\"Should rollback annotate causes split string\", () => {\n\t\tclient.insertTextLocal(0, \"abcdefg\");\n\t\tclient.annotateRangeLocal(1, 3, { foo: \"bar\" });\n\t\tclient.rollback?.(\n\t\t\t{ type: MergeTreeDeltaType.ANNOTATE },\n\t\t\tclient.peekPendingSegmentGroups(),\n\t\t);\n\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t});\n\tit(\"Should rollback annotate over split string\", () => {\n\t\tclient.insertTextLocal(0, \"abfg\");\n\t\tclient.insertTextLocal(1, \"cde\");\n\t\tclient.annotateRangeLocal(1, 6, { foo: \"bar\" });\n\t\tclient.rollback?.(\n\t\t\t{ type: MergeTreeDeltaType.ANNOTATE },\n\t\t\tclient.peekPendingSegmentGroups(),\n\t\t);\n\n\t\tfor (let i = 0; i < 7; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t});\n\tit(\"Should rollback annotate that later gets split\", () => {\n\t\tclient.insertTextLocal(0, \"abfg\");\n\t\tclient.annotateRangeLocal(0, 4, { foo: \"bar\" });\n\t\tclient.insertTextLocal(1, \"cde\");\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tclient.rollback?.(\n\t\t\t{ type: MergeTreeDeltaType.ANNOTATE },\n\t\t\tclient.peekPendingSegmentGroups(),\n\t\t);\n\n\t\tassert.equal(client.getText(), \"abfg\");\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t});\n\tit(\"Should rollback annotates with multiple previous property sets\", () => {\n\t\tclient.insertTextLocal(0, \"acde\");\n\t\tclient.annotateRangeLocal(0, 3, { foo: \"one\" });\n\t\tclient.annotateRangeLocal(2, 4, { foo: \"two\" });\n\t\tclient.annotateRangeLocal(0, 3, { foo: \"three\" });\n\t\tclient.insertTextLocal(1, \"b\");\n\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tlet props = client.getPropertiesAtPosition(3);\n\t\tassert(props !== undefined && props.foo === \"two\");\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props !== undefined && props.foo === \"three\");\n\t\t}\n\n\t\tclient.rollback?.(\n\t\t\t{ type: MergeTreeDeltaType.ANNOTATE },\n\t\t\tclient.peekPendingSegmentGroups(),\n\t\t);\n\t\tfor (let i = 0; i < 2; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props !== undefined && props.foo === \"one\");\n\t\t}\n\t\tfor (let i = 2; i < 4; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props !== undefined && props.foo === \"two\");\n\t\t}\n\n\t\tclient.rollback?.(\n\t\t\t{ type: MergeTreeDeltaType.ANNOTATE },\n\t\t\tclient.peekPendingSegmentGroups(),\n\t\t);\n\t\tprops = client.getPropertiesAtPosition(3);\n\t\tassert(props === undefined || props.foo === undefined);\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props !== undefined && props.foo === \"one\");\n\t\t}\n\n\t\tclient.rollback?.(\n\t\t\t{ type: MergeTreeDeltaType.ANNOTATE },\n\t\t\tclient.peekPendingSegmentGroups(),\n\t\t);\n\t\tassert.equal(client.getText(), \"acde\");\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t});\n\tit(\"Should rollback annotate with same prop\", () => {\n\t\tclient.insertTextLocal(0, \"abcde\");\n\t\tclient.annotateRangeLocal(2, 3, { foo: \"bar\" });\n\t\tclient.annotateRangeLocal(1, 4, { foo: \"bar\" });\n\t\tclient.rollback?.(\n\t\t\t{ type: MergeTreeDeltaType.ANNOTATE },\n\t\t\tclient.peekPendingSegmentGroups(),\n\t\t);\n\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i === 2) {\n\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\t});\n\tit(\"Should zamboni rolled back annotated segment\", () => {\n\t\tclient.applyMsg(\n\t\t\tclient.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(0, \"abcde\", { color: \"red\" }),\n\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\tundefined,\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t),\n\t\t);\n\t\tclient.annotateRangeLocal(2, 3, { foo: \"bar\" });\n\t\tconst segmentGroup = client.peekPendingSegmentGroups() as SegmentGroup;\n\t\tconst segment = segmentGroup.segments[0];\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.ANNOTATE }, segmentGroup);\n\n\t\t// do some work and move the client's min seq forward, so zamboni runs\n\t\tfor (const c of \"hello world\") {\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(\n\t\t\t\t\tclient.insertTextLocal(client.getLength(), c),\n\t\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t\tundefined,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tassert.equal(segment.parent, undefined);\n\t});\n\tit(\"Should rollback delete on single segment\", () => {\n\t\tclient.insertTextLocal(0, \"abcd\");\n\t\tclient.removeRangeLocal(0, 4);\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abcd\");\n\t});\n\tit(\"Should rollback delete which causes split segments\", () => {\n\t\tclient.insertTextLocal(0, \"abcde\");\n\t\tclient.removeRangeLocal(1, 4);\n\t\tlet deltaEvent = false;\n\t\tclient.on(\"delta\", () => {\n\t\t\tassert.equal(client.getText(), \"abcde\");\n\t\t\tdeltaEvent = true;\n\t\t});\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abcde\");\n\t\tassert.equal(deltaEvent, true);\n\t});\n\tit(\"Should rollback delete across split segments\", () => {\n\t\tclient.insertTextLocal(0, \"abcde\");\n\t\tclient.annotateRangeLocal(2, 3, { foo: \"bar\" });\n\t\tclient.removeRangeLocal(1, 4);\n\n\t\tlet deltaCount = 0;\n\t\tlet bFound = false;\n\t\tlet cFound = false;\n\t\tlet dFound = false;\n\t\tclient.on(\"delta\", (_opArgs, delta) => {\n\t\t\tdeltaCount++;\n\t\t\tassert.equal(client.getText().length, 2 + deltaCount);\n\t\t\tassert.equal(delta.deltaSegments.length, 1);\n\t\t\tassert.equal(delta.deltaSegments[0].segment.type, TextSegment.type);\n\t\t\tconst text = (delta.deltaSegments[0].segment as TextSegment).toString();\n\t\t\tswitch (text) {\n\t\t\t\tcase \"b\": {\n\t\t\t\t\tbFound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"c\": {\n\t\t\t\t\tcFound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"d\": {\n\t\t\t\t\tdFound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tassert(false, `Unexpected text segment: ${text}`);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abcde\");\n\t\tassert.equal(deltaCount, 3);\n\t\tassert(bFound);\n\t\tassert(cFound);\n\t\tassert(dFound);\n\t});\n\tit(\"Should rollback delete and update blocks\", () => {\n\t\tconst text = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()\";\n\t\tfor (const c of text) {\n\t\t\tclient.insertTextLocal(client.getLength(), c);\n\t\t}\n\t\tclient.removeRangeLocal(1, 4);\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\t// The insertion position calculation will be wrong if the blocks aren't updated correctly\n\t\tclient.insertTextLocal(text.length - 1, \"+\");\n\n\t\tconst expectedText = `${text.slice(0, Math.max(0, text.length - 1))}+${\n\t\t\ttext[text.length - 1]\n\t\t}`;\n\t\tassert.equal(client.getText(), expectedText, client.getText());\n\t});\n\tit(\"Should rollback delete and restore local references\", () => {\n\t\tclient.insertTextLocal(0, \"efg\");\n\t\tclient.insertTextLocal(0, \"d\");\n\t\tclient.insertTextLocal(0, \"abc\");\n\t\tconst segInfo1 = client.getContainingSegment<ISegmentPrivate>(2);\n\t\tconst segInfo3 = client.getContainingSegment<ISegmentPrivate>(5);\n\t\tconst ref1 = client.createLocalReferencePosition(\n\t\t\tsegInfo1.segment!,\n\t\t\t0,\n\t\t\tReferenceType.Simple,\n\t\t\tundefined,\n\t\t);\n\t\tconst refSlide = client.createLocalReferencePosition(\n\t\t\tsegInfo1.segment!,\n\t\t\t2,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\t\tconst ref2 = client.createLocalReferencePosition(\n\t\t\tsegInfo3.segment!,\n\t\t\t1,\n\t\t\tReferenceType.Simple,\n\t\t\tundefined,\n\t\t);\n\t\tconst refStay = client.createLocalReferencePosition(\n\t\t\tsegInfo3.segment!,\n\t\t\t1,\n\t\t\tReferenceType.StayOnRemove,\n\t\t\tundefined,\n\t\t);\n\n\t\tclient.removeRangeLocal(0, 7);\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abcdefg\");\n\t\tconst segInfo1After = client.getContainingSegment<ISegmentPrivate>(2);\n\t\tassert.notEqual(segInfo1After, undefined);\n\t\tassert.notEqual(segInfo1After.segment?.localRefs, undefined);\n\t\tassert(segInfo1After.segment?.localRefs!.has(ref1));\n\t\tassert(segInfo1After.segment?.localRefs!.has(refSlide));\n\t\tconst segInfo3After = client.getContainingSegment<ISegmentPrivate>(5);\n\t\tassert.notEqual(segInfo3After, undefined);\n\t\tassert.notEqual(segInfo3After.segment?.localRefs, undefined);\n\t\tassert(segInfo3After.segment?.localRefs!.has(ref2));\n\t\tassert(segInfo3After.segment?.localRefs!.has(refStay));\n\t});\n\tit(\"Should zamboni rolled back remove\", () => {\n\t\tclient.applyMsg(\n\t\t\tclient.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(0, \"abcde\", { color: \"red\" }),\n\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\tundefined,\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t),\n\t\t);\n\t\tclient.removeRangeLocal(1, 4);\n\t\tconst segmentGroup = client.peekPendingSegmentGroups() as SegmentGroup;\n\t\tconst segment = segmentGroup.segments[0];\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.REMOVE }, segmentGroup);\n\n\t\t// do some work and move the client's min seq forward, so zamboni runs\n\t\tfor (const c of \"hello world\") {\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(\n\t\t\t\t\tclient.insertTextLocal(client.getLength(), c),\n\t\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t\tundefined,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tassert.equal(segment.parent, undefined);\n\t});\n\tit(\"Should rollback multiple overlapping edits\", () => {\n\t\tclient.insertTextLocal(0, \"abcdefg\");\n\t\tclient.insertTextLocal(3, \"123\");\n\t\tclient.annotateRangeLocal(2, 5, { foo: \"bar\" });\n\t\tclient.removeRangeLocal(3, 7);\n\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abc123defg\");\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i >= 2 && i < 5) {\n\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\n\t\tclient.rollback?.(\n\t\t\t{ type: MergeTreeDeltaType.ANNOTATE },\n\t\t\tclient.peekPendingSegmentGroups(),\n\t\t);\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abcdefg\");\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should rollback multiple removes across split segments\", () => {\n\t\tclient.insertTextLocal(0, \"abcde\");\n\t\tclient.insertTextLocal(3, \"123\");\n\t\tclient.insertTextLocal(4, \"xyz\");\n\t\tclient.removeRangeLocal(2, 5);\n\t\tclient.removeRangeLocal(3, 7);\n\t\tclient.removeRangeLocal(2, 4);\n\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abye\");\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abyz23de\");\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abc1xyz23de\");\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abc123de\");\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abcde\");\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should annotate a previously removed range\", () => {\n\t\tclient.insertTextLocal(0, \"abcdefg\");\n\t\tclient.insertTextLocal(3, \"123\");\n\t\tclient.removeRangeLocal(2, 8);\n\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abc123defg\");\n\n\t\tclient.annotateRangeLocal(2, 8, { foo: \"bar\" });\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i >= 2 && i < 8) {\n\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\n\t\tclient.rollback?.(\n\t\t\t{ type: MergeTreeDeltaType.ANNOTATE },\n\t\t\tclient.peekPendingSegmentGroups(),\n\t\t);\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abcdefg\");\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should rollback overlapping annotates and remove\", () => {\n\t\tclient.insertTextLocal(0, \"abc123defg\");\n\t\tclient.annotateRangeLocal(0, 6, { foo: \"one\" });\n\t\tclient.annotateRangeLocal(5, 10, { foo: \"two\" });\n\t\tclient.removeRangeLocal(4, 8);\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getPropertiesAtPosition(4)?.foo, \"one\");\n\t\tassert.equal(client.getPropertiesAtPosition(5)?.foo, \"two\");\n\t\tclient.rollback?.(\n\t\t\t{ type: MergeTreeDeltaType.ANNOTATE },\n\t\t\tclient.peekPendingSegmentGroups(),\n\t\t);\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i >= 0 && i < 6) {\n\t\t\t\tassert.equal(props?.foo, \"one\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\t\tclient.rollback?.(\n\t\t\t{ type: MergeTreeDeltaType.ANNOTATE },\n\t\t\tclient.peekPendingSegmentGroups(),\n\t\t);\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should function properly after rollback with local ops\", () => {\n\t\tclient.insertTextLocal(0, \"abcdefg\");\n\t\tclient.removeRangeLocal(1, 5);\n\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tclient.removeRangeLocal(2, 4);\n\t\tassert.equal(client.getText(), \"abefg\");\n\n\t\tclient.annotateRangeLocal(2, 5, { foo: \"bar\" });\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i >= 2 && i < 5) {\n\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\n\t\tclient.insertTextLocal(1, \"123\");\n\t\tassert.equal(client.getText(), \"a123befg\");\n\t});\n\tit(\"Should function properly after rollback with external ops\", () => {\n\t\tconst remoteClient = new TestClient();\n\t\tremoteClient.startOrUpdateCollaboration(\"remoteUser\");\n\t\tconst clients = [client, remoteClient];\n\t\tlet seq = 0;\n\t\tconst logger = new TestClientLogger(clients);\n\t\tlogger.validate();\n\n\t\tlet msg = remoteClient.makeOpMessage(remoteClient.insertTextLocal(0, \"12345\"), ++seq);\n\t\tfor (const c of clients) c.applyMsg(msg);\n\t\tlogger.validate({ baseText: \"12345\" });\n\n\t\tclient.removeRangeLocal(1, 4);\n\t\tclient.rollback?.({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tmsg = remoteClient.makeOpMessage(remoteClient.removeRangeLocal(2, 3), ++seq);\n\t\tfor (const c of clients) {\n\t\t\tc.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"1245\" });\n\n\t\tmsg = remoteClient.makeOpMessage(\n\t\t\tremoteClient.annotateRangeLocal(0, 3, { foo: \"bar\" }),\n\t\t\t++seq,\n\t\t);\n\t\tfor (const c of clients) {\n\t\t\tc.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"1245\" });\n\t\tfor (const c of clients) {\n\t\t\tfor (let i = 0; i < c.getText().length; i++) {\n\t\t\t\tconst props = c.getPropertiesAtPosition(i);\n\t\t\t\tif (i >= 0 && i < 3) {\n\t\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t\t} else {\n\t\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tmsg = remoteClient.makeOpMessage(remoteClient.insertTextLocal(3, \"abc\"), ++seq);\n\t\tfor (const c of clients) {\n\t\t\tc.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"124abc5\" });\n\t});\n});\n"]}
1
+ {"version":3,"file":"client.rollback.spec.js","sourceRoot":"","sources":["../../src/test/client.rollback.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\n/* eslint-disable @typescript-eslint/no-non-null-assertion */\n\nimport { strict as assert } from \"node:assert\";\n\nimport {\n\tISegmentPrivate,\n\tMarker,\n\tSegmentGroup,\n\treservedMarkerIdKey,\n} from \"../mergeTreeNodes.js\";\nimport { MergeTreeDeltaType, ReferenceType } from \"../ops.js\";\nimport { TextSegment } from \"../textSegment.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { TestClientLogger } from \"./testClientLogger.js\";\nimport { validatePartialLengths } from \"./testUtils.js\";\n\ndescribe(\"client.rollback\", () => {\n\tconst localUserLongId = \"localUser\";\n\tlet client: TestClient;\n\n\tbeforeEach(() => {\n\t\tclient = new TestClient();\n\t\tclient.mergeTree.insertSegments(\n\t\t\t0,\n\t\t\t[TextSegment.make(\"\")],\n\t\t\tclient.mergeTree.localPerspective,\n\t\t\tclient.mergeTree.collabWindow.mintNextLocalOperationStamp(),\n\t\t\tundefined,\n\t\t);\n\t\tclient.startOrUpdateCollaboration(localUserLongId);\n\t});\n\n\tit(\"Should rollback insert on empty string\", () => {\n\t\tclient.insertTextLocal(0, \"abcd\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should rollback insert marker\", () => {\n\t\tclient.insertTextLocal(0, \"abc\");\n\t\tclient.insertMarkerLocal(1, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t});\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abc\");\n\t\tconst marker = client.getMarkerFromId(\"markerId\");\n\t\tassert.equal(marker, undefined);\n\t});\n\tit(\"Should rollback insert and validate the partial lengths\", () => {\n\t\tclient.insertTextLocal(0, \"ghi\");\n\t\tclient.insertTextLocal(0, \"def\");\n\t\tclient.insertTextLocal(0, \"abc\");\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"defghi\");\n\t\tvalidatePartialLengths(client.getClientId(), client.mergeTree);\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"ghi\");\n\t\tvalidatePartialLengths(client.getClientId(), client.mergeTree);\n\t});\n\tit(\"Should rollback multiple inserts with split segments\", () => {\n\t\tclient.insertTextLocal(0, \"aefg\");\n\t\tclient.insertTextLocal(1, \"bd\");\n\t\tclient.insertTextLocal(2, \"c\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"aefg\");\n\t\tvalidatePartialLengths(client.getClientId(), client.mergeTree);\n\t});\n\tit(\"Should zamboni rolled back insert\", () => {\n\t\tclient.insertTextLocal(0, \"aefg\");\n\t\tclient.insertTextLocal(1, \"bcd\");\n\t\tconst segmentGroup = client.peekPendingSegmentGroups() as SegmentGroup;\n\t\tconst segment = segmentGroup.segments[0];\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, segmentGroup);\n\n\t\t// do some work and move the client's min seq forward, so zamboni runs\n\t\tfor (const c of \"hello world\") {\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(\n\t\t\t\t\tclient.insertTextLocal(client.getLength(), c),\n\t\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t\tundefined,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tassert.equal(segment.parent, undefined);\n\t});\n\tit(\"Should rollback annotate marker\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\tclient.annotateMarker(marker, { foo: \"bar\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, undefined);\n\t});\n\tit(\"Should rollback annotate marker overwriting property\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tfoo: \"bar\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\tclient.annotateMarker(marker, { foo: \"baz\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, \"bar\");\n\t});\n\tit(\"Should rollback annotate marker removing property\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tfoo: \"bar\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\t// eslint-disable-next-line unicorn/no-null\n\t\tclient.annotateMarker(marker, { foo: null });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, \"bar\");\n\t});\n\tit(\"Should rollback annotate marker rewrite\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tfoo: \"bar\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\tclient.annotateMarker(marker, { [reservedMarkerIdKey]: \"markerId\", abc: \"def\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, \"bar\");\n\t\tassert.equal(properties?.abc, undefined);\n\t});\n\tit(\"Should rollback annotate rewrite with explicit null\", () => {\n\t\tclient.insertMarkerLocal(0, ReferenceType.Simple, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tfoo: \"bar\",\n\t\t});\n\t\tconst marker = client.getMarkerFromId(\"markerId\") as Marker;\n\t\tclient.annotateMarker(marker, {\n\t\t\t[reservedMarkerIdKey]: \"markerId\",\n\t\t\tabc: \"def\",\n\t\t\t// eslint-disable-next-line unicorn/no-null\n\t\t\tfoo: null,\n\t\t});\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tconst properties = marker.getProperties();\n\t\tassert.equal(properties?.foo, \"bar\");\n\t\tassert.equal(properties?.abc, undefined);\n\t});\n\tit(\"Should rollback annotate causes split string\", () => {\n\t\tclient.insertTextLocal(0, \"abcdefg\");\n\t\tclient.annotateRangeLocal(1, 3, { foo: \"bar\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t});\n\tit(\"Should rollback annotate over split string\", () => {\n\t\tclient.insertTextLocal(0, \"abfg\");\n\t\tclient.insertTextLocal(1, \"cde\");\n\t\tclient.annotateRangeLocal(1, 6, { foo: \"bar\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tfor (let i = 0; i < 7; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t});\n\tit(\"Should rollback annotate that later gets split\", () => {\n\t\tclient.insertTextLocal(0, \"abfg\");\n\t\tclient.annotateRangeLocal(0, 4, { foo: \"bar\" });\n\t\tclient.insertTextLocal(1, \"cde\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abfg\");\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t});\n\tit(\"Should rollback annotates with multiple previous property sets\", () => {\n\t\tclient.insertTextLocal(0, \"acde\");\n\t\tclient.annotateRangeLocal(0, 3, { foo: \"one\" });\n\t\tclient.annotateRangeLocal(2, 4, { foo: \"two\" });\n\t\tclient.annotateRangeLocal(0, 3, { foo: \"three\" });\n\t\tclient.insertTextLocal(1, \"b\");\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tlet props = client.getPropertiesAtPosition(3);\n\t\tassert(props !== undefined && props.foo === \"two\");\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props !== undefined && props.foo === \"three\");\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tfor (let i = 0; i < 2; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props !== undefined && props.foo === \"one\");\n\t\t}\n\t\tfor (let i = 2; i < 4; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props !== undefined && props.foo === \"two\");\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tprops = client.getPropertiesAtPosition(3);\n\t\tassert(props === undefined || props.foo === undefined);\n\t\tfor (let i = 0; i < 3; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props !== undefined && props.foo === \"one\");\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"acde\");\n\t\tfor (let i = 0; i < 4; i++) {\n\t\t\tprops = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t});\n\tit(\"Should rollback annotate with same prop\", () => {\n\t\tclient.insertTextLocal(0, \"abcde\");\n\t\tclient.annotateRangeLocal(2, 3, { foo: \"bar\" });\n\t\tclient.annotateRangeLocal(1, 4, { foo: \"bar\" });\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\n\t\tfor (let i = 0; i < 5; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i === 2) {\n\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\t});\n\tit(\"Should zamboni rolled back annotated segment\", () => {\n\t\tclient.applyMsg(\n\t\t\tclient.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(0, \"abcde\", { color: \"red\" }),\n\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\tundefined,\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t),\n\t\t);\n\t\tclient.annotateRangeLocal(2, 3, { foo: \"bar\" });\n\t\tconst segmentGroup = client.peekPendingSegmentGroups() as SegmentGroup;\n\t\tconst segment = segmentGroup.segments[0];\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, segmentGroup);\n\n\t\t// do some work and move the client's min seq forward, so zamboni runs\n\t\tfor (const c of \"hello world\") {\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(\n\t\t\t\t\tclient.insertTextLocal(client.getLength(), c),\n\t\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t\tundefined,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tassert.equal(segment.parent, undefined);\n\t});\n\tit(\"Should rollback delete on single segment\", () => {\n\t\tclient.insertTextLocal(0, \"abcd\");\n\t\tclient.removeRangeLocal(0, 4);\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abcd\");\n\t});\n\tit(\"Should rollback delete which causes split segments\", () => {\n\t\tclient.insertTextLocal(0, \"abcde\");\n\t\tclient.removeRangeLocal(1, 4);\n\t\tlet deltaEvent = false;\n\t\tclient.on(\"delta\", () => {\n\t\t\tassert.equal(client.getText(), \"abcde\");\n\t\t\tdeltaEvent = true;\n\t\t});\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abcde\");\n\t\tassert.equal(deltaEvent, true);\n\t});\n\tit(\"Should rollback delete across split segments\", () => {\n\t\tclient.insertTextLocal(0, \"abcde\");\n\t\tclient.annotateRangeLocal(2, 3, { foo: \"bar\" });\n\t\tclient.removeRangeLocal(1, 4);\n\n\t\tlet deltaCount = 0;\n\t\tlet bFound = false;\n\t\tlet cFound = false;\n\t\tlet dFound = false;\n\t\tclient.on(\"delta\", (_opArgs, delta) => {\n\t\t\tdeltaCount++;\n\t\t\tassert.equal(client.getText().length, 2 + deltaCount);\n\t\t\tassert.equal(delta.deltaSegments.length, 1);\n\t\t\tassert.equal(delta.deltaSegments[0].segment.type, TextSegment.type);\n\t\t\tconst text = (delta.deltaSegments[0].segment as TextSegment).toString();\n\t\t\tswitch (text) {\n\t\t\t\tcase \"b\": {\n\t\t\t\t\tbFound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"c\": {\n\t\t\t\t\tcFound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"d\": {\n\t\t\t\t\tdFound = true;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tdefault: {\n\t\t\t\t\tassert(false, `Unexpected text segment: ${text}`);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abcde\");\n\t\tassert.equal(deltaCount, 3);\n\t\tassert(bFound);\n\t\tassert(cFound);\n\t\tassert(dFound);\n\t});\n\tit(\"Should rollback delete and update blocks\", () => {\n\t\tconst text = \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()\";\n\t\tfor (const c of text) {\n\t\t\tclient.insertTextLocal(client.getLength(), c);\n\t\t}\n\t\tclient.removeRangeLocal(1, 4);\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\t// The insertion position calculation will be wrong if the blocks aren't updated correctly\n\t\tclient.insertTextLocal(text.length - 1, \"+\");\n\n\t\tconst expectedText = `${text.slice(0, Math.max(0, text.length - 1))}+${\n\t\t\ttext[text.length - 1]\n\t\t}`;\n\t\tassert.equal(client.getText(), expectedText, client.getText());\n\t});\n\tit(\"Should rollback delete and restore local references\", () => {\n\t\tclient.insertTextLocal(0, \"efg\");\n\t\tclient.insertTextLocal(0, \"d\");\n\t\tclient.insertTextLocal(0, \"abc\");\n\t\tconst segInfo1 = client.getContainingSegment<ISegmentPrivate>(2);\n\t\tconst segInfo3 = client.getContainingSegment<ISegmentPrivate>(5);\n\t\tconst ref1 = client.createLocalReferencePosition(\n\t\t\tsegInfo1.segment!,\n\t\t\t0,\n\t\t\tReferenceType.Simple,\n\t\t\tundefined,\n\t\t);\n\t\tconst refSlide = client.createLocalReferencePosition(\n\t\t\tsegInfo1.segment!,\n\t\t\t2,\n\t\t\tReferenceType.SlideOnRemove,\n\t\t\tundefined,\n\t\t);\n\t\tconst ref2 = client.createLocalReferencePosition(\n\t\t\tsegInfo3.segment!,\n\t\t\t1,\n\t\t\tReferenceType.Simple,\n\t\t\tundefined,\n\t\t);\n\t\tconst refStay = client.createLocalReferencePosition(\n\t\t\tsegInfo3.segment!,\n\t\t\t1,\n\t\t\tReferenceType.StayOnRemove,\n\t\t\tundefined,\n\t\t);\n\n\t\tclient.removeRangeLocal(0, 7);\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tassert.equal(client.getText(), \"abcdefg\");\n\t\tconst segInfo1After = client.getContainingSegment<ISegmentPrivate>(2);\n\t\tassert.notEqual(segInfo1After, undefined);\n\t\tassert.notEqual(segInfo1After.segment?.localRefs, undefined);\n\t\tassert(segInfo1After.segment?.localRefs!.has(ref1));\n\t\tassert(segInfo1After.segment?.localRefs!.has(refSlide));\n\t\tconst segInfo3After = client.getContainingSegment<ISegmentPrivate>(5);\n\t\tassert.notEqual(segInfo3After, undefined);\n\t\tassert.notEqual(segInfo3After.segment?.localRefs, undefined);\n\t\tassert(segInfo3After.segment?.localRefs!.has(ref2));\n\t\tassert(segInfo3After.segment?.localRefs!.has(refStay));\n\t});\n\tit(\"Should zamboni rolled back remove\", () => {\n\t\tclient.applyMsg(\n\t\t\tclient.makeOpMessage(\n\t\t\t\tclient.insertTextLocal(0, \"abcde\", { color: \"red\" }),\n\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\tundefined,\n\t\t\t\tclient.getCurrentSeq(),\n\t\t\t),\n\t\t);\n\t\tclient.removeRangeLocal(1, 4);\n\t\tconst segmentGroup = client.peekPendingSegmentGroups() as SegmentGroup;\n\t\tconst segment = segmentGroup.segments[0];\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, segmentGroup);\n\n\t\t// do some work and move the client's min seq forward, so zamboni runs\n\t\tfor (const c of \"hello world\") {\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(\n\t\t\t\t\tclient.insertTextLocal(client.getLength(), c),\n\t\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t\tundefined,\n\t\t\t\t\tclient.getCurrentSeq(),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tassert.equal(segment.parent, undefined);\n\t});\n\tit(\"Should rollback multiple overlapping edits\", () => {\n\t\tclient.insertTextLocal(0, \"abcdefg\");\n\t\tclient.insertTextLocal(3, \"123\");\n\t\tclient.annotateRangeLocal(2, 5, { foo: \"bar\" });\n\t\tclient.removeRangeLocal(3, 7);\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abc123defg\");\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i >= 2 && i < 5) {\n\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abcdefg\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should rollback multiple removes across split segments\", () => {\n\t\tclient.insertTextLocal(0, \"abcde\");\n\t\tclient.insertTextLocal(3, \"123\");\n\t\tclient.insertTextLocal(4, \"xyz\");\n\t\tclient.removeRangeLocal(2, 5);\n\t\tclient.removeRangeLocal(3, 7);\n\t\tclient.removeRangeLocal(2, 4);\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abye\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abyz23de\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abc1xyz23de\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abc123de\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abcde\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should annotate a previously removed range\", () => {\n\t\tclient.insertTextLocal(0, \"abcdefg\");\n\t\tclient.insertTextLocal(3, \"123\");\n\t\tclient.removeRangeLocal(2, 8);\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abc123defg\");\n\n\t\tclient.annotateRangeLocal(2, 8, { foo: \"bar\" });\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i >= 2 && i < 8) {\n\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"abcdefg\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should rollback overlapping annotates and remove\", () => {\n\t\tclient.insertTextLocal(0, \"abc123defg\");\n\t\tclient.annotateRangeLocal(0, 6, { foo: \"one\" });\n\t\tclient.annotateRangeLocal(5, 10, { foo: \"two\" });\n\t\tclient.removeRangeLocal(4, 8);\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getPropertiesAtPosition(4)?.foo, \"one\");\n\t\tassert.equal(client.getPropertiesAtPosition(5)?.foo, \"two\");\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i >= 0 && i < 6) {\n\t\t\t\tassert.equal(props?.foo, \"one\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\t\tclient.rollback({ type: MergeTreeDeltaType.ANNOTATE }, client.peekPendingSegmentGroups());\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t}\n\t\tclient.rollback({ type: MergeTreeDeltaType.INSERT }, client.peekPendingSegmentGroups());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\tit(\"Should function properly after rollback with local ops\", () => {\n\t\tclient.insertTextLocal(0, \"abcdefg\");\n\t\tclient.removeRangeLocal(1, 5);\n\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tclient.removeRangeLocal(2, 4);\n\t\tassert.equal(client.getText(), \"abefg\");\n\n\t\tclient.annotateRangeLocal(2, 5, { foo: \"bar\" });\n\t\tfor (let i = 0; i < client.getText().length; i++) {\n\t\t\tconst props = client.getPropertiesAtPosition(i);\n\t\t\tif (i >= 2 && i < 5) {\n\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t} else {\n\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t}\n\t\t}\n\n\t\tclient.insertTextLocal(1, \"123\");\n\t\tassert.equal(client.getText(), \"a123befg\");\n\t});\n\tit(\"Should function properly after rollback with external ops\", () => {\n\t\tconst remoteClient = new TestClient();\n\t\tremoteClient.startOrUpdateCollaboration(\"remoteUser\");\n\t\tconst clients = [client, remoteClient];\n\t\tlet seq = 0;\n\t\tconst logger = new TestClientLogger(clients);\n\t\tlogger.validate();\n\n\t\tlet msg = remoteClient.makeOpMessage(remoteClient.insertTextLocal(0, \"12345\"), ++seq);\n\t\tfor (const c of clients) c.applyMsg(msg);\n\t\tlogger.validate({ baseText: \"12345\" });\n\n\t\tclient.removeRangeLocal(1, 4);\n\t\tclient.rollback({ type: MergeTreeDeltaType.REMOVE }, client.peekPendingSegmentGroups());\n\n\t\tmsg = remoteClient.makeOpMessage(remoteClient.removeRangeLocal(2, 3), ++seq);\n\t\tfor (const c of clients) {\n\t\t\tc.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"1245\" });\n\n\t\tmsg = remoteClient.makeOpMessage(\n\t\t\tremoteClient.annotateRangeLocal(0, 3, { foo: \"bar\" }),\n\t\t\t++seq,\n\t\t);\n\t\tfor (const c of clients) {\n\t\t\tc.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"1245\" });\n\t\tfor (const c of clients) {\n\t\t\tfor (let i = 0; i < c.getText().length; i++) {\n\t\t\t\tconst props = c.getPropertiesAtPosition(i);\n\t\t\t\tif (i >= 0 && i < 3) {\n\t\t\t\t\tassert.equal(props?.foo, \"bar\");\n\t\t\t\t} else {\n\t\t\t\t\tassert(props === undefined || props.foo === undefined);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tmsg = remoteClient.makeOpMessage(remoteClient.insertTextLocal(3, \"abc\"), ++seq);\n\t\tfor (const c of clients) {\n\t\t\tc.applyMsg(msg);\n\t\t}\n\n\t\tlogger.validate({ baseText: \"124abc5\" });\n\t});\n});\n"]}