Parcourir la source

Added: New scenarios and cleanup.

Mgsy il y a 7 ans
Parent
commit
c0f7bddb07

+ 426 - 0
packages/ckeditor5-engine/tests/model/operation/transform/attribute.js

@@ -232,6 +232,21 @@ describe( 'transform', () => {
 				);
 			} );
 
+			it( 'text between changed nodes', () => {
+				john.setData( '<paragraph>[Foo</paragraph><paragraph>Bar]</paragraph>' );
+				kate.setData( '<paragraph>Foo</paragraph><paragraph>B[]ar</paragraph>' );
+
+				john.setAttribute( 'bold', true );
+				kate.type( 'Abc' );
+
+				syncClients();
+
+				expectClients(
+					'<paragraph><$text bold="true">Foo</$text></paragraph>' +
+					'<paragraph><$text bold="true">BAbcar</$text></paragraph>'
+				);
+			} );
+
 			it( 'element in different path', () => {
 				john.setData( '<paragraph>[Foo]</paragraph><paragraph>Bar</paragraph>' );
 				kate.setData( '<paragraph>Foo</paragraph><paragraph>Bar</paragraph>[]' );
@@ -263,6 +278,68 @@ describe( 'transform', () => {
 					'<paragraph>Abc</paragraph>'
 				);
 			} );
+
+			it( 'remove attribute from element in different path', () => {
+				john.setData( '<paragraph>[]Foo</paragraph><paragraph bold="true">Bar</paragraph>' );
+				kate.setData( '<paragraph>Foo</paragraph>[<paragraph bold="true">Bar</paragraph>]' );
+
+				john.type( 'Abc' );
+				kate.removeAttribute( 'bold' );
+
+				syncClients();
+
+				expectClients( '<paragraph>AbcFoo</paragraph><paragraph>Bar</paragraph>' );
+			} );
+
+			it( 'remove attribute from text in different path', () => {
+				john.setData( '<paragraph>[]Foo</paragraph><paragraph><$text bold="true">Bar</$text></paragraph>' );
+				kate.setData( '<paragraph>Foo</paragraph><paragraph><$text bold="true">[Bar]</$text></paragraph>' );
+
+				john.type( 'Abc' );
+				kate.removeAttribute( 'bold' );
+
+				syncClients();
+
+				expectClients( '<paragraph>AbcFoo</paragraph><paragraph>Bar</paragraph>' );
+			} );
+
+			it( 'remove attribute from text in same path', () => {
+				john.setData( '<paragraph>[]Fo<$text bold="true">o</$text></paragraph>' );
+				kate.setData( '<paragraph>Fo<$text bold="true">[o]</$text></paragraph>' );
+
+				john.type( 'Bar' );
+				kate.removeAttribute( 'bold' );
+
+				syncClients();
+
+				expectClients( '<paragraph>BarFoo</paragraph>' );
+			} );
+
+			it( 'remove attribute from element in same path', () => {
+				john.setData( '<paragraph bold="true">[]Foo</paragraph>' );
+				kate.setData( '[<paragraph bold="true">Foo</paragraph>]' );
+
+				john.type( 'Bar' );
+				kate.removeAttribute( 'bold' );
+
+				syncClients();
+
+				expectClients( '<paragraph>BarFoo</paragraph>' );
+			} );
+
+			it( 'remove attribute from text with 2 attributes in same path', () => {
+				john.setData( '<paragraph>[]Fo<$text bold="true" italic="true">o</$text></paragraph>' );
+				kate.setData( '<paragraph>Fo<$text bold="true" italic="true">[o]</$text></paragraph>' );
+
+				john.type( 'Bar' );
+				kate.removeAttribute( 'bold' );
+
+				syncClients();
+
+				expectClients(
+					'<paragraph>BarFo<$text italic="true">o</$text></paragraph>'
+				);
+			} );
 		} );
 
 		describe( 'by move', () => {
@@ -343,6 +420,93 @@ describe( 'transform', () => {
 
 				expectClients( '<paragraph bold="true">F Baroo</paragraph>' );
 			} );
+
+			it( 'remove attribute from element in different path', () => {
+				john.setData( '<paragraph>F[oo]</paragraph><paragraph bold="true">Bar</paragraph>' );
+				kate.setData( '<paragraph>Foo</paragraph>[<paragraph bold="true">Bar</paragraph>]' );
+
+				john.move( [ 1, 0 ] );
+				kate.removeAttribute( 'bold' );
+
+				syncClients();
+
+				expectClients(
+					'<paragraph>F</paragraph>' +
+					'<paragraph>ooBar</paragraph>'
+				);
+			} );
+
+			it( 'remove attribute from text in different path', () => {
+				john.setData( '<paragraph>F[oo]</paragraph><paragraph>Bar</paragraph>' );
+				kate.setData( '<paragraph>Foo</paragraph><paragraph>[Bar]</paragraph>' );
+
+				john.move( [ 1, 0 ] );
+				kate.removeAttribute( 'bold' );
+
+				syncClients();
+
+				expectClients(
+					'<paragraph>F</paragraph>' +
+					'<paragraph>ooBar</paragraph>'
+				);
+			} );
+
+			it( 'remove attribute from text in same path', () => {
+				john.setData( '<paragraph>[Fo]<$text bold="true">o</$text></paragraph>' );
+				kate.setData( '<paragraph>Fo<$text bold="true">[o]</$text></paragraph>' );
+
+				john.move( [ 0, 3 ] );
+				kate.removeAttribute( 'bold' );
+
+				syncClients();
+
+				expectClients(
+					'<paragraph>oFo</paragraph>'
+				);
+			} );
+
+			it( 'remove attribute from element in same path', () => {
+				john.setData( '<paragraph bold="true">[Fo]o</paragraph>' );
+				kate.setData( '[<paragraph bold="true">Foo</paragraph>]' );
+
+				john.move( [ 0, 3 ] );
+				kate.removeAttribute( 'bold' );
+
+				syncClients();
+
+				expectClients(
+					'<paragraph>oFo</paragraph>'
+				);
+			} );
+
+			it( 'remove attribute from text with 2 attributes in same path', () => {
+				john.setData( '<paragraph>[Fo]<$text bold="true" italic="true">o</$text></paragraph>' );
+				kate.setData( '<paragraph>Fo<$text bold="true" italic="true">[o]</$text></paragraph>' );
+
+				john.move( [ 0, 3 ] );
+				kate.removeAttribute( 'bold' );
+
+				syncClients();
+
+				expectClients(
+					'<paragraph><$text italic="true">o</$text>Fo</paragraph>'
+				);
+			} );
+
+			it( 'remove attribute from text in other user\'s selection', () => {
+				john.setData( '<paragraph><$text bold="true">[Foo]</$text></paragraph><paragraph></paragraph>' );
+				kate.setData( '<paragraph><$text bold="true">[Foo]</$text></paragraph><paragraph></paragraph>' );
+
+				john.move( [ 1, 0 ] );
+				kate.removeAttribute( 'bold' );
+
+				syncClients();
+
+				expectClients(
+					'<paragraph></paragraph>' +
+					'<paragraph>Foo</paragraph>'
+				);
+			} );
 		} );
 
 		describe( 'by wrap', () => {
@@ -660,6 +824,92 @@ describe( 'transform', () => {
 					'<paragraph><$text bold="true">F</$text></paragraph>'
 				);
 			} );
+
+			it( 'remove attribute from element in different path', () => {
+				john.setData( '<paragraph>F[oo]</paragraph><paragraph bold="true">Bar</paragraph>' );
+				kate.setData( '<paragraph>Foo</paragraph>[<paragraph bold="true">Bar</paragraph>]' );
+
+				john.remove();
+				kate.removeAttribute( 'bold' );
+
+				syncClients();
+
+				expectClients(
+					'<paragraph>F</paragraph>' +
+					'<paragraph>Bar</paragraph>'
+				);
+			} );
+
+			it( 'remove attribute from text in different path', () => {
+				john.setData( '<paragraph>F[oo]</paragraph><paragraph><$text bold="true">Bar</$text></paragraph>' );
+				kate.setData( '<paragraph>Foo</paragraph><paragraph><$text bold="true">[Bar]</$text></paragraph>' );
+
+				john.remove();
+				kate.removeAttribute( 'bold' );
+
+				syncClients();
+
+				expectClients(
+					'<paragraph>F</paragraph>' +
+					'<paragraph>Bar</paragraph>'
+				);
+			} );
+
+			it( 'remove attribute from text in same path', () => {
+				john.setData( '<paragraph>[Fo]<$text bold="true">o</$text></paragraph>' );
+				kate.setData( '<paragraph>Fo<$text bold="true">[o]</$text></paragraph>' );
+
+				john.remove();
+				kate.removeAttribute( 'bold' );
+
+				syncClients();
+
+				expectClients(
+					'<paragraph>o</paragraph>'
+				);
+			} );
+
+			it( 'remove attribute from element in same path', () => {
+				john.setData( '<paragraph bold="true">[Fo]o</paragraph>' );
+				kate.setData( '[<paragraph bold="true">Foo</paragraph>]' );
+
+				john.remove();
+				kate.removeAttribute( 'bold' );
+
+				syncClients();
+
+				expectClients(
+					'<paragraph>o</paragraph>'
+				);
+			} );
+
+			it( 'remove attribute from text with 2 attributes in same path', () => {
+				john.setData( '<paragraph>[Fo]<$text bold="true" italic="true">o</$text></paragraph>' );
+				kate.setData( '<paragraph>Fo<$text bold="true" italic="true">[o]</$text></paragraph>' );
+
+				john.remove();
+				kate.removeAttribute( 'bold' );
+
+				syncClients();
+
+				expectClients(
+					'<paragraph><$text italic="true">o</$text></paragraph>'
+				);
+			} );
+
+			it( 'remove attribute from text in other user\'s selection', () => {
+				john.setData( '<paragraph><$text bold="true">[Foo]</$text></paragraph>' );
+				kate.setData( '<paragraph><$text bold="true">[Foo]</$text></paragraph>' );
+
+				john.remove();
+				kate.removeAttribute( 'bold' );
+
+				syncClients();
+
+				expectClients(
+					'<paragraph></paragraph>'
+				);
+			} );
 		} );
 
 		describe( 'by remove attribute', () => {
@@ -836,6 +1086,96 @@ describe( 'transform', () => {
 
 				expectClients( '<paragraph><m1:start></m1:start><$text bold="true">Foo Bar</$text><m1:end></m1:end></paragraph>' );
 			} );
+
+			it( 'remove attribute from element in different path', () => {
+				john.setData( '<paragraph>[Foo]</paragraph><paragraph bold="true">Bar</paragraph>' );
+				kate.setData( '<paragraph>Foo</paragraph>[<paragraph bold="true">Bar</paragraph>]' );
+
+				john.setMarker( 'm1' );
+				kate.removeAttribute( 'bold' );
+
+				syncClients();
+
+				expectClients(
+					'<paragraph><m1:start></m1:start>Foo<m1:end></m1:end></paragraph>' +
+					'<paragraph>Bar</paragraph>'
+				);
+			} );
+
+			it( 'remove attribute from text in different path', () => {
+				john.setData( '<paragraph>[Foo]</paragraph><paragraph><$text bold="true">Bar</$text></paragraph>' );
+				kate.setData( '<paragraph>Foo</paragraph><paragraph><$text bold="true">[Bar]</$text></paragraph>' );
+
+				john.setMarker( 'm1' );
+				kate.removeAttribute( 'bold' );
+
+				syncClients();
+
+				expectClients(
+					'<paragraph><m1:start></m1:start>Foo<m1:end></m1:end></paragraph>' +
+					'<paragraph>Bar</paragraph>'
+				);
+			} );
+
+			it( 'remove attribute from text in same path', () => {
+				john.setData( '<paragraph>[Fo]<$text bold="true">o</$text></paragraph>' );
+				kate.setData( '<paragraph>Fo<$text bold="true">[o]</$text></paragraph>' );
+
+				john.setMarker( 'm1' );
+				kate.removeAttribute( 'bold' );
+
+				syncClients();
+
+				expectClients(
+					'<paragraph><m1:start></m1:start>Fo<m1:end></m1:end>o</paragraph>'
+				);
+			} );
+
+			it( 'remove attribute from text in same path, then undo', () => {
+				john.setData( '<paragraph>[Fo]<$text bold="true">o</$text></paragraph>' );
+				kate.setData( '<paragraph>Fo<$text bold="true">[o]</$text></paragraph>' );
+
+				john.setMarker( 'm1' );
+				kate.removeAttribute( 'bold' );
+
+				syncClients();
+
+				kate.undo();
+
+				syncClients();
+
+				expectClients(
+					'<paragraph><m1:start></m1:start>Fo<m1:end></m1:end><$text bold="true">o</$text></paragraph>'
+				);
+			} );
+
+			it( 'remove attribute from text with 2 attributes in same path', () => {
+				john.setData( '<paragraph>[Fo]<$text bold="true" italic="true">o</$text></paragraph>' );
+				kate.setData( '<paragraph>Fo<$text bold="true" italic="true">[o]</$text></paragraph>' );
+
+				john.setMarker( 'm1' );
+				kate.removeAttribute( 'bold' );
+
+				syncClients();
+
+				expectClients(
+					'<paragraph><m1:start></m1:start>Fo<m1:end></m1:end><$text italic="true">o</$text></paragraph>'
+				);
+			} );
+
+			it( 'remove attribute from text in other user\'s selection', () => {
+				john.setData( '<paragraph><$text bold="true">[Foo]</$text></paragraph>' );
+				kate.setData( '<paragraph><$text bold="true">[Foo]</$text></paragraph>' );
+
+				john.setMarker( 'm1' );
+				kate.removeAttribute( 'bold' );
+
+				syncClients();
+
+				expectClients(
+					'<paragraph><m1:start></m1:start>Foo<m1:end></m1:end></paragraph>'
+				);
+			} );
 		} );
 
 		describe( 'by merge', () => {
@@ -931,5 +1271,91 @@ describe( 'transform', () => {
 				'<paragraph>Foo</paragraph>'
 			);
 		} );
+
+		it( 'remove attribute from element in different path', () => {
+			john.setData( '<paragraph>F[]oo</paragraph><paragraph bold="true">Bar</paragraph>' );
+			kate.setData( '<paragraph>Foo</paragraph>[<paragraph bold="true">Bar</paragraph>]' );
+
+			john.rename( 'heading1' );
+			kate.removeAttribute( 'bold' );
+
+			syncClients();
+
+			expectClients(
+				'<heading1>Foo</heading1>' +
+				'<paragraph>Bar</paragraph>'
+			);
+		} );
+
+		it( 'remove attribute from text in different path', () => {
+			john.setData( '<paragraph>F[]oo</paragraph><paragraph>Bar</paragraph>' );
+			kate.setData( '<paragraph>Foo</paragraph><paragraph>[Bar]</paragraph>' );
+
+			john.rename( 'heading1' );
+			kate.removeAttribute( 'bold' );
+
+			syncClients();
+
+			expectClients(
+				'<heading1>Foo</heading1>' +
+				'<paragraph>Bar</paragraph>'
+			);
+		} );
+
+		it( 'remove attribute from text in same path', () => {
+			john.setData( '<paragraph>F[]o<$text bold="true">o</$text></paragraph>' );
+			kate.setData( '<paragraph>Fo<$text bold="true">[o]</$text></paragraph>' );
+
+			john.rename( 'heading1' );
+			kate.removeAttribute( 'bold' );
+
+			syncClients();
+
+			expectClients(
+				'<heading1>Foo</heading1>'
+			);
+		} );
+
+		it( 'remove attribute from element in same path', () => {
+			john.setData( '<paragraph bold="true">F[]oo</paragraph>' );
+			kate.setData( '[<paragraph bold="true">Foo</paragraph>]' );
+
+			john.rename( 'heading1' );
+			kate.removeAttribute( 'bold' );
+
+			syncClients();
+
+			expectClients(
+				'<heading1>Foo</heading1>'
+			);
+		} );
+
+		it( 'remove attribute from text with 2 attributes in same path', () => {
+			john.setData( '<paragraph>F[o]<$text bold="true" italic="true">o</$text></paragraph>' );
+			kate.setData( '<paragraph>Fo<$text bold="true" italic="true">[o]</$text></paragraph>' );
+
+			john.rename( 'heading1' );
+			kate.removeAttribute( 'bold' );
+
+			syncClients();
+
+			expectClients(
+				'<heading1>Fo<$text italic="true">o</$text></heading1>'
+			);
+		} );
+
+		it( 'remove attribute from text in other user\'s selection', () => {
+			john.setData( '<paragraph><$text bold="true">[Foo]</$text></paragraph>' );
+			kate.setData( '<paragraph><$text bold="true">[Foo]</$text></paragraph>' );
+
+			john.rename( 'heading1' );
+			kate.removeAttribute( 'bold' );
+
+			syncClients();
+
+			expectClients(
+				'<heading1>Foo</heading1>'
+			);
+		} );
 	} );
 } );

+ 74 - 69
packages/ckeditor5-engine/tests/model/operation/transform/insert.js

@@ -216,6 +216,21 @@ describe( 'transform', () => {
 				);
 			} );
 
+			it( 'text at different paths', () => {
+				john.setData( '<paragraph>[]Foo</paragraph><paragraph>Bar</paragraph>' );
+				kate.setData( '<paragraph>Foo</paragraph><paragraph>B[ar]</paragraph>' );
+
+				john.type( 'Abc' );
+				kate.move( [ 1, 0 ] );
+
+				syncClients();
+
+				expectClients(
+					'<paragraph>AbcFoo</paragraph>' +
+					'<paragraph>arB</paragraph>'
+				);
+			} );
+
 			it( 'text at same path', () => {
 				john.setData( '<paragraph>F[]oo Bar</paragraph>' );
 				kate.setData( '<paragraph>Foo B[ar]</paragraph>' );
@@ -254,7 +269,7 @@ describe( 'transform', () => {
 		} );
 
 		describe( 'by wrap', () => {
-			it( 'element in same path', () => {
+			it( 'element in same path #1', () => {
 				john.setData( '<paragraph>Foo Bar</paragraph>[]' );
 				kate.setData( '[<paragraph>Foo Bar</paragraph>]' );
 
@@ -271,7 +286,7 @@ describe( 'transform', () => {
 				);
 			} );
 
-			it( 'element in same path', () => {
+			it( 'element in same path #2', () => {
 				john.setData( '<paragraph>Foo[]</paragraph>' );
 				kate.setData( '[<paragraph>Foo</paragraph>]' );
 
@@ -287,7 +302,19 @@ describe( 'transform', () => {
 				);
 			} );
 
-			it( 'element in different paths', () => {
+			it( 'text in same path', () => {
+				john.setData( '<paragraph>Foo[]</paragraph>' );
+				kate.setData( '<paragraph>[Foo]</paragraph>' );
+
+				john.type( 'Bar' );
+				kate.wrap( 'div' );
+
+				syncClients();
+
+				expectClients( '<paragraph><div>Foo</div>Bar</paragraph>' );
+			} );
+
+			it( 'element in different paths #1', () => {
 				john.setData( '<paragraph>Foo</paragraph>[]<paragraph>Bar</paragraph>' );
 				kate.setData( '<paragraph>Foo</paragraph>[<paragraph>Bar</paragraph>]' );
 
@@ -305,7 +332,7 @@ describe( 'transform', () => {
 				);
 			} );
 
-			it( 'element in different paths', () => {
+			it( 'element in different paths #2', () => {
 				john.setData( '<paragraph>Foo</paragraph><paragraph>Bar[]</paragraph>' );
 				kate.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph>' );
 
@@ -322,6 +349,21 @@ describe( 'transform', () => {
 				);
 			} );
 
+			it( 'text in different paths', () => {
+				john.setData( '<paragraph>Foo[]</paragraph><paragraph>Bar</paragraph>' );
+				kate.setData( '<paragraph>Foo</paragraph><paragraph>[Bar]</paragraph>' );
+
+				john.type( 'Abc' );
+				kate.wrap( 'div' );
+
+				syncClients();
+
+				expectClients(
+					'<paragraph>FooAbc</paragraph>' +
+					'<paragraph><div>Bar</div></paragraph>'
+				);
+			} );
+
 			it( 'element, then unwrap and split', () => {
 				john.setData( '<paragraph>Foo[]</paragraph>' );
 				kate.setData( '[<paragraph>Foo</paragraph>]' );
@@ -449,6 +491,20 @@ describe( 'transform', () => {
 				);
 			} );
 
+			it( 'text in different path', () => {
+				john.setData( '<paragraph>Foo[]</paragraph><blockQuote><paragraph>Bar</paragraph></blockQuote>' );
+				kate.setData( '<paragraph>Foo</paragraph><blockQuote><paragraph>[Bar]</paragraph></blockQuote>' );
+
+				john.type( 'Abc' );
+				kate.unwrap();
+
+				syncClients();
+
+				expectClients(
+					'<paragraph>FooAbc</paragraph><blockQuote>Bar</blockQuote>'
+				);
+			} );
+
 			it( 'element in same path #1', () => {
 				john.setData( '<blockQuote><paragraph>Foo[]</paragraph></blockQuote>' );
 				kate.setData( '<blockQuote>[<paragraph>Foo</paragraph>]</blockQuote>' );
@@ -478,6 +534,20 @@ describe( 'transform', () => {
 				);
 			} );
 
+			it( 'text in same path', () => {
+				john.setData( '<blockQuote><paragraph>Foo[]</paragraph></blockQuote>' );
+				kate.setData( '<blockQuote><paragraph>[Foo]</paragraph></blockQuote>' );
+
+				john.type( ' Bar' );
+				kate.unwrap();
+
+				syncClients();
+
+				expectClients(
+					'<blockQuote>Foo Bar</blockQuote>'
+				);
+			} );
+
 			it( 'element, then insert text and move', () => {
 				john.setData( '<blockQuote>[]<paragraph>Foo</paragraph></blockQuote>' );
 				kate.setData( '<blockQuote>[]<paragraph>Foo</paragraph></blockQuote>' );
@@ -914,71 +984,6 @@ describe( 'transform', () => {
 			} );
 		} );
 
-		// This should be moved to attribute.js.
-		describe( 'by remove attribute', () => {
-			it( 'from element in different path', () => {
-				john.setData( '<paragraph>[]Foo</paragraph><paragraph bold="true">Bar</paragraph>' );
-				kate.setData( '<paragraph>Foo</paragraph>[<paragraph bold="true">Bar</paragraph>]' );
-
-				john.type( 'Abc' );
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients( '<paragraph>AbcFoo</paragraph><paragraph>Bar</paragraph>' );
-			} );
-
-			it( 'from text in different path', () => {
-				john.setData( '<paragraph>[]Foo</paragraph><paragraph><$text bold="true">Bar</$text></paragraph>' );
-				kate.setData( '<paragraph>Foo</paragraph><paragraph><$text bold="true">[Bar]</$text></paragraph>' );
-
-				john.type( 'Abc' );
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients( '<paragraph>AbcFoo</paragraph><paragraph>Bar</paragraph>' );
-			} );
-
-			it( 'from text in same path', () => {
-				john.setData( '<paragraph>[]Fo<$text bold="true">o</$text></paragraph>' );
-				kate.setData( '<paragraph>Fo<$text bold="true">[o]</$text></paragraph>' );
-
-				john.type( 'Bar' );
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients( '<paragraph>BarFoo</paragraph>' );
-			} );
-
-			it( 'from element in same path', () => {
-				john.setData( '<paragraph bold="true">[]Foo</paragraph>' );
-				kate.setData( '[<paragraph bold="true">Foo</paragraph>]' );
-
-				john.type( 'Bar' );
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients( '<paragraph>BarFoo</paragraph>' );
-			} );
-
-			it( 'from text with 2 attributes in same path', () => {
-				john.setData( '<paragraph>[]Fo<$text bold="true" italic="true">o</$text></paragraph>' );
-				kate.setData( '<paragraph>Fo<$text bold="true" italic="true">[o]</$text></paragraph>' );
-
-				john.type( 'Bar' );
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients(
-					'<paragraph>BarFo<$text italic="true">o</$text></paragraph>'
-				);
-			} );
-		} );
-
 		describe( 'by rename', () => {
 			it( 'element in different path', () => {
 				john.setData( '<paragraph>Foo</paragraph><paragraph>Bar</paragraph>[]' );

+ 0 - 93
packages/ckeditor5-engine/tests/model/operation/transform/marker.js

@@ -736,99 +736,6 @@ describe( 'transform', () => {
 			} );
 		} );
 
-		// Should be in attribute.js.
-		describe( 'by remove attribute', () => {
-			it( 'from element in different path', () => {
-				john.setData( '<paragraph>[Foo]</paragraph><paragraph bold="true">Bar</paragraph>' );
-				kate.setData( '<paragraph>Foo</paragraph>[<paragraph bold="true">Bar</paragraph>]' );
-
-				john.setMarker( 'm1' );
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients(
-					'<paragraph><m1:start></m1:start>Foo<m1:end></m1:end></paragraph>' +
-					'<paragraph>Bar</paragraph>'
-				);
-			} );
-
-			it( 'from text in different path', () => {
-				john.setData( '<paragraph>[Foo]</paragraph><paragraph><$text bold="true">Bar</$text></paragraph>' );
-				kate.setData( '<paragraph>Foo</paragraph><paragraph><$text bold="true">[Bar]</$text></paragraph>' );
-
-				john.setMarker( 'm1' );
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients(
-					'<paragraph><m1:start></m1:start>Foo<m1:end></m1:end></paragraph>' +
-					'<paragraph>Bar</paragraph>'
-				);
-			} );
-
-			it( 'from text in same path', () => {
-				john.setData( '<paragraph>[Fo]<$text bold="true">o</$text></paragraph>' );
-				kate.setData( '<paragraph>Fo<$text bold="true">[o]</$text></paragraph>' );
-
-				john.setMarker( 'm1' );
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients(
-					'<paragraph><m1:start></m1:start>Fo<m1:end></m1:end>o</paragraph>'
-				);
-			} );
-
-			it( 'from text in same path, then undo', () => {
-				john.setData( '<paragraph>[Fo]<$text bold="true">o</$text></paragraph>' );
-				kate.setData( '<paragraph>Fo<$text bold="true">[o]</$text></paragraph>' );
-
-				john.setMarker( 'm1' );
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				kate.undo();
-
-				syncClients();
-
-				expectClients(
-					'<paragraph><m1:start></m1:start>Fo<m1:end></m1:end><$text bold="true">o</$text></paragraph>'
-				);
-			} );
-
-			it( 'from text with 2 attributes in same path', () => {
-				john.setData( '<paragraph>[Fo]<$text bold="true" italic="true">o</$text></paragraph>' );
-				kate.setData( '<paragraph>Fo<$text bold="true" italic="true">[o]</$text></paragraph>' );
-
-				john.setMarker( 'm1' );
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients(
-					'<paragraph><m1:start></m1:start>Fo<m1:end></m1:end><$text italic="true">o</$text></paragraph>'
-				);
-			} );
-
-			it( 'from text in other user\'s selection', () => {
-				john.setData( '<paragraph><$text bold="true">[Foo]</$text></paragraph>' );
-				kate.setData( '<paragraph><$text bold="true">[Foo]</$text></paragraph>' );
-
-				john.setMarker( 'm1' );
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients(
-					'<paragraph><m1:start></m1:start>Foo<m1:end></m1:end></paragraph>'
-				);
-			} );
-		} );
-
 		describe( 'by merge', () => {
 			it( 'element into paragraph', () => {
 				john.setData( '<paragraph>[Foo]</paragraph><paragraph> Bar</paragraph>' );

+ 0 - 89
packages/ckeditor5-engine/tests/model/operation/transform/move.js

@@ -671,95 +671,6 @@ describe( 'transform', () => {
 			} );
 		} );
 
-		describe( 'by remove attribute', () => {
-			it( 'from element in different path', () => {
-				john.setData( '<paragraph>F[oo]</paragraph><paragraph bold="true">Bar</paragraph>' );
-				kate.setData( '<paragraph>Foo</paragraph>[<paragraph bold="true">Bar</paragraph>]' );
-
-				john.move( [ 1, 0 ] );
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients(
-					'<paragraph>F</paragraph>' +
-					'<paragraph>ooBar</paragraph>'
-				);
-			} );
-
-			it( 'from text in different path', () => {
-				john.setData( '<paragraph>F[oo]</paragraph><paragraph>Bar</paragraph>' );
-				kate.setData( '<paragraph>Foo</paragraph><paragraph>[Bar]</paragraph>' );
-
-				john.move( [ 1, 0 ] );
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients(
-					'<paragraph>F</paragraph>' +
-					'<paragraph>ooBar</paragraph>'
-				);
-			} );
-
-			it( 'from text in same path', () => {
-				john.setData( '<paragraph>[Fo]<$text bold="true">o</$text></paragraph>' );
-				kate.setData( '<paragraph>Fo<$text bold="true">[o]</$text></paragraph>' );
-
-				john.move( [ 0, 3 ] );
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients(
-					'<paragraph>oFo</paragraph>'
-				);
-			} );
-
-			it( 'from element in same path', () => {
-				john.setData( '<paragraph bold="true">[Fo]o</paragraph>' );
-				kate.setData( '[<paragraph bold="true">Foo</paragraph>]' );
-
-				john.move( [ 0, 3 ] );
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients(
-					'<paragraph>oFo</paragraph>'
-				);
-			} );
-
-			it( 'from text with 2 attributes in same path', () => {
-				john.setData( '<paragraph>[Fo]<$text bold="true" italic="true">o</$text></paragraph>' );
-				kate.setData( '<paragraph>Fo<$text bold="true" italic="true">[o]</$text></paragraph>' );
-
-				john.move( [ 0, 3 ] );
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients(
-					'<paragraph><$text italic="true">o</$text>Fo</paragraph>'
-				);
-			} );
-
-			it( 'from text in other user\'s selection', () => {
-				john.setData( '<paragraph><$text bold="true">[Foo]</$text></paragraph><paragraph></paragraph>' );
-				kate.setData( '<paragraph><$text bold="true">[Foo]</$text></paragraph><paragraph></paragraph>' );
-
-				john.move( [ 1, 0 ] );
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients(
-					'<paragraph></paragraph>' +
-					'<paragraph>Foo</paragraph>'
-				);
-			} );
-		} );
-
 		describe( 'by rename', () => {
 			it( 'element in different path #1', () => {
 				john.setData( '<paragraph>Foo</paragraph><paragraph>B[ar]</paragraph>' );

+ 0 - 88
packages/ckeditor5-engine/tests/model/operation/transform/remove.js

@@ -408,94 +408,6 @@ describe( 'transform', () => {
 			} );
 		} );
 
-		describe( 'by remove attribute', () => {
-			it( 'from element in different path', () => {
-				john.setData( '<paragraph>F[oo]</paragraph><paragraph bold="true">Bar</paragraph>' );
-				kate.setData( '<paragraph>Foo</paragraph>[<paragraph bold="true">Bar</paragraph>]' );
-
-				john.remove();
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients(
-					'<paragraph>F</paragraph>' +
-					'<paragraph>Bar</paragraph>'
-				);
-			} );
-
-			it( 'from text in different path', () => {
-				john.setData( '<paragraph>F[oo]</paragraph><paragraph><$text bold="true">Bar</$text></paragraph>' );
-				kate.setData( '<paragraph>Foo</paragraph><paragraph><$text bold="true">[Bar]</$text></paragraph>' );
-
-				john.remove();
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients(
-					'<paragraph>F</paragraph>' +
-					'<paragraph>Bar</paragraph>'
-				);
-			} );
-
-			it( 'from text in same path', () => {
-				john.setData( '<paragraph>[Fo]<$text bold="true">o</$text></paragraph>' );
-				kate.setData( '<paragraph>Fo<$text bold="true">[o]</$text></paragraph>' );
-
-				john.remove();
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients(
-					'<paragraph>o</paragraph>'
-				);
-			} );
-
-			it( 'from element in same path', () => {
-				john.setData( '<paragraph bold="true">[Fo]o</paragraph>' );
-				kate.setData( '[<paragraph bold="true">Foo</paragraph>]' );
-
-				john.remove();
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients(
-					'<paragraph>o</paragraph>'
-				);
-			} );
-
-			it( 'from text with 2 attributes in same path', () => {
-				john.setData( '<paragraph>[Fo]<$text bold="true" italic="true">o</$text></paragraph>' );
-				kate.setData( '<paragraph>Fo<$text bold="true" italic="true">[o]</$text></paragraph>' );
-
-				john.remove();
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients(
-					'<paragraph><$text italic="true">o</$text></paragraph>'
-				);
-			} );
-
-			it( 'from text in other user\'s selection', () => {
-				john.setData( '<paragraph><$text bold="true">[Foo]</$text></paragraph>' );
-				kate.setData( '<paragraph><$text bold="true">[Foo]</$text></paragraph>' );
-
-				john.remove();
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients(
-					'<paragraph></paragraph>'
-				);
-			} );
-		} );
-
 		describe( 'by merge', () => {
 			it( 'element into paragraph #1', () => {
 				john.setData( '<paragraph>F[oo]</paragraph><paragraph>Bar</paragraph>' );

+ 0 - 88
packages/ckeditor5-engine/tests/model/operation/transform/rename.js

@@ -15,94 +15,6 @@ describe( 'transform', () => {
 	} );
 
 	describe( 'rename', () => {
-		describe( 'by remove attribute', () => {
-			it( 'from element in different path', () => {
-				john.setData( '<paragraph>F[]oo</paragraph><paragraph bold="true">Bar</paragraph>' );
-				kate.setData( '<paragraph>Foo</paragraph>[<paragraph bold="true">Bar</paragraph>]' );
-
-				john.rename( 'heading1' );
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients(
-					'<heading1>Foo</heading1>' +
-					'<paragraph>Bar</paragraph>'
-				);
-			} );
-
-			it( 'from text in different path', () => {
-				john.setData( '<paragraph>F[]oo</paragraph><paragraph>Bar</paragraph>' );
-				kate.setData( '<paragraph>Foo</paragraph><paragraph>[Bar]</paragraph>' );
-
-				john.rename( 'heading1' );
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients(
-					'<heading1>Foo</heading1>' +
-					'<paragraph>Bar</paragraph>'
-				);
-			} );
-
-			it( 'from text in same path', () => {
-				john.setData( '<paragraph>F[]o<$text bold="true">o</$text></paragraph>' );
-				kate.setData( '<paragraph>Fo<$text bold="true">[o]</$text></paragraph>' );
-
-				john.rename( 'heading1' );
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients(
-					'<heading1>Foo</heading1>'
-				);
-			} );
-
-			it( 'from element in same path', () => {
-				john.setData( '<paragraph bold="true">F[]oo</paragraph>' );
-				kate.setData( '[<paragraph bold="true">Foo</paragraph>]' );
-
-				john.rename( 'heading1' );
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients(
-					'<heading1>Foo</heading1>'
-				);
-			} );
-
-			it( 'from text with 2 attributes in same path', () => {
-				john.setData( '<paragraph>F[o]<$text bold="true" italic="true">o</$text></paragraph>' );
-				kate.setData( '<paragraph>Fo<$text bold="true" italic="true">[o]</$text></paragraph>' );
-
-				john.rename( 'heading1' );
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients(
-					'<heading1>Fo<$text italic="true">o</$text></heading1>'
-				);
-			} );
-
-			it( 'from text in other user\'s selection', () => {
-				john.setData( '<paragraph><$text bold="true">[Foo]</$text></paragraph>' );
-				kate.setData( '<paragraph><$text bold="true">[Foo]</$text></paragraph>' );
-
-				john.rename( 'heading1' );
-				kate.removeAttribute( 'bold' );
-
-				syncClients();
-
-				expectClients(
-					'<heading1>Foo</heading1>'
-				);
-			} );
-		} );
-
 		describe( 'by rename', () => {
 			it( 'elements in different paths #1', () => {
 				john.setData( '<paragraph>[]Foo</paragraph><paragraph>Bar</paragraph>' );