@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.
- package/CHANGELOG.md +4 -0
- package/dist/client.d.ts +7 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +153 -44
- package/dist/client.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/mergeTree.d.ts +17 -5
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +188 -79
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeNodes.d.ts +16 -18
- package/dist/mergeTreeNodes.d.ts.map +1 -1
- package/dist/mergeTreeNodes.js +6 -0
- package/dist/mergeTreeNodes.js.map +1 -1
- package/dist/perspective.d.ts +9 -0
- package/dist/perspective.d.ts.map +1 -1
- package/dist/perspective.js +14 -1
- package/dist/perspective.js.map +1 -1
- package/dist/segmentInfos.d.ts +32 -4
- package/dist/segmentInfos.d.ts.map +1 -1
- package/dist/segmentInfos.js +3 -1
- package/dist/segmentInfos.js.map +1 -1
- package/dist/sortedSegmentSet.d.ts +1 -0
- package/dist/sortedSegmentSet.d.ts.map +1 -1
- package/dist/sortedSegmentSet.js +3 -0
- package/dist/sortedSegmentSet.js.map +1 -1
- package/dist/test/beastTest.spec.js +5 -5
- package/dist/test/beastTest.spec.js.map +1 -1
- package/dist/test/client.localReference.spec.js +3 -3
- package/dist/test/client.localReference.spec.js.map +1 -1
- package/dist/test/client.rollback.spec.js +17 -0
- package/dist/test/client.rollback.spec.js.map +1 -1
- package/dist/test/clientTestHelper.d.ts +100 -0
- package/dist/test/clientTestHelper.d.ts.map +1 -0
- package/dist/test/clientTestHelper.js +196 -0
- package/dist/test/clientTestHelper.js.map +1 -0
- package/dist/test/mergeTree.annotate.spec.js +12 -12
- package/dist/test/mergeTree.annotate.spec.js.map +1 -1
- package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +1 -1
- package/dist/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
- package/dist/test/obliterate.concurrent.spec.js +93 -90
- package/dist/test/obliterate.concurrent.spec.js.map +1 -1
- package/dist/test/obliterate.deltaCallback.spec.js +121 -116
- package/dist/test/obliterate.deltaCallback.spec.js.map +1 -1
- package/dist/test/obliterate.rangeExpansion.spec.js +29 -79
- package/dist/test/obliterate.rangeExpansion.spec.js.map +1 -1
- package/dist/test/obliterate.reconnect.spec.js +235 -58
- package/dist/test/obliterate.reconnect.spec.js.map +1 -1
- package/dist/test/testClient.js +1 -1
- package/dist/test/testClient.js.map +1 -1
- package/dist/test/testUtils.d.ts +13 -0
- package/dist/test/testUtils.d.ts.map +1 -1
- package/dist/test/testUtils.js +22 -1
- package/dist/test/testUtils.js.map +1 -1
- package/lib/client.d.ts +7 -1
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +155 -46
- package/lib/client.js.map +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/lib/mergeTree.d.ts +17 -5
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +192 -83
- package/lib/mergeTree.js.map +1 -1
- package/lib/mergeTreeNodes.d.ts +16 -18
- package/lib/mergeTreeNodes.d.ts.map +1 -1
- package/lib/mergeTreeNodes.js +7 -1
- package/lib/mergeTreeNodes.js.map +1 -1
- package/lib/perspective.d.ts +9 -0
- package/lib/perspective.d.ts.map +1 -1
- package/lib/perspective.js +12 -0
- package/lib/perspective.js.map +1 -1
- package/lib/segmentInfos.d.ts +32 -4
- package/lib/segmentInfos.d.ts.map +1 -1
- package/lib/segmentInfos.js +2 -1
- package/lib/segmentInfos.js.map +1 -1
- package/lib/sortedSegmentSet.d.ts +1 -0
- package/lib/sortedSegmentSet.d.ts.map +1 -1
- package/lib/sortedSegmentSet.js +3 -0
- package/lib/sortedSegmentSet.js.map +1 -1
- package/lib/test/beastTest.spec.js +5 -5
- package/lib/test/beastTest.spec.js.map +1 -1
- package/lib/test/client.localReference.spec.js +3 -3
- package/lib/test/client.localReference.spec.js.map +1 -1
- package/lib/test/client.rollback.spec.js +18 -1
- package/lib/test/client.rollback.spec.js.map +1 -1
- package/lib/test/clientTestHelper.d.ts +100 -0
- package/lib/test/clientTestHelper.d.ts.map +1 -0
- package/lib/test/clientTestHelper.js +192 -0
- package/lib/test/clientTestHelper.js.map +1 -0
- package/lib/test/mergeTree.annotate.spec.js +12 -12
- package/lib/test/mergeTree.annotate.spec.js.map +1 -1
- package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js +1 -1
- package/lib/test/mergeTree.markRangeRemoved.deltaCallback.spec.js.map +1 -1
- package/lib/test/obliterate.concurrent.spec.js +93 -90
- package/lib/test/obliterate.concurrent.spec.js.map +1 -1
- package/lib/test/obliterate.deltaCallback.spec.js +121 -116
- package/lib/test/obliterate.deltaCallback.spec.js.map +1 -1
- package/lib/test/obliterate.rangeExpansion.spec.js +1 -51
- package/lib/test/obliterate.rangeExpansion.spec.js.map +1 -1
- package/lib/test/obliterate.reconnect.spec.js +236 -59
- package/lib/test/obliterate.reconnect.spec.js.map +1 -1
- package/lib/test/testClient.js +1 -1
- package/lib/test/testClient.js.map +1 -1
- package/lib/test/testUtils.d.ts +13 -0
- package/lib/test/testUtils.d.ts.map +1 -1
- package/lib/test/testUtils.js +20 -0
- package/lib/test/testUtils.js.map +1 -1
- package/package.json +19 -18
- package/src/client.ts +286 -55
- package/src/index.ts +1 -1
- package/src/mergeTree.ts +265 -98
- package/src/mergeTreeNodes.ts +24 -18
- package/src/perspective.ts +21 -0
- package/src/segmentInfos.ts +48 -6
- package/src/sortedSegmentSet.ts +4 -0
- package/dist/test/partialSyncHelper.d.ts +0 -42
- package/dist/test/partialSyncHelper.d.ts.map +0 -1
- package/dist/test/partialSyncHelper.js +0 -96
- package/dist/test/partialSyncHelper.js.map +0 -1
- package/dist/test/reconnectHelper.d.ts +0 -50
- package/dist/test/reconnectHelper.d.ts.map +0 -1
- package/dist/test/reconnectHelper.js +0 -106
- package/dist/test/reconnectHelper.js.map +0 -1
- package/lib/test/partialSyncHelper.d.ts +0 -42
- package/lib/test/partialSyncHelper.d.ts.map +0 -1
- package/lib/test/partialSyncHelper.js +0 -92
- package/lib/test/partialSyncHelper.js.map +0 -1
- package/lib/test/reconnectHelper.d.ts +0 -50
- package/lib/test/reconnectHelper.d.ts.map +0 -1
- package/lib/test/reconnectHelper.js +0 -102
- 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
|
|
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
|
|
44
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|