@@ -187,6 +187,73 @@ func RunTestTreeConcurrency(testDesc string, t *testing.T, initialState json.Tre
187
187
}
188
188
}
189
189
190
+ func TestTreeConcurrencyEditEdit (t * testing.T ) {
191
+ // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
192
+ // <root> <p> a b c </p> <p> d e f </p> <p> g h i </p> </root>
193
+
194
+ initialState := json.TreeNode {
195
+ Type : "root" ,
196
+ Children : []json.TreeNode {
197
+ {Type : "p" , Children : []json.TreeNode {{Type : "text" , Value : "abc" }}},
198
+ {Type : "p" , Children : []json.TreeNode {{Type : "text" , Value : "def" }}},
199
+ {Type : "p" , Children : []json.TreeNode {{Type : "text" , Value : "ghi" }}},
200
+ },
201
+ }
202
+ initialXML := `<root><p>abc</p><p>def</p><p>ghi</p></root>`
203
+
204
+ textNode1 := & json.TreeNode {Type : "text" , Value : "A" }
205
+ textNode2 := & json.TreeNode {Type : "text" , Value : "B" }
206
+ elementNode1 := & json.TreeNode {Type : "b" , Children : []json.TreeNode {}}
207
+ elementNode2 := & json.TreeNode {Type : "i" , Children : []json.TreeNode {}}
208
+
209
+ ranges := []twoRangesType {
210
+ // intersect-element: <p>abc</p><p>def</p> - <p>def</p><p>ghi</p>
211
+ makeTwoRanges (0 , 5 , 10 , 5 , 10 , 15 , `intersect-element` ),
212
+ // intersect-text: ab - bc
213
+ makeTwoRanges (1 , 2 , 3 , 2 , 3 , 4 , `intersect-text` ),
214
+ // contain-element: <p>abc</p><p>def</p><p>ghi</p> - <p>def</p>
215
+ makeTwoRanges (0 , 5 , 15 , 5 , 5 , 10 , `contain-element` ),
216
+ // contain-text: abc - b
217
+ makeTwoRanges (1 , 2 , 4 , 2 , 2 , 3 , `contain-text` ),
218
+ // contain-mixed-type: <p>abc</p><p>def</p><p>ghi</p> - def
219
+ makeTwoRanges (0 , 5 , 15 , 6 , 7 , 9 , `contain-mixed-type` ),
220
+ // side-by-side-element: <p>abc</p> - <p>def</p>
221
+ makeTwoRanges (0 , 5 , 5 , 5 , 5 , 10 , `side-by-side-element` ),
222
+ // side-by-side-text: a - bc
223
+ makeTwoRanges (1 , 1 , 2 , 2 , 3 , 4 , `side-by-side-text` ),
224
+ // equal-text: abc - abc
225
+ makeTwoRanges (1 , 2 , 4 , 1 , 2 , 4 , `equal-text` ),
226
+ // equal-element: <p>abc</p><p>def</p> - <p>abc</p><p>def</p>
227
+ makeTwoRanges (0 , 5 , 10 , 0 , 5 , 10 , `equal-element` ),
228
+ }
229
+
230
+ editOperations1 := []operationInterface {
231
+ editOperationType {RangeFront , EditUpdate , textNode1 , 0 , `insertTextFront` },
232
+ editOperationType {RangeMiddle , EditUpdate , textNode1 , 0 , `insertTextMiddle` },
233
+ editOperationType {RangeBack , EditUpdate , textNode1 , 0 , `insertTextBack` },
234
+ editOperationType {RangeAll , EditUpdate , textNode1 , 0 , `changeText` },
235
+ editOperationType {RangeFront , EditUpdate , elementNode1 , 0 , `insertElementFront` },
236
+ editOperationType {RangeMiddle , EditUpdate , elementNode1 , 0 , `insertElementMiddle` },
237
+ editOperationType {RangeBack , EditUpdate , elementNode1 , 0 , `insertElementBack` },
238
+ editOperationType {RangeAll , EditUpdate , elementNode1 , 0 , `changeElement` },
239
+ editOperationType {RangeAll , EditUpdate , nil , 0 , `erase` },
240
+ }
241
+
242
+ editOperations2 := []operationInterface {
243
+ editOperationType {RangeFront , EditUpdate , textNode2 , 0 , `insertTextFront` },
244
+ editOperationType {RangeMiddle , EditUpdate , textNode2 , 0 , `insertTextMiddle` },
245
+ editOperationType {RangeBack , EditUpdate , textNode2 , 0 , `insertTextBack` },
246
+ editOperationType {RangeAll , EditUpdate , textNode2 , 0 , `changeText` },
247
+ editOperationType {RangeFront , EditUpdate , elementNode2 , 0 , `insertElementFront` },
248
+ editOperationType {RangeMiddle , EditUpdate , elementNode2 , 0 , `insertElementMiddle` },
249
+ editOperationType {RangeBack , EditUpdate , elementNode2 , 0 , `insertElementBack` },
250
+ editOperationType {RangeAll , EditUpdate , elementNode2 , 0 , `changeElement` },
251
+ editOperationType {RangeAll , EditUpdate , nil , 0 , `erase` },
252
+ }
253
+
254
+ RunTestTreeConcurrency ("concurrently-edit-edit-test" , t , initialState , initialXML , ranges , editOperations1 , editOperations2 )
255
+ }
256
+
190
257
func TestTreeConcurrencyStyleStyle (t * testing.T ) {
191
258
// 0 1 2 3 4 5 6 7 8 9
192
259
// <root> <p> a </p> <p> b </p> <p> c </p> </root>
@@ -205,10 +272,14 @@ func TestTreeConcurrencyStyleStyle(t *testing.T) {
205
272
initialXML := `<root><p>a</p><p>b</p><p>c</p></root>`
206
273
207
274
ranges := []twoRangesType {
208
- makeTwoRanges (3 , - 1 , 6 , 3 , - 1 , 6 , `equal` ), // (3, 6) - (3, 6)
209
- makeTwoRanges (0 , - 1 , 9 , 3 , - 1 , 6 , `contain` ), // (0, 9) - (3, 6)
210
- makeTwoRanges (0 , - 1 , 6 , 3 , - 1 , 9 , `intersect` ), // (0, 6) - (3, 9)
211
- makeTwoRanges (0 , - 1 , 3 , 3 , - 1 , 6 , `side-by-side` ), // (0, 3) - (3, 6)
275
+ // equal: <p>b</p> - <p>b</p>
276
+ makeTwoRanges (3 , - 1 , 6 , 3 , - 1 , 6 , `equal` ),
277
+ // contain: <p>a</p><p>b</p><p>c</p> - <p>b</p>
278
+ makeTwoRanges (0 , - 1 , 9 , 3 , - 1 , 6 , `contain` ),
279
+ // intersect: <p>a</p><p>b</p> - <p>b</p><p>c</p>
280
+ makeTwoRanges (0 , - 1 , 6 , 3 , - 1 , 9 , `intersect` ),
281
+ // side-by-side: <p>a</p> - <p>b</p>
282
+ makeTwoRanges (0 , - 1 , 3 , 3 , - 1 , 6 , `side-by-side` ),
212
283
}
213
284
214
285
styleOperations := []operationInterface {
@@ -243,12 +314,18 @@ func TestTreeConcurrencyEditStyle(t *testing.T) {
243
314
content := & json.TreeNode {Type : "p" , Attributes : map [string ]string {"italic" : "true" }, Children : []json.TreeNode {{Type : "text" , Value : `d` }}}
244
315
245
316
ranges := []twoRangesType {
246
- makeTwoRanges (3 , 3 , 6 , 3 , - 1 , 6 , `equal` ), // (3, 6) - (3, 6)
247
- makeTwoRanges (0 , 3 , 9 , 3 , - 1 , 6 , `A contains B` ), // (0, 9) - (3, 6)
248
- makeTwoRanges (3 , 3 , 6 , 0 , - 1 , 9 , `B contains A` ), // (0, 9) - (3, 6)
249
- makeTwoRanges (0 , 3 , 6 , 3 , - 1 , 9 , `intersect` ), // (0, 6) - (3, 9)
250
- makeTwoRanges (0 , 3 , 3 , 3 , - 1 , 6 , `A -> B` ), // (0, 3) - (3, 6)
251
- makeTwoRanges (3 , 3 , 6 , 0 , - 1 , 3 , `B -> A` ), // (0, 3) - (3, 6)
317
+ // equal: <p>b</p> - <p>b</p>
318
+ makeTwoRanges (3 , 3 , 6 , 3 , - 1 , 6 , `equal` ),
319
+ // A contains B: <p>a</p><p>b</p><p>c</p> - <p>b</p>
320
+ makeTwoRanges (0 , 3 , 9 , 3 , - 1 , 6 , `A contains B` ),
321
+ // B contains A: <p>b</p> - <p>a</p><p>b</p><p>c</p>
322
+ makeTwoRanges (3 , 3 , 6 , 0 , - 1 , 9 , `B contains A` ),
323
+ // intersect: <p>a</p><p>b</p> - <p>b</p><p>c</p>
324
+ makeTwoRanges (0 , 3 , 6 , 3 , - 1 , 9 , `intersect` ),
325
+ // A -> B: <p>a</p> - <p>b</p>
326
+ makeTwoRanges (0 , 3 , 3 , 3 , - 1 , 6 , `A -> B` ),
327
+ // B -> A: <p>b</p> - <p>a</p>
328
+ makeTwoRanges (3 , 3 , 6 , 0 , - 1 , 3 , `B -> A` ),
252
329
}
253
330
254
331
editOperations := []operationInterface {
0 commit comments