@fluidframework/merge-tree 2.31.0 → 2.32.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 (137) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/client.d.ts +7 -1
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +153 -44
  5. package/dist/client.js.map +1 -1
  6. package/dist/index.d.ts +1 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +3 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/mergeTree.d.ts +17 -5
  11. package/dist/mergeTree.d.ts.map +1 -1
  12. package/dist/mergeTree.js +188 -79
  13. package/dist/mergeTree.js.map +1 -1
  14. package/dist/mergeTreeNodes.d.ts +16 -18
  15. package/dist/mergeTreeNodes.d.ts.map +1 -1
  16. package/dist/mergeTreeNodes.js +6 -0
  17. package/dist/mergeTreeNodes.js.map +1 -1
  18. package/dist/perspective.d.ts +9 -0
  19. package/dist/perspective.d.ts.map +1 -1
  20. package/dist/perspective.js +14 -1
  21. package/dist/perspective.js.map +1 -1
  22. package/dist/segmentInfos.d.ts +32 -4
  23. package/dist/segmentInfos.d.ts.map +1 -1
  24. package/dist/segmentInfos.js +3 -1
  25. package/dist/segmentInfos.js.map +1 -1
  26. package/dist/sortedSegmentSet.d.ts +1 -0
  27. package/dist/sortedSegmentSet.d.ts.map +1 -1
  28. package/dist/sortedSegmentSet.js +3 -0
  29. package/dist/sortedSegmentSet.js.map +1 -1
  30. package/dist/test/beastTest.spec.js +5 -5
  31. package/dist/test/beastTest.spec.js.map +1 -1
  32. package/dist/test/client.localReference.spec.js +3 -3
  33. package/dist/test/client.localReference.spec.js.map +1 -1
  34. package/dist/test/client.rollback.spec.js +17 -0
  35. package/dist/test/client.rollback.spec.js.map +1 -1
  36. package/dist/test/clientTestHelper.d.ts +100 -0
  37. package/dist/test/clientTestHelper.d.ts.map +1 -0
  38. package/dist/test/clientTestHelper.js +196 -0
  39. package/dist/test/clientTestHelper.js.map +1 -0
  40. package/dist/test/mergeTree.annotate.spec.js +12 -12
  41. package/dist/test/mergeTree.annotate.spec.js.map +1 -1
  42. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +1 -1
  43. package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
  44. package/dist/test/obliterate.concurrent.spec.js +93 -90
  45. package/dist/test/obliterate.concurrent.spec.js.map +1 -1
  46. package/dist/test/obliterate.deltaCallback.spec.js +121 -116
  47. package/dist/test/obliterate.deltaCallback.spec.js.map +1 -1
  48. package/dist/test/obliterate.rangeExpansion.spec.js +29 -79
  49. package/dist/test/obliterate.rangeExpansion.spec.js.map +1 -1
  50. package/dist/test/obliterate.reconnect.spec.js +235 -58
  51. package/dist/test/obliterate.reconnect.spec.js.map +1 -1
  52. package/dist/test/testClient.js +1 -1
  53. package/dist/test/testClient.js.map +1 -1
  54. package/dist/test/testUtils.d.ts +13 -0
  55. package/dist/test/testUtils.d.ts.map +1 -1
  56. package/dist/test/testUtils.js +22 -1
  57. package/dist/test/testUtils.js.map +1 -1
  58. package/lib/client.d.ts +7 -1
  59. package/lib/client.d.ts.map +1 -1
  60. package/lib/client.js +155 -46
  61. package/lib/client.js.map +1 -1
  62. package/lib/index.d.ts +1 -1
  63. package/lib/index.d.ts.map +1 -1
  64. package/lib/index.js +1 -0
  65. package/lib/index.js.map +1 -1
  66. package/lib/mergeTree.d.ts +17 -5
  67. package/lib/mergeTree.d.ts.map +1 -1
  68. package/lib/mergeTree.js +192 -83
  69. package/lib/mergeTree.js.map +1 -1
  70. package/lib/mergeTreeNodes.d.ts +16 -18
  71. package/lib/mergeTreeNodes.d.ts.map +1 -1
  72. package/lib/mergeTreeNodes.js +7 -1
  73. package/lib/mergeTreeNodes.js.map +1 -1
  74. package/lib/perspective.d.ts +9 -0
  75. package/lib/perspective.d.ts.map +1 -1
  76. package/lib/perspective.js +12 -0
  77. package/lib/perspective.js.map +1 -1
  78. package/lib/segmentInfos.d.ts +32 -4
  79. package/lib/segmentInfos.d.ts.map +1 -1
  80. package/lib/segmentInfos.js +2 -1
  81. package/lib/segmentInfos.js.map +1 -1
  82. package/lib/sortedSegmentSet.d.ts +1 -0
  83. package/lib/sortedSegmentSet.d.ts.map +1 -1
  84. package/lib/sortedSegmentSet.js +3 -0
  85. package/lib/sortedSegmentSet.js.map +1 -1
  86. package/lib/test/beastTest.spec.js +5 -5
  87. package/lib/test/beastTest.spec.js.map +1 -1
  88. package/lib/test/client.localReference.spec.js +3 -3
  89. package/lib/test/client.localReference.spec.js.map +1 -1
  90. package/lib/test/client.rollback.spec.js +18 -1
  91. package/lib/test/client.rollback.spec.js.map +1 -1
  92. package/lib/test/clientTestHelper.d.ts +100 -0
  93. package/lib/test/clientTestHelper.d.ts.map +1 -0
  94. package/lib/test/clientTestHelper.js +192 -0
  95. package/lib/test/clientTestHelper.js.map +1 -0
  96. package/lib/test/mergeTree.annotate.spec.js +12 -12
  97. package/lib/test/mergeTree.annotate.spec.js.map +1 -1
  98. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +1 -1
  99. package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
  100. package/lib/test/obliterate.concurrent.spec.js +93 -90
  101. package/lib/test/obliterate.concurrent.spec.js.map +1 -1
  102. package/lib/test/obliterate.deltaCallback.spec.js +121 -116
  103. package/lib/test/obliterate.deltaCallback.spec.js.map +1 -1
  104. package/lib/test/obliterate.rangeExpansion.spec.js +1 -51
  105. package/lib/test/obliterate.rangeExpansion.spec.js.map +1 -1
  106. package/lib/test/obliterate.reconnect.spec.js +236 -59
  107. package/lib/test/obliterate.reconnect.spec.js.map +1 -1
  108. package/lib/test/testClient.js +1 -1
  109. package/lib/test/testClient.js.map +1 -1
  110. package/lib/test/testUtils.d.ts +13 -0
  111. package/lib/test/testUtils.d.ts.map +1 -1
  112. package/lib/test/testUtils.js +20 -0
  113. package/lib/test/testUtils.js.map +1 -1
  114. package/package.json +19 -18
  115. package/src/client.ts +286 -55
  116. package/src/index.ts +1 -1
  117. package/src/mergeTree.ts +265 -98
  118. package/src/mergeTreeNodes.ts +24 -18
  119. package/src/perspective.ts +21 -0
  120. package/src/segmentInfos.ts +48 -6
  121. package/src/sortedSegmentSet.ts +4 -0
  122. package/dist/test/partialSyncHelper.d.ts +0 -42
  123. package/dist/test/partialSyncHelper.d.ts.map +0 -1
  124. package/dist/test/partialSyncHelper.js +0 -96
  125. package/dist/test/partialSyncHelper.js.map +0 -1
  126. package/dist/test/reconnectHelper.d.ts +0 -50
  127. package/dist/test/reconnectHelper.d.ts.map +0 -1
  128. package/dist/test/reconnectHelper.js +0 -106
  129. package/dist/test/reconnectHelper.js.map +0 -1
  130. package/lib/test/partialSyncHelper.d.ts +0 -42
  131. package/lib/test/partialSyncHelper.d.ts.map +0 -1
  132. package/lib/test/partialSyncHelper.js +0 -92
  133. package/lib/test/partialSyncHelper.js.map +0 -1
  134. package/lib/test/reconnectHelper.d.ts +0 -50
  135. package/lib/test/reconnectHelper.d.ts.map +0 -1
  136. package/lib/test/reconnectHelper.js +0 -102
  137. package/lib/test/reconnectHelper.js.map +0 -1
@@ -5,11 +5,11 @@
5
5
  */
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  const node_assert_1 = require("node:assert");
8
+ const test_pairwise_generator_1 = require("@fluid-private/test-pairwise-generator");
8
9
  const internal_1 = require("@fluidframework/telemetry-utils/internal");
9
10
  const mergeTree_js_1 = require("../mergeTree.js");
10
11
  const sequencePlace_js_1 = require("../sequencePlace.js");
11
- const partialSyncHelper_js_1 = require("./partialSyncHelper.js");
12
- const reconnectHelper_js_1 = require("./reconnectHelper.js");
12
+ const clientTestHelper_js_1 = require("./clientTestHelper.js");
13
13
  const testUtils_js_1 = require("./testUtils.js");
14
14
  /**
15
15
  * Some tests contain ASCII diagrams of the trees to make it easier to reason about
@@ -40,8 +40,11 @@ const testUtils_js_1 = require("./testUtils.js");
40
40
  * This diagram describes a single segment, `ABC`, that has been concurrently
41
41
  * removed by two clients.
42
42
  */
43
- for (const incremental of [true, false]) {
44
- describe(`obliterate partial lengths incremental = ${incremental}`, () => {
43
+ for (const { incremental, mergeTreeEnableSidedObliterate } of (0, test_pairwise_generator_1.generatePairwiseOptions)({
44
+ incremental: [true, false],
45
+ mergeTreeEnableSidedObliterate: [true, false],
46
+ })) {
47
+ describe(`obliterate partial lengths incremental = ${incremental} enableSidedObliterate = ${mergeTreeEnableSidedObliterate}`, () => {
45
48
  (0, testUtils_js_1.useStrictPartialLengthChecks)();
46
49
  beforeEach(() => {
47
50
  mergeTree_js_1.MergeTree.options.incrementalUpdate = incremental;
@@ -50,7 +53,7 @@ for (const incremental of [true, false]) {
50
53
  mergeTree_js_1.MergeTree.options.incrementalUpdate = true;
51
54
  });
52
55
  it("obliterate, then insert at the end of the string", () => {
53
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
56
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
54
57
  helper.insertText("A", 0, "01234567");
55
58
  helper.processAllOps();
56
59
  helper.obliterateRange("A", 0, 8);
@@ -59,7 +62,7 @@ for (const incremental of [true, false]) {
59
62
  helper.logger.validate({ baseText: "BBB" });
60
63
  });
61
64
  it("insert, then obliterate at the end of the string", () => {
62
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
65
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
63
66
  helper.insertText("A", 0, "01234567");
64
67
  helper.processAllOps();
65
68
  helper.insertText("B", 8, "BBB");
@@ -68,7 +71,7 @@ for (const incremental of [true, false]) {
68
71
  helper.logger.validate({ baseText: "BBB" });
69
72
  });
70
73
  it("length of children does not differ from parent when overlapping remove+obliterate", () => {
71
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
74
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
72
75
  // ABCDEFGH
73
76
  // I-[J]-(KLM-[ABC]-D-123456-E-[FG]-H)
74
77
  helper.insertText("A", 0, "ABCDEFGH");
@@ -84,7 +87,7 @@ for (const incremental of [true, false]) {
84
87
  helper.logger.validate();
85
88
  });
86
89
  it("deletes concurrent insert that occurs after obliterate", () => {
87
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
90
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
88
91
  helper.insertText("B", 0, "ABCD");
89
92
  helper.processAllOps();
90
93
  helper.obliterateRange("B", 0, 4);
@@ -95,7 +98,7 @@ for (const incremental of [true, false]) {
95
98
  helper.logger.validate();
96
99
  });
97
100
  it("deletes concurrent insert that occurs before obliterate", () => {
98
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
101
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
99
102
  helper.insertText("B", 0, "ABCD");
100
103
  helper.processAllOps();
101
104
  helper.insertText("C", 2, "X");
@@ -106,7 +109,7 @@ for (const incremental of [true, false]) {
106
109
  helper.logger.validate();
107
110
  });
108
111
  it("does not delete unacked segment at start of string", () => {
109
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
112
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
110
113
  helper.insertText("C", 0, "ABC");
111
114
  helper.obliterateRange("C", 2, 3);
112
115
  helper.insertText("B", 0, "X");
@@ -117,7 +120,7 @@ for (const incremental of [true, false]) {
117
120
  helper.logger.validate();
118
121
  });
119
122
  it("throws when local obliterate has range end outside length of local string", () => {
120
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
123
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
121
124
  helper.insertText("B", 0, "A");
122
125
  helper.insertText("C", 0, "B");
123
126
  try {
@@ -126,11 +129,11 @@ for (const incremental of [true, false]) {
126
129
  }
127
130
  catch (error) {
128
131
  (0, node_assert_1.strict)(error instanceof internal_1.LoggingError);
129
- node_assert_1.strict.equal(error.message, "RangeOutOfBounds");
132
+ node_assert_1.strict.equal(error.message, mergeTreeEnableSidedObliterate ? "InvalidRange" : "RangeOutOfBounds");
130
133
  }
131
134
  });
132
135
  it("does not delete when obliterate immediately after insert", () => {
133
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
136
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
134
137
  helper.insertText("C", 0, "A");
135
138
  helper.obliterateRange("C", 0, 1);
136
139
  helper.insertText("B", 0, "W");
@@ -143,7 +146,7 @@ for (const incremental of [true, false]) {
143
146
  helper.logger.validate();
144
147
  });
145
148
  it("does not delete remote insert when between local insert+obliterate", () => {
146
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
149
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
147
150
  helper.insertText("C", 0, "A");
148
151
  helper.insertText("B", 0, "X");
149
152
  helper.obliterateRange("C", 0, 1);
@@ -156,7 +159,7 @@ for (const incremental of [true, false]) {
156
159
  helper.logger.validate();
157
160
  });
158
161
  it("does not delete remote insert when between local insert+obliterate", () => {
159
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
162
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
160
163
  helper.insertText("C", 0, "A");
161
164
  helper.obliterateRange("C", 0, 1);
162
165
  helper.insertText("B", 0, "B");
@@ -169,7 +172,7 @@ for (const incremental of [true, false]) {
169
172
  helper.logger.validate();
170
173
  });
171
174
  it("does not delete remote insert when in middle of segment", () => {
172
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
175
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
173
176
  helper.insertText("C", 0, "ABC");
174
177
  helper.obliterateRange("C", 2, 3);
175
178
  helper.obliterateRange("C", 0, 1);
@@ -181,7 +184,7 @@ for (const incremental of [true, false]) {
181
184
  helper.logger.validate();
182
185
  });
183
186
  it("deletes segment inserted into locally obliterated segment", () => {
184
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
187
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
185
188
  helper.insertText("C", 0, "A");
186
189
  helper.insertText("B", 0, "X");
187
190
  helper.insertText("C", 0, "B");
@@ -193,7 +196,7 @@ for (const incremental of [true, false]) {
193
196
  helper.logger.validate();
194
197
  });
195
198
  it("updates lengths after obliterated insertion", () => {
196
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
199
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
197
200
  helper.insertText("C", 0, "A");
198
201
  helper.insertText("B", 0, "X");
199
202
  helper.insertText("C", 0, "N");
@@ -209,7 +212,7 @@ for (const incremental of [true, false]) {
209
212
  helper.logger.validate();
210
213
  });
211
214
  it("updates lengths when insertion causes tree to split", () => {
212
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
215
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
213
216
  helper.insertText("A", 0, "0");
214
217
  helper.insertText("C", 0, "123");
215
218
  helper.insertText("B", 0, "BB");
@@ -224,7 +227,7 @@ for (const incremental of [true, false]) {
224
227
  helper.logger.validate();
225
228
  });
226
229
  it("length of node split by insertion does not count remotely obliterated segments", () => {
227
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
230
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
228
231
  helper.insertText("A", 0, "1");
229
232
  helper.insertText("A", 0, "2");
230
233
  helper.insertText("C", 0, "XXXX");
@@ -238,7 +241,7 @@ for (const incremental of [true, false]) {
238
241
  helper.logger.validate();
239
242
  });
240
243
  it("length of node split by obliterate does not count remotely obliterated segments", () => {
241
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
244
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
242
245
  helper.insertText("A", 0, "1");
243
246
  helper.insertText("A", 0, "2");
244
247
  helper.insertText("C", 0, "XXXX");
@@ -253,7 +256,7 @@ for (const incremental of [true, false]) {
253
256
  helper.logger.validate();
254
257
  });
255
258
  it("counts remotely but not concurrently inserted segments for length when tree is split", () => {
256
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
259
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
257
260
  // a-b-c-d-e-123
258
261
  // (a-b)-c-d-e-1-[2]-3
259
262
  helper.insertText("B", 0, "123");
@@ -271,7 +274,7 @@ for (const incremental of [true, false]) {
271
274
  helper.logger.validate();
272
275
  });
273
276
  it("does obliterate X for all clients", () => {
274
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
277
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
275
278
  helper.insertText("B", 0, "DE");
276
279
  helper.obliterateRange("B", 0, 1);
277
280
  helper.insertText("A", 0, "X");
@@ -283,7 +286,7 @@ for (const incremental of [true, false]) {
283
286
  helper.logger.validate();
284
287
  });
285
288
  it("does not include remote but unacked segments in partial len calculation", () => {
286
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
289
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
287
290
  // 89-4567-123-X
288
291
  // 8-(9-4-w-567-1)-23-Y-X
289
292
  helper.insertText("A", 0, "X");
@@ -300,7 +303,7 @@ for (const incremental of [true, false]) {
300
303
  helper.logger.validate();
301
304
  });
302
305
  it("correctly accounts for overlapping obliterate", () => {
303
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
306
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
304
307
  helper.insertText("B", 0, "AB");
305
308
  helper.processAllOps();
306
309
  helper.obliterateRange("C", 0, 1);
@@ -312,7 +315,7 @@ for (const incremental of [true, false]) {
312
315
  helper.logger.validate();
313
316
  });
314
317
  it("correctly accounts for overlapping obliterate and remove", () => {
315
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
318
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
316
319
  helper.insertText("B", 0, "AB");
317
320
  helper.processAllOps();
318
321
  helper.removeRange("C", 0, 1);
@@ -324,7 +327,7 @@ for (const incremental of [true, false]) {
324
327
  helper.logger.validate();
325
328
  });
326
329
  it("clones removes array during insert", () => {
327
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
330
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
328
331
  // the bug found here:
329
332
  // the X was skipped over by client `A` because it had already been
330
333
  // deleted, so its length at refSeq was 0
@@ -343,7 +346,7 @@ for (const incremental of [true, false]) {
343
346
  helper.logger.validate();
344
347
  });
345
348
  it("client partial lens consider overlapping obliterates", () => {
346
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
349
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
347
350
  helper.insertText("A", 0, "123");
348
351
  helper.insertText("A", 0, "ABCDEF");
349
352
  helper.processAllOps();
@@ -357,7 +360,7 @@ for (const incremental of [true, false]) {
357
360
  helper.logger.validate();
358
361
  });
359
362
  it("client partial lens consider overlapping obliterates", () => {
360
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
363
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
361
364
  helper.insertText("C", 0, "X");
362
365
  helper.insertText("C", 0, "ABCDEFG");
363
366
  helper.processAllOps();
@@ -370,7 +373,7 @@ for (const incremental of [true, false]) {
370
373
  helper.logger.validate();
371
374
  });
372
375
  it("tracks obliterate refSeq when acking op for partial len calculation", () => {
373
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
376
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
374
377
  // v-----------------------v
375
378
  // v--v
376
379
  // v--v
@@ -388,7 +391,7 @@ for (const incremental of [true, false]) {
388
391
  helper.logger.validate();
389
392
  });
390
393
  it("does not have negative len when segment obliterated before insert", () => {
391
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
394
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
392
395
  // 1234567-D-C-AB
393
396
  // 12-([3-X-45]-67)-D-C-AB
394
397
  helper.insertText("A", 0, "AB");
@@ -407,7 +410,7 @@ for (const incremental of [true, false]) {
407
410
  helper.logger.validate();
408
411
  });
409
412
  it("does not have negative len when segment obliterated before insert", () => {
410
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
413
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
411
414
  // ABCDE-1-[2]-3
412
415
  // (A-XX-B)-(CD)-E-1-3
413
416
  helper.insertText("B", 0, "123");
@@ -425,7 +428,7 @@ for (const incremental of [true, false]) {
425
428
  helper.logger.validate();
426
429
  });
427
430
  it("deletes segments between two obliterates with different seq", () => {
428
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
431
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
429
432
  // 90-8-1234-(5)-67-D-C-B-A
430
433
  // 9-(EFG-[0-8-1234-(5)-67)]-D-C-B-A
431
434
  helper.insertText("A", 0, "A");
@@ -445,7 +448,7 @@ for (const incremental of [true, false]) {
445
448
  helper.logger.validate();
446
449
  });
447
450
  it("deletes inserted segment when obliterate of different seq in-between", () => {
448
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
451
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
449
452
  helper.insertText("A", 0, "AB");
450
453
  helper.insertText("B", 0, "E");
451
454
  helper.obliterateRange("A", 0, 1);
@@ -459,7 +462,7 @@ for (const incremental of [true, false]) {
459
462
  helper.logger.validate();
460
463
  });
461
464
  it("deletes inserted segment when obliterate of different seq in-between", () => {
462
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
465
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
463
466
  helper.insertText("A", 0, "ABC");
464
467
  helper.obliterateRange("A", 1, 2);
465
468
  helper.processAllOps();
@@ -472,7 +475,7 @@ for (const incremental of [true, false]) {
472
475
  helper.logger.validate();
473
476
  });
474
477
  it("deletes inserted segment when obliterate of different seq in-between", () => {
475
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
478
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
476
479
  helper.insertText("A", 0, "ABC");
477
480
  helper.obliterateRange("A", 1, 2);
478
481
  helper.processAllOps();
@@ -485,7 +488,7 @@ for (const incremental of [true, false]) {
485
488
  helper.logger.validate();
486
489
  });
487
490
  it("considers obliterated local segments as remotely obliterate", () => {
488
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
491
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
489
492
  // G-(H-F-I-C)-J-DE-A-(B)
490
493
  // G-J-(H-F-I-CD)-E
491
494
  helper.insertText("A", 0, "AB");
@@ -502,7 +505,7 @@ for (const incremental of [true, false]) {
502
505
  helper.logger.validate();
503
506
  });
504
507
  it("traverses hier block in obliterated when len at ref seq is >0 and len at len seq == 0", () => {
505
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
508
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
506
509
  helper.insertText("A", 0, "AB");
507
510
  helper.insertText("A", 2, "CD");
508
511
  helper.removeRange("A", 1, 3);
@@ -520,7 +523,7 @@ for (const incremental of [true, false]) {
520
523
  helper.logger.validate();
521
524
  });
522
525
  it("traverses hier block in obliterate when len at ref seq is >0 and len at len seq == 0", () => {
523
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
526
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
524
527
  // [E]-FGH-12-[A]-[B]-CD
525
528
  // 3-4-F-[G-(H-1)-2]-CD
526
529
  helper.insertText("B", 0, "ABCD");
@@ -541,7 +544,7 @@ for (const incremental of [true, false]) {
541
544
  helper.logger.validate();
542
545
  });
543
546
  it("ignores segments obliterated at insertion time for partial len calculations", () => {
544
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
547
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
545
548
  helper.insertText("B", 0, "ABC");
546
549
  helper.insertText("A", 0, "DEF");
547
550
  helper.removeRange("A", 1, 2);
@@ -558,7 +561,7 @@ for (const incremental of [true, false]) {
558
561
  helper.logger.validate();
559
562
  });
560
563
  it("accounts for overlapping obliterates from same client", () => {
561
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
564
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
562
565
  helper.insertText("A", 0, "AB");
563
566
  helper.processAllOps();
564
567
  helper.logger.validate();
@@ -572,7 +575,7 @@ for (const incremental of [true, false]) {
572
575
  helper.logger.validate();
573
576
  });
574
577
  it("accounts for concurrently obliterated segments from the perspective of the inserting client for partial lengths", () => {
575
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
578
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
576
579
  helper.insertText("B", 0, "A");
577
580
  helper.insertText("C", 0, "B");
578
581
  helper.insertText("C", 0, "C");
@@ -587,7 +590,7 @@ for (const incremental of [true, false]) {
587
590
  helper.logger.validate();
588
591
  });
589
592
  it("traverses segments when there is a local obliterate", () => {
590
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
593
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
591
594
  helper.insertText("A", 0, "AB");
592
595
  helper.obliterateRange("A", 0, 1);
593
596
  helper.insertText("C", 0, "12");
@@ -600,7 +603,7 @@ for (const incremental of [true, false]) {
600
603
  helper.logger.validate();
601
604
  });
602
605
  it("keeps track of all obliterates on a segment", () => {
603
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
606
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
604
607
  // B-A
605
608
  // (B-C-(A))
606
609
  helper.insertText("C", 0, "A");
@@ -620,7 +623,7 @@ for (const incremental of [true, false]) {
620
623
  helper.logger.validate();
621
624
  });
622
625
  it("many overlapping obliterates", () => {
623
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
626
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
624
627
  // EF-ABCD
625
628
  // (1)-2-((E)-F-A)-B-(C)-D
626
629
  helper.insertText("C", 0, "ABCD");
@@ -637,7 +640,7 @@ for (const incremental of [true, false]) {
637
640
  helper.logger.validate();
638
641
  });
639
642
  it("overlapping obliterates at start", () => {
640
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
643
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
641
644
  // 12345-B-A
642
645
  // ((1-C-2)-3)-4-D-5-B-A
643
646
  helper.insertText("C", 0, "A");
@@ -653,7 +656,7 @@ for (const incremental of [true, false]) {
653
656
  helper.logger.validate();
654
657
  });
655
658
  it("partial lengths updated when local insert is acked", () => {
656
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
659
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
657
660
  // A-BCDEF
658
661
  // (A-B-G-C)-D-I-E-H-F
659
662
  helper.insertText("A", 0, "A");
@@ -672,7 +675,7 @@ for (const incremental of [true, false]) {
672
675
  helper.logger.validate();
673
676
  });
674
677
  it("two local obliterates get different seq numbers after ack", () => {
675
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
678
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
676
679
  // C-AB
677
680
  // (C-A)-D-(B)
678
681
  helper.insertText("C", 0, "AB");
@@ -690,7 +693,7 @@ for (const incremental of [true, false]) {
690
693
  helper.logger.validate();
691
694
  });
692
695
  it("acks remote segment obliterated by local op", () => {
693
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
696
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
694
697
  // (D-C-A)-B
695
698
  // (D-C-A)-B-E
696
699
  helper.insertText("B", 0, "AB");
@@ -708,7 +711,7 @@ for (const incremental of [true, false]) {
708
711
  helper.logger.validate();
709
712
  });
710
713
  it("skips segments obliterated before refSeq when traversing for insertion", () => {
711
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
714
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
712
715
  // CDE-(A)-B
713
716
  // C-(DE-F-(A)-B)
714
717
  helper.insertText("A", 0, "AB");
@@ -728,7 +731,7 @@ for (const incremental of [true, false]) {
728
731
  helper.logger.validate();
729
732
  });
730
733
  it("applies correct obliterate when right segment has multiple obliterates", () => {
731
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
734
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
732
735
  // AB
733
736
  // (A-C-D-(B))
734
737
  helper.insertText("B", 0, "AB");
@@ -747,7 +750,7 @@ for (const incremental of [true, false]) {
747
750
  helper.logger.validate();
748
751
  });
749
752
  it("takes the correct remove clientId/stamp when multiple obliterates apply", () => {
750
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
753
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
751
754
  // AB
752
755
  // (A-C-D-(B))
753
756
  helper.insertText("A", 0, "AB");
@@ -766,7 +769,7 @@ for (const incremental of [true, false]) {
766
769
  helper.logger.validate();
767
770
  });
768
771
  it("selects clientId if 0", () => {
769
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
772
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
770
773
  // AB
771
774
  // (A-D-E-(C)-B)
772
775
  helper.insertText("B", 0, "AB");
@@ -786,7 +789,7 @@ for (const incremental of [true, false]) {
786
789
  helper.logger.validate();
787
790
  });
788
791
  it("obliterates unacked segment inside non-leaf-segment", () => {
789
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
792
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
790
793
  // FGHIJ-E-12345678-D-C-A-K-B
791
794
  // FGHIJ-E-12345-(6-[7-L-8-D]-C)-A-K-B
792
795
  helper.insertText("A", 0, "AB");
@@ -813,7 +816,7 @@ for (const incremental of [true, false]) {
813
816
  helper.logger.validate();
814
817
  });
815
818
  it("tracks length at seq of lower remove seq when overlapping", () => {
816
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
819
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
817
820
  // H-FG-A-CDE-B
818
821
  // (H-F-[G-A)-C-I-D]-E-B
819
822
  helper.insertText("C", 0, "AB");
@@ -836,7 +839,7 @@ for (const incremental of [true, false]) {
836
839
  helper.logger.validate();
837
840
  });
838
841
  it("segment obliterated on insert overlaps with local obliterate", () => {
839
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
842
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
840
843
  // AB
841
844
  // ((A-C)-B)
842
845
  helper.insertText("B", 0, "AB");
@@ -850,7 +853,7 @@ for (const incremental of [true, false]) {
850
853
  helper.logger.validate();
851
854
  });
852
855
  it("obliterates entire string when concurrent inserts inside range", () => {
853
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
856
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
854
857
  // GT
855
858
  // (G-O-S-Y-T)
856
859
  helper.insertText("B", 0, "GT");
@@ -864,7 +867,7 @@ for (const incremental of [true, false]) {
864
867
  helper.logger.validate();
865
868
  });
866
869
  it("obliterate ack traverses over non-obliterated remove", () => {
867
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
870
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
868
871
  // ABCDEFGH-1
869
872
  // ABCDE-(F-[G]-2-H)-1
870
873
  // ABCDE-(F-[G]-2-H)-1-3
@@ -885,7 +888,7 @@ for (const incremental of [true, false]) {
885
888
  helper.logger.validate();
886
889
  });
887
890
  it("overlapping remove and obliterate when remove happens last", () => {
888
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
891
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
889
892
  // FGH-E-D-BC-A
890
893
  // ([F]-G)-H-E-D-B-I-C-A
891
894
  helper.insertText("A", 0, "A");
@@ -906,7 +909,7 @@ for (const incremental of [true, false]) {
906
909
  helper.logger.validate();
907
910
  });
908
911
  it("overlapping remove and obliterate when remove happens last _and_ partial length already exists", () => {
909
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
912
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
910
913
  // FGH-CDE-B-A
911
914
  // [F-(GH)-C]-D-Z-E-B-A
912
915
  helper.insertText("B", 0, "A");
@@ -923,7 +926,7 @@ for (const incremental of [true, false]) {
923
926
  helper.logger.validate();
924
927
  });
925
928
  it("overlapping obliterate and remove when obliterate is larger than remove and happened last", () => {
926
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
929
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
927
930
  // H-CDEFG-B-A
928
931
  // (H-C-[D]-E)-F-Z-G-B-A
929
932
  helper.insertText("B", 0, "A");
@@ -940,7 +943,7 @@ for (const incremental of [true, false]) {
940
943
  helper.logger.validate();
941
944
  });
942
945
  it("wasRemovedOnInsert computation remains accurate after leaf node is split", () => {
943
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
946
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
944
947
  // CD-B-A
945
948
  // I-(C-(G)H-E)-F-D-B-A
946
949
  helper.insertText("C", 0, "A");
@@ -958,7 +961,7 @@ for (const incremental of [true, false]) {
958
961
  helper.logger.validate();
959
962
  });
960
963
  it("overlapping obliterates, segment is obliterated on insert and by local client", () => {
961
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
964
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
962
965
  // DEFG-BC-A
963
966
  // v-----------v
964
967
  // v-----v
@@ -977,7 +980,7 @@ for (const incremental of [true, false]) {
977
980
  helper.logger.validate();
978
981
  });
979
982
  it("overlapping obliterates and remove", () => {
980
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
983
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
981
984
  // FGHIJKL-BCDE-A
982
985
  // (FGHI-[JK-(L-B)-C]-D)-E-M-A
983
986
  helper.insertText("C", 0, "A");
@@ -994,7 +997,7 @@ for (const incremental of [true, false]) {
994
997
  helper.logger.validate();
995
998
  });
996
999
  it("does not mark obliterated on insert for non-acked obliterates", () => {
997
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
1000
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
998
1001
  // CDE-B-A
999
1002
  // I-((C-F)-G-D)-H-E-B-A
1000
1003
  helper.insertText("B", 0, "A");
@@ -1012,7 +1015,7 @@ for (const incremental of [true, false]) {
1012
1015
  helper.logger.validate();
1013
1016
  });
1014
1017
  it("partial len isLocal when seq is local but a non-local obliterate affects the segment", () => {
1015
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
1018
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
1016
1019
  // CDEFG-AB
1017
1020
  // C-((D-I-E)-F)-G-A-H-B
1018
1021
  helper.insertText("A", 0, "AB");
@@ -1028,7 +1031,7 @@ for (const incremental of [true, false]) {
1028
1031
  helper.logger.validate();
1029
1032
  });
1030
1033
  it("obliterated on insert by overlapping obliterates", () => {
1031
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
1034
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
1032
1035
  // B-DEFG-C-A
1033
1036
  // ((B-D-H-E)-F-I-G-C)-A
1034
1037
  helper.insertText("C", 0, "A");
@@ -1045,7 +1048,7 @@ for (const incremental of [true, false]) {
1045
1048
  helper.logger.validate();
1046
1049
  });
1047
1050
  it("overlapping obliterates", () => {
1048
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
1051
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
1049
1052
  // ABCDEF
1050
1053
  // v-------------v
1051
1054
  // v-----------v
@@ -1064,7 +1067,7 @@ for (const incremental of [true, false]) {
1064
1067
  helper.logger.validate();
1065
1068
  });
1066
1069
  it("overlapping obliterates", () => {
1067
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
1070
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
1068
1071
  // CDEF-AB
1069
1072
  // v-------------------v
1070
1073
  // v---------v
@@ -1084,7 +1087,7 @@ for (const incremental of [true, false]) {
1084
1087
  helper.logger.validate();
1085
1088
  });
1086
1089
  it("overlapping remove and obliterate, local obliterate does not have a remote obliterated len", () => {
1087
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
1090
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
1088
1091
  // v-v------v-v
1089
1092
  // G-(H-[F]-E)-D-[A]-B-I-C
1090
1093
  helper.insertText("A", 0, "ABC");
@@ -1100,7 +1103,7 @@ for (const incremental of [true, false]) {
1100
1103
  helper.logger.validate();
1101
1104
  });
1102
1105
  it("triple overlapping obliterate and overlapping remove", () => {
1103
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
1106
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
1104
1107
  // I-H-BCDEFG-A
1105
1108
  // v------------v
1106
1109
  // v-------v
@@ -1125,7 +1128,7 @@ for (const incremental of [true, false]) {
1125
1128
  helper.logger.validate();
1126
1129
  });
1127
1130
  it("triple overlapping obliterate with one being local", () => {
1128
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
1131
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
1129
1132
  // CDEFG-B-A
1130
1133
  // v--------v
1131
1134
  // v--------v
@@ -1147,7 +1150,7 @@ for (const incremental of [true, false]) {
1147
1150
  helper.logger.validate();
1148
1151
  });
1149
1152
  it("obliterate ack traversal is not stopped by obliterated segment", () => {
1150
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
1153
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
1151
1154
  // ABCD
1152
1155
  // (A-(B)-E-C)-D-F
1153
1156
  helper.insertText("B", 0, "ABCD");
@@ -1165,7 +1168,7 @@ for (const incremental of [true, false]) {
1165
1168
  helper.logger.validate();
1166
1169
  });
1167
1170
  it("updates partial lengths for segments when doing obliterate ack traversal", () => {
1168
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
1171
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
1169
1172
  // O-JKLMN-FGHI-E-CD-AB
1170
1173
  // v-v---v-----v
1171
1174
  // (P-O-JKLMN-FG-[H]-Q-[I-E-C]-D-A)-B
@@ -1191,7 +1194,7 @@ for (const incremental of [true, false]) {
1191
1194
  helper.logger.validate();
1192
1195
  });
1193
1196
  it("combines remote obliterated length ", () => {
1194
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
1197
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
1195
1198
  // R-XYZ12-STUVW-LMNOP-DEFGHIJK-A-34567890-Q-BC
1196
1199
  // v---------------v------------v------v--------v------------v
1197
1200
  // [R-XYZ12-STUVW-L]-abcdefghij-[MNOP-D]-klmnop-[EFGHIJK-A-34]-5-(6-x-7)-890-Q-BC
@@ -1234,7 +1237,7 @@ for (const incremental of [true, false]) {
1234
1237
  helper.logger.validate();
1235
1238
  });
1236
1239
  it("three obliterates on same segment", () => {
1237
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
1240
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
1238
1241
  // A
1239
1242
  // (C-B-D-((A)))
1240
1243
  helper.insertText("B", 0, "A");
@@ -1251,7 +1254,7 @@ for (const incremental of [true, false]) {
1251
1254
  });
1252
1255
  describe("incremental partial length updates", () => {
1253
1256
  it("obliterates concurrently inserted segment", () => {
1254
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
1257
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
1255
1258
  // (C-B-A)
1256
1259
  helper.insertText("A", 0, "A");
1257
1260
  helper.insertText("B", 0, "B");
@@ -1262,7 +1265,7 @@ for (const incremental of [true, false]) {
1262
1265
  helper.logger.validate();
1263
1266
  });
1264
1267
  it("obliterates 2 concurrently inserted segments", () => {
1265
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
1268
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
1266
1269
  // (C-B-D-A)
1267
1270
  helper.insertText("B", 0, "A");
1268
1271
  helper.insertText("A", 0, "B");
@@ -1274,7 +1277,7 @@ for (const incremental of [true, false]) {
1274
1277
  helper.logger.validate();
1275
1278
  });
1276
1279
  it("obliterates 4 concurrently inserted segments", () => {
1277
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
1280
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
1278
1281
  // I-F-(G-D-H-E-C-A)-B
1279
1282
  helper.insertText("B", 0, "AB");
1280
1283
  helper.insertText("B", 0, "C");
@@ -1288,7 +1291,7 @@ for (const incremental of [true, false]) {
1288
1291
  helper.logger.validate();
1289
1292
  });
1290
1293
  it("obliterates 3 concurrently inserted segments", () => {
1291
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
1294
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
1292
1295
  // I-G-(H-D-F-E-B)-C-A
1293
1296
  helper.insertText("B", 0, "A");
1294
1297
  helper.insertText("B", 0, "BC");
@@ -1302,7 +1305,7 @@ for (const incremental of [true, false]) {
1302
1305
  helper.logger.validate();
1303
1306
  });
1304
1307
  it("overlapping remove + obliterate, remove happened first", () => {
1305
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
1308
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
1306
1309
  // D-EFG-B-H-C-A
1307
1310
  // I-D-([E]-F)-G-B-H-C-A
1308
1311
  helper.insertText("A", 0, "A");
@@ -1319,7 +1322,7 @@ for (const incremental of [true, false]) {
1319
1322
  helper.logger.validate();
1320
1323
  });
1321
1324
  it("overlapping remove + obliterate, remove happened last", () => {
1322
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
1325
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
1323
1326
  // DEFGH-C-B-A
1324
1327
  // [D]-[E-(F)-G]-H-C-B-A
1325
1328
  helper.insertText("C", 0, "A");
@@ -1336,7 +1339,7 @@ for (const incremental of [true, false]) {
1336
1339
  helper.logger.validate();
1337
1340
  });
1338
1341
  it("segment inside locally obliterated segment group is split", () => {
1339
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
1342
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
1340
1343
  // CDEF-AB
1341
1344
  // [C]-DE-(F-(G)-H-A)-B
1342
1345
  // [C]-DE-(F-(G)-H-A)-(B)
@@ -1356,7 +1359,7 @@ for (const incremental of [true, false]) {
1356
1359
  helper.logger.validate();
1357
1360
  });
1358
1361
  it("continues traversal past locally removed segment inserted before first obliterate", () => {
1359
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
1362
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
1360
1363
  // ABC
1361
1364
  // (E-D-(A)-[B]-C)
1362
1365
  helper.insertText("A", 0, "ABC");
@@ -1372,7 +1375,7 @@ for (const incremental of [true, false]) {
1372
1375
  helper.logger.validate();
1373
1376
  });
1374
1377
  it("keeps track of remote obliterated length when hier node contains hier nodes", () => {
1375
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
1378
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
1376
1379
  // LMNO-HIJ-E-K-FG-D-C-AB
1377
1380
  // lmnopq-L-[M]-NO-H-ghijk-I-(J-E-K-FG-D-C-A-a)-bc-ef-d-B
1378
1381
  // v--------------------------------------v
@@ -1409,7 +1412,7 @@ for (const incremental of [true, false]) {
1409
1412
  helper.logger.validate();
1410
1413
  });
1411
1414
  it("combines remote obliterated length for parent node of tree with depth >=3", () => {
1412
- const helper = new reconnectHelper_js_1.ReconnectTestHelper();
1415
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate });
1413
1416
  // VWXYZ0-(K)-[L]-M-[N]-O-EFGHIJ-[A]-B-P-TU-QRS-CD
1414
1417
  // v-v------v------------v
1415
1418
  // v--------------------v
@@ -1456,7 +1459,7 @@ for (const incremental of [true, false]) {
1456
1459
  // Strict partial lengths checks reported an inconsistency when B applies A's
1457
1460
  // obliterateRange op for the length of the string at refSeq 4.
1458
1461
  // With strict partial lengths disabled, this manifested in 0x4bc on the subsequent op application.
1459
- const helper = new partialSyncHelper_js_1.PartialSyncTestHelper();
1462
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate: true });
1460
1463
  helper.insertText("D", 0, "ABCDEFGH");
1461
1464
  helper.processAllOps();
1462
1465
  helper.insertText("B", 0, "123456xxxxx7890");
@@ -1473,7 +1476,7 @@ for (const incremental of [true, false]) {
1473
1476
  helper.logger.validate({ baseText: "cx7890FGH" });
1474
1477
  });
1475
1478
  it("Avoids adding entries for insert with subsequent removal", () => {
1476
- const helper = new partialSyncHelper_js_1.PartialSyncTestHelper();
1479
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate: true });
1477
1480
  helper.insertText("D", 0, "bZL4aQd");
1478
1481
  helper.processAllOps();
1479
1482
  helper.insertText("A", 0, "8mvaLcEa4nwhELu");
@@ -1500,7 +1503,7 @@ for (const incremental of [true, false]) {
1500
1503
  // Once fuzz testing more meaninfully leverages ops being sent to different clients at different types (partial
1501
1504
  // synchronization), it's probably fine to remove this.
1502
1505
  it("fuzz regression: Local obliterate wins post-insertion of segment previously thought to have won", () => {
1503
- const helper = new partialSyncHelper_js_1.PartialSyncTestHelper();
1506
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate: true });
1504
1507
  helper.insertText("A", 0, "Hx15J");
1505
1508
  helper.processAllOps();
1506
1509
  helper.insertText("A", 0, "9T");
@@ -1522,7 +1525,7 @@ for (const incremental of [true, false]) {
1522
1525
  });
1523
1526
  // Simpler version of the above test which has the same root cause but reproduces a slightly different failure mode.
1524
1527
  it("Local obliterate wins post-insertion of segment previously thought to have won", () => {
1525
- const helper = new partialSyncHelper_js_1.PartialSyncTestHelper();
1528
+ const helper = new clientTestHelper_js_1.ClientTestHelper({ mergeTreeEnableSidedObliterate: true });
1526
1529
  helper.insertText("A", 0, "1xx2");
1527
1530
  helper.processAllOps();
1528
1531
  // A and B both obliterate the 'xx' segment with an expanding obliterate, then try to insert