浏览代码

Fixed conversion tests.

Oskar Wróbel 8 年之前
父节点
当前提交
757ef4bf83

+ 29 - 24
packages/ckeditor5-engine/tests/conversion/advanced-converters.js

@@ -3,13 +3,15 @@
  * For licensing, see LICENSE.md.
  */
 
-import ModelDocument from '../../src/model/document';
+import Model from '../../src/model/model';
 import ModelElement from '../../src/model/element';
 import ModelText from '../../src/model/text';
 import ModelTextProxy from '../../src/model/textproxy';
 import ModelRange from '../../src/model/range';
 import ModelPosition from '../../src/model/position';
 import ModelWalker from '../../src/model/treewalker';
+import ModelWriter from '../../src/model/writer';
+import Batch from '../../src/model/batch';
 
 import ViewElement from '../../src/view/element';
 import ViewContainerElement from '../../src/view/containerelement';
@@ -38,25 +40,28 @@ import { convertToModelFragment, convertText } from '../../src/conversion/view-t
 import { createRangeOnElementOnly } from '../../tests/model/_utils/utils';
 
 describe( 'advanced-converters', () => {
-	let modelDoc, modelRoot, viewRoot, mapper, modelDispatcher, viewDispatcher, batch;
+	let model, modelDoc, modelRoot, viewRoot, mapper, modelDispatcher, viewDispatcher, modelWriter;
 
 	beforeEach( () => {
-		modelDoc = new ModelDocument();
+		model = new Model();
+		modelDoc = model.document;
 		modelRoot = modelDoc.createRoot();
 		viewRoot = new ViewContainerElement( 'div' );
-		batch = modelDoc.batch();
 
 		mapper = new Mapper();
 		mapper.bindElements( modelRoot, viewRoot );
 
-		modelDispatcher = new ModelConversionDispatcher( modelDoc, { mapper } );
+		modelDispatcher = new ModelConversionDispatcher( model, { mapper } );
 		// Schema is mocked up because we don't care about it in those tests.
-		viewDispatcher = new ViewConversionDispatcher( { schema: { check: () => true } } );
+		viewDispatcher = new ViewConversionDispatcher( model, { schema: { check: () => true } } );
 
 		modelDispatcher.on( 'insert:$text', insertText() );
 		modelDispatcher.on( 'remove', remove() );
 		viewDispatcher.on( 'text', convertText() );
 		viewDispatcher.on( 'documentFragment', convertToModelFragment() );
+
+		// We need to create a model writer to modify model tree in tests.
+		modelWriter = new ModelWriter( model, new Batch() );
 	} );
 
 	function viewAttributesToString( item ) {
@@ -217,16 +222,16 @@ describe( 'advanced-converters', () => {
 
 			const viewImageConverter = function( evt, data, consumable, conversionApi ) {
 				if ( consumable.consume( data.input, { name: true } ) ) {
-					data.output = conversionApi.batch.createElement( 'image', data.input.getAttributes() );
+					data.output = conversionApi.writer.createElement( 'image', data.input.getAttributes() );
 				}
 			};
 
 			const viewFigcaptionConverter = function( evt, data, consumable, conversionApi ) {
 				if ( consumable.consume( data.input, { name: true } ) ) {
-					const modelCaption = conversionApi.batch.createElement( 'caption' );
+					const modelCaption = conversionApi.writer.createElement( 'caption' );
 					const children = conversionApi.convertChildren( data.input, consumable );
 
-					conversionApi.batch.append( children, modelCaption );
+					conversionApi.writer.append( children, modelCaption );
 
 					data.output = modelCaption;
 				}
@@ -242,14 +247,14 @@ describe( 'advanced-converters', () => {
 		} );
 
 		it( 'should convert model images changes without caption to view', () => {
-			const modelElement = batch.createElement( 'image', { src: 'bar.jpg', title: 'bar' } );
-			batch.append( modelElement, modelRoot );
+			const modelElement = new ModelElement( 'image', { src: 'bar.jpg', title: 'bar' } );
+			modelRoot.appendChildren( modelElement );
 			modelDispatcher.convertInsertion( ModelRange.createIn( modelRoot ) );
 
 			expect( viewToString( viewRoot ) ).to.equal( '<div><img src="bar.jpg" title="bar"></img></div>' );
 
-			batch.setAttribute( 'src', 'new.jpg', modelElement );
-			batch.removeAttribute( 'title', modelElement );
+			modelElement.setAttribute( 'src', 'new.jpg' );
+			modelElement.removeAttribute( 'title' );
 			modelDispatcher.convertAttribute( 'changeAttribute', createRangeOnElementOnly( modelElement ), 'src', 'bar.jpg', 'new.jpg' );
 			modelDispatcher.convertAttribute( 'removeAttribute', createRangeOnElementOnly( modelElement ), 'title', 'bar', null );
 
@@ -260,7 +265,7 @@ describe( 'advanced-converters', () => {
 			const modelElement = new ModelElement( 'image', { src: 'foo.jpg', title: 'foo' }, [
 				new ModelElement( 'caption', {}, new ModelText( 'foobar' ) )
 			] );
-			modelRoot.appendChildren( modelElement );
+			modelRoot.appendChildren( [ modelElement ] );
 			modelDispatcher.convertInsertion( ModelRange.createIn( modelRoot ) );
 
 			expect( viewToString( viewRoot ) ).to.equal(
@@ -279,7 +284,7 @@ describe( 'advanced-converters', () => {
 
 		it( 'should convert view image to model', () => {
 			const viewElement = new ViewContainerElement( 'img', { src: 'bar.jpg', title: 'bar' } );
-			const modelElement = viewDispatcher.convert( viewElement, batch );
+			const modelElement = viewDispatcher.convert( viewElement );
 
 			expect( modelToString( modelElement ) ).to.equal( '<image src="bar.jpg" title="bar"></image>' );
 		} );
@@ -293,7 +298,7 @@ describe( 'advanced-converters', () => {
 					new ViewContainerElement( 'figcaption', null, new ViewText( 'foobar' ) )
 				]
 			);
-			const modelElement = viewDispatcher.convert( viewElement, batch );
+			const modelElement = viewDispatcher.convert( viewElement );
 
 			expect( modelToString( modelElement ) ).to.equal( '<image src="bar.jpg" title="bar"><caption>foobar</caption></image>' );
 		} );
@@ -478,7 +483,7 @@ describe( 'advanced-converters', () => {
 			expect( viewToString( viewRoot ) ).to.equal( '<div><a href="foo.html" title="Foo title">foo</a></div>' );
 
 			// Let's change link's attributes.
-			batch.setAttributes( {
+			modelWriter.setAttributes( {
 				linkHref: 'bar.html',
 				linkTitle: 'Bar title'
 			}, range );
@@ -487,7 +492,7 @@ describe( 'advanced-converters', () => {
 
 			expect( viewToString( viewRoot ) ).to.equal( '<div><a href="bar.html" title="Bar title">foo</a></div>' );
 
-			batch.remove( ModelRange.createFromParentsAndOffsets( modelRoot, 0, modelRoot, 1 ) );
+			modelWriter.remove( ModelRange.createFromParentsAndOffsets( modelRoot, 0, modelRoot, 1 ) );
 			modelDispatcher.convertRemove(
 				ModelPosition.createFromParentAndOffset( modelRoot, 0 ),
 				ModelRange.createIn( modelDoc.graveyard )
@@ -498,13 +503,13 @@ describe( 'advanced-converters', () => {
 			range = ModelRange.createIn( modelRoot );
 
 			// Let's remove just one attribute.
-			batch.removeAttribute( 'linkTitle', range );
+			modelWriter.removeAttribute( 'linkTitle', range );
 			modelDispatcher.convertAttribute( 'removeAttribute', range, 'linkTitle', 'Bar title', null );
 
 			expect( viewToString( viewRoot ) ).to.equal( '<div><a href="bar.html">oo</a></div>' );
 
 			// Let's remove the other attribute.
-			batch.removeAttribute( 'linkHref', range );
+			modelWriter.removeAttribute( 'linkHref', range );
 			modelDispatcher.convertAttribute( 'removeAttribute', range, 'linkHref', 'bar.html', null );
 
 			expect( viewToString( viewRoot ) ).to.equal( '<div>oo</div>' );
@@ -513,7 +518,7 @@ describe( 'advanced-converters', () => {
 		it( 'should convert a view element to model', () => {
 			const viewElement = new ViewAttributeElement( 'a', { href: 'foo.html', title: 'Foo title' }, new ViewText( 'foo' ) );
 
-			const modelText = viewDispatcher.convert( viewElement, batch ).getChild( 0 );
+			const modelText = viewDispatcher.convert( viewElement ).getChild( 0 );
 
 			expect( modelText ).to.be.instanceof( ModelText );
 			expect( modelText.data ).to.equal( 'foo' );
@@ -584,7 +589,7 @@ describe( 'advanced-converters', () => {
 				]
 			);
 
-			const modelElement = viewDispatcher.convert( viewElement, batch );
+			const modelElement = viewDispatcher.convert( viewElement );
 
 			expect( modelToString( modelElement ) ).to.equal( '<quote linkHref="foo.html" linkTitle="Foo source">foo</quote>' );
 		} );
@@ -647,7 +652,7 @@ describe( 'advanced-converters', () => {
 			] )
 		] );
 
-		expect( modelToString( viewDispatcher.convert( viewTable, batch ) ) )
+		expect( modelToString( viewDispatcher.convert( viewTable ) ) )
 			.to.equal( '<paragraph>foo <$text linkHref="bar.html">bar</$text></paragraph><paragraph>abc</paragraph>' );
 	} );
 
@@ -746,7 +751,7 @@ describe( 'advanced-converters', () => {
 				] )
 			] );
 
-			const modelElement = viewDispatcher.convert( viewElement, batch );
+			const modelElement = viewDispatcher.convert( viewElement );
 
 			expect( modelToString( modelElement ) ).to.equal(
 				'<table cellpadding="5" cellspacing="5">' +

+ 9 - 10
packages/ckeditor5-engine/tests/conversion/buildmodelconverter.js

@@ -5,7 +5,7 @@
 
 import buildModelConverter from '../../src/conversion/buildmodelconverter';
 
-import ModelDocument from '../../src/model/document';
+import Model from '../../src/model/model';
 import ModelElement from '../../src/model/element';
 import ModelText from '../../src/model/text';
 import ModelRange from '../../src/model/range';
@@ -69,14 +69,13 @@ function viewToString( item ) {
 }
 
 describe( 'Model converter builder', () => {
-	let dispatcher, mapper, modelDoc, modelRoot, viewDoc, viewRoot, viewSelection, batch;
+	let dispatcher, mapper, modelDoc, modelRoot, viewDoc, viewRoot, viewSelection, model;
 
 	beforeEach( () => {
-		modelDoc = new ModelDocument();
+		model = new Model();
+		modelDoc = model.document;
 		modelRoot = modelDoc.createRoot( 'root', 'root' );
 
-		batch = modelDoc.batch();
-
 		viewDoc = new ViewDocument();
 		viewRoot = viewDoc.createRoot( 'div' );
 		viewSelection = viewDoc.selection;
@@ -84,7 +83,7 @@ describe( 'Model converter builder', () => {
 		mapper = new Mapper();
 		mapper.bindElements( modelRoot, viewRoot );
 
-		dispatcher = new ModelConversionDispatcher( modelDoc, { mapper, viewSelection } );
+		dispatcher = new ModelConversionDispatcher( model, { mapper, viewSelection } );
 
 		dispatcher.on( 'insert:$text', insertText() );
 		dispatcher.on( 'remove', remove() );
@@ -146,7 +145,7 @@ describe( 'Model converter builder', () => {
 
 			expect( viewToString( viewRoot ) ).to.equal( '<div><strong>foo</strong></div>' );
 
-			batch.removeAttribute( 'bold', modelRoot );
+			modelRoot.removeAttribute( 'bold' );
 
 			dispatcher.convertAttribute( 'removeAttribute', ModelRange.createIn( modelRoot ), 'bold', true, null );
 
@@ -163,7 +162,7 @@ describe( 'Model converter builder', () => {
 
 			expect( viewToString( viewRoot ) ).to.equal( '<div><strong>foo</strong></div>' );
 
-			batch.removeAttribute( 'bold', modelRoot );
+			modelRoot.removeAttribute( 'bold' );
 
 			dispatcher.convertAttribute( 'removeAttribute', ModelRange.createIn( modelRoot ), 'bold', true, null );
 
@@ -180,13 +179,13 @@ describe( 'Model converter builder', () => {
 
 			expect( viewToString( viewRoot ) ).to.equal( '<div><em>foo</em></div>' );
 
-			batch.setAttribute( 'italic', 'i', modelRoot );
+			modelRoot.setAttribute( 'italic', 'i' );
 
 			dispatcher.convertAttribute( 'changeAttribute', ModelRange.createIn( modelRoot ), 'italic', 'em', 'i' );
 
 			expect( viewToString( viewRoot ) ).to.equal( '<div><i>foo</i></div>' );
 
-			batch.removeAttribute( 'italic', modelRoot );
+			modelRoot.removeAttribute( 'italic' );
 
 			dispatcher.convertAttribute( 'removeAttribute', ModelRange.createIn( modelRoot ), 'italic', 'i', null );
 

+ 32 - 37
packages/ckeditor5-engine/tests/conversion/buildviewconverter.js

@@ -5,8 +5,8 @@
 
 import buildViewConverter from '../../src/conversion/buildviewconverter';
 
+import Model from '../../src/model/model';
 import ModelSchema from '../../src/model/schema';
-import ModelDocument from '../../src/model/document';
 import ModelDocumentFragment from '../../src/model/documentfragment';
 import ModelElement from '../../src/model/element';
 import ModelTextProxy from '../../src/model/textproxy';
@@ -64,13 +64,11 @@ const textAttributes = [ undefined, 'linkHref', 'linkTitle', 'bold', 'italic', '
 const pAttributes = [ undefined, 'class', 'important', 'theme', 'decorated', 'size' ];
 
 describe( 'View converter builder', () => {
-	let dispatcher, schema, additionalData, batch;
+	let dispatcher, schema, additionalData;
 
-	const modelDocument = new ModelDocument();
+	const model = new Model();
 
 	beforeEach( () => {
-		batch = modelDocument.batch();
-
 		// `additionalData` parameter for `.convert` calls.
 		additionalData = { context: [ '$root' ] };
 
@@ -93,14 +91,14 @@ describe( 'View converter builder', () => {
 		schema.allow( { name: 'span', attributes: [ 'transformer' ], inside: '$root' } );
 		schema.allow( { name: 'div', attributes: [ 'class' ], inside: '$root' } );
 
-		dispatcher = new ViewConversionDispatcher( { schema } );
+		dispatcher = new ViewConversionDispatcher( model, { schema } );
 		dispatcher.on( 'text', convertText() );
 	} );
 
 	it( 'should convert from view element to model element', () => {
 		buildViewConverter().for( dispatcher ).fromElement( 'p' ).toElement( 'paragraph' );
 
-		const conversionResult = dispatcher.convert( new ViewContainerElement( 'p', null, new ViewText( 'foo' ) ), batch, additionalData );
+		const conversionResult = dispatcher.convert( new ViewContainerElement( 'p', null, new ViewText( 'foo' ) ), additionalData );
 
 		expect( modelToString( conversionResult ) ).to.equal( '<paragraph>foo</paragraph>' );
 	} );
@@ -110,7 +108,7 @@ describe( 'View converter builder', () => {
 			.fromElement( 'img' )
 			.toElement( viewElement => new ModelElement( 'image', { src: viewElement.getAttribute( 'src' ) } ) );
 
-		const conversionResult = dispatcher.convert( new ViewContainerElement( 'img', { src: 'foo.jpg' } ), batch, additionalData );
+		const conversionResult = dispatcher.convert( new ViewContainerElement( 'img', { src: 'foo.jpg' } ), additionalData );
 
 		expect( modelToString( conversionResult ) ).to.equal( '<image src="foo.jpg"></image>' );
 	} );
@@ -119,7 +117,7 @@ describe( 'View converter builder', () => {
 		buildViewConverter().for( dispatcher ).fromElement( 'strong' ).toAttribute( 'bold', true );
 
 		const conversionResult = dispatcher.convert(
-			new ViewAttributeElement( 'strong', null, new ViewText( 'foo' ) ), batch, additionalData
+			new ViewAttributeElement( 'strong', null, new ViewText( 'foo' ) ), additionalData
 		);
 
 		// Have to check root because result is a ModelText.
@@ -132,7 +130,7 @@ describe( 'View converter builder', () => {
 			.toAttribute( viewElement => ( { key: 'linkHref', value: viewElement.getAttribute( 'href' ) } ) );
 
 		const conversionResult = dispatcher.convert(
-			new ViewAttributeElement( 'a', { href: 'foo.html' }, new ViewText( 'foo' ) ), batch, additionalData
+			new ViewAttributeElement( 'a', { href: 'foo.html' }, new ViewText( 'foo' ) ), additionalData
 		);
 
 		// Have to check root because result is a ModelText.
@@ -147,7 +145,7 @@ describe( 'View converter builder', () => {
 			.toAttribute( viewElement => ( { key: 'class', value: viewElement.getAttribute( 'class' ) } ) );
 
 		const conversionResult = dispatcher.convert(
-			new ViewContainerElement( 'p', { class: 'myClass' }, new ViewText( 'foo' ) ), batch, additionalData
+			new ViewContainerElement( 'p', { class: 'myClass' }, new ViewText( 'foo' ) ), additionalData
 		);
 
 		expect( modelToString( conversionResult ) ).to.equal( '<paragraph class="myClass">foo</paragraph>' );
@@ -169,7 +167,7 @@ describe( 'View converter builder', () => {
 			new ViewContainerElement( 'p', { 'data-type': 'foo' }, new ViewText( 'xyz' ) )
 		] );
 
-		const conversionResult = dispatcher.convert( viewStructure, batch, additionalData );
+		const conversionResult = dispatcher.convert( viewStructure, additionalData );
 
 		expect( modelToString( conversionResult ) ).to.equal(
 			'<paragraph important="true">foo</paragraph>' +
@@ -195,7 +193,7 @@ describe( 'View converter builder', () => {
 			new ViewContainerElement( 'span', { style: 'font-weight:bold; font-size:20px' }, new ViewText( 'ddd' ) )
 		] );
 
-		const conversionResult = dispatcher.convert( viewElement, batch, additionalData );
+		const conversionResult = dispatcher.convert( viewElement, additionalData );
 
 		expect( modelToString( conversionResult ) ).to.equal( '<paragraph><$text bold="true">aaabbbcccddd</$text></paragraph>' );
 	} );
@@ -212,7 +210,7 @@ describe( 'View converter builder', () => {
 			new ViewText( 'r' )
 		] );
 
-		const conversionResult = dispatcher.convert( viewElement, batch, additionalData );
+		const conversionResult = dispatcher.convert( viewElement, additionalData );
 
 		const markerSearch = conversionResult.markers.get( 'search' );
 
@@ -234,7 +232,7 @@ describe( 'View converter builder', () => {
 			new ViewText( 'r' )
 		] );
 
-		const conversionResult = dispatcher.convert( viewElement, batch, additionalData );
+		const conversionResult = dispatcher.convert( viewElement, additionalData );
 
 		const markerSearch = conversionResult.markers.get( 'search' );
 
@@ -260,7 +258,7 @@ describe( 'View converter builder', () => {
 			new ViewText( 'r' )
 		] );
 
-		const conversionResult = dispatcher.convert( viewElement, batch, additionalData );
+		const conversionResult = dispatcher.convert( viewElement, additionalData );
 
 		const marker1 = conversionResult.markers.get( 'marker1' );
 		const marker2 = conversionResult.markers.get( 'marker2' );
@@ -277,7 +275,7 @@ describe( 'View converter builder', () => {
 
 		const element = new ViewAttributeElement( 'span' );
 
-		const result = dispatcher.convert( element, batch, additionalData );
+		const result = dispatcher.convert( element, additionalData );
 
 		expect( result ).to.be.instanceof( ModelDocumentFragment );
 		expect( result.childCount ).to.equal( 0 );
@@ -289,7 +287,7 @@ describe( 'View converter builder', () => {
 		const element = new ViewAttributeElement( 'marker', { class: 'search' } );
 
 		expect( () => {
-			dispatcher.convert( element, batch, additionalData );
+			dispatcher.convert( element, additionalData );
 		} ).to.throw( CKEditorError, /^build-view-converter-invalid-marker/ );
 	} );
 
@@ -301,7 +299,7 @@ describe( 'View converter builder', () => {
 		const element = new ViewAttributeElement( 'marker', { 'data-name': 'search' } );
 
 		expect( () => {
-			dispatcher.convert( element, batch, additionalData );
+			dispatcher.convert( element, additionalData );
 		} ).to.throw( CKEditorError, /^build-view-converter-invalid-marker/ );
 	} );
 
@@ -313,7 +311,7 @@ describe( 'View converter builder', () => {
 		const element = new ViewAttributeElement( 'marker', { 'data-name': 'search' } );
 
 		expect( () => {
-			dispatcher.convert( element, batch, additionalData );
+			dispatcher.convert( element, additionalData );
 		} ).to.throw( CKEditorError, /^build-view-converter-invalid-marker/ );
 	} );
 
@@ -330,7 +328,7 @@ describe( 'View converter builder', () => {
 
 		// Not quite megatron.
 		result = dispatcher.convert(
-			new ViewContainerElement( 'span', { class: 'megatron' }, new ViewText( 'foo' ) ), batch, additionalData
+			new ViewContainerElement( 'span', { class: 'megatron' }, new ViewText( 'foo' ) ), additionalData
 		);
 
 		expect( modelToString( result ) ).to.equal( '<span>foo</span>' );
@@ -338,7 +336,6 @@ describe( 'View converter builder', () => {
 		// Almost a megatron. Missing a head.
 		result = dispatcher.convert(
 			new ViewContainerElement( 'span', { class: 'megatron', body: 'megatron', legs: 'megatron' }, new ViewText( 'foo' ) ),
-			batch,
 			additionalData
 		);
 
@@ -351,7 +348,6 @@ describe( 'View converter builder', () => {
 				{ class: 'megatron', body: 'megatron', legs: 'megatron', head: 'megatron' },
 				new ViewText( 'foo' )
 			),
-			batch,
 			additionalData
 		);
 
@@ -364,7 +360,6 @@ describe( 'View converter builder', () => {
 				{ class: 'megatron', body: 'megatron', legs: 'megatron', head: 'megatron' },
 				new ViewText( 'foo' )
 			),
-			batch,
 			additionalData
 		);
 
@@ -385,7 +380,7 @@ describe( 'View converter builder', () => {
 			new ViewText( 'foo' )
 		);
 
-		const conversionResult = dispatcher.convert( viewElement, batch, additionalData );
+		const conversionResult = dispatcher.convert( viewElement, additionalData );
 
 		expect( modelToString( conversionResult ) ).to.equal( '<span transformer="megatron">foo</span>' );
 	} );
@@ -395,7 +390,7 @@ describe( 'View converter builder', () => {
 
 		const viewElement = new ViewAttributeElement( 'strong', null, new ViewText( 'foo' ) );
 
-		const conversionResult = dispatcher.convert( viewElement, batch, additionalData );
+		const conversionResult = dispatcher.convert( viewElement, additionalData );
 
 		expect( conversionResult.is( 'documentFragment' ) ).to.be.true;
 	} );
@@ -407,7 +402,7 @@ describe( 'View converter builder', () => {
 		buildViewConverter().for( dispatcher ).fromElement( 'p' ).toElement( 'paragraph' );
 
 		const conversionResult = dispatcher.convert(
-			new ViewContainerElement( 'p', { class: 'myClass' }, new ViewText( 'foo' ) ), batch, additionalData
+			new ViewContainerElement( 'p', { class: 'myClass' }, new ViewText( 'foo' ) ), additionalData
 		);
 
 		// Element converter was fired first even though attribute converter was added first.
@@ -423,7 +418,7 @@ describe( 'View converter builder', () => {
 		let result;
 
 		result = dispatcher.convert(
-			new ViewContainerElement( 'p', { class: 'myClass' }, new ViewText( 'foo' ) ), batch, additionalData
+			new ViewContainerElement( 'p', { class: 'myClass' }, new ViewText( 'foo' ) ), additionalData
 		);
 
 		expect( modelToString( result ) ).to.equal( '<paragraph class="myClass">foo</paragraph>' );
@@ -433,7 +428,7 @@ describe( 'View converter builder', () => {
 			.toElement( 'customP' );
 
 		result = dispatcher.convert(
-			new ViewContainerElement( 'p', { class: 'myClass' }, new ViewText( 'foo' ) ), batch, additionalData
+			new ViewContainerElement( 'p', { class: 'myClass' }, new ViewText( 'foo' ) ), additionalData
 		);
 
 		expect( modelToString( result ) ).to.equal( '<customP>foo</customP>' );
@@ -454,7 +449,7 @@ describe( 'View converter builder', () => {
 			.toAttribute( 'size', 'small' );
 
 		const viewElement = new ViewContainerElement( 'p', { class: 'decorated small' }, new ViewText( 'foo' ) );
-		const conversionResult = dispatcher.convert( viewElement, batch, additionalData );
+		const conversionResult = dispatcher.convert( viewElement, additionalData );
 
 		// P element and it's children got converted by the converter (1) and the converter (1) got fired
 		// because P name was not consumed in converter (2). Converter (3) could consume class="small" because
@@ -477,7 +472,7 @@ describe( 'View converter builder', () => {
 			new ViewContainerElement( 'abcd', null, new ViewText( 'foo' ) )
 		] );
 
-		const conversionResult = dispatcher.convert( viewStructure, batch, additionalData );
+		const conversionResult = dispatcher.convert( viewStructure, additionalData );
 
 		expect( modelToString( conversionResult ) ).to.equal( '<div class="myClass"><abcd>foo</abcd></div>' );
 	} );
@@ -496,7 +491,7 @@ describe( 'View converter builder', () => {
 			)
 		);
 
-		const conversionResult = dispatcher.convert( viewElement, batch, additionalData );
+		const conversionResult = dispatcher.convert( viewElement, additionalData );
 
 		expect( modelToString( conversionResult ) ).to.equal( '<paragraph>foo</paragraph>' );
 	} );
@@ -515,7 +510,7 @@ describe( 'View converter builder', () => {
 			)
 		);
 
-		const conversionResult = dispatcher.convert( viewElement, batch, additionalData );
+		const conversionResult = dispatcher.convert( viewElement, additionalData );
 
 		expect( modelToString( conversionResult ) ).to.equal( '<paragraph>foo</paragraph>' );
 	} );
@@ -529,11 +524,11 @@ describe( 'View converter builder', () => {
 			} );
 
 		const viewElement = new ViewContainerElement( 'p' );
-		let conversionResult = dispatcher.convert( viewElement, batch, additionalData );
+		let conversionResult = dispatcher.convert( viewElement, additionalData );
 		expect( modelToString( conversionResult ) ).to.equal( '<paragraph></paragraph>' );
 
 		viewElement.setAttribute( 'stop', true );
-		conversionResult = dispatcher.convert( viewElement, batch, additionalData );
+		conversionResult = dispatcher.convert( viewElement, additionalData );
 
 		expect( conversionResult ).to.be.instanceof( ModelDocumentFragment );
 		expect( conversionResult.childCount ).to.equal( 0 );
@@ -551,11 +546,11 @@ describe( 'View converter builder', () => {
 		} );
 
 		const viewElement = new ViewContainerElement( 'p', { 'data-type': 'foo' } );
-		let conversionResult = dispatcher.convert( viewElement, batch, additionalData );
+		let conversionResult = dispatcher.convert( viewElement, additionalData );
 		expect( modelToString( conversionResult ) ).to.equal( '<paragraph type="foo"></paragraph>' );
 
 		viewElement.setAttribute( 'data-type', 'stop' );
-		conversionResult = dispatcher.convert( viewElement, batch, additionalData );
+		conversionResult = dispatcher.convert( viewElement, additionalData );
 		expect( modelToString( conversionResult ) ).to.equal( '<paragraph></paragraph>' );
 	} );
 } );

+ 32 - 31
packages/ckeditor5-engine/tests/conversion/model-selection-to-view-converters.js

@@ -3,7 +3,7 @@
  * For licensing, see LICENSE.md.
  */
 
-import ModelDocument from '../../src/model/document';
+import Model from '../../src/model/model';
 import ModelElement from '../../src/model/element';
 import ModelRange from '../../src/model/range';
 import ModelPosition from '../../src/model/position';
@@ -37,14 +37,15 @@ import { stringify as stringifyView } from '../../src/dev-utils/view';
 import { setData as setModelData } from '../../src/dev-utils/model';
 
 describe( 'model-selection-to-view-converters', () => {
-	let dispatcher, mapper, modelDoc, modelRoot, modelSelection, viewDoc, viewRoot, viewSelection, highlightDescriptor;
+	let dispatcher, mapper, model, modelDoc, modelRoot, modelSelection, viewDoc, viewRoot, viewSelection, highlightDescriptor;
 
 	beforeEach( () => {
-		modelDoc = new ModelDocument();
+		model = new Model();
+		modelDoc = model.document;
 		modelRoot = modelDoc.createRoot();
 		modelSelection = modelDoc.selection;
 
-		modelDoc.schema.allow( { name: '$text', inside: '$root' } );
+		model.schema.allow( { name: '$text', inside: '$root' } );
 
 		viewDoc = new ViewDocument();
 		viewRoot = viewDoc.createRoot( 'div' );
@@ -55,7 +56,7 @@ describe( 'model-selection-to-view-converters', () => {
 
 		highlightDescriptor = { class: 'marker', priority: 1 };
 
-		dispatcher = new ModelConversionDispatcher( modelDoc, { mapper, viewSelection } );
+		dispatcher = new ModelConversionDispatcher( model, { mapper, viewSelection } );
 
 		dispatcher.on( 'insert:$text', insertText() );
 		dispatcher.on( 'addAttribute:bold', wrapItem( new ViewAttributeElement( 'strong' ) ) );
@@ -218,8 +219,8 @@ describe( 'model-selection-to-view-converters', () => {
 			} );
 
 			it( 'in attribute and marker', () => {
-				setModelData( modelDoc, 'fo<$text bold="true">ob</$text>ar' );
-				const marker = modelDoc.markers.set( 'marker', ModelRange.createFromParentsAndOffsets( modelRoot, 1, modelRoot, 5 ) );
+				setModelData( model, 'fo<$text bold="true">ob</$text>ar' );
+				const marker = model.markers.set( 'marker', ModelRange.createFromParentsAndOffsets( modelRoot, 1, modelRoot, 5 ) );
 
 				modelSelection.setRanges( [ new ModelRange( ModelPosition.createAt( modelRoot, 3 ) ) ] );
 
@@ -233,7 +234,7 @@ describe( 'model-selection-to-view-converters', () => {
 				dispatcher.convertInsertion( ModelRange.createIn( modelRoot ) );
 				dispatcher.convertMarker( 'addMarker', marker.name, marker.getRange() );
 
-				const markers = Array.from( modelDoc.markers.getMarkersAtPosition( modelSelection.getFirstPosition() ) );
+				const markers = Array.from( model.markers.getMarkersAtPosition( modelSelection.getFirstPosition() ) );
 				dispatcher.convertSelection( modelSelection, markers );
 
 				// Stringify view and check if it is same as expected.
@@ -243,8 +244,8 @@ describe( 'model-selection-to-view-converters', () => {
 			} );
 
 			it( 'in attribute and marker - no attribute', () => {
-				setModelData( modelDoc, 'fo<$text bold="true">ob</$text>ar' );
-				const marker = modelDoc.markers.set( 'marker', ModelRange.createFromParentsAndOffsets( modelRoot, 1, modelRoot, 5 ) );
+				setModelData( model, 'fo<$text bold="true">ob</$text>ar' );
+				const marker = model.markers.set( 'marker', ModelRange.createFromParentsAndOffsets( modelRoot, 1, modelRoot, 5 ) );
 
 				modelSelection.setRanges( [ new ModelRange( ModelPosition.createAt( modelRoot, 3 ) ) ] );
 
@@ -260,7 +261,7 @@ describe( 'model-selection-to-view-converters', () => {
 				dispatcher.convertInsertion( ModelRange.createIn( modelRoot ) );
 				dispatcher.convertMarker( 'addMarker', marker.name, marker.getRange() );
 
-				const markers = Array.from( modelDoc.markers.getMarkersAtPosition( modelSelection.getFirstPosition() ) );
+				const markers = Array.from( model.markers.getMarkersAtPosition( modelSelection.getFirstPosition() ) );
 				dispatcher.convertSelection( modelSelection, markers );
 
 				// Stringify view and check if it is same as expected.
@@ -273,8 +274,8 @@ describe( 'model-selection-to-view-converters', () => {
 					data => ( { 'class': data.markerName } )
 				) );
 
-				setModelData( modelDoc, 'foobar' );
-				const marker = modelDoc.markers.set( 'marker2', ModelRange.createFromParentsAndOffsets( modelRoot, 1, modelRoot, 5 ) );
+				setModelData( model, 'foobar' );
+				const marker = model.markers.set( 'marker2', ModelRange.createFromParentsAndOffsets( modelRoot, 1, modelRoot, 5 ) );
 
 				modelSelection.setRanges( [ new ModelRange( ModelPosition.createAt( modelRoot, 3 ) ) ] );
 
@@ -285,7 +286,7 @@ describe( 'model-selection-to-view-converters', () => {
 				dispatcher.convertInsertion( ModelRange.createIn( modelRoot ) );
 				dispatcher.convertMarker( 'addMarker', marker.name, marker.getRange() );
 
-				const markers = Array.from( modelDoc.markers.getMarkersAtPosition( modelSelection.getFirstPosition() ) );
+				const markers = Array.from( model.markers.getMarkersAtPosition( modelSelection.getFirstPosition() ) );
 				dispatcher.convertSelection( modelSelection, markers );
 
 				// Stringify view and check if it is same as expected.
@@ -297,8 +298,8 @@ describe( 'model-selection-to-view-converters', () => {
 				dispatcher.on( 'addMarker:marker2', highlightText( data => ( { 'class': data.markerName } ) ) );
 				dispatcher.on( 'selectionMarker:marker2', convertSelectionMarker( data => ( { 'class': data.markerName } ) ) );
 
-				setModelData( modelDoc, 'foobar' );
-				const marker = modelDoc.markers.set( 'marker2', ModelRange.createFromParentsAndOffsets( modelRoot, 1, modelRoot, 5 ) );
+				setModelData( model, 'foobar' );
+				const marker = model.markers.set( 'marker2', ModelRange.createFromParentsAndOffsets( modelRoot, 1, modelRoot, 5 ) );
 
 				modelSelection.setRanges( [ new ModelRange( ModelPosition.createAt( modelRoot, 3 ) ) ] );
 
@@ -309,7 +310,7 @@ describe( 'model-selection-to-view-converters', () => {
 				dispatcher.convertInsertion( ModelRange.createIn( modelRoot ) );
 				dispatcher.convertMarker( 'addMarker', marker.name, marker.getRange() );
 
-				const markers = Array.from( modelDoc.markers.getMarkersAtPosition( modelSelection.getFirstPosition() ) );
+				const markers = Array.from( model.markers.getMarkersAtPosition( modelSelection.getFirstPosition() ) );
 				dispatcher.convertSelection( modelSelection, markers );
 
 				// Stringify view and check if it is same as expected.
@@ -322,8 +323,8 @@ describe( 'model-selection-to-view-converters', () => {
 
 				} ) );
 
-				setModelData( modelDoc, 'foobar' );
-				const marker = modelDoc.markers.set( 'marker3', ModelRange.createFromParentsAndOffsets( modelRoot, 1, modelRoot, 5 ) );
+				setModelData( model, 'foobar' );
+				const marker = model.markers.set( 'marker3', ModelRange.createFromParentsAndOffsets( modelRoot, 1, modelRoot, 5 ) );
 
 				modelSelection.setRanges( [ new ModelRange( ModelPosition.createAt( modelRoot, 3 ) ) ] );
 
@@ -334,7 +335,7 @@ describe( 'model-selection-to-view-converters', () => {
 				dispatcher.convertInsertion( ModelRange.createIn( modelRoot ) );
 				dispatcher.convertMarker( 'addMarker', marker.name, marker.getRange() );
 
-				const markers = Array.from( modelDoc.markers.getMarkersAtPosition( modelSelection.getFirstPosition() ) );
+				const markers = Array.from( model.markers.getMarkersAtPosition( modelSelection.getFirstPosition() ) );
 				dispatcher.convertSelection( modelSelection, markers );
 
 				// Stringify view and check if it is same as expected.
@@ -344,7 +345,7 @@ describe( 'model-selection-to-view-converters', () => {
 
 			// #1072 - if the container has only ui elements, collapsed selection attribute should be rendered after those ui elements.
 			it( 'selection with attribute before ui element - no non-ui children', () => {
-				setModelData( modelDoc, '' );
+				setModelData( model, '' );
 
 				// Add two ui elements to view.
 				viewRoot.appendChildren( [
@@ -365,7 +366,7 @@ describe( 'model-selection-to-view-converters', () => {
 
 			// #1072.
 			it( 'selection with attribute before ui element - has non-ui children #1', () => {
-				setModelData( modelDoc, 'x' );
+				setModelData( model, 'x' );
 
 				modelSelection.setRanges( [ new ModelRange( new ModelPosition( modelRoot, [ 1 ] ) ) ] );
 				modelSelection.setAttribute( 'bold', true );
@@ -386,7 +387,7 @@ describe( 'model-selection-to-view-converters', () => {
 
 			// #1072.
 			it( 'selection with attribute before ui element - has non-ui children #2', () => {
-				setModelData( modelDoc, '<$text bold="true">x</$text>y' );
+				setModelData( model, '<$text bold="true">x</$text>y' );
 
 				modelSelection.setRanges( [ new ModelRange( new ModelPosition( modelRoot, [ 1 ] ) ) ] );
 				modelSelection.setAttribute( 'bold', true );
@@ -635,14 +636,14 @@ describe( 'model-selection-to-view-converters', () => {
 
 	describe( 'table cell selection converter', () => {
 		beforeEach( () => {
-			modelDoc.schema.registerItem( 'table' );
-			modelDoc.schema.registerItem( 'tr' );
-			modelDoc.schema.registerItem( 'td' );
+			model.schema.registerItem( 'table' );
+			model.schema.registerItem( 'tr' );
+			model.schema.registerItem( 'td' );
 
-			modelDoc.schema.allow( { name: 'table', inside: '$root' } );
-			modelDoc.schema.allow( { name: 'tr', inside: 'table' } );
-			modelDoc.schema.allow( { name: 'td', inside: 'tr' } );
-			modelDoc.schema.allow( { name: '$text', inside: 'td' } );
+			model.schema.allow( { name: 'table', inside: '$root' } );
+			model.schema.allow( { name: 'tr', inside: 'table' } );
+			model.schema.allow( { name: 'td', inside: 'tr' } );
+			model.schema.allow( { name: '$text', inside: 'td' } );
 
 			// "Universal" converter to convert table structure.
 			const tableConverter = insertElement( data => new ViewContainerElement( data.item.name ) );
@@ -705,7 +706,7 @@ describe( 'model-selection-to-view-converters', () => {
 	// that are offsets or paths of selection positions in root element.
 	function test( selectionPaths, modelInput, expectedView, selectionAttributes = {} ) {
 		// Parse passed `modelInput` string and set it as current model.
-		setModelData( modelDoc, modelInput );
+		setModelData( model, modelInput );
 
 		// Manually set selection ranges using passed `selectionPaths`.
 		const startPath = typeof selectionPaths[ 0 ] == 'number' ? [ selectionPaths[ 0 ] ] : selectionPaths[ 0 ];

+ 30 - 26
packages/ckeditor5-engine/tests/conversion/model-to-view-converters.js

@@ -3,7 +3,9 @@
  * For licensing, see LICENSE.md.
  */
 
-import ModelDocument from '../../src/model/document';
+import ModelWriter from '../../src/model/writer';
+import Batch from '../../src/model/batch';
+import Model from '../../src/model/model';
 import ModelElement from '../../src/model/element';
 import ModelText from '../../src/model/text';
 import ModelRange from '../../src/model/range';
@@ -35,19 +37,21 @@ import {
 import { createRangeOnElementOnly } from '../../tests/model/_utils/utils';
 
 describe( 'model-to-view-converters', () => {
-	let dispatcher, modelDoc, modelRoot, mapper, viewRoot, batch;
+	let dispatcher, model, modelDoc, modelRoot, modelWriter, mapper, viewRoot;
 
 	beforeEach( () => {
-		modelDoc = new ModelDocument();
+		model = new Model();
+		modelDoc = model.document;
 		modelRoot = modelDoc.createRoot();
 		viewRoot = new ViewContainerElement( 'div' );
 
-		batch = modelDoc.batch();
-
 		mapper = new Mapper();
 		mapper.bindElements( modelRoot, viewRoot );
 
-		dispatcher = new ModelConversionDispatcher( modelDoc, { mapper } );
+		dispatcher = new ModelConversionDispatcher( model, { mapper } );
+
+		// As an util for modifying model tree.
+		modelWriter = new ModelWriter( model, new Batch() );
 	} );
 
 	function viewAttributesToString( item ) {
@@ -110,7 +114,7 @@ describe( 'model-to-view-converters', () => {
 			dispatcher.on( 'removeMarker:marker', highlightText( highlightDescriptor ) );
 			dispatcher.convertInsertion( markerRange );
 
-			modelDoc.markers.set( 'marker', markerRange );
+			model.markers.set( 'marker', markerRange );
 			dispatcher.convertMarker( 'addMarker', 'marker', markerRange );
 
 			expect( viewToString( viewRoot ) ).to.equal(
@@ -138,7 +142,7 @@ describe( 'model-to-view-converters', () => {
 			dispatcher.on( 'removeMarker:marker', highlightText( newDescriptor ), { priority: 'high' } );
 			dispatcher.convertInsertion( markerRange );
 
-			modelDoc.markers.set( 'marker', markerRange );
+			model.markers.set( 'marker', markerRange );
 			dispatcher.convertMarker( 'addMarker', 'marker', markerRange );
 
 			expect( viewToString( viewRoot ) ).to.equal(
@@ -163,7 +167,7 @@ describe( 'model-to-view-converters', () => {
 
 			dispatcher.convertInsertion( markerRange );
 
-			modelDoc.markers.set( 'marker', markerRange );
+			model.markers.set( 'marker', markerRange );
 			dispatcher.convertMarker( 'addMarker', 'marker', markerRange );
 
 			expect( viewToString( viewRoot ) ).to.equal( '<div><p>foo</p><p>bar</p></div>' );
@@ -222,7 +226,7 @@ describe( 'model-to-view-converters', () => {
 			} ), { priority: 'high' } );
 
 			dispatcher.convertInsertion( markerRange );
-			modelDoc.markers.set( 'marker', markerRange );
+			model.markers.set( 'marker', markerRange );
 			dispatcher.convertMarker( 'addMarker', 'marker', markerRange );
 
 			expect( viewToString( viewRoot ) ).to.equal(
@@ -264,7 +268,7 @@ describe( 'model-to-view-converters', () => {
 			} ), { priority: 'high' } );
 
 			dispatcher.convertInsertion( markerRange );
-			modelDoc.markers.set( 'marker', markerRange );
+			model.markers.set( 'marker', markerRange );
 			dispatcher.convertMarker( 'addMarker', 'marker', markerRange );
 
 			expect( viewToString( viewRoot ) ).to.equal(
@@ -310,7 +314,7 @@ describe( 'model-to-view-converters', () => {
 			} ), { priority: 'high' } );
 
 			dispatcher.convertInsertion( markerRange );
-			modelDoc.markers.set( 'marker', markerRange );
+			model.markers.set( 'marker', markerRange );
 			dispatcher.convertMarker( 'addMarker', 'marker:foo-bar-baz', markerRange );
 		} );
 
@@ -320,7 +324,7 @@ describe( 'model-to-view-converters', () => {
 
 			dispatcher.convertInsertion( markerRange );
 
-			modelDoc.markers.set( 'marker', markerRange );
+			model.markers.set( 'marker', markerRange );
 			dispatcher.convertMarker( 'addMarker', 'marker', markerRange );
 
 			expect( viewToString( viewRoot ) ).to.equal( '<div><p>foo</p><p>bar</p></div>' );
@@ -538,7 +542,7 @@ describe( 'model-to-view-converters', () => {
 
 			expect( viewToString( viewRoot ) ).to.equal( '<div><p><b>foobar</b></p></div>' );
 
-			batch.removeAttribute( 'bold', modelElement );
+			modelWriter.removeAttribute( 'bold', modelElement );
 
 			dispatcher.convertAttribute( 'removeAttribute', ModelRange.createIn( modelElement ), 'bold', true, null );
 
@@ -565,7 +569,7 @@ describe( 'model-to-view-converters', () => {
 
 			expect( viewToString( viewRoot ) ).to.equal( '<div><p><b>foobar</b></p></div>' );
 
-			batch.removeAttribute( 'style', modelElement );
+			modelWriter.removeAttribute( 'style', modelElement );
 
 			dispatcher.convertAttribute( 'removeAttribute', ModelRange.createIn( modelElement ), 'style', 'bold', null );
 
@@ -595,7 +599,7 @@ describe( 'model-to-view-converters', () => {
 
 			expect( viewToString( viewRoot ) ).to.equal( '<div><p>x<a href="http://foo.com">foo</a>x</p></div>' );
 
-			batch.setAttribute( 'link', 'http://foobar.com', modelElement );
+			modelWriter.setAttribute( 'link', 'http://foobar.com', modelElement );
 
 			dispatcher.convertAttribute(
 				'changeAttribute',
@@ -623,7 +627,7 @@ describe( 'model-to-view-converters', () => {
 
 			expect( viewToString( viewRoot ) ).to.equal( '<div><p>நி<b>லைக்</b>கு</p></div>' );
 
-			batch.removeAttribute( 'bold', modelElement );
+			modelWriter.removeAttribute( 'bold', modelElement );
 
 			dispatcher.convertAttribute( 'removeAttribute', ModelRange.createIn( modelElement ), 'bold', true, null );
 
@@ -666,7 +670,7 @@ describe( 'model-to-view-converters', () => {
 
 			expect( viewToString( viewRoot ) ).to.equal( '<div><p><b>foobar</b></p></div>' );
 
-			batch.removeAttribute( 'bold', modelElement );
+			modelWriter.removeAttribute( 'bold', modelElement );
 
 			dispatcher.convertAttribute( 'removeAttribute', ModelRange.createIn( modelElement ), 'bold', true, null );
 
@@ -1012,7 +1016,7 @@ describe( 'model-to-view-converters', () => {
 
 			dispatcher.convertInsertion( ModelRange.createIn( modelRoot ) );
 
-			batch.remove( ModelRange.createFromParentsAndOffsets( modelDiv, 0, modelDiv, 6 ) );
+			modelWriter.remove( ModelRange.createFromParentsAndOffsets( modelDiv, 0, modelDiv, 6 ) );
 
 			dispatcher.convertRemove(
 				ModelPosition.createFromParentAndOffset( modelDiv, 0 ),
@@ -1033,7 +1037,7 @@ describe( 'model-to-view-converters', () => {
 			dispatcher.on( 'remove', remove() );
 
 			// Remove 'b'.
-			batch.remove( ModelRange.createFromParentsAndOffsets( modelRoot, 3, modelRoot, 4 ) );
+			modelWriter.remove( ModelRange.createFromParentsAndOffsets( modelRoot, 3, modelRoot, 4 ) );
 
 			dispatcher.convertRemove(
 				ModelPosition.createFromParentAndOffset( modelRoot, 3 ),
@@ -1054,7 +1058,7 @@ describe( 'model-to-view-converters', () => {
 			dispatcher.on( 'remove', remove() );
 
 			// Remove 'o<span></span>b'.
-			batch.remove( ModelRange.createFromParentsAndOffsets( modelRoot, 2, modelRoot, 4 ) );
+			modelWriter.remove( ModelRange.createFromParentsAndOffsets( modelRoot, 2, modelRoot, 4 ) );
 
 			dispatcher.convertRemove(
 				ModelPosition.createFromParentAndOffset( modelRoot, 2 ),
@@ -1076,7 +1080,7 @@ describe( 'model-to-view-converters', () => {
 			dispatcher.on( 'remove', remove() );
 
 			// Move <a></a> after "b". Can be e.g. a part of an unwrap delta (move + remove).
-			batch.move(
+			modelWriter.move(
 				ModelRange.createFromParentsAndOffsets( modelRoot, 0, modelRoot, 1 ),
 				ModelPosition.createAt( modelRoot, 'end' )
 			);
@@ -1104,7 +1108,7 @@ describe( 'model-to-view-converters', () => {
 			dispatcher.on( 'remove', remove() );
 
 			// Remove <a></a>.
-			batch.remove( ModelRange.createFromParentsAndOffsets( modelRoot, 0, modelRoot, 1 ) );
+			modelWriter.remove( ModelRange.createFromParentsAndOffsets( modelRoot, 0, modelRoot, 1 ) );
 
 			dispatcher.convertRemove(
 				ModelPosition.createFromParentAndOffset( modelRoot, 0 ),
@@ -1145,7 +1149,7 @@ describe( 'model-to-view-converters', () => {
 				dispatcher.convertChange( type, changes );
 			} );
 
-			modelDoc.batch().unwrap( modelWElement );
+			modelWriter.unwrap( modelWElement );
 
 			expect( viewToString( viewRoot ) ).to.equal( '<div><a2></a2></div>' );
 
@@ -1177,7 +1181,7 @@ describe( 'model-to-view-converters', () => {
 
 			dispatcher.on( 'remove', remove() );
 
-			batch.remove( ModelRange.createFromParentsAndOffsets( modelRoot, 1, modelRoot, 2 ) );
+			modelWriter.remove( ModelRange.createFromParentsAndOffsets( modelRoot, 1, modelRoot, 2 ) );
 
 			dispatcher.convertRemove(
 				ModelPosition.createFromParentAndOffset( modelRoot, 1 ),
@@ -1201,7 +1205,7 @@ describe( 'model-to-view-converters', () => {
 
 			dispatcher.on( 'remove', remove() );
 
-			batch.remove( ModelRange.createFromParentsAndOffsets( modelRoot, 3, modelRoot, 4 ) );
+			modelWriter.remove( ModelRange.createFromParentsAndOffsets( modelRoot, 3, modelRoot, 4 ) );
 
 			dispatcher.convertRemove(
 				ModelPosition.createFromParentAndOffset( modelRoot, 3 ),

+ 63 - 53
packages/ckeditor5-engine/tests/conversion/modelconversiondispatcher.js

@@ -4,11 +4,13 @@
  */
 
 import ModelConversionDispatcher from '../../src/conversion/modelconversiondispatcher';
-import ModelDocument from '../../src/model/document';
+import Model from '../../src/model/model';
 import ModelText from '../../src/model/text';
 import ModelElement from '../../src/model/element';
 import ModelRange from '../../src/model/range';
 import ModelPosition from '../../src/model/position';
+import ModelWriter from '../../src/model/writer';
+import Batch from '../../src/model/batch';
 import RemoveOperation from '../../src/model/operation/removeoperation';
 import NoOperation from '../../src/model/operation/nooperation';
 import RenameOperation from '../../src/model/operation/renameoperation';
@@ -18,20 +20,24 @@ import { wrapInDelta } from '../../tests/model/_utils/utils';
 import ViewContainerElement from '../../src/view/containerelement';
 
 describe( 'ModelConversionDispatcher', () => {
-	let dispatcher, doc, root, gyPos;
+	let dispatcher, doc, root, gyPos, model, writer;
 
 	beforeEach( () => {
-		doc = new ModelDocument();
-		dispatcher = new ModelConversionDispatcher( doc );
+		model = new Model();
+		doc = model.document;
+		dispatcher = new ModelConversionDispatcher( model );
 		root = doc.createRoot();
 
 		gyPos = new ModelPosition( doc.graveyard, [ 0 ] );
+
+		// As an util for modifying model tree.
+		writer = new ModelWriter( model, new Batch() );
 	} );
 
 	describe( 'constructor()', () => {
 		it( 'should create ModelConversionDispatcher with given api', () => {
 			const apiObj = {};
-			const dispatcher = new ModelConversionDispatcher( doc, { apiObj } );
+			const dispatcher = new ModelConversionDispatcher( model, { apiObj } );
 
 			expect( dispatcher.conversionApi.apiObj ).to.equal( apiObj );
 		} );
@@ -63,7 +69,9 @@ describe( 'ModelConversionDispatcher', () => {
 			dispatcher.on( 'insert:image', cbInsertImage );
 			dispatcher.on( 'addAttribute:key:$text', cbAddAttribute );
 
-			doc.batch().insertText( 'foo', { key: 'value' }, root );
+			model.change( writer => {
+				writer.insertText( 'foo', { key: 'value' }, root );
+			} );
 
 			expect( cbInsertText.called ).to.be.true;
 			expect( cbAddAttribute.called ).to.be.true;
@@ -78,7 +86,7 @@ describe( 'ModelConversionDispatcher', () => {
 			const removeOperation = new RemoveOperation( imagePos, 1, gyPos, 0 );
 
 			// Let's apply remove operation so reinsert operation won't break.
-			doc.applyOperation( wrapInDelta( removeOperation ) );
+			model.applyOperation( wrapInDelta( removeOperation ) );
 
 			const cbInsertText = sinon.spy();
 			const cbInsertImage = sinon.spy();
@@ -88,7 +96,7 @@ describe( 'ModelConversionDispatcher', () => {
 			dispatcher.on( 'insert:image', cbInsertImage );
 			dispatcher.on( 'addAttribute:key:image', cbAddAttribute );
 
-			doc.applyOperation( wrapInDelta( removeOperation.getReversed() ) );
+			model.applyOperation( wrapInDelta( removeOperation.getReversed() ) );
 
 			expect( cbInsertImage.called ).to.be.true;
 			expect( cbAddAttribute.called ).to.be.true;
@@ -100,7 +108,9 @@ describe( 'ModelConversionDispatcher', () => {
 
 			dispatcher.on( 'remove', cbRemove );
 
-			doc.batch().remove( image );
+			model.change( writer => {
+				writer.remove( image );
+			} );
 
 			expect( cbRemove.called ).to.be.true;
 		} );
@@ -112,13 +122,17 @@ describe( 'ModelConversionDispatcher', () => {
 			dispatcher.on( 'addAttribute:key:$text', cbAddText );
 			dispatcher.on( 'addAttribute:key:image', cbAddImage );
 
-			doc.batch().setAttribute( 'key', 'value', image );
+			model.change( writer => {
+				writer.setAttribute( 'key', 'value', image );
+			} );
 
 			// Callback for adding attribute on text not called.
 			expect( cbAddText.called ).to.be.false;
 			expect( cbAddImage.calledOnce ).to.be.true;
 
-			doc.batch().setAttribute( 'key', 'value', ModelRange.createFromParentsAndOffsets( root, 3, root, 4 ) );
+			model.change( writer => {
+				writer.setAttribute( 'key', 'value', ModelRange.createFromParentsAndOffsets( root, 3, root, 4 ) );
+			} );
 
 			expect( cbAddText.calledOnce ).to.be.true;
 			// Callback for adding attribute on image not called this time.
@@ -128,21 +142,24 @@ describe( 'ModelConversionDispatcher', () => {
 		it( 'should fire changeAttribute callbacks for change attribute change', () => {
 			const cbChangeText = sinon.spy();
 			const cbChangeImage = sinon.spy();
-			const batch = doc.batch();
 
 			dispatcher.on( 'changeAttribute:key:$text', cbChangeText );
 			dispatcher.on( 'changeAttribute:key:image', cbChangeImage );
 
-			batch.setAttribute( 'key', 'value', image );
-			batch.setAttribute( 'key', 'newValue', image );
+			model.change( writer => {
+				writer.setAttribute( 'key', 'value', image );
+				writer.setAttribute( 'key', 'newValue', image );
+			} );
 
 			// Callback for adding attribute on text not called.
 			expect( cbChangeText.called ).to.be.false;
 			expect( cbChangeImage.calledOnce ).to.be.true;
 
 			const range = ModelRange.createFromParentsAndOffsets( root, 3, root, 4 );
-			batch.setAttribute( 'key', 'value', range );
-			batch.setAttribute( 'key', 'newValue', range );
+			model.change( writer => {
+				writer.setAttribute( 'key', 'value', range );
+				writer.setAttribute( 'key', 'newValue', range );
+			} );
 
 			expect( cbChangeText.calledOnce ).to.be.true;
 			// Callback for adding attribute on image not called this time.
@@ -152,21 +169,20 @@ describe( 'ModelConversionDispatcher', () => {
 		it( 'should fire removeAttribute callbacks for remove attribute change', () => {
 			const cbRemoveText = sinon.spy();
 			const cbRemoveImage = sinon.spy();
-			const batch = doc.batch();
 
 			dispatcher.on( 'removeAttribute:key:$text', cbRemoveText );
 			dispatcher.on( 'removeAttribute:key:image', cbRemoveImage );
 
-			batch.setAttribute( 'key', 'value', image );
-			batch.removeAttribute( 'key', image );
+			writer.setAttribute( 'key', 'value', image );
+			writer.removeAttribute( 'key', image );
 
 			// Callback for adding attribute on text not called.
 			expect( cbRemoveText.called ).to.be.false;
 			expect( cbRemoveImage.calledOnce ).to.be.true;
 
 			const range = ModelRange.createFromParentsAndOffsets( root, 3, root, 4 );
-			batch.setAttribute( 'key', 'value', range );
-			batch.removeAttribute( 'key', range );
+			writer.setAttribute( 'key', 'value', range );
+			writer.removeAttribute( 'key', range );
 
 			expect( cbRemoveText.calledOnce ).to.be.true;
 			// Callback for adding attribute on image not called this time.
@@ -187,7 +203,7 @@ describe( 'ModelConversionDispatcher', () => {
 			const gyNode = new ModelElement( 'image' );
 			doc.graveyard.appendChildren( gyNode );
 
-			doc.batch().setAttribute( 'key', 'value', gyNode );
+			writer.setAttribute( 'key', 'value', gyNode );
 
 			expect( dispatcher.fire.called ).to.be.false;
 		} );
@@ -199,7 +215,7 @@ describe( 'ModelConversionDispatcher', () => {
 			const gyNode = new ModelElement( 'image' );
 			doc.graveyard.appendChildren( gyNode );
 
-			doc.batch().remove( gyNode );
+			writer.remove( gyNode );
 
 			expect( dispatcher.fire.called ).to.be.false;
 		} );
@@ -211,7 +227,7 @@ describe( 'ModelConversionDispatcher', () => {
 			const gyNode = new ModelElement( 'image' );
 			doc.graveyard.appendChildren( gyNode );
 
-			doc.batch().rename( gyNode, 'p' );
+			writer.rename( gyNode, 'p' );
 
 			expect( dispatcher.fire.called ).to.be.false;
 		} );
@@ -219,7 +235,7 @@ describe( 'ModelConversionDispatcher', () => {
 		it( 'should not fire any event after NoOperation is applied', () => {
 			sinon.spy( dispatcher, 'fire' );
 
-			doc.applyOperation( wrapInDelta( new NoOperation( 0 ) ) );
+			model.applyOperation( wrapInDelta( new NoOperation( 0 ) ) );
 
 			expect( dispatcher.fire.called ).to.be.false;
 		} );
@@ -230,7 +246,7 @@ describe( 'ModelConversionDispatcher', () => {
 			root.removeChildren( 0, root.childCount );
 			root.appendChildren( [ new ModelElement( 'paragraph' ) ] );
 
-			doc.applyOperation( wrapInDelta( new RenameOperation( new ModelPosition( root, [ 0 ] ), 'paragraph', 'paragraph', 0 ) ) );
+			model.applyOperation( wrapInDelta( new RenameOperation( new ModelPosition( root, [ 0 ] ), 'paragraph', 'paragraph', 0 ) ) );
 
 			expect( dispatcher.fire.called ).to.be.false;
 		} );
@@ -242,7 +258,7 @@ describe( 'ModelConversionDispatcher', () => {
 			root.appendChildren( [ new ModelElement( 'paragraph', { foo: 'bar' } ) ] );
 
 			const range = new ModelRange( new ModelPosition( root, [ 0 ] ), new ModelPosition( root, [ 0, 0 ] ) );
-			doc.applyOperation( wrapInDelta( new AttributeOperation( range, 'foo', 'bar', 'bar', 0 ) ) );
+			model.applyOperation( wrapInDelta( new AttributeOperation( range, 'foo', 'bar', 'bar', 0 ) ) );
 
 			expect( dispatcher.fire.called ).to.be.false;
 		} );
@@ -337,7 +353,7 @@ describe( 'ModelConversionDispatcher', () => {
 			root.appendChildren( [ paragraph1, paragraph2 ] );
 
 			const markerRange = ModelRange.createFromParentsAndOffsets( root, 0, root, 2 );
-			doc.markers.set( 'marker', markerRange );
+			model.markers.set( 'marker', markerRange );
 
 			const insertionRange = ModelRange.createOn( paragraph2 );
 			dispatcher.convertInsertion( insertionRange );
@@ -356,7 +372,7 @@ describe( 'ModelConversionDispatcher', () => {
 			root.appendChildren( [ paragraph1, paragraph2 ] );
 
 			const markerRange = ModelRange.createIn( paragraph2 );
-			doc.markers.set( 'marker', markerRange );
+			model.markers.set( 'marker', markerRange );
 
 			const insertionRange = ModelRange.createOn( paragraph2 );
 			dispatcher.convertInsertion( insertionRange );
@@ -396,7 +412,7 @@ describe( 'ModelConversionDispatcher', () => {
 			};
 
 			const markerRange = ModelRange.createFromParentsAndOffsets( root, 0, root, 1 );
-			doc.markers.set( 'marker', markerRange );
+			model.markers.set( 'marker', markerRange );
 
 			const insertionRange = ModelRange.createFromParentsAndOffsets( caption, 1, caption, 2 );
 			dispatcher.convertInsertion( insertionRange );
@@ -432,7 +448,7 @@ describe( 'ModelConversionDispatcher', () => {
 			};
 
 			const markerRange = ModelRange.createFromParentsAndOffsets( caption, 0, caption, 3 );
-			doc.markers.set( 'marker', markerRange );
+			model.markers.set( 'marker', markerRange );
 
 			const insertionRange = ModelRange.createFromParentsAndOffsets( caption, 2, caption, 3 );
 			dispatcher.convertInsertion( insertionRange );
@@ -620,11 +636,9 @@ describe( 'ModelConversionDispatcher', () => {
 		} );
 
 		it( 'should prepare correct list of consumable values', () => {
-			doc.enqueueChanges( () => {
-				const batch = doc.batch();
-
-				batch.setAttribute( 'bold', true, ModelRange.createIn( root ) );
-				batch.setAttribute( 'italic', true, ModelRange.createFromParentsAndOffsets( root, 4, root, 5 ) );
+			model.enqueueChange( writer => {
+				writer.setAttribute( 'bold', true, ModelRange.createIn( root ) );
+				writer.setAttribute( 'italic', true, ModelRange.createFromParentsAndOffsets( root, 4, root, 5 ) );
 			} );
 
 			dispatcher.on( 'selection', ( evt, data, consumable ) => {
@@ -639,11 +653,9 @@ describe( 'ModelConversionDispatcher', () => {
 		it( 'should fire attributes events for selection', () => {
 			sinon.spy( dispatcher, 'fire' );
 
-			doc.enqueueChanges( () => {
-				const batch = doc.batch();
-
-				batch.setAttribute( 'bold', true, ModelRange.createIn( root ) );
-				batch.setAttribute( 'italic', true, ModelRange.createFromParentsAndOffsets( root, 4, root, 5 ) );
+			model.enqueueChange( writer => {
+				writer.setAttribute( 'bold', true, ModelRange.createIn( root ) );
+				writer.setAttribute( 'italic', true, ModelRange.createFromParentsAndOffsets( root, 4, root, 5 ) );
 			} );
 
 			dispatcher.convertSelection( doc.selection, [] );
@@ -659,11 +671,9 @@ describe( 'ModelConversionDispatcher', () => {
 				consumable.consume( data.selection, 'selectionAttribute:bold' );
 			} );
 
-			doc.enqueueChanges( () => {
-				const batch = doc.batch();
-
-				batch.setAttribute( 'bold', true, ModelRange.createIn( root ) );
-				batch.setAttribute( 'italic', true, ModelRange.createFromParentsAndOffsets( root, 4, root, 5 ) );
+			model.enqueueChange( writer => {
+				writer.setAttribute( 'bold', true, ModelRange.createIn( root ) );
+				writer.setAttribute( 'italic', true, ModelRange.createFromParentsAndOffsets( root, 4, root, 5 ) );
 			} );
 
 			dispatcher.convertSelection( doc.selection, [] );
@@ -672,11 +682,11 @@ describe( 'ModelConversionDispatcher', () => {
 		} );
 
 		it( 'should fire events for each marker which contains selection', () => {
-			doc.markers.set( 'name', ModelRange.createFromParentsAndOffsets( root, 0, root, 2 ) );
+			model.markers.set( 'name', ModelRange.createFromParentsAndOffsets( root, 0, root, 2 ) );
 
 			sinon.spy( dispatcher, 'fire' );
 
-			const markers = Array.from( doc.markers.getMarkersAtPosition( doc.selection.getFirstPosition() ) );
+			const markers = Array.from( model.markers.getMarkersAtPosition( doc.selection.getFirstPosition() ) );
 			dispatcher.convertSelection( doc.selection, markers );
 
 			expect( dispatcher.fire.calledWith( 'selectionMarker:name' ) ).to.be.true;
@@ -710,12 +720,12 @@ describe( 'ModelConversionDispatcher', () => {
 				}
 			};
 
-			doc.markers.set( 'name', ModelRange.createFromParentsAndOffsets( root, 0, root, 1 ) );
+			model.markers.set( 'name', ModelRange.createFromParentsAndOffsets( root, 0, root, 1 ) );
 			doc.selection.setRanges( [ ModelRange.createFromParentsAndOffsets( caption, 1, caption, 1 ) ] );
 
 			sinon.spy( dispatcher, 'fire' );
 
-			const markers = Array.from( doc.markers.getMarkersAtPosition( doc.selection.getFirstPosition() ) );
+			const markers = Array.from( model.markers.getMarkersAtPosition( doc.selection.getFirstPosition() ) );
 
 			dispatcher.convertSelection( doc.selection, markers );
 
@@ -723,8 +733,8 @@ describe( 'ModelConversionDispatcher', () => {
 		} );
 
 		it( 'should not fire events if information about marker has been consumed', () => {
-			doc.markers.set( 'foo', ModelRange.createFromParentsAndOffsets( root, 0, root, 2 ) );
-			doc.markers.set( 'bar', ModelRange.createFromParentsAndOffsets( root, 0, root, 2 ) );
+			model.markers.set( 'foo', ModelRange.createFromParentsAndOffsets( root, 0, root, 2 ) );
+			model.markers.set( 'bar', ModelRange.createFromParentsAndOffsets( root, 0, root, 2 ) );
 
 			sinon.spy( dispatcher, 'fire' );
 
@@ -732,7 +742,7 @@ describe( 'ModelConversionDispatcher', () => {
 				consumable.consume( data.selection, 'selectionMarker:bar' );
 			} );
 
-			const markers = Array.from( doc.markers.getMarkersAtPosition( doc.selection.getFirstPosition() ) );
+			const markers = Array.from( model.markers.getMarkersAtPosition( doc.selection.getFirstPosition() ) );
 			dispatcher.convertSelection( doc.selection, markers );
 
 			expect( dispatcher.fire.calledWith( 'selectionMarker:foo' ) ).to.be.true;

+ 5 - 5
packages/ckeditor5-engine/tests/conversion/view-selection-to-model-converters.js

@@ -7,7 +7,7 @@ import ViewDocument from '../../src/view/document';
 import ViewSelection from '../../src/view/selection';
 import ViewRange from '../../src/view/range';
 
-import ModelDocument from '../../src/model/document';
+import Model from '../../src/model/model';
 
 import Mapper from '../../src/conversion/mapper';
 import { convertSelectionChange } from '../../src/conversion/view-selection-to-model-converters';
@@ -19,8 +19,8 @@ describe( 'convertSelectionChange', () => {
 	let model, view, mapper, convertSelection, modelRoot, viewRoot;
 
 	beforeEach( () => {
-		model = new ModelDocument();
-		modelRoot = model.createRoot();
+		model = new Model();
+		modelRoot = model.document.createRoot();
 		model.schema.registerItem( 'paragraph', '$block' );
 
 		modelSetData( model, '<paragraph>foo</paragraph><paragraph>bar</paragraph>' );
@@ -82,7 +82,7 @@ describe( 'convertSelectionChange', () => {
 		expect( modelGetData( model ) ).to.equal(
 			'<paragraph>f[o]o</paragraph><paragraph>b[a]r</paragraph>' );
 
-		const ranges = Array.from( model.selection.getRanges() );
+		const ranges = Array.from( model.document.selection.getRanges() );
 		expect( ranges.length ).to.equal( 2 );
 
 		expect( ranges[ 0 ].start.parent ).to.equal( modelRoot.getChild( 0 ) );
@@ -106,7 +106,7 @@ describe( 'convertSelectionChange', () => {
 		convertSelection( null, { newSelection: viewSelection } );
 
 		expect( modelGetData( model ) ).to.equal( '<paragraph>f[o]o</paragraph><paragraph>b[a]r</paragraph>' );
-		expect( model.selection.isBackward ).to.true;
+		expect( model.document.selection.isBackward ).to.true;
 	} );
 
 	it( 'should not enqueue changes if selection has not changed', () => {

+ 11 - 12
packages/ckeditor5-engine/tests/conversion/view-to-model-converters.js

@@ -8,8 +8,8 @@ import ViewContainerElement from '../../src/view/containerelement';
 import ViewDocumentFragment from '../../src/view/documentfragment';
 import ViewText from '../../src/view/text';
 
+import Model from '../../src/model/model';
 import ModelSchema from '../../src/model/schema';
-import ModelDocument from '../../src/model/document';
 import ModelDocumentFragment from '../../src/model/documentfragment';
 import ModelElement from '../../src/model/element';
 import ModelText from '../../src/model/text';
@@ -17,17 +17,16 @@ import ModelText from '../../src/model/text';
 import { convertToModelFragment, convertText } from '../../src/conversion/view-to-model-converters';
 
 describe( 'view-to-model-converters', () => {
-	let dispatcher, schema, additionalData, batch;
+	let dispatcher, schema, additionalData;
 
-	const modelDocument = new ModelDocument();
+	const model = new Model();
 
 	beforeEach( () => {
 		schema = new ModelSchema();
 		schema.registerItem( 'paragraph', '$block' );
 		schema.allow( { name: '$text', inside: '$root' } );
-		batch = modelDocument.batch();
 		additionalData = { context: [ '$root' ] };
-		dispatcher = new ViewConversionDispatcher( { schema } );
+		dispatcher = new ViewConversionDispatcher( model, { schema } );
 	} );
 
 	describe( 'convertText', () => {
@@ -36,7 +35,7 @@ describe( 'view-to-model-converters', () => {
 
 			dispatcher.on( 'text', convertText() );
 
-			const conversionResult = dispatcher.convert( viewText, batch, additionalData );
+			const conversionResult = dispatcher.convert( viewText, additionalData );
 
 			expect( conversionResult ).to.be.instanceof( ModelDocumentFragment );
 			expect( conversionResult.getChild( 0 ) ).to.be.instanceof( ModelText );
@@ -55,7 +54,7 @@ describe( 'view-to-model-converters', () => {
 				}
 			} );
 
-			const conversionResult = dispatcher.convert( viewText, batch, additionalData );
+			const conversionResult = dispatcher.convert( viewText, additionalData );
 
 			expect( conversionResult ).to.be.instanceof( ModelDocumentFragment );
 			expect( conversionResult.getChild( 0 ) ).to.be.instanceof( ModelText );
@@ -68,12 +67,12 @@ describe( 'view-to-model-converters', () => {
 			const viewText = new ViewText( 'foobar' );
 			dispatcher.on( 'text', convertText() );
 
-			let conversionResult = dispatcher.convert( viewText, batch, additionalData );
+			let conversionResult = dispatcher.convert( viewText, additionalData );
 
 			expect( conversionResult ).to.be.instanceof( ModelDocumentFragment );
 			expect( conversionResult.childCount ).to.equal( 0 );
 
-			conversionResult = dispatcher.convert( viewText, batch, { context: [ '$block' ] } );
+			conversionResult = dispatcher.convert( viewText, { context: [ '$block' ] } );
 
 			expect( conversionResult ).to.be.instanceof( ModelDocumentFragment );
 			expect( conversionResult.childCount ).to.equal( 1 );
@@ -86,7 +85,7 @@ describe( 'view-to-model-converters', () => {
 
 			dispatcher.on( 'text', convertText() );
 
-			const conversionResult = dispatcher.convert( viewText, batch, additionalData );
+			const conversionResult = dispatcher.convert( viewText, additionalData );
 
 			expect( conversionResult ).to.be.instanceof( ModelDocumentFragment );
 			expect( conversionResult.getChild( 0 ) ).to.be.instanceof( ModelText );
@@ -107,7 +106,7 @@ describe( 'view-to-model-converters', () => {
 			dispatcher.on( 'element', convertToModelFragment() );
 			dispatcher.on( 'documentFragment', convertToModelFragment() );
 
-			const conversionResult = dispatcher.convert( viewFragment, batch, additionalData );
+			const conversionResult = dispatcher.convert( viewFragment, additionalData );
 
 			expect( conversionResult ).to.be.instanceof( ModelDocumentFragment );
 			expect( conversionResult.maxOffset ).to.equal( 6 );
@@ -132,7 +131,7 @@ describe( 'view-to-model-converters', () => {
 				}
 			} );
 
-			const conversionResult = dispatcher.convert( viewP, batch, additionalData );
+			const conversionResult = dispatcher.convert( viewP, additionalData );
 
 			expect( conversionResult ).to.be.instanceof( ModelDocumentFragment );
 			expect( conversionResult.getChild( 0 ) ).to.be.instanceof( ModelElement );

+ 23 - 27
packages/ckeditor5-engine/tests/conversion/viewconversiondispatcher.js

@@ -8,10 +8,10 @@ import ViewContainerElement from '../../src/view/containerelement';
 import ViewDocumentFragment from '../../src/view/documentfragment';
 import ViewText from '../../src/view/text';
 
+import Model from '../../src/model/model';
 import ModelText from '../../src/model/text';
 import ModelElement from '../../src/model/element';
 import ModelDocumentFragment from '../../src/model/documentfragment';
-import ModelDocument from '../../src/model/document';
 import { stringify } from '../../src/dev-utils/model';
 
 import log from '@ckeditor/ckeditor5-utils/src/log';
@@ -20,15 +20,19 @@ import log from '@ckeditor/ckeditor5-utils/src/log';
 const logWarn = log.warn;
 
 describe( 'ViewConversionDispatcher', () => {
+	let model;
+
 	afterEach( () => {
+		model = new Model();
 		log.warn = logWarn;
 	} );
 
 	describe( 'constructor()', () => {
 		it( 'should create ViewConversionDispatcher with passed api', () => {
 			const apiObj = {};
-			const dispatcher = new ViewConversionDispatcher( { apiObj } );
+			const dispatcher = new ViewConversionDispatcher( model, { apiObj } );
 
+			expect( dispatcher.model ).to.equal( model );
 			expect( dispatcher.conversionApi.apiObj ).to.equal( apiObj );
 			expect( dispatcher.conversionApi ).to.have.property( 'convertItem' ).that.is.instanceof( Function );
 			expect( dispatcher.conversionApi ).to.have.property( 'convertChildren' ).that.is.instanceof( Function );
@@ -36,13 +40,10 @@ describe( 'ViewConversionDispatcher', () => {
 	} );
 
 	describe( 'convert', () => {
-		let dispatcher, batch;
-
-		const modelDocument = new ModelDocument();
+		let dispatcher;
 
 		beforeEach( () => {
-			dispatcher = new ViewConversionDispatcher();
-			batch = modelDocument.batch();
+			dispatcher = new ViewConversionDispatcher( model );
 		} );
 
 		it( 'should fire viewCleanup event on converted view part', () => {
@@ -51,7 +52,7 @@ describe( 'ViewConversionDispatcher', () => {
 			sinon.spy( dispatcher, 'fire' );
 
 			const viewP = new ViewContainerElement( 'p' );
-			dispatcher.convert( viewP, batch );
+			dispatcher.convert( viewP );
 
 			expect( dispatcher.fire.calledWith( 'viewCleanup', viewP ) ).to.be.true;
 		} );
@@ -65,9 +66,9 @@ describe( 'ViewConversionDispatcher', () => {
 
 			sinon.spy( dispatcher, 'fire' );
 
-			dispatcher.convert( viewText, batch );
-			dispatcher.convert( viewElement, batch );
-			dispatcher.convert( viewFragment, batch );
+			dispatcher.convert( viewText );
+			dispatcher.convert( viewElement );
+			dispatcher.convert( viewFragment );
 
 			expect( dispatcher.fire.calledWith( 'text' ) ).to.be.true;
 			expect( dispatcher.fire.calledWith( 'element:p' ) ).to.be.true;
@@ -99,7 +100,7 @@ describe( 'ViewConversionDispatcher', () => {
 			} );
 
 			// Use `additionalData` parameter to check if it was passed to the event.
-			const conversionResult = dispatcher.convert( viewText, batch, { foo: 'bar' } );
+			const conversionResult = dispatcher.convert( viewText, { foo: 'bar' } );
 
 			// Check conversion result.
 			// Result should be wrapped in document fragment.
@@ -134,7 +135,7 @@ describe( 'ViewConversionDispatcher', () => {
 			} );
 
 			// Use `additionalData` parameter to check if it was passed to the event.
-			const conversionResult = dispatcher.convert( viewElement, batch, { foo: 'bar' } );
+			const conversionResult = dispatcher.convert( viewElement, { foo: 'bar' } );
 
 			// Check conversion result.
 			// Result should be wrapped in document fragment.
@@ -168,7 +169,7 @@ describe( 'ViewConversionDispatcher', () => {
 			} );
 
 			// Use `additionalData` parameter to check if it was passed to the event.
-			const conversionResult = dispatcher.convert( viewFragment, batch, { foo: 'bar' } );
+			const conversionResult = dispatcher.convert( viewFragment, { foo: 'bar' } );
 
 			// Check conversion result.
 			expect( conversionResult ).to.be.instanceof( ModelDocumentFragment );
@@ -191,7 +192,7 @@ describe( 'ViewConversionDispatcher', () => {
 				] );
 			} );
 
-			const conversionResult = dispatcher.convert( viewFragment, batch );
+			const conversionResult = dispatcher.convert( viewFragment );
 
 			expect( conversionResult.markers.size ).to.equal( 2 );
 			expect( stringify( conversionResult, conversionResult.markers.get( 'marker1' ) ) ).to.deep.equal( 'fo[ob]ar' );
@@ -201,13 +202,9 @@ describe( 'ViewConversionDispatcher', () => {
 
 	describe( 'conversionApi', () => {
 		let spy, spyP, spyText, viewP, viewText, modelP, modelText, consumableMock, dispatcher,
-			spyNull, spyArray, viewDiv, viewNull, viewArray, batch;
-
-		const modelDocument = new ModelDocument();
+			spyNull, spyArray, viewDiv, viewNull, viewArray;
 
 		beforeEach( () => {
-			batch = modelDocument.batch();
-
 			spy = sinon.spy();
 			spyP = sinon.spy();
 			spyText = sinon.spy();
@@ -219,7 +216,7 @@ describe( 'ViewConversionDispatcher', () => {
 
 			consumableMock = {};
 
-			dispatcher = new ViewConversionDispatcher();
+			dispatcher = new ViewConversionDispatcher( model );
 
 			dispatcher.on( 'element:p', ( evt, data, consumable ) => {
 				spyP();
@@ -268,10 +265,9 @@ describe( 'ViewConversionDispatcher', () => {
 
 					expect( conversionApi.convertItem( viewP, consumableMock, data ) ).to.equal( modelP );
 					expect( conversionApi.convertItem( viewText, consumableMock, data ) ).to.equal( modelText );
-					expect( conversionApi.batch ).to.equal( batch );
 				} );
 
-				dispatcher.convert( new ViewDocumentFragment(), batch, { foo: 'bar' } );
+				dispatcher.convert( new ViewDocumentFragment(), { foo: 'bar' } );
 
 				expect( spy.calledOnce ).to.be.true;
 				expect( spyP.calledOnce ).to.be.true;
@@ -288,7 +284,7 @@ describe( 'ViewConversionDispatcher', () => {
 					expect( conversionApi.convertItem( viewNull ) ).to.equal( null );
 				} );
 
-				dispatcher.convert( new ViewDocumentFragment(), batch );
+				dispatcher.convert( new ViewDocumentFragment() );
 
 				expect( spy.calledOnce ).to.be.true;
 				expect( spyNull.calledOnce ).to.be.true;
@@ -306,7 +302,7 @@ describe( 'ViewConversionDispatcher', () => {
 					expect( conversionApi.convertItem( viewArray ) ).to.equal( null );
 				} );
 
-				dispatcher.convert( new ViewDocumentFragment(), batch );
+				dispatcher.convert( new ViewDocumentFragment() );
 
 				expect( spy.calledOnce ).to.be.true;
 				expect( spyArray.calledOnce ).to.be.true;
@@ -332,7 +328,7 @@ describe( 'ViewConversionDispatcher', () => {
 					expect( result.getChild( 1 ) ).to.equal( modelText );
 				} );
 
-				dispatcher.convert( new ViewDocumentFragment( [ viewP, viewText ] ), batch, { foo: 'bar' } );
+				dispatcher.convert( new ViewDocumentFragment( [ viewP, viewText ] ), { foo: 'bar' } );
 
 				expect( spy.calledOnce ).to.be.true;
 				expect( spyP.calledOnce ).to.be.true;
@@ -353,7 +349,7 @@ describe( 'ViewConversionDispatcher', () => {
 					expect( result.getChild( 1 ) ).to.equal( modelText );
 				} );
 
-				dispatcher.convert( new ViewDocumentFragment( [ viewArray, viewP, viewDiv, viewText, viewNull ] ), batch, { foo: 'bar' } );
+				dispatcher.convert( new ViewDocumentFragment( [ viewArray, viewP, viewDiv, viewText, viewNull ] ), { foo: 'bar' } );
 
 				expect( spy.calledOnce ).to.be.true;
 				expect( spyNull.calledOnce ).to.be.true;