@@ -19,7 +19,10 @@ import {
1919 expectDelta ,
2020 getFilledDocument ,
2121 getMarkerDelta ,
22- getSplitDelta
22+ getSplitDelta ,
23+ getMergeDelta ,
24+ getWrapDelta ,
25+ getUnwrapDelta
2326} from '../../../model/delta/transform/_utils/utils' ;
2427
2528describe ( 'transform' , ( ) => {
@@ -33,16 +36,16 @@ describe( 'transform', () => {
3336 } ) ;
3437
3538 describe ( 'MarkerDelta by' , ( ) => {
36- let markerDelta ;
39+ describe ( 'SplitDelta' , ( ) => {
40+ let markerDelta ;
3741
38- beforeEach ( ( ) => {
39- const oldRange = new Range ( new Position ( root , [ 3 , 0 ] ) , new Position ( root , [ 3 , 3 ] ) ) ;
40- const newRange = new Range ( new Position ( root , [ 3 , 3 , 3 , 2 ] ) , new Position ( root , [ 3 , 3 , 3 , 6 ] ) ) ;
42+ beforeEach ( ( ) => {
43+ const oldRange = new Range ( new Position ( root , [ 3 , 0 ] ) , new Position ( root , [ 3 , 3 ] ) ) ;
44+ const newRange = new Range ( new Position ( root , [ 3 , 3 , 3 , 2 ] ) , new Position ( root , [ 3 , 3 , 3 , 6 ] ) ) ;
4145
42- markerDelta = getMarkerDelta ( 'name' , oldRange , newRange , baseVersion ) ;
43- } ) ;
46+ markerDelta = getMarkerDelta ( 'name' , oldRange , newRange , baseVersion ) ;
47+ } ) ;
4448
45- describe ( 'SplitDelta' , ( ) => {
4649 it ( 'split inside oldRange' , ( ) => {
4750 let splitDelta = getSplitDelta ( new Position ( root , [ 3 , 1 ] ) , new Element ( 'div' ) , 3 , baseVersion ) ;
4851 let transformed = transform ( markerDelta , splitDelta ) ;
@@ -93,5 +96,139 @@ describe( 'transform', () => {
9396 } ) ;
9497 } ) ;
9598 } ) ;
99+
100+ describe ( 'MergeDelta' , ( ) => {
101+ it ( 'collapsed marker in merged element' , ( ) => {
102+ // MarkerDelta with collapsed range, which changes from the beginning of merged element to the end.
103+ const oldRange = new Range ( new Position ( root , [ 3 , 3 , 3 , 0 ] ) ) ;
104+ const newRange = new Range ( new Position ( root , [ 3 , 3 , 3 , 12 ] ) ) ;
105+
106+ const markerDelta = getMarkerDelta ( 'name' , oldRange , newRange , baseVersion ) ;
107+
108+ // MergeDelta merges the element in which is collapsed marker range with the previous element.
109+ const mergeDelta = getMergeDelta ( new Position ( root , [ 3 , 3 , 3 ] ) , 4 , 12 , baseVersion ) ;
110+
111+ const transformed = transform ( markerDelta , mergeDelta ) ;
112+
113+ // It is expected, that ranges in MarkerDelta got correctly transformed:
114+ // from start of merged element to the place where merged nodes where moved in the previous element,
115+ // from end of merged element to the end of previous element.
116+ const expectedOldRange = new Range ( new Position ( root , [ 3 , 3 , 2 , 4 ] ) , new Position ( root , [ 3 , 3 , 2 , 4 ] ) ) ;
117+ const expectedNewRange = new Range ( new Position ( root , [ 3 , 3 , 2 , 16 ] ) , new Position ( root , [ 3 , 3 , 2 , 16 ] ) ) ;
118+
119+ expectDelta ( transformed [ 0 ] , {
120+ type : MarkerDelta ,
121+ operations : [
122+ {
123+ type : MarkerOperation ,
124+ name : 'name' ,
125+ oldRange : expectedOldRange ,
126+ newRange : expectedNewRange ,
127+ baseVersion : baseVersion + 2
128+ }
129+ ]
130+ } ) ;
131+ } ) ;
132+ } ) ;
133+
134+ describe ( 'WrapDelta' , ( ) => {
135+ it ( 'ranges intersecting with wrapped range' , ( ) => {
136+ // MarkerDelta with ranges that intersects with wrapped range.
137+ const oldRange = new Range ( new Position ( root , [ 0 , 2 ] ) , new Position ( root , [ 1 , 2 ] ) ) ;
138+ const newRange = new Range ( new Position ( root , [ 1 , 2 ] ) , new Position ( root , [ 2 , 2 ] ) ) ;
139+
140+ const markerDelta = getMarkerDelta ( 'name' , oldRange , newRange , baseVersion ) ;
141+
142+ // Wrap delta wraps element on position ( root [ 1 ] ), which intersects with both `oldRange` and `newRange`.
143+ const wrapElement = new Element ( 'w' ) ;
144+ const wrapRange = new Range ( new Position ( root , [ 1 ] ) , new Position ( root , [ 2 ] ) ) ;
145+ const wrapDelta = getWrapDelta ( wrapRange , wrapElement , baseVersion ) ;
146+
147+ const transformed = transform ( markerDelta , wrapDelta ) ;
148+
149+ // It is expected, that ranges in MarkerDelta got correctly transformed:
150+ // `oldRange` end is in wrapped element,
151+ // `newRange` start is in wrapped element.
152+ const expectedOldRange = new Range ( new Position ( root , [ 0 , 2 ] ) , new Position ( root , [ 1 , 0 , 2 ] ) ) ;
153+ const expectedNewRange = new Range ( new Position ( root , [ 1 , 0 , 2 ] ) , new Position ( root , [ 2 , 2 ] ) ) ;
154+
155+ expectDelta ( transformed [ 0 ] , {
156+ type : MarkerDelta ,
157+ operations : [
158+ {
159+ type : MarkerOperation ,
160+ name : 'name' ,
161+ oldRange : expectedOldRange ,
162+ newRange : expectedNewRange ,
163+ baseVersion : baseVersion + 2
164+ }
165+ ]
166+ } ) ;
167+ } ) ;
168+ } ) ;
169+
170+ describe ( 'UnwrapDelta' , ( ) => {
171+ it ( 'ranges intersecting with unwrapped element' , ( ) => {
172+ // MarkerDelta with ranges that intersects with unwrapped element.
173+ const oldRange = new Range ( new Position ( root , [ 0 , 2 ] ) , new Position ( root , [ 1 , 0 , 2 ] ) ) ;
174+ const newRange = new Range ( new Position ( root , [ 1 , 0 , 2 ] ) , new Position ( root , [ 2 , 2 ] ) ) ;
175+
176+ const markerDelta = getMarkerDelta ( 'name' , oldRange , newRange , baseVersion ) ;
177+
178+ // Unwrap delta unwraps element on position ( root [ 1, 0 ] ), which intersects with both `oldRange` and `newRange`.
179+ const unwrapPosition = new Position ( root , [ 1 , 0 ] ) ;
180+ const unwrapDelta = getUnwrapDelta ( unwrapPosition , 4 , baseVersion ) ;
181+
182+ const transformed = transform ( markerDelta , unwrapDelta ) ;
183+
184+ // It is expected, that ranges in MarkerDelta got correctly transformed.
185+ const expectedOldRange = new Range ( new Position ( root , [ 0 , 2 ] ) , new Position ( root , [ 1 , 2 ] ) ) ;
186+ const expectedNewRange = new Range ( new Position ( root , [ 1 , 2 ] ) , new Position ( root , [ 2 , 2 ] ) ) ;
187+
188+ expectDelta ( transformed [ 0 ] , {
189+ type : MarkerDelta ,
190+ operations : [
191+ {
192+ type : MarkerOperation ,
193+ name : 'name' ,
194+ oldRange : expectedOldRange ,
195+ newRange : expectedNewRange ,
196+ baseVersion : baseVersion + 2
197+ }
198+ ]
199+ } ) ;
200+ } ) ;
201+
202+ it ( 'ranges intersecting with unwrapped element #2' , ( ) => {
203+ // MarkerDelta with ranges that intersects with unwrapped element.
204+ const oldRange = new Range ( new Position ( root , [ 0 , 2 ] ) , new Position ( root , [ 1 , 2 ] ) ) ;
205+ const newRange = new Range ( new Position ( root , [ 1 , 2 ] ) , new Position ( root , [ 2 , 2 ] ) ) ;
206+
207+ const markerDelta = getMarkerDelta ( 'name' , oldRange , newRange , baseVersion ) ;
208+
209+ // Unwrap delta unwraps element on position ( root [ 1 ] ), which intersects with both `oldRange` and `newRange`.
210+ const unwrapPosition = new Position ( root , [ 1 ] ) ;
211+ const unwrapDelta = getUnwrapDelta ( unwrapPosition , 4 , baseVersion ) ;
212+
213+ const transformed = transform ( markerDelta , unwrapDelta ) ;
214+
215+ // It is expected, that ranges in MarkerDelta got correctly transformed.
216+ const expectedOldRange = new Range ( new Position ( root , [ 0 , 2 ] ) , new Position ( root , [ 3 ] ) ) ;
217+ const expectedNewRange = new Range ( new Position ( root , [ 3 ] ) , new Position ( root , [ 5 , 2 ] ) ) ;
218+
219+ expectDelta ( transformed [ 0 ] , {
220+ type : MarkerDelta ,
221+ operations : [
222+ {
223+ type : MarkerOperation ,
224+ name : 'name' ,
225+ oldRange : expectedOldRange ,
226+ newRange : expectedNewRange ,
227+ baseVersion : baseVersion + 2
228+ }
229+ ]
230+ } ) ;
231+ } ) ;
232+ } ) ;
96233 } ) ;
97234} ) ;
0 commit comments