easy-richtextarea 4.0.3 → 4.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/README.md +0 -8
  2. package/example.js +1535 -1039
  3. package/lib/browser.js +9 -5
  4. package/lib/constants.js +13 -4
  5. package/lib/contentCompare.js +34 -0
  6. package/lib/example/richTextarea.js +2 -2
  7. package/lib/example/view.js +18 -9
  8. package/lib/keyCodes.js +13 -0
  9. package/lib/main.js +9 -5
  10. package/lib/operation/delete.js +101 -52
  11. package/lib/operation/empty.js +21 -6
  12. package/lib/operation/insert.js +78 -31
  13. package/lib/operations/fromJSON.js +4 -4
  14. package/lib/operations/generate.js +3 -3
  15. package/lib/richTextarea.js +258 -153
  16. package/lib/selection.js +55 -13
  17. package/lib/transform/content.js +19 -0
  18. package/lib/{operations/transform.js → transform/operations.js} +3 -7
  19. package/lib/transform/selection.js +19 -0
  20. package/lib/types.js +13 -13
  21. package/lib/undoBuffer.js +140 -0
  22. package/package.json +3 -2
  23. package/src/browser.js +3 -3
  24. package/src/constants.js +1 -0
  25. package/src/contentCompare.js +34 -0
  26. package/src/example/richTextarea.js +11 -9
  27. package/src/example/view.js +28 -10
  28. package/src/keyCodes.js +3 -0
  29. package/src/main.js +3 -2
  30. package/src/operation/delete.js +135 -58
  31. package/src/operation/empty.js +19 -14
  32. package/src/operation/insert.js +97 -39
  33. package/src/operations/fromJSON.js +4 -4
  34. package/src/operations/generate.js +8 -4
  35. package/src/richTextarea.js +343 -181
  36. package/src/selection.js +53 -9
  37. package/src/transform/content.js +11 -0
  38. package/src/{operations/transform.js → transform/operations.js} +3 -3
  39. package/src/transform/selection.js +11 -0
  40. package/src/types.js +6 -6
  41. package/src/undoBuffer.js +105 -0
  42. package/test/content/transform.js +9 -11
  43. package/test/helpers.js +27 -21
  44. package/test/operation/delete.js +187 -147
  45. package/test/operation/empty.js +3 -5
  46. package/test/operation/insert.js +134 -118
  47. package/test/operations/generate.js +19 -22
  48. package/test/operations/transform.js +37 -98
  49. package/lib/content/transform.js +0 -17
  50. package/lib/stringCompare.js +0 -33
  51. package/src/content/transform.js +0 -5
  52. package/src/stringCompare.js +0 -33
@@ -4,227 +4,267 @@ const { assert } = require("chai"),
4
4
  { arrayUtilities } = require("necessary"),
5
5
  { EmptyOperation, DeleteOperation, InsertOperation } = require("../../lib/main"); ///
6
6
 
7
- const helpers = require("../helpers");
8
-
9
7
  const { first } = arrayUtilities;
10
8
 
11
9
  describe("DeleteOperation", () => {
12
10
  describe("transform", () => {
13
- it("transforms an insert operation at position 2 to position 1", () => {
14
- const deleteOperation1 = DeleteOperation.fromLengthAndPosition(2, 1),
15
- insertOperation2 = InsertOperation.fromStringAndPosition("b", 2),
16
- transformedOperations = deleteOperation1.transformOperation(insertOperation2);
11
+ it("leaves an empty operation intact", () => {
12
+ const deleteOperation1 = DeleteOperation.fromContentAndPosition("juiHYGrvc", 6),
13
+ emptyOperation2 = EmptyOperation.fromNothing(),
14
+ transformedOperations = deleteOperation1.transformOperation(emptyOperation2);
17
15
 
18
16
  assert.lengthOf(transformedOperations, 1);
19
17
 
20
18
  const firstTransformedOperation = first(transformedOperations),
21
- transformedOperation = firstTransformedOperation, ///
22
- transformedOperationJSON = transformedOperation.toJSON(),
23
- expectedTransformedOperation = InsertOperation.fromStringAndPosition("b", 1),
24
- expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
19
+ transformedOperation = firstTransformedOperation, ///
20
+ transformedOperationJSON = transformedOperation.toJSON(),
21
+ expectedTransformedOperation = emptyOperation2.clone(),
22
+ expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
25
23
 
26
24
  assert.deepEqual(transformedOperationJSON, expectedTransformedOperationJSON)
27
25
  });
28
26
 
29
- it("transforms a delete operation of length 1 at position 2 to an empty operation", () => {
30
- const deleteOperation1 = DeleteOperation.fromLengthAndPosition(2, 1),
31
- deleteOperation2 = DeleteOperation.fromLengthAndPosition(1, 2),
32
- transformedOperations = deleteOperation1.transformOperation(deleteOperation2);
27
+ describe("completely to the left of an insert", () => {
28
+ it("move the insert left by its own length", () => {
29
+ const deleteOperation1 = DeleteOperation.fromContentAndPosition("dkjyBH", 1),
30
+ insertOperation2 = InsertOperation.fromContentAndPosition("grFTd", 10),
31
+ transformedOperations = deleteOperation1.transformOperation(insertOperation2);
33
32
 
34
- assert.lengthOf(transformedOperations, 1);
33
+ assert.lengthOf(transformedOperations, 1);
35
34
 
36
- const firstTransformedOperation = first(transformedOperations),
37
- transformedOperation = firstTransformedOperation, ///
38
- transformedOperationJSON = transformedOperation.toJSON(),
39
- expectedTransformedOperation = EmptyOperation.fromNothing(),
40
- expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
41
-
42
- assert.deepEqual(transformedOperationJSON, expectedTransformedOperationJSON)
35
+ const firstTransformedOperation = first(transformedOperations),
36
+ transformedOperation = firstTransformedOperation, ///
37
+ transformedOperationJSON = transformedOperation.toJSON(),
38
+ expectedTransformedOperation = InsertOperation.fromContentAndPosition("grFTd", 4),
39
+ expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
40
+
41
+ assert.deepEqual(transformedOperationJSON, expectedTransformedOperationJSON)
42
+ });
43
43
  });
44
44
 
45
- it("transforms a delete operation of length 2 at position 2 to a delete operation of length 1 at position 1", () => {
46
- const deleteOperation1 = DeleteOperation.fromLengthAndPosition(2, 1),
47
- deleteOperation2 = DeleteOperation.fromLengthAndPosition(2, 2),
48
- transformedOperations = deleteOperation1.transformOperation(deleteOperation2);
45
+ describe("partially overlaps an insert on the left", () => {
46
+ it("moves the insert left by its own position", () => {
47
+ const deleteOperation1 = DeleteOperation.fromContentAndPosition("bgRDTh", 2),
48
+ insertOperation2 = InsertOperation.fromContentAndPosition("zn76g", 4),
49
+ transformedOperations = deleteOperation1.transformOperation(insertOperation2);
49
50
 
50
- assert.lengthOf(transformedOperations, 1);
51
+ assert.lengthOf(transformedOperations, 1);
51
52
 
52
- const firstTransformedOperation = first(transformedOperations),
53
- transformedOperation = firstTransformedOperation, ///
54
- transformedOperationJSON = transformedOperation.toJSON(),
55
- expectedTransformedOperation = DeleteOperation.fromLengthAndPosition(1, 1),
56
- expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
53
+ const firstTransformedOperation = first(transformedOperations),
54
+ transformedOperation = firstTransformedOperation, ///
55
+ transformedOperationJSON = transformedOperation.toJSON(),
56
+ expectedTransformedOperation = InsertOperation.fromContentAndPosition("zn76g", 2),
57
+ expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
57
58
 
58
- assert.deepEqual(transformedOperationJSON, expectedTransformedOperationJSON)
59
+ assert.deepEqual(transformedOperationJSON, expectedTransformedOperationJSON)
60
+ });
59
61
  });
60
62
 
61
- it("transforms an insert operation at position 0, leaving it in the same position", () => {
62
- const deleteOperation1 = DeleteOperation.fromLengthAndPosition(1, 1),
63
- insertOperation2 = InsertOperation.fromStringAndPosition("b", 0),
64
- transformedOperations = deleteOperation1.transformOperation(insertOperation2);
63
+ describe("completely overlaps an insert", () => {
64
+ it("moves the insert left by its own position", () => {
65
+ const deleteOperation1 = DeleteOperation.fromContentAndPosition("bgRjhgtFFGHRTDTh", 2),
66
+ insertOperation2 = InsertOperation.fromContentAndPosition("zn76g", 4),
67
+ transformedOperations = deleteOperation1.transformOperation(insertOperation2);
65
68
 
66
- assert.lengthOf(transformedOperations, 1);
69
+ assert.lengthOf(transformedOperations, 1);
67
70
 
68
- const firstTransformedOperation = first(transformedOperations),
69
- transformedOperation = firstTransformedOperation, ///
70
- transformedOperationJSON = transformedOperation.toJSON(),
71
- expectedTransformedOperation = insertOperation2.clone(),
72
- expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
71
+ const firstTransformedOperation = first(transformedOperations),
72
+ transformedOperation = firstTransformedOperation, ///
73
+ transformedOperationJSON = transformedOperation.toJSON(),
74
+ expectedTransformedOperation = InsertOperation.fromContentAndPosition("zn76g", 2),
75
+ expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
73
76
 
74
- assert.deepEqual(transformedOperationJSON, expectedTransformedOperationJSON)
77
+ assert.deepEqual(transformedOperationJSON, expectedTransformedOperationJSON)
78
+ });
75
79
  });
76
80
 
77
- it("transforms an insert operation at position 1, leaving it in the same position", () => {
78
- const deleteOperation1 = DeleteOperation.fromLengthAndPosition(1, 1),
79
- insertOperation2 = InsertOperation.fromStringAndPosition("b", 1),
80
- transformedOperations = deleteOperation1.transformOperation(insertOperation2);
81
+ describe("overlaps an insert on the right", () => {
82
+ it("leaves the insert intact", () => {
83
+ const deleteOperation1 = DeleteOperation.fromContentAndPosition("jhuGTRRde2kjU", 6),
84
+ insertOperation2 = InsertOperation.fromContentAndPosition("znds76g", 4),
85
+ transformedOperations = deleteOperation1.transformOperation(insertOperation2);
81
86
 
82
- assert.lengthOf(transformedOperations, 1);
87
+ assert.lengthOf(transformedOperations, 1);
83
88
 
84
- const firstTransformedOperation = first(transformedOperations),
85
- transformedOperation = firstTransformedOperation, ///
86
- transformedOperationJSON = transformedOperation.toJSON(),
87
- expectedTransformedOperation = insertOperation2.clone(),
88
- expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
89
+ const firstTransformedOperation = first(transformedOperations),
90
+ transformedOperation = firstTransformedOperation, ///
91
+ transformedOperationJSON = transformedOperation.toJSON(),
92
+ expectedTransformedOperation = InsertOperation.fromContentAndPosition("znds76g", 4),
93
+ expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
89
94
 
90
- assert.deepEqual(transformedOperationJSON, expectedTransformedOperationJSON)
95
+ assert.deepEqual(transformedOperationJSON, expectedTransformedOperationJSON)
96
+ });
91
97
  });
92
98
 
93
- it("transforms an insert operation at position 2 to position 1", () => {
94
- const deleteOperation1 = DeleteOperation.fromLengthAndPosition(1, 1),
95
- insertOperation2 = InsertOperation.fromStringAndPosition("b", 2),
96
- transformedOperations = deleteOperation1.transformOperation(insertOperation2);
99
+ describe("is overlapped by an insert", () => {
100
+ it("leaves the insert intact", () => {
101
+ const deleteOperation1 = DeleteOperation.fromContentAndPosition("juiyd", 6),
102
+ insertOperation2 = InsertOperation.fromContentAndPosition("zndLKo76g", 2),
103
+ transformedOperations = deleteOperation1.transformOperation(insertOperation2);
97
104
 
98
- assert.lengthOf(transformedOperations, 1);
105
+ assert.lengthOf(transformedOperations, 1);
99
106
 
100
- const firstTransformedOperation = first(transformedOperations),
101
- transformedOperation = firstTransformedOperation, ///
102
- transformedOperationJSON = transformedOperation.toJSON(),
103
- expectedTransformedOperation = InsertOperation.fromStringAndPosition("b", 1),
104
- expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
107
+ const firstTransformedOperation = first(transformedOperations),
108
+ transformedOperation = firstTransformedOperation, ///
109
+ transformedOperationJSON = transformedOperation.toJSON(),
110
+ expectedTransformedOperation = InsertOperation.fromContentAndPosition("zndLKo76g", 2),
111
+ expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
105
112
 
106
- assert.deepEqual(transformedOperationJSON, expectedTransformedOperationJSON)
113
+ assert.deepEqual(transformedOperationJSON, expectedTransformedOperationJSON)
114
+ });
107
115
  });
108
116
 
109
- it("transforms an empty operation, leaving it the same", () => {
110
- const deleteOperation1 = DeleteOperation.fromLengthAndPosition(1, 1),
111
- emptyOperation2 = EmptyOperation.fromNothing(),
112
- transformedOperations = deleteOperation1.transformOperation(emptyOperation2);
117
+ describe("completely to the left of another delete", () => {
118
+ it("moves the other delete to the left by its own length", () => {
119
+ const deleteOperation1 = DeleteOperation.fromContentAndPosition("juhtyb", 2),
120
+ deleteOperation2 = DeleteOperation.fromContentAndPosition("xhTRF43X", 10),
121
+ transformedOperations = deleteOperation1.transformOperation(deleteOperation2);
113
122
 
114
- assert.lengthOf(transformedOperations, 1);
123
+ assert.lengthOf(transformedOperations, 1);
115
124
 
116
- const firstTransformedOperation = first(transformedOperations),
117
- transformedOperation = firstTransformedOperation, ///
118
- transformedOperationJSON = transformedOperation.toJSON(),
119
- expectedTransformedOperation = emptyOperation2.clone(),
120
- expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
125
+ const firstTransformedOperation = first(transformedOperations),
126
+ transformedOperation = firstTransformedOperation, ///
127
+ transformedOperationJSON = transformedOperation.toJSON(),
128
+ expectedTransformedOperation = DeleteOperation.fromContentAndPosition("xhTRF43X", 4),
129
+ expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
121
130
 
122
- assert.deepEqual(transformedOperationJSON, expectedTransformedOperationJSON)
131
+ assert.deepEqual(transformedOperationJSON, expectedTransformedOperationJSON)
132
+ });
123
133
  });
124
134
 
125
- it("transforms a delete operation of length 1 at position 0, leaving it the same position", () => {
126
- const deleteOperation1 = DeleteOperation.fromLengthAndPosition(1, 1),
127
- deleteOperation2 = DeleteOperation.fromLengthAndPosition(1, 0),
128
- transformedOperations = deleteOperation1.transformOperation(deleteOperation2);
135
+ describe("partially overlaps another delete on the left", () => {
136
+ it("moves the other delete to the left to its own position and truncates it on the left", () => {
137
+ const deleteOperation1 = DeleteOperation.fromContentAndPosition("jkimmijhdX", 2),
138
+ deleteOperation2 = DeleteOperation.fromContentAndPosition("mijhdXkAVB", 6),
139
+ transformedOperations = deleteOperation1.transformOperation(deleteOperation2);
129
140
 
130
- assert.lengthOf(transformedOperations, 1);
141
+ assert.lengthOf(transformedOperations, 1);
131
142
 
132
- const firstTransformedOperation = first(transformedOperations),
133
- transformedOperation = firstTransformedOperation, ///
134
- transformedOperationJSON = transformedOperation.toJSON(),
135
- expectedTransformedOperation = deleteOperation2.clone(),
136
- expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
143
+ const firstTransformedOperation = first(transformedOperations),
144
+ transformedOperation = firstTransformedOperation, ///
145
+ transformedOperationJSON = transformedOperation.toJSON(),
146
+ expectedTransformedOperation = DeleteOperation.fromContentAndPosition("kAVB", 2),
147
+ expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
137
148
 
138
- assert.deepEqual(transformedOperationJSON, expectedTransformedOperationJSON)
149
+ assert.deepEqual(transformedOperationJSON, expectedTransformedOperationJSON)
150
+ });
139
151
  });
140
152
 
141
- it("transforms a delete operation of length 2 at position 0 to a delete operation of length 1 at position 0", () => {
142
- const deleteOperation1 = DeleteOperation.fromLengthAndPosition(1, 1),
143
- deleteOperation2 = DeleteOperation.fromLengthAndPosition(2, 0),
144
- transformedOperations = deleteOperation1.transformOperation(deleteOperation2);
153
+ describe("completely overlaps another delete on the left", () => {
154
+ it("transforms it to an empty operation", () => {
155
+ const deleteOperation1 = DeleteOperation.fromContentAndPosition("jkimmijhdX", 2),
156
+ deleteOperation2 = DeleteOperation.fromContentAndPosition("immi", 4),
157
+ transformedOperations = deleteOperation1.transformOperation(deleteOperation2);
145
158
 
146
- assert.lengthOf(transformedOperations, 1);
159
+ assert.lengthOf(transformedOperations, 1);
147
160
 
148
- const firstTransformedOperation = first(transformedOperations),
149
- transformedOperation = firstTransformedOperation, ///
150
- transformedOperationJSON = transformedOperation.toJSON(),
151
- expectedTransformedOperation = DeleteOperation.fromLengthAndPosition(1, 0),
152
- expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
161
+ const firstTransformedOperation = first(transformedOperations),
162
+ transformedOperation = firstTransformedOperation, ///
163
+ transformedOperationJSON = transformedOperation.toJSON(),
164
+ expectedTransformedOperation = EmptyOperation.fromNothing(),
165
+ expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
153
166
 
154
- assert.deepEqual(transformedOperationJSON, expectedTransformedOperationJSON)
167
+ assert.deepEqual(transformedOperationJSON, expectedTransformedOperationJSON)
168
+ });
155
169
  });
156
170
 
157
- it("transforms a delete operation of length 3 at position 0 to a delete operation of length 2 at position 0", () => {
158
- const deleteOperation1 = DeleteOperation.fromLengthAndPosition(1, 1),
159
- deleteOperation2 = DeleteOperation.fromLengthAndPosition(3, 0),
160
- transformedOperations = deleteOperation1.transformOperation(deleteOperation2);
171
+ describe("is completely overlapped by another delete", () => {
172
+ it("splites the ohter delete", () => {
173
+ const deleteOperation1 = DeleteOperation.fromContentAndPosition("immi", 4),
174
+ deleteOperation2 = DeleteOperation.fromContentAndPosition("jkimmijhdX", 2),
175
+ transformedOperations = deleteOperation1.transformOperation(deleteOperation2);
161
176
 
162
- assert.lengthOf(transformedOperations, 1);
177
+ assert.lengthOf(transformedOperations, 1);
163
178
 
164
- const firstTransformedOperation = first(transformedOperations),
165
- transformedOperation = firstTransformedOperation, ///
166
- transformedOperationJSON = transformedOperation.toJSON(),
167
- expectedTransformedOperation = DeleteOperation.fromLengthAndPosition(2, 0),
168
- expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
179
+ const firstTransformedOperation = first(transformedOperations),
180
+ transformedOperation = firstTransformedOperation, ///
181
+ transformedOperationJSON = transformedOperation.toJSON(),
182
+ expectedTransformedOperation = DeleteOperation.fromContentAndPosition("jkjhdX", 2),
183
+ expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
169
184
 
170
- assert.deepEqual(transformedOperationJSON, expectedTransformedOperationJSON)
185
+ assert.deepEqual(transformedOperationJSON, expectedTransformedOperationJSON)
186
+ });
171
187
  });
172
188
 
173
- it("transforms a delete operation of length 1 at position 1 to an empty operation", () => {
174
- const deleteOperation1 = DeleteOperation.fromLengthAndPosition(1, 1),
175
- deleteOperation2 = DeleteOperation.fromLengthAndPosition(1, 1),
176
- transformedOperations = deleteOperation1.transformOperation(deleteOperation2);
189
+ describe("overlaps another delete on the right", () => {
190
+ it("truncates the other delete on the right", () => {
191
+ const deleteOperation1 = DeleteOperation.fromContentAndPosition("GtfrdIKJU", 6),
192
+ deleteOperation2 = DeleteOperation.fromContentAndPosition("juHYGtfrd", 2),
193
+ transformedOperations = deleteOperation1.transformOperation(deleteOperation2);
177
194
 
178
- assert.lengthOf(transformedOperations, 1);
195
+ assert.lengthOf(transformedOperations, 1);
179
196
 
180
- const firstTransformedOperation = first(transformedOperations),
181
- transformedOperation = firstTransformedOperation, ///
182
- transformedOperationJSON = transformedOperation.toJSON(),
183
- expectedTransformedOperation = EmptyOperation.fromNothing(),
184
- expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
197
+ const firstTransformedOperation = first(transformedOperations),
198
+ transformedOperation = firstTransformedOperation, ///
199
+ transformedOperationJSON = transformedOperation.toJSON(),
200
+ expectedTransformedOperation = DeleteOperation.fromContentAndPosition("juHY", 2),
201
+ expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
185
202
 
186
- assert.deepEqual(transformedOperationJSON, expectedTransformedOperationJSON)
203
+ assert.deepEqual(transformedOperationJSON, expectedTransformedOperationJSON)
204
+ });
187
205
  });
188
206
 
189
- it("transforms a delete operation of length 2 at position 1 to a delete operation of length 1 at position 1", () => {
190
- const deleteOperation1 = DeleteOperation.fromLengthAndPosition(1, 1),
191
- deleteOperation2 = DeleteOperation.fromLengthAndPosition(2, 1),
192
- transformedOperations = deleteOperation1.transformOperation(deleteOperation2);
207
+ describe("completely to the right another delete", () => {
208
+ it("leaves the other delete intact", () => {
209
+ const deleteOperation1 = DeleteOperation.fromContentAndPosition("jikd", 12),
210
+ deleteOperation2 = DeleteOperation.fromContentAndPosition("ZDrert5", 2),
211
+ transformedOperations = deleteOperation1.transformOperation(deleteOperation2);
193
212
 
194
- assert.lengthOf(transformedOperations, 1);
213
+ assert.lengthOf(transformedOperations, 1);
195
214
 
196
- const firstTransformedOperation = first(transformedOperations),
197
- transformedOperation = firstTransformedOperation, ///
198
- transformedOperationJSON = transformedOperation.toJSON(),
199
- expectedTransformedOperation = DeleteOperation.fromLengthAndPosition(1, 1),
200
- expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
215
+ const firstTransformedOperation = first(transformedOperations),
216
+ transformedOperation = firstTransformedOperation, ///
217
+ transformedOperationJSON = transformedOperation.toJSON(),
218
+ expectedTransformedOperation = DeleteOperation.fromContentAndPosition("ZDrert5", 2),
219
+ expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
201
220
 
202
- assert.deepEqual(transformedOperationJSON, expectedTransformedOperationJSON)
221
+ assert.deepEqual(transformedOperationJSON, expectedTransformedOperationJSON)
222
+ });
203
223
  });
204
224
 
205
- it("transforms a delete operation of length 1 at position 2 to a delete operation of length 1 at position 1", () => {
206
- const deleteOperation1 = DeleteOperation.fromLengthAndPosition(1, 1),
207
- deleteOperation2 = DeleteOperation.fromLengthAndPosition(1, 2),
208
- transformedOperations = deleteOperation1.transformOperation(deleteOperation2);
225
+ describe("has the same position as the other delete and is strictly overlapped by it", () => {
226
+ it("truncates the other delete on the left", () => {
227
+ const deleteOperation1 = DeleteOperation.fromContentAndPosition("juhy", 2),
228
+ deleteOperation2 = DeleteOperation.fromContentAndPosition("juhyKIOU", 2),
229
+ transformedOperations = deleteOperation1.transformOperation(deleteOperation2);
209
230
 
210
- assert.lengthOf(transformedOperations, 1);
231
+ assert.lengthOf(transformedOperations, 1);
211
232
 
212
- const firstTransformedOperation = first(transformedOperations),
213
- transformedOperation = firstTransformedOperation, ///
214
- transformedOperationJSON = transformedOperation.toJSON(),
215
- expectedTransformedOperation = DeleteOperation.fromLengthAndPosition(1, 1),
216
- expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
233
+ const firstTransformedOperation = first(transformedOperations),
234
+ transformedOperation = firstTransformedOperation, ///
235
+ transformedOperationJSON = transformedOperation.toJSON(),
236
+ expectedTransformedOperation = DeleteOperation.fromContentAndPosition("KIOU", 2),
237
+ expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
217
238
 
218
- assert.deepEqual(transformedOperationJSON, expectedTransformedOperationJSON)
239
+ assert.deepEqual(transformedOperationJSON, expectedTransformedOperationJSON)
240
+ });
241
+ });
242
+
243
+ describe("has the same position as the other delete and overlaps it", () => {
244
+ it("transforms the other delete to an empty operation", () => {
245
+ const deleteOperation1 = DeleteOperation.fromContentAndPosition("juhYGTfv", 2),
246
+ deleteOperation2 = DeleteOperation.fromContentAndPosition("juhYG", 2),
247
+ transformedOperations = deleteOperation1.transformOperation(deleteOperation2);
248
+
249
+ assert.lengthOf(transformedOperations, 1);
250
+
251
+ const firstTransformedOperation = first(transformedOperations),
252
+ transformedOperation = firstTransformedOperation, ///
253
+ transformedOperationJSON = transformedOperation.toJSON(),
254
+ expectedTransformedOperation = EmptyOperation.fromNothing(),
255
+ expectedTransformedOperationJSON = expectedTransformedOperation.toJSON();
256
+
257
+ assert.deepEqual(transformedOperationJSON, expectedTransformedOperationJSON)
258
+ });
219
259
  });
220
260
  });
221
261
 
222
262
  describe("transformContent", () => {
223
263
  it("deletes the requisite characters from the content", () => {
224
- const content = helpers.content(10),
225
- deleteOperation = DeleteOperation.fromLengthAndPosition(6, 4),
264
+ const content = "3c9OQTyTmb",
265
+ deleteOperation = DeleteOperation.fromContentAndPosition("QTyTmb", 4),
226
266
  transformedContent = deleteOperation.transformContent(content),
227
- expectedContent = content.substring(0, 4);
267
+ expectedContent = "3c9O";
228
268
 
229
269
  assert.equal(transformedContent, expectedContent);
230
270
  });
@@ -234,7 +274,7 @@ describe("DeleteOperation", () => {
234
274
  it("transforms from and to JSON, leaving the operation unchanged", () => {
235
275
  const expectedJSON = {
236
276
  "type": "delete",
237
- "length": 3,
277
+ "content": "bcd",
238
278
  "position": 1
239
279
  },
240
280
  json = DeleteOperation.fromJSON(expectedJSON).toJSON();
@@ -4,15 +4,13 @@ const { assert } = require("chai"),
4
4
  { arrayUtilities } = require("necessary"),
5
5
  { EmptyOperation, DeleteOperation, InsertOperation } = require("../../lib/main"); ///
6
6
 
7
- const helpers = require("../helpers");
8
-
9
7
  const { first } = arrayUtilities;
10
8
 
11
9
  describe("EmptyOperation", () => {
12
10
  describe("transform", () => {
13
11
  it("transforms an insert operation, leaving it the same", () => {
14
12
  const emptyOperation1 = EmptyOperation.fromNothing(),
15
- insertOperation2 = InsertOperation.fromStringAndPosition(0, "b"),
13
+ insertOperation2 = InsertOperation.fromContentAndPosition("jinHgt", 8),
16
14
  transformedOperations = emptyOperation1.transformOperation(insertOperation2);
17
15
 
18
16
  assert.lengthOf(transformedOperations, 1);
@@ -44,7 +42,7 @@ describe("EmptyOperation", () => {
44
42
 
45
43
  it("transforms a delete operation, leaving it the same", () => {
46
44
  const emptyOperation1 = EmptyOperation.fromNothing(),
47
- deleteOperation2 = DeleteOperation.fromLengthAndPosition(0, 1),
45
+ deleteOperation2 = DeleteOperation.fromContentAndPosition("bKinld", 4),
48
46
  transformedOperations = emptyOperation1.transformOperation(deleteOperation2);
49
47
 
50
48
  assert.lengthOf(transformedOperations, 1);
@@ -61,7 +59,7 @@ describe("EmptyOperation", () => {
61
59
 
62
60
  describe("transformContent", () => {
63
61
  it("leaves the content unchanged", () => {
64
- const content = helpers.content(),
62
+ const content = "asXdvvyi",
65
63
  emptyOperation = EmptyOperation.fromNothing(),
66
64
  transformedContent = emptyOperation.transformContent(content),
67
65
  expectedContent = content; ///