@fluidframework/merge-tree 2.4.0-294316 → 2.4.0-297027
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/api-report/merge-tree.legacy.alpha.api.md +26 -5
- package/dist/attributionPolicy.d.ts.map +1 -1
- package/dist/attributionPolicy.js +10 -3
- package/dist/attributionPolicy.js.map +1 -1
- package/dist/client.d.ts +14 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +97 -9
- 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.map +1 -1
- package/dist/legacy.d.ts +1 -0
- package/dist/mergeTree.d.ts +15 -1
- package/dist/mergeTree.d.ts.map +1 -1
- package/dist/mergeTree.js +65 -19
- package/dist/mergeTree.js.map +1 -1
- package/dist/mergeTreeNodes.d.ts +6 -0
- package/dist/mergeTreeNodes.d.ts.map +1 -1
- package/dist/mergeTreeNodes.js +2 -1
- package/dist/mergeTreeNodes.js.map +1 -1
- package/dist/opBuilder.d.ts +15 -1
- package/dist/opBuilder.d.ts.map +1 -1
- package/dist/opBuilder.js +28 -1
- package/dist/opBuilder.js.map +1 -1
- package/dist/ops.d.ts +27 -1
- package/dist/ops.d.ts.map +1 -1
- package/dist/ops.js +1 -0
- package/dist/ops.js.map +1 -1
- package/dist/sequencePlace.d.ts +4 -0
- package/dist/sequencePlace.d.ts.map +1 -1
- package/dist/sequencePlace.js +17 -1
- package/dist/sequencePlace.js.map +1 -1
- package/dist/test/obliterate.concurrent.spec.js +18 -0
- package/dist/test/obliterate.concurrent.spec.js.map +1 -1
- package/dist/test/obliterate.rangeExpansion.spec.js +109 -53
- package/dist/test/obliterate.rangeExpansion.spec.js.map +1 -1
- package/dist/test/obliterate.spec.js +2 -2
- package/dist/test/obliterate.spec.js.map +1 -1
- package/dist/test/reconnectHelper.d.ts +8 -6
- package/dist/test/reconnectHelper.d.ts.map +1 -1
- package/dist/test/reconnectHelper.js +14 -13
- package/dist/test/reconnectHelper.js.map +1 -1
- package/dist/test/testClientLogger.d.ts.map +1 -1
- package/dist/test/testClientLogger.js +19 -8
- package/dist/test/testClientLogger.js.map +1 -1
- package/lib/attributionPolicy.d.ts.map +1 -1
- package/lib/attributionPolicy.js +10 -3
- package/lib/attributionPolicy.js.map +1 -1
- package/lib/client.d.ts +14 -4
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +98 -10
- 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.map +1 -1
- package/lib/legacy.d.ts +1 -0
- package/lib/mergeTree.d.ts +15 -1
- package/lib/mergeTree.d.ts.map +1 -1
- package/lib/mergeTree.js +65 -19
- package/lib/mergeTree.js.map +1 -1
- package/lib/mergeTreeNodes.d.ts +6 -0
- package/lib/mergeTreeNodes.d.ts.map +1 -1
- package/lib/mergeTreeNodes.js +2 -1
- package/lib/mergeTreeNodes.js.map +1 -1
- package/lib/opBuilder.d.ts +15 -1
- package/lib/opBuilder.d.ts.map +1 -1
- package/lib/opBuilder.js +26 -0
- package/lib/opBuilder.js.map +1 -1
- package/lib/ops.d.ts +27 -1
- package/lib/ops.d.ts.map +1 -1
- package/lib/ops.js +1 -0
- package/lib/ops.js.map +1 -1
- package/lib/sequencePlace.d.ts +4 -0
- package/lib/sequencePlace.d.ts.map +1 -1
- package/lib/sequencePlace.js +15 -0
- package/lib/sequencePlace.js.map +1 -1
- package/lib/test/obliterate.concurrent.spec.js +18 -0
- package/lib/test/obliterate.concurrent.spec.js.map +1 -1
- package/lib/test/obliterate.rangeExpansion.spec.js +109 -53
- package/lib/test/obliterate.rangeExpansion.spec.js.map +1 -1
- package/lib/test/obliterate.spec.js +2 -2
- package/lib/test/obliterate.spec.js.map +1 -1
- package/lib/test/reconnectHelper.d.ts +8 -6
- package/lib/test/reconnectHelper.d.ts.map +1 -1
- package/lib/test/reconnectHelper.js +15 -14
- package/lib/test/reconnectHelper.js.map +1 -1
- package/lib/test/testClientLogger.d.ts.map +1 -1
- package/lib/test/testClientLogger.js +19 -8
- package/lib/test/testClientLogger.js.map +1 -1
- package/package.json +29 -16
- package/src/attributionPolicy.ts +5 -0
- package/src/client.ts +136 -21
- package/src/index.ts +1 -0
- package/src/mergeTree.ts +108 -22
- package/src/mergeTreeNodes.ts +9 -1
- package/src/opBuilder.ts +32 -0
- package/src/ops.ts +23 -1
- package/src/sequencePlace.ts +16 -0
|
@@ -7,37 +7,35 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
7
7
|
const node_assert_1 = require("node:assert");
|
|
8
8
|
const sequencePlace_js_1 = require("../sequencePlace.js");
|
|
9
9
|
const reconnectHelper_js_1 = require("./reconnectHelper.js");
|
|
10
|
-
function itCorrectlyObliterates({ title, action, expectedText,
|
|
10
|
+
function itCorrectlyObliterates({ title, action, expectedText, }) {
|
|
11
11
|
return it(title, () => {
|
|
12
12
|
const events = [];
|
|
13
|
-
const helper = new reconnectHelper_js_1.ReconnectTestHelper(
|
|
13
|
+
const helper = new reconnectHelper_js_1.ReconnectTestHelper({
|
|
14
|
+
mergeTreeEnableSidedObliterate: true,
|
|
15
|
+
});
|
|
14
16
|
helper.clients.A.on("delta", (opArgs, deltaArgs) => {
|
|
15
17
|
events.push(deltaArgs.operation);
|
|
16
18
|
});
|
|
17
19
|
action(helper);
|
|
18
20
|
helper.processAllOps();
|
|
19
|
-
|
|
20
|
-
node_assert_1.strict.equal(helper.clients.B.getText(), expectedText);
|
|
21
|
-
node_assert_1.strict.equal(helper.clients.C.getText(), expectedText);
|
|
22
|
-
node_assert_1.strict.equal(events.length, expectedEventCount, `events: ${events.join(", ")}`);
|
|
23
|
-
helper.logger.validate();
|
|
21
|
+
helper.logger.validate({ baseText: expectedText });
|
|
24
22
|
});
|
|
25
23
|
}
|
|
26
|
-
|
|
24
|
+
itCorrectlyObliterates.skip = ({ title, }) => it.skip(title, () => { });
|
|
25
|
+
describe("obliterate", () => {
|
|
27
26
|
itCorrectlyObliterates({
|
|
28
27
|
title: "obliterate adjacent insert",
|
|
29
28
|
action: (helper) => {
|
|
30
29
|
helper.insertText("A", 0, "|ABC>");
|
|
31
30
|
helper.processAllOps();
|
|
32
|
-
helper.obliterateRange("A", { pos: 0, side: sequencePlace_js_1.Side.After }, { pos: 4, side: sequencePlace_js_1.Side.
|
|
31
|
+
helper.obliterateRange("A", { pos: 0, side: sequencePlace_js_1.Side.After }, { pos: 4, side: sequencePlace_js_1.Side.Before });
|
|
33
32
|
// not concurrent to A's obliterate - ops on the same client are never concurrent to one another
|
|
34
33
|
// because they are all sequenced locally
|
|
35
|
-
helper.insertText("A", 1, "
|
|
36
|
-
helper.obliterateRange("B", { pos: 0, side: sequencePlace_js_1.Side.After }, { pos: 4, side: sequencePlace_js_1.Side.
|
|
37
|
-
helper.insertText("B", 1, "
|
|
34
|
+
helper.insertText("A", 1, "AAA");
|
|
35
|
+
helper.obliterateRange("B", { pos: 0, side: sequencePlace_js_1.Side.After }, { pos: 4, side: sequencePlace_js_1.Side.Before });
|
|
36
|
+
helper.insertText("B", 1, "BBB");
|
|
38
37
|
},
|
|
39
|
-
expectedText: "|
|
|
40
|
-
expectedEventCount: 3,
|
|
38
|
+
expectedText: "|BBB>",
|
|
41
39
|
});
|
|
42
40
|
itCorrectlyObliterates({
|
|
43
41
|
title: "does not obliterate non-adjacent insert",
|
|
@@ -48,33 +46,104 @@ describe.skip("obliterate", () => {
|
|
|
48
46
|
// do not obliterate the XYZ - outside the obliterated range without expansion
|
|
49
47
|
helper.insertText("B", 0, "XYZ");
|
|
50
48
|
},
|
|
51
|
-
expectedText: "
|
|
52
|
-
|
|
49
|
+
expectedText: "XYZhe world",
|
|
50
|
+
});
|
|
51
|
+
itCorrectlyObliterates({
|
|
52
|
+
title: "obliterate, then insert at the end of the string",
|
|
53
|
+
action: (helper) => {
|
|
54
|
+
helper.insertText("A", 0, "hello world");
|
|
55
|
+
helper.processAllOps();
|
|
56
|
+
helper.obliterateRange("A", { pos: 5, side: sequencePlace_js_1.Side.Before }, { pos: 10, side: sequencePlace_js_1.Side.After });
|
|
57
|
+
helper.insertText("B", 10, "123");
|
|
58
|
+
},
|
|
59
|
+
expectedText: "hello",
|
|
60
|
+
});
|
|
61
|
+
itCorrectlyObliterates({
|
|
62
|
+
title: "insert, then obliterate at the end of the string",
|
|
63
|
+
action: (helper) => {
|
|
64
|
+
helper.insertText("A", 0, "hello world");
|
|
65
|
+
helper.processAllOps();
|
|
66
|
+
helper.insertText("A", 10, "123");
|
|
67
|
+
helper.obliterateRange("B", { pos: 5, side: sequencePlace_js_1.Side.Before }, { pos: 10, side: sequencePlace_js_1.Side.After });
|
|
68
|
+
},
|
|
69
|
+
expectedText: "hello",
|
|
70
|
+
});
|
|
71
|
+
itCorrectlyObliterates({
|
|
72
|
+
title: "obliterate, then insert at the end of the string",
|
|
73
|
+
action: (helper) => {
|
|
74
|
+
helper.insertText("A", 0, "hello world");
|
|
75
|
+
helper.processAllOps();
|
|
76
|
+
helper.obliterateRange("A", { pos: 5, side: sequencePlace_js_1.Side.Before }, { pos: 10, side: sequencePlace_js_1.Side.After });
|
|
77
|
+
helper.insertText("B", 10, "123");
|
|
78
|
+
},
|
|
79
|
+
expectedText: "hello",
|
|
80
|
+
});
|
|
81
|
+
itCorrectlyObliterates({
|
|
82
|
+
title: "insert, then obliterate at the end of the string",
|
|
83
|
+
action: (helper) => {
|
|
84
|
+
helper.insertText("A", 0, "hello world");
|
|
85
|
+
helper.processAllOps();
|
|
86
|
+
helper.insertText("A", 10, "123");
|
|
87
|
+
helper.obliterateRange("B", { pos: 5, side: sequencePlace_js_1.Side.Before }, { pos: 10, side: sequencePlace_js_1.Side.After });
|
|
88
|
+
},
|
|
89
|
+
expectedText: "hello",
|
|
90
|
+
});
|
|
91
|
+
describe("zero length", () => {
|
|
92
|
+
// TODO: #17785: Allow start and end to be used as obliteration range endpoints.
|
|
93
|
+
itCorrectlyObliterates.skip({
|
|
94
|
+
title: "zero length obliterate at the start of the string",
|
|
95
|
+
action: (helper) => {
|
|
96
|
+
helper.insertText("A", 0, "hello world");
|
|
97
|
+
helper.processAllOps();
|
|
98
|
+
helper.obliterateRange("A", { pos: -1, side: sequencePlace_js_1.Side.After }, { pos: 0, side: sequencePlace_js_1.Side.Before });
|
|
99
|
+
helper.insertText("B", 0, "more ");
|
|
100
|
+
},
|
|
101
|
+
expectedText: "hello world",
|
|
102
|
+
});
|
|
103
|
+
itCorrectlyObliterates({
|
|
104
|
+
title: "zero length obliterate in the middle of the string",
|
|
105
|
+
action: (helper) => {
|
|
106
|
+
helper.insertText("A", 0, "hello world");
|
|
107
|
+
helper.processAllOps();
|
|
108
|
+
helper.obliterateRange("A", { pos: 0, side: sequencePlace_js_1.Side.After }, { pos: 1, side: sequencePlace_js_1.Side.Before });
|
|
109
|
+
helper.insertText("B", 1, "more ");
|
|
110
|
+
},
|
|
111
|
+
expectedText: "hello world",
|
|
112
|
+
});
|
|
113
|
+
// TODO: #17785: Allow start and end to be used as obliteration range endpoints.
|
|
114
|
+
itCorrectlyObliterates.skip({
|
|
115
|
+
title: "zero length obliterate at the end of the string",
|
|
116
|
+
action: (helper) => {
|
|
117
|
+
helper.insertText("A", 0, "hello world");
|
|
118
|
+
helper.processAllOps();
|
|
119
|
+
helper.obliterateRange("A", { pos: helper.clients.A.getLength() - 1, side: sequencePlace_js_1.Side.After }, { pos: -1, side: sequencePlace_js_1.Side.Before });
|
|
120
|
+
helper.insertText("B", helper.clients.B.getLength(), " more");
|
|
121
|
+
},
|
|
122
|
+
expectedText: "hello world",
|
|
123
|
+
});
|
|
53
124
|
});
|
|
54
125
|
});
|
|
55
|
-
describe
|
|
126
|
+
describe("overlapping edits", () => {
|
|
56
127
|
itCorrectlyObliterates({
|
|
57
128
|
title: "overlapping obliterate and obliterate",
|
|
58
129
|
action: (helper) => {
|
|
59
130
|
const text = "abcdef";
|
|
60
131
|
helper.insertText("A", 0, text);
|
|
61
132
|
helper.processAllOps();
|
|
62
|
-
helper.obliterateRange("A", { pos: 0, side: sequencePlace_js_1.Side.Before }, { pos: text.length, side: sequencePlace_js_1.Side.After });
|
|
63
|
-
helper.obliterateRange("B", { pos: 0, side: sequencePlace_js_1.Side.Before }, { pos: text.length, side: sequencePlace_js_1.Side.After });
|
|
133
|
+
helper.obliterateRange("A", { pos: 0, side: sequencePlace_js_1.Side.Before }, { pos: text.length - 1, side: sequencePlace_js_1.Side.After });
|
|
134
|
+
helper.obliterateRange("B", { pos: 0, side: sequencePlace_js_1.Side.Before }, { pos: text.length - 1, side: sequencePlace_js_1.Side.After });
|
|
64
135
|
},
|
|
65
136
|
expectedText: "",
|
|
66
|
-
expectedEventCount: 2,
|
|
67
137
|
});
|
|
68
138
|
itCorrectlyObliterates({
|
|
69
139
|
title: "adjacent obliterates",
|
|
70
140
|
action: (helper) => {
|
|
71
141
|
helper.insertText("A", 0, "hello world");
|
|
72
142
|
helper.processAllOps();
|
|
73
|
-
helper.obliterateRange("A", { pos: 2, side: sequencePlace_js_1.Side.Before }, { pos:
|
|
74
|
-
helper.obliterateRange("B", { pos: 4, side: sequencePlace_js_1.Side.Before }, { pos:
|
|
143
|
+
helper.obliterateRange("A", { pos: 2, side: sequencePlace_js_1.Side.Before }, { pos: 3, side: sequencePlace_js_1.Side.After });
|
|
144
|
+
helper.obliterateRange("B", { pos: 4, side: sequencePlace_js_1.Side.Before }, { pos: 5, side: sequencePlace_js_1.Side.After });
|
|
75
145
|
},
|
|
76
146
|
expectedText: "heworld",
|
|
77
|
-
expectedEventCount: 2,
|
|
78
147
|
});
|
|
79
148
|
itCorrectlyObliterates({
|
|
80
149
|
title: "remove within obliterated range",
|
|
@@ -84,8 +153,7 @@ describe.skip("overlapping edits", () => {
|
|
|
84
153
|
helper.obliterateRange("A", { pos: 2, side: sequencePlace_js_1.Side.Before }, { pos: 5, side: sequencePlace_js_1.Side.After });
|
|
85
154
|
helper.removeRange("B", 3, 4);
|
|
86
155
|
},
|
|
87
|
-
expectedText: "
|
|
88
|
-
expectedEventCount: 2,
|
|
156
|
+
expectedText: "heworld",
|
|
89
157
|
});
|
|
90
158
|
itCorrectlyObliterates({
|
|
91
159
|
title: "obliterate, then remove adjacent to range start",
|
|
@@ -95,8 +163,7 @@ describe.skip("overlapping edits", () => {
|
|
|
95
163
|
helper.obliterateRange("A", { pos: 1, side: sequencePlace_js_1.Side.After }, { pos: 5, side: sequencePlace_js_1.Side.After });
|
|
96
164
|
helper.removeRange("B", 1, 2);
|
|
97
165
|
},
|
|
98
|
-
expectedText: "
|
|
99
|
-
expectedEventCount: 2,
|
|
166
|
+
expectedText: "hworld",
|
|
100
167
|
});
|
|
101
168
|
itCorrectlyObliterates({
|
|
102
169
|
title: "obliterate, then remove adjacent to range end",
|
|
@@ -106,8 +173,7 @@ describe.skip("overlapping edits", () => {
|
|
|
106
173
|
helper.obliterateRange("A", { pos: 2, side: sequencePlace_js_1.Side.Before }, { pos: 4, side: sequencePlace_js_1.Side.After });
|
|
107
174
|
helper.removeRange("B", 4, 6);
|
|
108
175
|
},
|
|
109
|
-
expectedText: "
|
|
110
|
-
expectedEventCount: 2,
|
|
176
|
+
expectedText: "heworld",
|
|
111
177
|
});
|
|
112
178
|
itCorrectlyObliterates({
|
|
113
179
|
title: "remove, then obliterate adjacent to range start",
|
|
@@ -118,7 +184,6 @@ describe.skip("overlapping edits", () => {
|
|
|
118
184
|
helper.obliterateRange("B", { pos: 2, side: sequencePlace_js_1.Side.Before }, { pos: 4, side: sequencePlace_js_1.Side.After });
|
|
119
185
|
},
|
|
120
186
|
expectedText: "heworld",
|
|
121
|
-
expectedEventCount: 3,
|
|
122
187
|
});
|
|
123
188
|
itCorrectlyObliterates({
|
|
124
189
|
title: "remove, then obliterate adjacent to range end",
|
|
@@ -128,8 +193,7 @@ describe.skip("overlapping edits", () => {
|
|
|
128
193
|
helper.removeRange("A", 2, 4);
|
|
129
194
|
helper.obliterateRange("B", { pos: 3, side: sequencePlace_js_1.Side.After }, { pos: 6, side: sequencePlace_js_1.Side.After });
|
|
130
195
|
},
|
|
131
|
-
expectedText: "
|
|
132
|
-
expectedEventCount: 3,
|
|
196
|
+
expectedText: "heorld",
|
|
133
197
|
});
|
|
134
198
|
});
|
|
135
199
|
describe.skip("reconnect", () => {
|
|
@@ -147,7 +211,6 @@ describe.skip("reconnect", () => {
|
|
|
147
211
|
helper.insertText("A", 2, "123");
|
|
148
212
|
},
|
|
149
213
|
expectedText: "heo world",
|
|
150
|
-
expectedEventCount: 2,
|
|
151
214
|
});
|
|
152
215
|
itCorrectlyObliterates({
|
|
153
216
|
title: "add text, disconnect, obliterate, insert adjacent to obliterated range, reconnect",
|
|
@@ -162,10 +225,9 @@ describe.skip("reconnect", () => {
|
|
|
162
225
|
helper.submitDisconnectedOp("C", op);
|
|
163
226
|
},
|
|
164
227
|
expectedText: "heo world",
|
|
165
|
-
expectedEventCount: 2,
|
|
166
228
|
});
|
|
167
229
|
});
|
|
168
|
-
describe
|
|
230
|
+
describe("sided obliterates", () => {
|
|
169
231
|
/**
|
|
170
232
|
* All test cases will operate on the same numerical positions, but differ on their sidedness:
|
|
171
233
|
* 1. A expand both endpoints, B expand neither endpoint = expand range on both endpoints
|
|
@@ -188,10 +250,9 @@ describe.skip("sided obliterates", () => {
|
|
|
188
250
|
// [2, 4]: before 2, after 4 => h e [l l o] _ w o r l d
|
|
189
251
|
helper.obliterateRange("B", { pos: 2, side: sequencePlace_js_1.Side.Before }, { pos: 4, side: sequencePlace_js_1.Side.After });
|
|
190
252
|
helper.insertText("C", 2, "123");
|
|
191
|
-
helper.insertText("C",
|
|
253
|
+
helper.insertText("C", 8, "456");
|
|
192
254
|
},
|
|
193
255
|
expectedText: "he world",
|
|
194
|
-
expectedEventCount: 2,
|
|
195
256
|
});
|
|
196
257
|
itCorrectlyObliterates({
|
|
197
258
|
title: "2. A expand start endpoint, B expand end endpoint",
|
|
@@ -202,15 +263,14 @@ describe.skip("sided obliterates", () => {
|
|
|
202
263
|
helper.insertText("A", 0, "ABC");
|
|
203
264
|
helper.processAllOps();
|
|
204
265
|
helper.insertText("A", 2, "D");
|
|
205
|
-
// ( 1]: after 0, after 1 => A( B] C
|
|
206
|
-
helper.obliterateRange("A", { pos: 0, side: sequencePlace_js_1.Side.After }, { pos:
|
|
266
|
+
// ( 1]: after 0, after 1 => A( B] D C
|
|
267
|
+
helper.obliterateRange("A", { pos: 0, side: sequencePlace_js_1.Side.After }, { pos: 1, side: sequencePlace_js_1.Side.After });
|
|
207
268
|
// included in the range -- should get obliterated
|
|
208
|
-
helper.insertText("B",
|
|
209
|
-
// [1 ): before 1, before 2 => A [B )C
|
|
210
|
-
helper.obliterateRange("B", { pos: 1, side: sequencePlace_js_1.Side.
|
|
269
|
+
helper.insertText("B", 1, "E");
|
|
270
|
+
// [1 ): before 1, before 2 => A E [B )C
|
|
271
|
+
helper.obliterateRange("B", { pos: 1, side: sequencePlace_js_1.Side.Before }, { pos: 3, side: sequencePlace_js_1.Side.Before });
|
|
211
272
|
},
|
|
212
|
-
expectedText: "
|
|
213
|
-
expectedEventCount: 2,
|
|
273
|
+
expectedText: "AC",
|
|
214
274
|
});
|
|
215
275
|
itCorrectlyObliterates({
|
|
216
276
|
title: "3. A expand both endpoints, B expand start",
|
|
@@ -226,7 +286,6 @@ describe.skip("sided obliterates", () => {
|
|
|
226
286
|
helper.insertText("C", 4, "456");
|
|
227
287
|
},
|
|
228
288
|
expectedText: "he world",
|
|
229
|
-
expectedEventCount: 2,
|
|
230
289
|
});
|
|
231
290
|
itCorrectlyObliterates({
|
|
232
291
|
title: "4. A expand both endpoints, B expand end",
|
|
@@ -237,12 +296,11 @@ describe.skip("sided obliterates", () => {
|
|
|
237
296
|
helper.obliterateRange("A", { pos: 1, side: sequencePlace_js_1.Side.After }, { pos: 5, side: sequencePlace_js_1.Side.Before });
|
|
238
297
|
// [2, 4 ): before 2, before 5 => h e [l l o )_ w o r l d
|
|
239
298
|
helper.obliterateRange("B", { pos: 2, side: sequencePlace_js_1.Side.Before }, { pos: 5, side: sequencePlace_js_1.Side.Before });
|
|
240
|
-
helper.insertText("C", 2, "123");
|
|
299
|
+
helper.insertText("C", 2, "123"); // he123llo world
|
|
241
300
|
// for this to be interesting, might want to insert at 5
|
|
242
|
-
helper.insertText("C",
|
|
301
|
+
helper.insertText("C", 8, "456"); // he123llo456 world
|
|
243
302
|
},
|
|
244
303
|
expectedText: "he world",
|
|
245
|
-
expectedEventCount: 3,
|
|
246
304
|
});
|
|
247
305
|
itCorrectlyObliterates({
|
|
248
306
|
title: "5. A expand neither endpoint, B expand start",
|
|
@@ -253,8 +311,8 @@ describe.skip("sided obliterates", () => {
|
|
|
253
311
|
helper.obliterateRange("A", { pos: 2, side: sequencePlace_js_1.Side.Before }, { pos: 4, side: sequencePlace_js_1.Side.After });
|
|
254
312
|
// ( 2, 4]: after 1, after 4 => h e( l l o] _ w o r l d
|
|
255
313
|
helper.obliterateRange("B", { pos: 1, side: sequencePlace_js_1.Side.After }, { pos: 4, side: sequencePlace_js_1.Side.After });
|
|
256
|
-
helper.insertText("C", 2, "123");
|
|
257
|
-
helper.insertText("C",
|
|
314
|
+
helper.insertText("C", 2, "123"); // h e( 123 l l o] _ w o r l d
|
|
315
|
+
helper.insertText("C", 8, "456"); // h e( 123 l l o) 456 _ w o r l d
|
|
258
316
|
helper.processAllOps();
|
|
259
317
|
node_assert_1.strict.equal(helper.clients.A.getText(), "he456 world");
|
|
260
318
|
node_assert_1.strict.equal(helper.clients.B.getText(), "he456 world");
|
|
@@ -262,7 +320,6 @@ describe.skip("sided obliterates", () => {
|
|
|
262
320
|
helper.logger.validate();
|
|
263
321
|
},
|
|
264
322
|
expectedText: "he456 world",
|
|
265
|
-
expectedEventCount: 3,
|
|
266
323
|
});
|
|
267
324
|
itCorrectlyObliterates({
|
|
268
325
|
title: "6. A expand neither endpoint, B expand end",
|
|
@@ -274,7 +331,7 @@ describe.skip("sided obliterates", () => {
|
|
|
274
331
|
// [2, 4 ): before 2, before 5 => h e [l l o )_ w o r l d
|
|
275
332
|
helper.obliterateRange("B", { pos: 2, side: sequencePlace_js_1.Side.Before }, { pos: 5, side: sequencePlace_js_1.Side.Before });
|
|
276
333
|
helper.insertText("C", 2, "123");
|
|
277
|
-
helper.insertText("C",
|
|
334
|
+
helper.insertText("C", 8, "456");
|
|
278
335
|
helper.processAllOps();
|
|
279
336
|
node_assert_1.strict.equal(helper.clients.A.getText(), "he123 world");
|
|
280
337
|
node_assert_1.strict.equal(helper.clients.B.getText(), "he123 world");
|
|
@@ -282,7 +339,6 @@ describe.skip("sided obliterates", () => {
|
|
|
282
339
|
helper.logger.validate();
|
|
283
340
|
},
|
|
284
341
|
expectedText: "he123 world",
|
|
285
|
-
expectedEventCount: 3,
|
|
286
342
|
});
|
|
287
343
|
});
|
|
288
344
|
//# sourceMappingURL=obliterate.rangeExpansion.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"obliterate.rangeExpansion.spec.js","sourceRoot":"","sources":["../../src/test/obliterate.rangeExpansion.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { Side } from \"../sequencePlace.js\";\n\nimport { ReconnectTestHelper } from \"./reconnectHelper.js\";\n\nfunction itCorrectlyObliterates({\n\ttitle,\n\taction,\n\texpectedText,\n\texpectedEventCount,\n}: {\n\ttitle: string;\n\taction: (helper: ReconnectTestHelper) => void;\n\texpectedText: string;\n\texpectedEventCount: number;\n}): Mocha.Test {\n\treturn it(title, () => {\n\t\tconst events: number[] = [];\n\n\t\tconst helper = new ReconnectTestHelper();\n\t\thelper.clients.A.on(\"delta\", (opArgs, deltaArgs) => {\n\t\t\tevents.push(deltaArgs.operation);\n\t\t});\n\t\taction(helper);\n\t\thelper.processAllOps();\n\t\tassert.equal(helper.clients.A.getText(), expectedText);\n\t\tassert.equal(helper.clients.B.getText(), expectedText);\n\t\tassert.equal(helper.clients.C.getText(), expectedText);\n\t\tassert.equal(events.length, expectedEventCount, `events: ${events.join(\", \")}`);\n\n\t\thelper.logger.validate();\n\t});\n}\n\ndescribe.skip(\"obliterate\", () => {\n\titCorrectlyObliterates({\n\t\ttitle: \"obliterate adjacent insert\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"|ABC>\");\n\t\t\thelper.processAllOps();\n\t\t\thelper.obliterateRange(\"A\", { pos: 0, side: Side.After }, { pos: 4, side: Side.After });\n\t\t\t// not concurrent to A's obliterate - ops on the same client are never concurrent to one another\n\t\t\t// because they are all sequenced locally\n\t\t\thelper.insertText(\"A\", 1, \"XYZ\");\n\t\t\thelper.obliterateRange(\"B\", { pos: 0, side: Side.After }, { pos: 4, side: Side.After });\n\t\t\thelper.insertText(\"B\", 1, \"XYZ\");\n\t\t},\n\t\texpectedText: \"|XYZ>\",\n\t\texpectedEventCount: 3,\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"does not obliterate non-adjacent insert\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\t\t\thelper.obliterateRange(\"A\", { pos: 2, side: Side.Before }, { pos: 4, side: Side.After });\n\t\t\t// do not obliterate the XYZ - outside the obliterated range without expansion\n\t\t\thelper.insertText(\"B\", 0, \"XYZ\");\n\t\t},\n\t\texpectedText: \"XYZheo world\",\n\t\texpectedEventCount: 3,\n\t});\n});\n\ndescribe.skip(\"overlapping edits\", () => {\n\titCorrectlyObliterates({\n\t\ttitle: \"overlapping obliterate and obliterate\",\n\t\taction: (helper) => {\n\t\t\tconst text = \"abcdef\";\n\n\t\t\thelper.insertText(\"A\", 0, text);\n\t\t\thelper.processAllOps();\n\t\t\thelper.obliterateRange(\n\t\t\t\t\"A\",\n\t\t\t\t{ pos: 0, side: Side.Before },\n\t\t\t\t{ pos: text.length, side: Side.After },\n\t\t\t);\n\t\t\thelper.obliterateRange(\n\t\t\t\t\"B\",\n\t\t\t\t{ pos: 0, side: Side.Before },\n\t\t\t\t{ pos: text.length, side: Side.After },\n\t\t\t);\n\t\t},\n\t\texpectedText: \"\",\n\t\texpectedEventCount: 2,\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"adjacent obliterates\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\t\t\thelper.obliterateRange(\"A\", { pos: 2, side: Side.Before }, { pos: 4, side: Side.After });\n\t\t\thelper.obliterateRange(\"B\", { pos: 4, side: Side.Before }, { pos: 6, side: Side.After });\n\t\t},\n\t\texpectedText: \"heworld\",\n\t\texpectedEventCount: 2,\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"remove within obliterated range\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\t\t\thelper.obliterateRange(\"A\", { pos: 2, side: Side.Before }, { pos: 5, side: Side.After });\n\t\t\thelper.removeRange(\"B\", 3, 4);\n\t\t},\n\t\texpectedText: \"he world\",\n\t\texpectedEventCount: 2,\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"obliterate, then remove adjacent to range start\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\t\t\thelper.obliterateRange(\"A\", { pos: 1, side: Side.After }, { pos: 5, side: Side.After });\n\t\t\thelper.removeRange(\"B\", 1, 2);\n\t\t},\n\t\texpectedText: \"he world\",\n\t\texpectedEventCount: 2,\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"obliterate, then remove adjacent to range end\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\t\t\thelper.obliterateRange(\"A\", { pos: 2, side: Side.Before }, { pos: 4, side: Side.After });\n\t\t\thelper.removeRange(\"B\", 4, 6);\n\t\t},\n\t\texpectedText: \"he world\",\n\t\texpectedEventCount: 2,\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"remove, then obliterate adjacent to range start\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\t\t\thelper.removeRange(\"A\", 4, 6);\n\t\t\thelper.obliterateRange(\"B\", { pos: 2, side: Side.Before }, { pos: 4, side: Side.After });\n\t\t},\n\t\texpectedText: \"heworld\",\n\t\texpectedEventCount: 3,\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"remove, then obliterate adjacent to range end\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\t\t\thelper.removeRange(\"A\", 2, 4);\n\t\t\thelper.obliterateRange(\"B\", { pos: 3, side: Side.After }, { pos: 6, side: Side.After });\n\t\t},\n\t\texpectedText: \"heworld\",\n\t\texpectedEventCount: 3,\n\t});\n});\n\ndescribe.skip(\"reconnect\", () => {\n\titCorrectlyObliterates({\n\t\ttitle: \"add text, disconnect, obliterate, reconnect, insert adjacent to obliterated range\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\t\t\thelper.disconnect([\"C\"]);\n\t\t\tconst op = helper.obliterateRangeLocal(\n\t\t\t\t\"C\",\n\t\t\t\t{ pos: 1, side: Side.After },\n\t\t\t\t{ pos: 4, side: Side.After },\n\t\t\t);\n\t\t\thelper.reconnect([\"C\"]);\n\t\t\thelper.submitDisconnectedOp(\"C\", op);\n\t\t\thelper.processAllOps();\n\t\t\t// inserting adjacent to the obliterated range start\n\t\t\thelper.insertText(\"A\", 2, \"123\");\n\t\t},\n\t\texpectedText: \"heo world\",\n\t\texpectedEventCount: 2,\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"add text, disconnect, obliterate, insert adjacent to obliterated range, reconnect\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\t\t\thelper.disconnect([\"C\"]);\n\t\t\tconst op = helper.obliterateRangeLocal(\n\t\t\t\t\"C\",\n\t\t\t\t{ pos: 1, side: Side.After },\n\t\t\t\t{ pos: 4, side: Side.After },\n\t\t\t);\n\t\t\t// inserting adjacent to the obliterated range start\n\t\t\thelper.insertText(\"A\", 2, \"123\");\n\t\t\thelper.reconnect([\"C\"]);\n\t\t\thelper.submitDisconnectedOp(\"C\", op);\n\t\t},\n\t\texpectedText: \"heo world\",\n\t\texpectedEventCount: 2,\n\t});\n});\n\ndescribe.skip(\"sided obliterates\", () => {\n\t/**\n\t * All test cases will operate on the same numerical positions, but differ on their sidedness:\n\t * 1. A expand both endpoints, B expand neither endpoint = expand range on both endpoints\n\t * 2. A expand start endpoint, B expand end endpoint = either FWW/LWW\n\t * 3. A expand both endpoints, B expand start = expand range on both endpoints\n\t * 4. (similar to 3) A expand both endpoints, B expand end = expand range on both endpoints\n\t * 5. A expand neither endpoint, B expand start = expand start endpoint\n\t * 6. A expand neither endpoint, B expand end = expand end endpoint\n\t * before = 0, after = 1\n\t */\n\titCorrectlyObliterates({\n\t\ttitle: \"1. A expand both endpoints, B expand neither endpoint\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\t\t\t// in order to get the right behavior, the range needs to start after the previous position\n\t\t\t// if so, for a range ( 2, 4 ) itCorrectlyObliterates would need to be after 1 and before 5\n\t\t\t// h e( l l o )_ w o r l d\n\t\t\thelper.obliterateRange(\"A\", { pos: 1, side: Side.After }, { pos: 5, side: Side.Before });\n\t\t\t// [2, 4]: before 2, after 4 => h e [l l o] _ w o r l d\n\t\t\thelper.obliterateRange(\"B\", { pos: 2, side: Side.Before }, { pos: 4, side: Side.After });\n\t\t\thelper.insertText(\"C\", 2, \"123\");\n\t\t\thelper.insertText(\"C\", 5, \"456\");\n\t\t},\n\t\texpectedText: \"he world\",\n\t\texpectedEventCount: 2,\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"2. A expand start endpoint, B expand end endpoint\",\n\t\taction: (helper) => {\n\t\t\t// currently this is the example from obliterate notation loop doc\n\t\t\t// TODO: translate this into same format as others\n\t\t\t// i think this gets difficult when the range to obliterate > 1 character\n\t\t\thelper.insertText(\"A\", 0, \"ABC\");\n\t\t\thelper.processAllOps();\n\t\t\thelper.insertText(\"A\", 2, \"D\");\n\t\t\t// ( 1]: after 0, after 1 => A( B] C\n\t\t\thelper.obliterateRange(\"A\", { pos: 0, side: Side.After }, { pos: 2, side: Side.After });\n\t\t\t// included in the range -- should get obliterated\n\t\t\thelper.insertText(\"B\", 2, \"E\");\n\t\t\t// [1 ): before 1, before 2 => A [B )C\n\t\t\thelper.obliterateRange(\"B\", { pos: 1, side: Side.After }, { pos: 3, side: Side.Before });\n\t\t},\n\t\texpectedText: \"ADC\",\n\t\texpectedEventCount: 2,\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"3. A expand both endpoints, B expand start\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\n\t\t\t// ( 2, 4 ): after 1, before 5 => h e( l l o )_ w o r l d\n\t\t\thelper.obliterateRange(\"A\", { pos: 1, side: Side.After }, { pos: 5, side: Side.Before });\n\t\t\t// ( 2, 4]: after 1, after 4 => h e( l l o] _ w o r l d\n\t\t\thelper.obliterateRange(\"B\", { pos: 2, side: Side.After }, { pos: 4, side: Side.Before });\n\t\t\thelper.insertText(\"C\", 2, \"123\");\n\t\t\t// for this to be interesting, might want to insert at 5\n\t\t\thelper.insertText(\"C\", 4, \"456\");\n\t\t},\n\t\texpectedText: \"he world\",\n\t\texpectedEventCount: 2,\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"4. A expand both endpoints, B expand end\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\n\t\t\t// ( 2, 4 ): after 1, before 5 => h e( l l o )_ w o r l d\n\t\t\thelper.obliterateRange(\"A\", { pos: 1, side: Side.After }, { pos: 5, side: Side.Before });\n\t\t\t// [2, 4 ): before 2, before 5 => h e [l l o )_ w o r l d\n\t\t\thelper.obliterateRange(\n\t\t\t\t\"B\",\n\t\t\t\t{ pos: 2, side: Side.Before },\n\t\t\t\t{ pos: 5, side: Side.Before },\n\t\t\t);\n\t\t\thelper.insertText(\"C\", 2, \"123\");\n\t\t\t// for this to be interesting, might want to insert at 5\n\t\t\thelper.insertText(\"C\", 4, \"456\");\n\t\t},\n\t\texpectedText: \"he world\",\n\t\texpectedEventCount: 3,\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"5. A expand neither endpoint, B expand start\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\n\t\t\t// [2, 4]: before 2, after 4 => h e [l l o] _ w o r l d\n\t\t\thelper.obliterateRange(\"A\", { pos: 2, side: Side.Before }, { pos: 4, side: Side.After });\n\t\t\t// ( 2, 4]: after 1, after 4 => h e( l l o] _ w o r l d\n\t\t\thelper.obliterateRange(\"B\", { pos: 1, side: Side.After }, { pos: 4, side: Side.After });\n\t\t\thelper.insertText(\"C\", 2, \"123\");\n\t\t\thelper.insertText(\"C\", 5, \"456\");\n\t\t\thelper.processAllOps();\n\n\t\t\tassert.equal(helper.clients.A.getText(), \"he456 world\");\n\t\t\tassert.equal(helper.clients.B.getText(), \"he456 world\");\n\t\t\tassert.equal(helper.clients.C.getText(), \"he456 world\");\n\n\t\t\thelper.logger.validate();\n\t\t},\n\t\texpectedText: \"he456 world\",\n\t\texpectedEventCount: 3,\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"6. A expand neither endpoint, B expand end\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\n\t\t\t// [2, 4]: before 2, after 4 => h e [l l o] _ w o r l d\n\t\t\thelper.obliterateRange(\"A\", { pos: 2, side: Side.Before }, { pos: 4, side: Side.After });\n\t\t\t// [2, 4 ): before 2, before 5 => h e [l l o )_ w o r l d\n\t\t\thelper.obliterateRange(\n\t\t\t\t\"B\",\n\t\t\t\t{ pos: 2, side: Side.Before },\n\t\t\t\t{ pos: 5, side: Side.Before },\n\t\t\t);\n\t\t\thelper.insertText(\"C\", 2, \"123\");\n\t\t\thelper.insertText(\"C\", 5, \"456\");\n\t\t\thelper.processAllOps();\n\n\t\t\tassert.equal(helper.clients.A.getText(), \"he123 world\");\n\t\t\tassert.equal(helper.clients.B.getText(), \"he123 world\");\n\t\t\tassert.equal(helper.clients.C.getText(), \"he123 world\");\n\n\t\t\thelper.logger.validate();\n\t\t},\n\t\texpectedText: \"he123 world\",\n\t\texpectedEventCount: 3,\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"obliterate.rangeExpansion.spec.js","sourceRoot":"","sources":["../../src/test/obliterate.rangeExpansion.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport { Side } from \"../sequencePlace.js\";\n\nimport { ReconnectTestHelper } from \"./reconnectHelper.js\";\n\nfunction itCorrectlyObliterates({\n\ttitle,\n\taction,\n\texpectedText,\n}: {\n\ttitle: string;\n\taction: (helper: ReconnectTestHelper) => void;\n\texpectedText: string;\n}): Mocha.Test {\n\treturn it(title, () => {\n\t\tconst events: number[] = [];\n\n\t\tconst helper = new ReconnectTestHelper({\n\t\t\tmergeTreeEnableSidedObliterate: true,\n\t\t});\n\t\thelper.clients.A.on(\"delta\", (opArgs, deltaArgs) => {\n\t\t\tevents.push(deltaArgs.operation);\n\t\t});\n\t\taction(helper);\n\t\thelper.processAllOps();\n\n\t\thelper.logger.validate({ baseText: expectedText });\n\t});\n}\nitCorrectlyObliterates.skip = ({\n\ttitle,\n}: {\n\ttitle: string;\n\taction: (helper: ReconnectTestHelper) => void;\n\texpectedText: string;\n}) => it.skip(title, () => {});\n\ndescribe(\"obliterate\", () => {\n\titCorrectlyObliterates({\n\t\ttitle: \"obliterate adjacent insert\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"|ABC>\");\n\t\t\thelper.processAllOps();\n\t\t\thelper.obliterateRange(\"A\", { pos: 0, side: Side.After }, { pos: 4, side: Side.Before });\n\t\t\t// not concurrent to A's obliterate - ops on the same client are never concurrent to one another\n\t\t\t// because they are all sequenced locally\n\t\t\thelper.insertText(\"A\", 1, \"AAA\");\n\t\t\thelper.obliterateRange(\"B\", { pos: 0, side: Side.After }, { pos: 4, side: Side.Before });\n\t\t\thelper.insertText(\"B\", 1, \"BBB\");\n\t\t},\n\t\texpectedText: \"|BBB>\",\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"does not obliterate non-adjacent insert\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\t\t\thelper.obliterateRange(\"A\", { pos: 2, side: Side.Before }, { pos: 4, side: Side.After });\n\t\t\t// do not obliterate the XYZ - outside the obliterated range without expansion\n\t\t\thelper.insertText(\"B\", 0, \"XYZ\");\n\t\t},\n\t\texpectedText: \"XYZhe world\",\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"obliterate, then insert at the end of the string\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\n\t\t\thelper.obliterateRange(\n\t\t\t\t\"A\",\n\t\t\t\t{ pos: 5, side: Side.Before },\n\t\t\t\t{ pos: 10, side: Side.After },\n\t\t\t);\n\t\t\thelper.insertText(\"B\", 10, \"123\");\n\t\t},\n\t\texpectedText: \"hello\",\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"insert, then obliterate at the end of the string\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\n\t\t\thelper.insertText(\"A\", 10, \"123\");\n\t\t\thelper.obliterateRange(\n\t\t\t\t\"B\",\n\t\t\t\t{ pos: 5, side: Side.Before },\n\t\t\t\t{ pos: 10, side: Side.After },\n\t\t\t);\n\t\t},\n\t\texpectedText: \"hello\",\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"obliterate, then insert at the end of the string\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\n\t\t\thelper.obliterateRange(\n\t\t\t\t\"A\",\n\t\t\t\t{ pos: 5, side: Side.Before },\n\t\t\t\t{ pos: 10, side: Side.After },\n\t\t\t);\n\t\t\thelper.insertText(\"B\", 10, \"123\");\n\t\t},\n\t\texpectedText: \"hello\",\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"insert, then obliterate at the end of the string\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\n\t\t\thelper.insertText(\"A\", 10, \"123\");\n\t\t\thelper.obliterateRange(\n\t\t\t\t\"B\",\n\t\t\t\t{ pos: 5, side: Side.Before },\n\t\t\t\t{ pos: 10, side: Side.After },\n\t\t\t);\n\t\t},\n\t\texpectedText: \"hello\",\n\t});\n\tdescribe(\"zero length\", () => {\n\t\t// TODO: #17785: Allow start and end to be used as obliteration range endpoints.\n\t\titCorrectlyObliterates.skip({\n\t\t\ttitle: \"zero length obliterate at the start of the string\",\n\t\t\taction: (helper) => {\n\t\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\t\thelper.processAllOps();\n\n\t\t\t\thelper.obliterateRange(\n\t\t\t\t\t\"A\",\n\t\t\t\t\t{ pos: -1, side: Side.After },\n\t\t\t\t\t{ pos: 0, side: Side.Before },\n\t\t\t\t);\n\t\t\t\thelper.insertText(\"B\", 0, \"more \");\n\t\t\t},\n\t\t\texpectedText: \"hello world\",\n\t\t});\n\t\titCorrectlyObliterates({\n\t\t\ttitle: \"zero length obliterate in the middle of the string\",\n\t\t\taction: (helper) => {\n\t\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\t\thelper.processAllOps();\n\n\t\t\t\thelper.obliterateRange(\n\t\t\t\t\t\"A\",\n\t\t\t\t\t{ pos: 0, side: Side.After },\n\t\t\t\t\t{ pos: 1, side: Side.Before },\n\t\t\t\t);\n\t\t\t\thelper.insertText(\"B\", 1, \"more \");\n\t\t\t},\n\t\t\texpectedText: \"hello world\",\n\t\t});\n\t\t// TODO: #17785: Allow start and end to be used as obliteration range endpoints.\n\t\titCorrectlyObliterates.skip({\n\t\t\ttitle: \"zero length obliterate at the end of the string\",\n\t\t\taction: (helper) => {\n\t\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\t\thelper.processAllOps();\n\n\t\t\t\thelper.obliterateRange(\n\t\t\t\t\t\"A\",\n\t\t\t\t\t{ pos: helper.clients.A.getLength() - 1, side: Side.After },\n\t\t\t\t\t{ pos: -1, side: Side.Before },\n\t\t\t\t);\n\t\t\t\thelper.insertText(\"B\", helper.clients.B.getLength(), \" more\");\n\t\t\t},\n\t\t\texpectedText: \"hello world\",\n\t\t});\n\t});\n});\n\ndescribe(\"overlapping edits\", () => {\n\titCorrectlyObliterates({\n\t\ttitle: \"overlapping obliterate and obliterate\",\n\t\taction: (helper) => {\n\t\t\tconst text = \"abcdef\";\n\n\t\t\thelper.insertText(\"A\", 0, text);\n\t\t\thelper.processAllOps();\n\t\t\thelper.obliterateRange(\n\t\t\t\t\"A\",\n\t\t\t\t{ pos: 0, side: Side.Before },\n\t\t\t\t{ pos: text.length - 1, side: Side.After },\n\t\t\t);\n\t\t\thelper.obliterateRange(\n\t\t\t\t\"B\",\n\t\t\t\t{ pos: 0, side: Side.Before },\n\t\t\t\t{ pos: text.length - 1, side: Side.After },\n\t\t\t);\n\t\t},\n\t\texpectedText: \"\",\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"adjacent obliterates\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\t\t\thelper.obliterateRange(\"A\", { pos: 2, side: Side.Before }, { pos: 3, side: Side.After });\n\t\t\thelper.obliterateRange(\"B\", { pos: 4, side: Side.Before }, { pos: 5, side: Side.After });\n\t\t},\n\t\texpectedText: \"heworld\",\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"remove within obliterated range\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\t\t\thelper.obliterateRange(\"A\", { pos: 2, side: Side.Before }, { pos: 5, side: Side.After });\n\t\t\thelper.removeRange(\"B\", 3, 4);\n\t\t},\n\t\texpectedText: \"heworld\",\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"obliterate, then remove adjacent to range start\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\t\t\thelper.obliterateRange(\"A\", { pos: 1, side: Side.After }, { pos: 5, side: Side.After });\n\t\t\thelper.removeRange(\"B\", 1, 2);\n\t\t},\n\t\texpectedText: \"hworld\",\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"obliterate, then remove adjacent to range end\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\t\t\thelper.obliterateRange(\"A\", { pos: 2, side: Side.Before }, { pos: 4, side: Side.After });\n\t\t\thelper.removeRange(\"B\", 4, 6);\n\t\t},\n\t\texpectedText: \"heworld\",\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"remove, then obliterate adjacent to range start\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\t\t\thelper.removeRange(\"A\", 4, 6);\n\t\t\thelper.obliterateRange(\"B\", { pos: 2, side: Side.Before }, { pos: 4, side: Side.After });\n\t\t},\n\t\texpectedText: \"heworld\",\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"remove, then obliterate adjacent to range end\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\t\t\thelper.removeRange(\"A\", 2, 4);\n\t\t\thelper.obliterateRange(\"B\", { pos: 3, side: Side.After }, { pos: 6, side: Side.After });\n\t\t},\n\t\texpectedText: \"heorld\",\n\t});\n});\n\ndescribe.skip(\"reconnect\", () => {\n\titCorrectlyObliterates({\n\t\ttitle: \"add text, disconnect, obliterate, reconnect, insert adjacent to obliterated range\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\t\t\thelper.disconnect([\"C\"]);\n\t\t\tconst op = helper.obliterateRangeLocal(\n\t\t\t\t\"C\",\n\t\t\t\t{ pos: 1, side: Side.After },\n\t\t\t\t{ pos: 4, side: Side.After },\n\t\t\t);\n\t\t\thelper.reconnect([\"C\"]);\n\t\t\thelper.submitDisconnectedOp(\"C\", op);\n\t\t\thelper.processAllOps();\n\t\t\t// inserting adjacent to the obliterated range start\n\t\t\thelper.insertText(\"A\", 2, \"123\");\n\t\t},\n\t\texpectedText: \"heo world\",\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"add text, disconnect, obliterate, insert adjacent to obliterated range, reconnect\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\t\t\thelper.disconnect([\"C\"]);\n\t\t\tconst op = helper.obliterateRangeLocal(\n\t\t\t\t\"C\",\n\t\t\t\t{ pos: 1, side: Side.After },\n\t\t\t\t{ pos: 4, side: Side.After },\n\t\t\t);\n\t\t\t// inserting adjacent to the obliterated range start\n\t\t\thelper.insertText(\"A\", 2, \"123\");\n\t\t\thelper.reconnect([\"C\"]);\n\t\t\thelper.submitDisconnectedOp(\"C\", op);\n\t\t},\n\t\texpectedText: \"heo world\",\n\t});\n});\n\ndescribe(\"sided obliterates\", () => {\n\t/**\n\t * All test cases will operate on the same numerical positions, but differ on their sidedness:\n\t * 1. A expand both endpoints, B expand neither endpoint = expand range on both endpoints\n\t * 2. A expand start endpoint, B expand end endpoint = either FWW/LWW\n\t * 3. A expand both endpoints, B expand start = expand range on both endpoints\n\t * 4. (similar to 3) A expand both endpoints, B expand end = expand range on both endpoints\n\t * 5. A expand neither endpoint, B expand start = expand start endpoint\n\t * 6. A expand neither endpoint, B expand end = expand end endpoint\n\t * before = 0, after = 1\n\t */\n\titCorrectlyObliterates({\n\t\ttitle: \"1. A expand both endpoints, B expand neither endpoint\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\t\t\t// in order to get the right behavior, the range needs to start after the previous position\n\t\t\t// if so, for a range ( 2, 4 ) itCorrectlyObliterates would need to be after 1 and before 5\n\t\t\t// h e( l l o )_ w o r l d\n\t\t\thelper.obliterateRange(\"A\", { pos: 1, side: Side.After }, { pos: 5, side: Side.Before });\n\t\t\t// [2, 4]: before 2, after 4 => h e [l l o] _ w o r l d\n\t\t\thelper.obliterateRange(\"B\", { pos: 2, side: Side.Before }, { pos: 4, side: Side.After });\n\t\t\thelper.insertText(\"C\", 2, \"123\");\n\t\t\thelper.insertText(\"C\", 8, \"456\");\n\t\t},\n\t\texpectedText: \"he world\",\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"2. A expand start endpoint, B expand end endpoint\",\n\t\taction: (helper) => {\n\t\t\t// currently this is the example from obliterate notation loop doc\n\t\t\t// TODO: translate this into same format as others\n\t\t\t// i think this gets difficult when the range to obliterate > 1 character\n\t\t\thelper.insertText(\"A\", 0, \"ABC\");\n\t\t\thelper.processAllOps();\n\t\t\thelper.insertText(\"A\", 2, \"D\");\n\t\t\t// ( 1]: after 0, after 1 => A( B] D C\n\t\t\thelper.obliterateRange(\"A\", { pos: 0, side: Side.After }, { pos: 1, side: Side.After });\n\t\t\t// included in the range -- should get obliterated\n\t\t\thelper.insertText(\"B\", 1, \"E\");\n\t\t\t// [1 ): before 1, before 2 => A E [B )C\n\t\t\thelper.obliterateRange(\n\t\t\t\t\"B\",\n\t\t\t\t{ pos: 1, side: Side.Before },\n\t\t\t\t{ pos: 3, side: Side.Before },\n\t\t\t);\n\t\t},\n\t\texpectedText: \"AC\",\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"3. A expand both endpoints, B expand start\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\n\t\t\t// ( 2, 4 ): after 1, before 5 => h e( l l o )_ w o r l d\n\t\t\thelper.obliterateRange(\"A\", { pos: 1, side: Side.After }, { pos: 5, side: Side.Before });\n\t\t\t// ( 2, 4]: after 1, after 4 => h e( l l o] _ w o r l d\n\t\t\thelper.obliterateRange(\"B\", { pos: 2, side: Side.After }, { pos: 4, side: Side.Before });\n\t\t\thelper.insertText(\"C\", 2, \"123\");\n\t\t\t// for this to be interesting, might want to insert at 5\n\t\t\thelper.insertText(\"C\", 4, \"456\");\n\t\t},\n\t\texpectedText: \"he world\",\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"4. A expand both endpoints, B expand end\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\n\t\t\t// ( 2, 4 ): after 1, before 5 => h e( l l o )_ w o r l d\n\t\t\thelper.obliterateRange(\"A\", { pos: 1, side: Side.After }, { pos: 5, side: Side.Before });\n\t\t\t// [2, 4 ): before 2, before 5 => h e [l l o )_ w o r l d\n\t\t\thelper.obliterateRange(\n\t\t\t\t\"B\",\n\t\t\t\t{ pos: 2, side: Side.Before },\n\t\t\t\t{ pos: 5, side: Side.Before },\n\t\t\t);\n\t\t\thelper.insertText(\"C\", 2, \"123\"); // he123llo world\n\t\t\t// for this to be interesting, might want to insert at 5\n\t\t\thelper.insertText(\"C\", 8, \"456\"); // he123llo456 world\n\t\t},\n\t\texpectedText: \"he world\",\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"5. A expand neither endpoint, B expand start\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\n\t\t\t// [2, 4]: before 2, after 4 => h e [l l o] _ w o r l d\n\t\t\thelper.obliterateRange(\"A\", { pos: 2, side: Side.Before }, { pos: 4, side: Side.After });\n\t\t\t// ( 2, 4]: after 1, after 4 => h e( l l o] _ w o r l d\n\t\t\thelper.obliterateRange(\"B\", { pos: 1, side: Side.After }, { pos: 4, side: Side.After });\n\n\t\t\thelper.insertText(\"C\", 2, \"123\"); // h e( 123 l l o] _ w o r l d\n\t\t\thelper.insertText(\"C\", 8, \"456\"); // h e( 123 l l o) 456 _ w o r l d\n\t\t\thelper.processAllOps();\n\n\t\t\tassert.equal(helper.clients.A.getText(), \"he456 world\");\n\t\t\tassert.equal(helper.clients.B.getText(), \"he456 world\");\n\t\t\tassert.equal(helper.clients.C.getText(), \"he456 world\");\n\n\t\t\thelper.logger.validate();\n\t\t},\n\t\texpectedText: \"he456 world\",\n\t});\n\titCorrectlyObliterates({\n\t\ttitle: \"6. A expand neither endpoint, B expand end\",\n\t\taction: (helper) => {\n\t\t\thelper.insertText(\"A\", 0, \"hello world\");\n\t\t\thelper.processAllOps();\n\n\t\t\t// [2, 4]: before 2, after 4 => h e [l l o] _ w o r l d\n\t\t\thelper.obliterateRange(\"A\", { pos: 2, side: Side.Before }, { pos: 4, side: Side.After });\n\t\t\t// [2, 4 ): before 2, before 5 => h e [l l o )_ w o r l d\n\t\t\thelper.obliterateRange(\n\t\t\t\t\"B\",\n\t\t\t\t{ pos: 2, side: Side.Before },\n\t\t\t\t{ pos: 5, side: Side.Before },\n\t\t\t);\n\n\t\t\thelper.insertText(\"C\", 2, \"123\");\n\t\t\thelper.insertText(\"C\", 8, \"456\");\n\n\t\t\thelper.processAllOps();\n\n\t\t\tassert.equal(helper.clients.A.getText(), \"he123 world\");\n\t\t\tassert.equal(helper.clients.B.getText(), \"he123 world\");\n\t\t\tassert.equal(helper.clients.C.getText(), \"he123 world\");\n\n\t\t\thelper.logger.validate();\n\t\t},\n\t\texpectedText: \"he123 world\",\n\t});\n});\n"]}
|
|
@@ -104,7 +104,7 @@ describe("obliterate", () => {
|
|
|
104
104
|
(0, testUtils_js_1.obliterateRange)({
|
|
105
105
|
mergeTree: client.mergeTree,
|
|
106
106
|
start: 5,
|
|
107
|
-
end:
|
|
107
|
+
end: client.getLength(),
|
|
108
108
|
refSeq,
|
|
109
109
|
clientId: remoteClientId,
|
|
110
110
|
seq: refSeq + 1,
|
|
@@ -149,7 +149,7 @@ describe("obliterate", () => {
|
|
|
149
149
|
});
|
|
150
150
|
describe("local obliterate with concurrent inserts", () => {
|
|
151
151
|
it("removes range when pending local obliterate op", () => {
|
|
152
|
-
client.obliterateRangeLocal(0,
|
|
152
|
+
client.obliterateRangeLocal(0, client.getLength());
|
|
153
153
|
(0, testUtils_js_1.insertText)({
|
|
154
154
|
mergeTree: client.mergeTree,
|
|
155
155
|
pos: 1,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"obliterate.spec.js","sourceRoot":"","sources":["../../src/test/obliterate.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport type { ObliterateInfo } from \"../mergeTreeNodes.js\";\nimport { MergeTreeDeltaType } from \"../ops.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { insertText, obliterateRange } from \"./testUtils.js\";\n\ndescribe(\"obliterate\", () => {\n\tlet client: TestClient;\n\tlet refSeq: number;\n\tconst localClientId = 17;\n\tconst remoteClientId = localClientId + 1;\n\n\tbeforeEach(() => {\n\t\tclient = new TestClient({\n\t\t\tmergeTreeEnableObliterate: true,\n\t\t});\n\t\tclient.startOrUpdateCollaboration(\"local\");\n\t\tfor (const char of \"hello world\") {\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(\n\t\t\t\t\tclient.insertTextLocal(client.getLength(), char),\n\t\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tassert.equal(client.getText(), \"hello world\");\n\t\trefSeq = client.getCurrentSeq();\n\t});\n\n\tit(\"removes text\", () => {\n\t\tclient.obliterateRangeLocal(0, client.getLength());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\n\tdescribe(\"concurrent obliterate and insert\", () => {\n\t\tit(\"removes text for obliterate then insert\", () => {\n\t\t\tobliterateRange({\n\t\t\t\tmergeTree: client.mergeTree,\n\t\t\t\tstart: 0,\n\t\t\t\tend: client.getLength(),\n\t\t\t\trefSeq,\n\t\t\t\tclientId: remoteClientId,\n\t\t\t\tseq: refSeq + 1,\n\t\t\t\toverwrite: false,\n\t\t\t\topArgs: undefined as never,\n\t\t\t});\n\t\t\tinsertText({\n\t\t\t\tmergeTree: client.mergeTree,\n\t\t\t\tpos: 1,\n\t\t\t\trefSeq,\n\t\t\t\tclientId: remoteClientId + 1,\n\t\t\t\tseq: refSeq + 2,\n\t\t\t\ttext: \"more \",\n\t\t\t\tprops: undefined,\n\t\t\t\topArgs: { op: { type: MergeTreeDeltaType.INSERT } },\n\t\t\t});\n\t\t\tassert.equal(client.getText(), \"\");\n\t\t});\n\t\tit(\"removes text for insert then obliterate when deleting entire string\", () => {\n\t\t\tinsertText({\n\t\t\t\tmergeTree: client.mergeTree,\n\t\t\t\tpos: 1,\n\t\t\t\trefSeq,\n\t\t\t\tclientId: remoteClientId + 1,\n\t\t\t\tseq: refSeq + 1,\n\t\t\t\ttext: \"more \",\n\t\t\t\tprops: undefined,\n\t\t\t\topArgs: { op: { type: MergeTreeDeltaType.INSERT } },\n\t\t\t});\n\t\t\tobliterateRange({\n\t\t\t\tmergeTree: client.mergeTree,\n\t\t\t\tstart: 0,\n\t\t\t\tend: \"hello world\".length,\n\t\t\t\trefSeq,\n\t\t\t\tclientId: remoteClientId,\n\t\t\t\tseq: refSeq + 2,\n\t\t\t\toverwrite: false,\n\t\t\t\topArgs: undefined as never,\n\t\t\t});\n\t\t\tassert.equal(client.getText(), \"\");\n\t\t});\n\t\tit(\"removes text for insert then obliterate\", () => {\n\t\t\tinsertText({\n\t\t\t\tmergeTree: client.mergeTree,\n\t\t\t\tpos: 5,\n\t\t\t\trefSeq,\n\t\t\t\tclientId: remoteClientId + 1,\n\t\t\t\tseq: refSeq + 1,\n\t\t\t\ttext: \"more \",\n\t\t\t\tprops: undefined,\n\t\t\t\topArgs: { op: { type: MergeTreeDeltaType.INSERT } },\n\t\t\t});\n\t\t\tobliterateRange({\n\t\t\t\tmergeTree: client.mergeTree,\n\t\t\t\tstart: 1,\n\t\t\t\tend: \"hello world\".length,\n\t\t\t\trefSeq,\n\t\t\t\tclientId: remoteClientId,\n\t\t\t\tseq: refSeq + 2,\n\t\t\t\toverwrite: false,\n\t\t\t\topArgs: undefined as never,\n\t\t\t});\n\t\t\tassert.equal(client.getText(), \"h\");\n\t\t});\n\t});\n\n\tdescribe(\"endpoint behavior\", () => {\n\t\tit(\"does not expand to include text inserted at start\", () => {\n\t\t\tobliterateRange({\n\t\t\t\tmergeTree: client.mergeTree,\n\t\t\t\tstart: 5,\n\t\t\t\tend: \"hello world\".length,\n\t\t\t\trefSeq,\n\t\t\t\tclientId: remoteClientId,\n\t\t\t\tseq: refSeq + 1,\n\t\t\t\toverwrite: false,\n\t\t\t\topArgs: undefined as never,\n\t\t\t});\n\t\t\tinsertText({\n\t\t\t\tmergeTree: client.mergeTree,\n\t\t\t\tpos: 5,\n\t\t\t\trefSeq,\n\t\t\t\tclientId: remoteClientId + 1,\n\t\t\t\tseq: refSeq + 2,\n\t\t\t\ttext: \"XXX\",\n\t\t\t\tprops: undefined,\n\t\t\t\topArgs: { op: { type: MergeTreeDeltaType.INSERT } },\n\t\t\t});\n\t\t\tassert.equal(client.getText(), \"helloXXX\");\n\t\t});\n\t\tit(\"does not expand to include text inserted at end\", () => {\n\t\t\tobliterateRange({\n\t\t\t\tmergeTree: client.mergeTree,\n\t\t\t\tstart: 0,\n\t\t\t\tend: \"hello\".length,\n\t\t\t\trefSeq,\n\t\t\t\tclientId: remoteClientId,\n\t\t\t\tseq: refSeq + 1,\n\t\t\t\toverwrite: false,\n\t\t\t\topArgs: undefined as never,\n\t\t\t});\n\t\t\tinsertText({\n\t\t\t\tmergeTree: client.mergeTree,\n\t\t\t\tpos: 5,\n\t\t\t\trefSeq,\n\t\t\t\tclientId: remoteClientId + 1,\n\t\t\t\tseq: refSeq + 2,\n\t\t\t\ttext: \"XXX\",\n\t\t\t\tprops: undefined,\n\t\t\t\topArgs: { op: { type: MergeTreeDeltaType.INSERT } },\n\t\t\t});\n\t\t\tassert.equal(client.getText(), \"XXX world\");\n\t\t});\n\t});\n\n\tdescribe(\"local obliterate with concurrent inserts\", () => {\n\t\tit(\"removes range when pending local obliterate op\", () => {\n\t\t\tclient.obliterateRangeLocal(0, \"hello world\".length);\n\t\t\tinsertText({\n\t\t\t\tmergeTree: client.mergeTree,\n\t\t\t\tpos: 1,\n\t\t\t\trefSeq,\n\t\t\t\tclientId: remoteClientId,\n\t\t\t\tseq: refSeq + 2,\n\t\t\t\ttext: \"XXX\",\n\t\t\t\tprops: undefined,\n\t\t\t\topArgs: { op: { type: MergeTreeDeltaType.INSERT } },\n\t\t\t});\n\t\t\tassert.equal(client.getText(), \"\");\n\t\t});\n\t});\n\n\tdescribe(\"local references\", () => {\n\t\tit(\"cleans up local references once the collab window advances enough\", () => {\n\t\t\tconst client2 = new TestClient({ mergeTreeEnableObliterate: true });\n\t\t\tclient2.startOrUpdateCollaboration(\"client2\");\n\n\t\t\tconst obliterateStart = 0;\n\t\t\tconst obliterateEnd = client.getLength();\n\t\t\tconst startSeg = client.getContainingSegment(obliterateStart);\n\t\t\tconst endSeg = client.getContainingSegment(obliterateEnd);\n\t\t\tobliterateRange({\n\t\t\t\tmergeTree: client.mergeTree,\n\t\t\t\tstart: obliterateStart,\n\t\t\t\tend: obliterateEnd,\n\t\t\t\trefSeq,\n\t\t\t\tclientId: remoteClientId,\n\t\t\t\tseq: refSeq + 1,\n\t\t\t\toverwrite: false,\n\t\t\t\topArgs: undefined as never,\n\t\t\t});\n\t\t\tinsertText({\n\t\t\t\tmergeTree: client.mergeTree,\n\t\t\t\tpos: 1,\n\t\t\t\trefSeq,\n\t\t\t\tclientId: remoteClientId + 1,\n\t\t\t\tseq: refSeq + 2,\n\t\t\t\ttext: \"more \",\n\t\t\t\tprops: undefined,\n\t\t\t\topArgs: { op: { type: MergeTreeDeltaType.INSERT } },\n\t\t\t});\n\t\t\tassert.equal(client.getText(), \"\");\n\n\t\t\tstartSeg.segment?.localRefs?.walkReferences((ref) => {\n\t\t\t\tconst oblProps = ref.properties?.obliterate as ObliterateInfo;\n\t\t\t\tassert(oblProps?.start !== undefined, \"start ref should NOT be removed\");\n\t\t\t});\n\t\t\tendSeg.segment?.localRefs?.walkReferences((ref) => {\n\t\t\t\tconst oblProps = ref.properties?.obliterate as ObliterateInfo;\n\t\t\t\tassert(oblProps?.end !== undefined, \"end ref should NOT be removed\");\n\t\t\t});\n\n\t\t\t// this will force Zamboni to run\n\t\t\tlet seq = refSeq;\n\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\tconst insert = client.makeOpMessage(\n\t\t\t\t\tclient.insertTextLocal(client.getLength(), i.toString()),\n\t\t\t\t\t++seq,\n\t\t\t\t);\n\t\t\t\tinsert.minimumSequenceNumber = seq - 1;\n\t\t\t\tclient.applyMsg(insert);\n\t\t\t\tclient2.applyMsg(insert);\n\t\t\t}\n\n\t\t\t// want to check that the start and end segment don't have the obliterate refs on them\n\t\t\tstartSeg.segment?.localRefs?.walkReferences((ref) => {\n\t\t\t\tconst oblProps = ref.properties?.obliterate as ObliterateInfo;\n\t\t\t\tassert(oblProps.start === undefined, \"start ref should be removed\");\n\t\t\t});\n\t\t\tendSeg.segment?.localRefs?.walkReferences((ref) => {\n\t\t\t\tconst oblProps = ref.properties?.obliterate as ObliterateInfo;\n\t\t\t\tassert(oblProps.end === undefined, \"end ref should be removed\");\n\t\t\t});\n\t\t});\n\t});\n});\n"]}
|
|
1
|
+
{"version":3,"file":"obliterate.spec.js","sourceRoot":"","sources":["../../src/test/obliterate.spec.ts"],"names":[],"mappings":"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","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation and contributors. All rights reserved.\n * Licensed under the MIT License.\n */\n\nimport { strict as assert } from \"node:assert\";\n\nimport type { ObliterateInfo } from \"../mergeTreeNodes.js\";\nimport { MergeTreeDeltaType } from \"../ops.js\";\n\nimport { TestClient } from \"./testClient.js\";\nimport { insertText, obliterateRange } from \"./testUtils.js\";\n\ndescribe(\"obliterate\", () => {\n\tlet client: TestClient;\n\tlet refSeq: number;\n\tconst localClientId = 17;\n\tconst remoteClientId = localClientId + 1;\n\n\tbeforeEach(() => {\n\t\tclient = new TestClient({\n\t\t\tmergeTreeEnableObliterate: true,\n\t\t});\n\t\tclient.startOrUpdateCollaboration(\"local\");\n\t\tfor (const char of \"hello world\") {\n\t\t\tclient.applyMsg(\n\t\t\t\tclient.makeOpMessage(\n\t\t\t\t\tclient.insertTextLocal(client.getLength(), char),\n\t\t\t\t\tclient.getCurrentSeq() + 1,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tassert.equal(client.getText(), \"hello world\");\n\t\trefSeq = client.getCurrentSeq();\n\t});\n\n\tit(\"removes text\", () => {\n\t\tclient.obliterateRangeLocal(0, client.getLength());\n\t\tassert.equal(client.getText(), \"\");\n\t});\n\n\tdescribe(\"concurrent obliterate and insert\", () => {\n\t\tit(\"removes text for obliterate then insert\", () => {\n\t\t\tobliterateRange({\n\t\t\t\tmergeTree: client.mergeTree,\n\t\t\t\tstart: 0,\n\t\t\t\tend: client.getLength(),\n\t\t\t\trefSeq,\n\t\t\t\tclientId: remoteClientId,\n\t\t\t\tseq: refSeq + 1,\n\t\t\t\toverwrite: false,\n\t\t\t\topArgs: undefined as never,\n\t\t\t});\n\t\t\tinsertText({\n\t\t\t\tmergeTree: client.mergeTree,\n\t\t\t\tpos: 1,\n\t\t\t\trefSeq,\n\t\t\t\tclientId: remoteClientId + 1,\n\t\t\t\tseq: refSeq + 2,\n\t\t\t\ttext: \"more \",\n\t\t\t\tprops: undefined,\n\t\t\t\topArgs: { op: { type: MergeTreeDeltaType.INSERT } },\n\t\t\t});\n\t\t\tassert.equal(client.getText(), \"\");\n\t\t});\n\t\tit(\"removes text for insert then obliterate when deleting entire string\", () => {\n\t\t\tinsertText({\n\t\t\t\tmergeTree: client.mergeTree,\n\t\t\t\tpos: 1,\n\t\t\t\trefSeq,\n\t\t\t\tclientId: remoteClientId + 1,\n\t\t\t\tseq: refSeq + 1,\n\t\t\t\ttext: \"more \",\n\t\t\t\tprops: undefined,\n\t\t\t\topArgs: { op: { type: MergeTreeDeltaType.INSERT } },\n\t\t\t});\n\t\t\tobliterateRange({\n\t\t\t\tmergeTree: client.mergeTree,\n\t\t\t\tstart: 0,\n\t\t\t\tend: \"hello world\".length,\n\t\t\t\trefSeq,\n\t\t\t\tclientId: remoteClientId,\n\t\t\t\tseq: refSeq + 2,\n\t\t\t\toverwrite: false,\n\t\t\t\topArgs: undefined as never,\n\t\t\t});\n\t\t\tassert.equal(client.getText(), \"\");\n\t\t});\n\t\tit(\"removes text for insert then obliterate\", () => {\n\t\t\tinsertText({\n\t\t\t\tmergeTree: client.mergeTree,\n\t\t\t\tpos: 5,\n\t\t\t\trefSeq,\n\t\t\t\tclientId: remoteClientId + 1,\n\t\t\t\tseq: refSeq + 1,\n\t\t\t\ttext: \"more \",\n\t\t\t\tprops: undefined,\n\t\t\t\topArgs: { op: { type: MergeTreeDeltaType.INSERT } },\n\t\t\t});\n\t\t\tobliterateRange({\n\t\t\t\tmergeTree: client.mergeTree,\n\t\t\t\tstart: 1,\n\t\t\t\tend: \"hello world\".length,\n\t\t\t\trefSeq,\n\t\t\t\tclientId: remoteClientId,\n\t\t\t\tseq: refSeq + 2,\n\t\t\t\toverwrite: false,\n\t\t\t\topArgs: undefined as never,\n\t\t\t});\n\t\t\tassert.equal(client.getText(), \"h\");\n\t\t});\n\t});\n\n\tdescribe(\"endpoint behavior\", () => {\n\t\tit(\"does not expand to include text inserted at start\", () => {\n\t\t\tobliterateRange({\n\t\t\t\tmergeTree: client.mergeTree,\n\t\t\t\tstart: 5,\n\t\t\t\tend: client.getLength(),\n\t\t\t\trefSeq,\n\t\t\t\tclientId: remoteClientId,\n\t\t\t\tseq: refSeq + 1,\n\t\t\t\toverwrite: false,\n\t\t\t\topArgs: undefined as never,\n\t\t\t});\n\t\t\tinsertText({\n\t\t\t\tmergeTree: client.mergeTree,\n\t\t\t\tpos: 5,\n\t\t\t\trefSeq,\n\t\t\t\tclientId: remoteClientId + 1,\n\t\t\t\tseq: refSeq + 2,\n\t\t\t\ttext: \"XXX\",\n\t\t\t\tprops: undefined,\n\t\t\t\topArgs: { op: { type: MergeTreeDeltaType.INSERT } },\n\t\t\t});\n\t\t\tassert.equal(client.getText(), \"helloXXX\");\n\t\t});\n\t\tit(\"does not expand to include text inserted at end\", () => {\n\t\t\tobliterateRange({\n\t\t\t\tmergeTree: client.mergeTree,\n\t\t\t\tstart: 0,\n\t\t\t\tend: \"hello\".length,\n\t\t\t\trefSeq,\n\t\t\t\tclientId: remoteClientId,\n\t\t\t\tseq: refSeq + 1,\n\t\t\t\toverwrite: false,\n\t\t\t\topArgs: undefined as never,\n\t\t\t});\n\t\t\tinsertText({\n\t\t\t\tmergeTree: client.mergeTree,\n\t\t\t\tpos: 5,\n\t\t\t\trefSeq,\n\t\t\t\tclientId: remoteClientId + 1,\n\t\t\t\tseq: refSeq + 2,\n\t\t\t\ttext: \"XXX\",\n\t\t\t\tprops: undefined,\n\t\t\t\topArgs: { op: { type: MergeTreeDeltaType.INSERT } },\n\t\t\t});\n\t\t\tassert.equal(client.getText(), \"XXX world\");\n\t\t});\n\t});\n\n\tdescribe(\"local obliterate with concurrent inserts\", () => {\n\t\tit(\"removes range when pending local obliterate op\", () => {\n\t\t\tclient.obliterateRangeLocal(0, client.getLength());\n\t\t\tinsertText({\n\t\t\t\tmergeTree: client.mergeTree,\n\t\t\t\tpos: 1,\n\t\t\t\trefSeq,\n\t\t\t\tclientId: remoteClientId,\n\t\t\t\tseq: refSeq + 2,\n\t\t\t\ttext: \"XXX\",\n\t\t\t\tprops: undefined,\n\t\t\t\topArgs: { op: { type: MergeTreeDeltaType.INSERT } },\n\t\t\t});\n\t\t\tassert.equal(client.getText(), \"\");\n\t\t});\n\t});\n\n\tdescribe(\"local references\", () => {\n\t\tit(\"cleans up local references once the collab window advances enough\", () => {\n\t\t\tconst client2 = new TestClient({ mergeTreeEnableObliterate: true });\n\t\t\tclient2.startOrUpdateCollaboration(\"client2\");\n\n\t\t\tconst obliterateStart = 0;\n\t\t\tconst obliterateEnd = client.getLength();\n\t\t\tconst startSeg = client.getContainingSegment(obliterateStart);\n\t\t\tconst endSeg = client.getContainingSegment(obliterateEnd);\n\t\t\tobliterateRange({\n\t\t\t\tmergeTree: client.mergeTree,\n\t\t\t\tstart: obliterateStart,\n\t\t\t\tend: obliterateEnd,\n\t\t\t\trefSeq,\n\t\t\t\tclientId: remoteClientId,\n\t\t\t\tseq: refSeq + 1,\n\t\t\t\toverwrite: false,\n\t\t\t\topArgs: undefined as never,\n\t\t\t});\n\t\t\tinsertText({\n\t\t\t\tmergeTree: client.mergeTree,\n\t\t\t\tpos: 1,\n\t\t\t\trefSeq,\n\t\t\t\tclientId: remoteClientId + 1,\n\t\t\t\tseq: refSeq + 2,\n\t\t\t\ttext: \"more \",\n\t\t\t\tprops: undefined,\n\t\t\t\topArgs: { op: { type: MergeTreeDeltaType.INSERT } },\n\t\t\t});\n\t\t\tassert.equal(client.getText(), \"\");\n\n\t\t\tstartSeg.segment?.localRefs?.walkReferences((ref) => {\n\t\t\t\tconst oblProps = ref.properties?.obliterate as ObliterateInfo;\n\t\t\t\tassert(oblProps?.start !== undefined, \"start ref should NOT be removed\");\n\t\t\t});\n\t\t\tendSeg.segment?.localRefs?.walkReferences((ref) => {\n\t\t\t\tconst oblProps = ref.properties?.obliterate as ObliterateInfo;\n\t\t\t\tassert(oblProps?.end !== undefined, \"end ref should NOT be removed\");\n\t\t\t});\n\n\t\t\t// this will force Zamboni to run\n\t\t\tlet seq = refSeq;\n\t\t\tfor (let i = 0; i < 5; i++) {\n\t\t\t\tconst insert = client.makeOpMessage(\n\t\t\t\t\tclient.insertTextLocal(client.getLength(), i.toString()),\n\t\t\t\t\t++seq,\n\t\t\t\t);\n\t\t\t\tinsert.minimumSequenceNumber = seq - 1;\n\t\t\t\tclient.applyMsg(insert);\n\t\t\t\tclient2.applyMsg(insert);\n\t\t\t}\n\n\t\t\t// want to check that the start and end segment don't have the obliterate refs on them\n\t\t\tstartSeg.segment?.localRefs?.walkReferences((ref) => {\n\t\t\t\tconst oblProps = ref.properties?.obliterate as ObliterateInfo;\n\t\t\t\tassert(oblProps.start === undefined, \"start ref should be removed\");\n\t\t\t});\n\t\t\tendSeg.segment?.localRefs?.walkReferences((ref) => {\n\t\t\t\tconst oblProps = ref.properties?.obliterate as ObliterateInfo;\n\t\t\t\tassert(oblProps.end === undefined, \"end ref should be removed\");\n\t\t\t});\n\t\t});\n\t});\n});\n"]}
|
|
@@ -3,23 +3,25 @@
|
|
|
3
3
|
* Licensed under the MIT License.
|
|
4
4
|
*/
|
|
5
5
|
import { ISequencedDocumentMessage } from "@fluidframework/driver-definitions/internal";
|
|
6
|
-
import { SegmentGroup, type SequencePlace } from "../index.js";
|
|
7
|
-
import { IMergeTreeDeltaOp, type IMergeTreeInsertMsg, type IMergeTreeObliterateMsg, type IMergeTreeRemoveMsg } from "../ops.js";
|
|
6
|
+
import { SegmentGroup, type IMergeTreeOptions, type InteriorSequencePlace, type SequencePlace } from "../index.js";
|
|
7
|
+
import { IMergeTreeDeltaOp, type IMergeTreeInsertMsg, type IMergeTreeObliterateMsg, type IMergeTreeObliterateSidedMsg, type IMergeTreeRemoveMsg } from "../ops.js";
|
|
8
|
+
import type { TestClient } from "./testClient.js";
|
|
8
9
|
import { TestClientLogger } from "./testClientLogger.js";
|
|
9
10
|
declare const ClientIds: readonly ["A", "B", "C", "D"];
|
|
10
11
|
type ClientName = (typeof ClientIds)[number];
|
|
11
12
|
export declare class ReconnectTestHelper {
|
|
12
|
-
clients: Record<
|
|
13
|
-
all:
|
|
13
|
+
clients: Record<ClientName, TestClient> & {
|
|
14
|
+
all: TestClient[];
|
|
14
15
|
};
|
|
15
16
|
idxFromName(name: ClientName): number;
|
|
16
17
|
logger: TestClientLogger;
|
|
17
18
|
ops: ISequencedDocumentMessage[];
|
|
18
19
|
perClientOps: ISequencedDocumentMessage[][];
|
|
19
20
|
seq: number;
|
|
21
|
+
constructor(options?: IMergeTreeOptions);
|
|
20
22
|
insertText(clientName: ClientName, pos: number, text: string): void;
|
|
21
23
|
removeRange(clientName: ClientName, start: number, end: number): void;
|
|
22
|
-
obliterateRange(clientName: ClientName, start:
|
|
24
|
+
obliterateRange(clientName: ClientName, start: number | InteriorSequencePlace, end: number | InteriorSequencePlace): void;
|
|
23
25
|
insertTextLocal(clientName: ClientName, pos: number, text: string): {
|
|
24
26
|
op: IMergeTreeInsertMsg;
|
|
25
27
|
seg: SegmentGroup;
|
|
@@ -31,7 +33,7 @@ export declare class ReconnectTestHelper {
|
|
|
31
33
|
refSeq: number;
|
|
32
34
|
};
|
|
33
35
|
obliterateRangeLocal(clientName: ClientName, start: SequencePlace, end: SequencePlace): {
|
|
34
|
-
op: IMergeTreeObliterateMsg;
|
|
36
|
+
op: IMergeTreeObliterateMsg | IMergeTreeObliterateSidedMsg;
|
|
35
37
|
seg: SegmentGroup;
|
|
36
38
|
refSeq: number;
|
|
37
39
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reconnectHelper.d.ts","sourceRoot":"","sources":["../../src/test/reconnectHelper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAC;AAExF,OAAO,
|
|
1
|
+
{"version":3,"file":"reconnectHelper.d.ts","sourceRoot":"","sources":["../../src/test/reconnectHelper.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAC;AAExF,OAAO,EACN,YAAY,EAEZ,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EACN,iBAAiB,EACjB,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,4BAA4B,EACjC,KAAK,mBAAmB,EACxB,MAAM,WAAW,CAAC;AAEnB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAA+B,MAAM,uBAAuB,CAAC;AAEtF,QAAA,MAAM,SAAS,+BAAgC,CAAC;AAChD,KAAK,UAAU,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7C,qBAAa,mBAAmB;IAC/B,OAAO,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG;QAAE,GAAG,EAAE,UAAU,EAAE,CAAA;KAAE,CAAC;IAEhE,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;IAIrC,MAAM,EAAE,gBAAgB,CAAC;IAEzB,GAAG,EAAE,yBAAyB,EAAE,CAAM;IACtC,YAAY,EAAE,yBAAyB,EAAE,EAAE,CAAC;IAE5C,GAAG,EAAE,MAAM,CAAK;gBAEG,OAAO,GAAE,iBAAsB;IAgB3C,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAKnE,WAAW,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAKrE,eAAe,CACrB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,MAAM,GAAG,qBAAqB,EACrC,GAAG,EAAE,MAAM,GAAG,qBAAqB,GACjC,IAAI;IAWA,eAAe,CACrB,UAAU,EAAE,UAAU,EACtB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACV;QACF,EAAE,EAAE,mBAAmB,CAAC;QACxB,GAAG,EAAE,YAAY,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;KACf;IASM,gBAAgB,CACtB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,GACT;QACF,EAAE,EAAE,mBAAmB,CAAC;QACxB,GAAG,EAAE,YAAY,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;KACf;IASM,oBAAoB,CAC1B,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,aAAa,GAChB;QACF,EAAE,EAAE,uBAAuB,GAAG,4BAA4B,CAAC;QAC3D,GAAG,EAAE,YAAY,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;KACf;IAoBM,UAAU,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,IAAI;IAY3C,aAAa,IAAI,IAAI;IAOrB,SAAS,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,IAAI;IAS1C,oBAAoB,CAC1B,UAAU,EAAE,UAAU,EACtB,EAAE,EAAE;QAAE,EAAE,EAAE,iBAAiB,CAAC;QAAC,GAAG,EAAE,YAAY,GAAG,YAAY,EAAE,CAAA;KAAE,GAC/D,IAAI;CAIP"}
|