Bläddra i källkod

Changes in MergeDelta API.

Szymon Cofalik 9 år sedan
förälder
incheckning
00bf9fb8a9

+ 24 - 21
packages/ckeditor5-engine/src/treemodel/delta/mergedelta.js

@@ -22,32 +22,35 @@ import CKEditorError from '../../ckeditorerror.js';
  * @memberOf core.treeModel.delta
  */
 export default class MergeDelta extends Delta {
-	get moveOperation() {
-		return this.operations[ 0 ] || null;
-	}
-
-	get removeOperation() {
+	/**
+	 * Operation in this delta that removes the node after merge position (which will be empty at that point) or
+	 * `null` if the delta has no operations. Note, that after {@link core.treeModel.delta.transform transformation}
+	 * this might be an instance of {@link core.treeModel.operation.MoveOperation} instead of
+	 * {@link core.treeModel.operation.RemoveOperation}.
+	 *
+	 * @protected
+	 * @type {core.treeModel.operation.MoveOperation|null}
+	 */
+	get _removeOperation() {
 		return this.operations[ 1 ] || null;
 	}
 
-	get position() {
-		return this.removeOperation ? this.removeOperation.sourcePosition : null;
+	/**
+	 * @see core.treeModel.delta.Delta#_reverseDeltaClass
+	 * @protected
+	 * @type {Object}
+	 */
+	get _reverseDeltaClass() {
+		return SplitDelta;
 	}
 
-	getReversed() {
-		if ( this.moveOperation ) {
-			let delta = new SplitDelta();
-
-			for ( let op of this.operations ) {
-				delta.addOperation( op.getReversed() );
-			}
-
-			delta.operations.reverse();
-
-			return delta;
-		}
-
-		return null;
+	/**
+	 * Position between to merged nodes or `null` if the delta has no operations.
+	 *
+	 * @type {core.treeModel.Position|null}
+	 */
+	get position() {
+		return this._removeOperation ? this._removeOperation.sourcePosition : null;
 	}
 }
 

+ 65 - 0
packages/ckeditor5-engine/tests/treemodel/delta/mergedelta.js

@@ -12,6 +12,13 @@ import Position from '/ckeditor5/core/treemodel/position.js';
 import Element from '/ckeditor5/core/treemodel/element.js';
 import CKEditorError from '/ckeditor5/core/ckeditorerror.js';
 
+import MergeDelta from '/ckeditor5/core/treemodel/delta/mergedelta.js';
+import SplitDelta from '/ckeditor5/core/treemodel/delta/splitdelta.js';
+
+import MoveOperation from '/ckeditor5/core/treemodel/operation/moveoperation.js';
+import RemoveOperation from '/ckeditor5/core/treemodel/operation/removeoperation.js';
+import ReinsertOperation from '/ckeditor5/core/treemodel/operation/reinsertoperation.js';
+
 describe( 'Batch', () => {
 	let doc, root, p1, p2;
 
@@ -62,3 +69,61 @@ describe( 'Batch', () => {
 		} );
 	} );
 } );
+
+describe( 'MergeDelta', () => {
+	let mergeDelta, doc, root;
+
+	beforeEach( () => {
+		doc = new Document();
+		root = doc.createRoot( 'root' );
+		mergeDelta = new MergeDelta();
+	} );
+
+	describe( 'constructor', () => {
+		it( 'should create merge delta with no operations added', () => {
+			expect( mergeDelta.operations.length ).to.equal( 0 );
+		} );
+	} );
+
+	describe( 'position', () => {
+		it( 'should be null if there are no operations in delta', () => {
+			expect( mergeDelta.position ).to.be.null;
+		} );
+
+		it( 'should be equal to the position between merged nodes', () => {
+			mergeDelta.operations.push( new MoveOperation( new Position( root, [ 1, 2, 0 ] ), 4, new Position( root, [ 1, 1, 4 ] ) ) );
+			mergeDelta.operations.push( new RemoveOperation( new Position( root, [ 1, 2, 0 ] ), 1 ) );
+
+			expect( mergeDelta.position.root ).to.equal( root );
+			expect( mergeDelta.position.path ).to.deep.equal( [ 1, 2, 0 ] );
+		} );
+	} );
+
+	describe( 'getReversed', () => {
+		it( 'should return empty SplitDelta if there are no operations in delta', () => {
+			let reversed = mergeDelta.getReversed();
+
+			expect( reversed ).to.be.instanceof( SplitDelta );
+			expect( reversed.operations.length ).to.equal( 0 );
+		} );
+
+		it( 'should return correct SplitDelta', () => {
+			mergeDelta.operations.push( new MoveOperation( new Position( root, [ 1, 2, 0 ] ), 4, new Position( root, [ 1, 1, 4 ] ) ) );
+			mergeDelta.operations.push( new RemoveOperation( new Position( root, [ 1, 2, 0 ] ), 1 ) );
+
+			let reversed = mergeDelta.getReversed();
+
+			expect( reversed ).to.be.instanceof( SplitDelta );
+			expect( reversed.operations.length ).to.equal( 2 );
+
+			expect( reversed.operations[ 0 ] ).to.be.instanceof( ReinsertOperation );
+			expect( reversed.operations[ 0 ].howMany ).to.equal( 1 );
+			expect( reversed.operations[ 0 ].targetPosition.path ).to.deep.equal( [ 1, 2, 0 ] );
+
+			expect( reversed.operations[ 1 ] ).to.be.instanceof( MoveOperation );
+			expect( reversed.operations[ 1 ].sourcePosition.path ).to.deep.equal( [ 1, 1, 4 ] );
+			expect( reversed.operations[ 1 ].howMany ).to.equal( 4 );
+			expect( reversed.operations[ 1 ].targetPosition.path ).to.deep.equal( [ 1, 2, 0 ] );
+		} );
+	} );
+} );