8
0
Quellcode durchsuchen

More tests for BuildModelConverter, model to view converters and ModelConversionDispatcher.

Szymon Kupś vor 8 Jahren
Ursprung
Commit
982bbf7531

+ 29 - 2
packages/ckeditor5-engine/tests/conversion/buildmodelconverter.js

@@ -361,7 +361,7 @@ describe( 'Model converter builder', () => {
 		it( 'using passed virtual selection descriptor object', () => {
 			buildModelConverter().for( dispatcher ).fromMarker( 'search' ).toVirtualSelection( {
 				class: 'virtual-selection',
-				priority: 1,
+				priority: 3,
 				attributes: { title: 'marker' }
 			} );
 
@@ -376,6 +376,8 @@ describe( 'Model converter builder', () => {
 					'</p>' +
 				'</div>' );
 
+			expect( viewRoot.getChild( 0 ).getChild( 1 ).priority ).to.equal( 3 );
+
 			dispatcher.convertMarker(
 				'removeMarker', 'search', ModelRange.createFromParentsAndOffsets( modelElement, 2, modelElement, 4 )
 			);
@@ -401,6 +403,8 @@ describe( 'Model converter builder', () => {
 					'</p>' +
 				'</div>' );
 
+			expect( viewRoot.getChild( 0 ).getChild( 1 ).priority ).to.equal( 12 );
+
 			dispatcher.convertMarker(
 				'removeMarker', 'search', ModelRange.createFromParentsAndOffsets( modelElement, 2, modelElement, 4 )
 			);
@@ -409,7 +413,9 @@ describe( 'Model converter builder', () => {
 		} );
 
 		it( 'should do nothing when marker range is collapsed', () => {
-			buildModelConverter().for( dispatcher ).fromMarker( 'search' ).toElement( 'strong' );
+			buildModelConverter().for( dispatcher ).fromMarker( 'search' ).toVirtualSelection( {
+				class: 'virtual-selection'
+			} );
 
 			dispatcher.convertMarker( 'addMarker', 'search', ModelRange.createFromParentsAndOffsets( modelElement, 2, modelElement, 2 ) );
 
@@ -421,6 +427,27 @@ describe( 'Model converter builder', () => {
 
 			expect( viewToString( viewRoot ) ).to.equal( '<div><p>foobar</p></div>' );
 		} );
+
+		it( 'should create converters with provided priority', () => {
+			buildModelConverter().for( dispatcher ).fromMarker( 'search' ).toVirtualSelection( {
+				class: 'virtual-selection'
+			} );
+
+			buildModelConverter().for( dispatcher ).fromMarker( 'search' ).withPriority( 'high' ).toVirtualSelection( {
+				class: 'override'
+			} );
+
+			dispatcher.convertMarker( 'addMarker', 'search', ModelRange.createFromParentsAndOffsets( modelElement, 2, modelElement, 4 ) );
+
+			expect( viewToString( viewRoot ) ).to.equal(
+				'<div>' +
+					'<p>' +
+						'fo' +
+						'<span class="override">ob</span>' +
+						'ar' +
+					'</p>' +
+				'</div>' );
+		} );
 	} );
 
 	describe( 'model marker to view stamp conversion', () => {

+ 208 - 1
packages/ckeditor5-engine/tests/conversion/model-to-view-converters.js

@@ -27,7 +27,9 @@ import {
 	wrapItem,
 	unwrapItem,
 	remove,
-	removeUIElement
+	removeUIElement,
+	markerToVirtualSelection,
+	virtualSelectionDescriptorToAttribute
 } from '../../src/conversion/model-to-view-converters';
 
 import { createRangeOnElementOnly } from '../../tests/model/_utils/utils';
@@ -79,6 +81,145 @@ describe( 'model-to-view-converters', () => {
 		return result;
 	}
 
+	describe( 'markerToVirtualSelection()', () => {
+		let modelElement1, modelElement2, markerRange;
+		const virtualSelectionDescriptor = {
+			class: 'marker-class',
+			priority: 7,
+			attributes: { title: 'title' }
+		};
+
+		beforeEach( () => {
+			const modelText1 = new ModelText( 'foo' );
+			modelElement1 = new ModelElement( 'paragraph', null, modelText1 );
+			const modelText2 = new ModelText( 'bar' );
+			modelElement2 = new ModelElement( 'paragraph', null, modelText2 );
+
+			modelRoot.appendChildren( modelElement1 );
+			modelRoot.appendChildren( modelElement2 );
+			dispatcher.on( 'insert:paragraph', insertElement( () => new ViewContainerElement( 'p' ) ) );
+			dispatcher.on( 'insert:$text', insertText() );
+
+			markerRange = ModelRange.createIn( modelRoot );
+		} );
+
+		it( 'should wrap and unwrap text nodes', () => {
+			dispatcher.on( 'addMarker:marker', markerToVirtualSelection( virtualSelectionDescriptor ) );
+			dispatcher.on( 'removeMarker:marker', markerToVirtualSelection( virtualSelectionDescriptor ) );
+			dispatcher.convertInsertion( markerRange );
+
+			modelDoc.markers.set( 'marker', markerRange );
+			dispatcher.convertMarker( 'addMarker', 'marker', markerRange );
+
+			expect( viewToString( viewRoot ) ).to.equal(
+				'<div>' +
+					'<p>' +
+						'<span class="marker-class" title="title">foo</span>' +
+					'</p>' +
+					'<p>' +
+						'<span class="marker-class" title="title">bar</span>' +
+					'</p>' +
+				'</div>'
+			);
+
+			dispatcher.convertMarker( 'removeMarker', 'marker', markerRange );
+
+			expect( viewToString( viewRoot ) ).to.equal( '<div><p>foo</p><p>bar</p></div>' );
+		} );
+
+		it( 'should use setVirtualSelection and removeVirtualSelection on elements and not convert children nodes', () => {
+			dispatcher.on( 'addMarker:marker', markerToVirtualSelection( virtualSelectionDescriptor ) );
+			dispatcher.on( 'removeMarker:marker', markerToVirtualSelection( virtualSelectionDescriptor ) );
+			dispatcher.on( 'insert:paragraph', insertElement( () => {
+				const element = new ViewContainerElement( 'p' );
+
+				element.setVirtualSelection = descriptor => {
+					element.addClass( 'virtual-selection-own-class' );
+
+					expect( descriptor ).to.equal( virtualSelectionDescriptor );
+				};
+
+				element.removeVirtualSelection = descriptor => {
+					element.removeClass( 'virtual-selection-own-class' );
+
+					expect( descriptor ).to.equal( virtualSelectionDescriptor );
+				};
+
+				return element;
+			} ), { priority: 'high' } );
+
+			dispatcher.convertInsertion( markerRange );
+			modelDoc.markers.set( 'marker', markerRange );
+			dispatcher.convertMarker( 'addMarker', 'marker', markerRange );
+
+			expect( viewToString( viewRoot ) ).to.equal(
+				'<div>' +
+					'<p class="virtual-selection-own-class">' +
+						'foo' +
+					'</p>' +
+					'<p class="virtual-selection-own-class">' +
+						'bar' +
+					'</p>' +
+				'</div>'
+			);
+
+			dispatcher.convertMarker( 'removeMarker', 'marker', markerRange );
+
+			expect( viewToString( viewRoot ) ).to.equal( '<div><p>foo</p><p>bar</p></div>' );
+		} );
+
+		it( 'should not convert marker on elements already consumed', () => {
+			const newDescriptor = { class: 'override-class' };
+
+			dispatcher.on( 'addMarker:marker', markerToVirtualSelection( virtualSelectionDescriptor ) );
+			dispatcher.on( 'removeMarker:marker', markerToVirtualSelection( virtualSelectionDescriptor ) );
+
+			dispatcher.on( 'addMarker:marker', markerToVirtualSelection( newDescriptor ), { priority: 'high' } );
+			dispatcher.on( 'removeMarker:marker', markerToVirtualSelection( newDescriptor ), { priority: 'high' } );
+
+			dispatcher.on( 'insert:paragraph', insertElement( () => {
+				const element = new ViewContainerElement( 'p' );
+				element.setVirtualSelection = data => element.addClass( data.class );
+				element.removeVirtualSelection = data => element.removeClass( data.class );
+
+				return element;
+			} ), { priority: 'high' } );
+
+			dispatcher.convertInsertion( markerRange );
+			modelDoc.markers.set( 'marker', markerRange );
+			dispatcher.convertMarker( 'addMarker', 'marker', markerRange );
+
+			expect( viewToString( viewRoot ) ).to.equal(
+				'<div>' +
+					'<p class="override-class">' +
+						'foo' +
+					'</p>' +
+					'<p class="override-class">' +
+						'bar' +
+					'</p>' +
+				'</div>'
+			);
+
+			dispatcher.convertMarker( 'removeMarker', 'marker', markerRange );
+
+			expect( viewToString( viewRoot ) ).to.equal( '<div><p>foo</p><p>bar</p></div>' );
+		} );
+
+		it( 'should do nothing if descriptor is not provided', () => {
+			dispatcher.on( 'addMarker:marker', markerToVirtualSelection( () => null ) );
+			dispatcher.on( 'removeMarker:marker', markerToVirtualSelection( () => null ) );
+
+			dispatcher.convertInsertion( markerRange );
+
+			modelDoc.markers.set( 'marker', markerRange );
+			dispatcher.convertMarker( 'addMarker', 'marker', markerRange );
+
+			expect( viewToString( viewRoot ) ).to.equal( '<div><p>foo</p><p>bar</p></div>' );
+			dispatcher.convertMarker( 'removeMarker', 'marker', markerRange );
+			expect( viewToString( viewRoot ) ).to.equal( '<div><p>foo</p><p>bar</p></div>' );
+		} );
+	} );
+
 	describe( 'insertText', () => {
 		it( 'should convert text insertion in model to view text', () => {
 			modelRoot.appendChildren( new ModelText( 'foobar' ) );
@@ -895,4 +1036,70 @@ describe( 'model-to-view-converters', () => {
 			expect( mapper.toViewElement( modelWElement ) ).to.be.undefined;
 		} );
 	} );
+
+	describe( 'virtualSelectionDescriptorToAttribute()', () => {
+		it( 'should return attribute element from descriptor object', () => {
+			const descriptor = {
+				class: 'foo-class',
+				attributes: { one: 1, two: 2 },
+				priority: 7,
+			};
+			const element = virtualSelectionDescriptorToAttribute( descriptor );
+
+			expect( element.is( 'attributeElement' ) ).to.be.true;
+			expect( element.name ).to.equal( 'span' );
+			expect( element.priority ).to.equal( 7 );
+			expect( element.hasClass( 'foo-class' ) ).to.be.true;
+
+			for ( const key of Object.keys( descriptor.attributes ) ) {
+				expect( element.getAttribute( key ) ).to.equal( descriptor.attributes[ key ] );
+			}
+		} );
+
+		it( 'should create element without class', () => {
+			const descriptor = {
+				attributes: { one: 1, two: 2 },
+				priority: 7,
+			};
+			const element = virtualSelectionDescriptorToAttribute( descriptor );
+
+			expect( element.is( 'attributeElement' ) ).to.be.true;
+			expect( element.name ).to.equal( 'span' );
+			expect( element.priority ).to.equal( 7 );
+
+			for ( const key of Object.keys( descriptor.attributes ) ) {
+				expect( element.getAttribute( key ) ).to.equal( descriptor.attributes[ key ] );
+			}
+		} );
+
+		it( 'should create element without priority', () => {
+			const descriptor = {
+				class: 'foo-class',
+				attributes: { one: 1, two: 2 },
+			};
+			const element = virtualSelectionDescriptorToAttribute( descriptor );
+
+			expect( element.is( 'attributeElement' ) ).to.be.true;
+			expect( element.name ).to.equal( 'span' );
+			expect( element.priority ).to.equal( 10 );
+			expect( element.hasClass( 'foo-class' ) ).to.be.true;
+
+			for ( const key of Object.keys( descriptor.attributes ) ) {
+				expect( element.getAttribute( key ) ).to.equal( descriptor.attributes[ key ] );
+			}
+		} );
+
+		it( 'should create element without attributes', () => {
+			const descriptor = {
+				class: 'foo-class',
+				priority: 7
+			};
+			const element = virtualSelectionDescriptorToAttribute( descriptor );
+
+			expect( element.is( 'attributeElement' ) ).to.be.true;
+			expect( element.name ).to.equal( 'span' );
+			expect( element.priority ).to.equal( 7 );
+			expect( element.hasClass( 'foo-class' ) ).to.be.true;
+		} );
+	} );
 } );

+ 4 - 0
packages/ckeditor5-engine/tests/conversion/modelconversiondispatcher.js

@@ -654,6 +654,10 @@ describe( 'ModelConversionDispatcher', () => {
 			dispatcher.convertMarker( 'removeMarker', 'name', range );
 		} );
 
+		it( 'should fire conversion for each item in the range', () => {
+			expect( true ).to.be.false;
+		} );
+
 		it( 'should not fire conversion for each item in marker\'s range if whole marker conversion was performed', () => {
 			const spy = sinon.spy( ( evt, data, consumable ) => {
 				if ( !data.item ) {