Selaa lähdekoodia

Aligned test with engine changes.

Oskar Wróbel 8 vuotta sitten
vanhempi
commit
ca49008d61

+ 64 - 49
packages/ckeditor5-list/tests/indentcommand.js

@@ -4,31 +4,32 @@
  */
 
 import Editor from '@ckeditor/ckeditor5-core/src/editor/editor';
-import Document from '@ckeditor/ckeditor5-engine/src/model/document';
+import Model from '@ckeditor/ckeditor5-engine/src/model/model';
 import IndentCommand from '../src/indentcommand';
 import Range from '@ckeditor/ckeditor5-engine/src/model/range';
 import Position from '@ckeditor/ckeditor5-engine/src/model/position';
 import { setData, getData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model';
 
 describe( 'IndentCommand', () => {
-	let editor, doc, root;
+	let editor, model, doc, root;
 
 	beforeEach( () => {
 		editor = new Editor();
-		editor.document = new Document();
+		editor.model = new Model();
 
-		doc = editor.document;
+		model = editor.model;
+		doc = model.document;
 		root = doc.createRoot();
 
-		doc.schema.registerItem( 'listItem', '$block' );
-		doc.schema.registerItem( 'paragraph', '$block' );
+		model.schema.registerItem( 'listItem', '$block' );
+		model.schema.registerItem( 'paragraph', '$block' );
 
-		doc.schema.allow( { name: '$block', inside: '$root' } );
-		doc.schema.allow( { name: 'listItem', attributes: [ 'type', 'indent' ], inside: '$root' } );
-		doc.schema.allow( { name: 'paragraph', inside: '$root' } );
+		model.schema.allow( { name: '$block', inside: '$root' } );
+		model.schema.allow( { name: 'listItem', attributes: [ 'type', 'indent' ], inside: '$root' } );
+		model.schema.allow( { name: 'paragraph', inside: '$root' } );
 
 		setData(
-			doc,
+			model,
 			'<listItem indent="0" type="bulleted">a</listItem>' +
 			'<listItem indent="0" type="bulleted">b</listItem>' +
 			'<listItem indent="1" type="bulleted">c</listItem>' +
@@ -52,7 +53,7 @@ describe( 'IndentCommand', () => {
 
 		describe( 'isEnabled', () => {
 			it( 'should be true if selection starts in list item', () => {
-				doc.enqueueChanges( () => {
+				model.change( () => {
 					doc.selection.setCollapsedAt( root.getChild( 5 ) );
 				} );
 
@@ -60,7 +61,7 @@ describe( 'IndentCommand', () => {
 			} );
 
 			it( 'should be false if selection starts in first list item', () => {
-				doc.enqueueChanges( () => {
+				model.change( () => {
 					doc.selection.setCollapsedAt( root.getChild( 0 ) );
 				} );
 
@@ -70,7 +71,7 @@ describe( 'IndentCommand', () => {
 			// Reported in PR #53.
 			it( 'should be false if selection starts in first list item #2', () => {
 				setData(
-					doc,
+					model,
 					'<listItem indent="0" type="bulleted">a</listItem>' +
 					'<listItem indent="1" type="bulleted">b</listItem>' +
 					'<listItem indent="0" type="bulleted">c</listItem>' +
@@ -84,7 +85,7 @@ describe( 'IndentCommand', () => {
 			// Reported in PR #53.
 			it( 'should be false if selection starts in first list item #3', () => {
 				setData(
-					doc,
+					model,
 					'<listItem indent="0" type="bulleted">a</listItem>' +
 					'<listItem indent="1" type="bulleted">b</listItem>' +
 					'<listItem indent="0" type="numbered">c</listItem>' +
@@ -97,7 +98,7 @@ describe( 'IndentCommand', () => {
 
 			it( 'should be false if selection starts in first list item of top level list with different type than previous list', () => {
 				setData(
-					doc,
+					model,
 					'<listItem indent="0" type="bulleted">a</listItem>' +
 					'<listItem indent="0" type="numbered">[]b</listItem>'
 				);
@@ -106,7 +107,7 @@ describe( 'IndentCommand', () => {
 			} );
 
 			it( 'should be false if selection starts in a list item that has bigger indent than it\'s previous sibling', () => {
-				doc.enqueueChanges( () => {
+				model.change( () => {
 					doc.selection.setCollapsedAt( root.getChild( 2 ) );
 				} );
 
@@ -116,23 +117,37 @@ describe( 'IndentCommand', () => {
 			// Edge case but may happen that some other blocks will also use the indent attribute
 			// and before we fixed it the command was enabled in such a case.
 			it( 'should be false if selection starts in a paragraph with indent attribute', () => {
-				doc.schema.allow( { name: 'paragraph', attributes: [ 'indent' ], inside: '$root' } );
+				model.schema.allow( { name: 'paragraph', attributes: [ 'indent' ], inside: '$root' } );
 
-				setData( doc, '<listItem indent="0">a</listItem><paragraph indent="0">b[]</paragraph>' );
+				setData( model, '<listItem indent="0">a</listItem><paragraph indent="0">b[]</paragraph>' );
 
 				expect( command.isEnabled ).to.be.false;
 			} );
 		} );
 
 		describe( 'execute()', () => {
+			it( 'should use parent batch', () => {
+				model.change( () => {
+					doc.selection.setCollapsedAt( root.getChild( 5 ) );
+				} );
+
+				model.change( writer => {
+					expect( writer.batch.deltas.length ).to.equal( 0 );
+
+					command.execute();
+
+					expect( writer.batch.deltas.length ).to.be.above( 0 );
+				} );
+			} );
+
 			it( 'should increment indent attribute by 1', () => {
-				doc.enqueueChanges( () => {
+				model.change( () => {
 					doc.selection.setCollapsedAt( root.getChild( 5 ) );
 				} );
 
 				command.execute();
 
-				expect( getData( doc, { withoutSelection: true } ) ).to.equal(
+				expect( getData( model, { withoutSelection: true } ) ).to.equal(
 					'<listItem indent="0" type="bulleted">a</listItem>' +
 					'<listItem indent="0" type="bulleted">b</listItem>' +
 					'<listItem indent="1" type="bulleted">c</listItem>' +
@@ -144,13 +159,13 @@ describe( 'IndentCommand', () => {
 			} );
 
 			it( 'should increment indent of all sub-items of indented item', () => {
-				doc.enqueueChanges( () => {
+				model.change( () => {
 					doc.selection.setCollapsedAt( root.getChild( 1 ) );
 				} );
 
 				command.execute();
 
-				expect( getData( doc, { withoutSelection: true } ) ).to.equal(
+				expect( getData( model, { withoutSelection: true } ) ).to.equal(
 					'<listItem indent="0" type="bulleted">a</listItem>' +
 					'<listItem indent="1" type="bulleted">b</listItem>' +
 					'<listItem indent="2" type="bulleted">c</listItem>' +
@@ -162,7 +177,7 @@ describe( 'IndentCommand', () => {
 			} );
 
 			it( 'should increment indent of all selected item when multiple items are selected', () => {
-				doc.enqueueChanges( () => {
+				model.change( () => {
 					doc.selection.setRanges( [ new Range(
 						new Position( root.getChild( 1 ), [ 0 ] ),
 						new Position( root.getChild( 3 ), [ 1 ] )
@@ -171,7 +186,7 @@ describe( 'IndentCommand', () => {
 
 				command.execute();
 
-				expect( getData( doc, { withoutSelection: true } ) ).to.equal(
+				expect( getData( model, { withoutSelection: true } ) ).to.equal(
 					'<listItem indent="0" type="bulleted">a</listItem>' +
 					'<listItem indent="1" type="bulleted">b</listItem>' +
 					'<listItem indent="2" type="bulleted">c</listItem>' +
@@ -184,7 +199,7 @@ describe( 'IndentCommand', () => {
 
 			it( 'should fix list type when item is intended #1', () => {
 				setData(
-					doc,
+					model,
 					'<listItem indent="0" type="bulleted">a</listItem>' +
 					'<listItem indent="1" type="bulleted">b</listItem>' +
 					'<listItem indent="2" type="numbered">c</listItem>' +
@@ -193,7 +208,7 @@ describe( 'IndentCommand', () => {
 
 				command.execute();
 
-				expect( getData( doc, { withoutSelection: true } ) ).to.equal(
+				expect( getData( model, { withoutSelection: true } ) ).to.equal(
 					'<listItem indent="0" type="bulleted">a</listItem>' +
 					'<listItem indent="1" type="bulleted">b</listItem>' +
 					'<listItem indent="2" type="numbered">c</listItem>' +
@@ -204,7 +219,7 @@ describe( 'IndentCommand', () => {
 			// Not only boundary list items has to be fixed, but also items in the middle of selection.
 			it( 'should fix list type when item is intended #2', () => {
 				setData(
-					doc,
+					model,
 					'<listItem indent="0" type="bulleted">a</listItem>' +
 					'<listItem indent="1" type="numbered">b</listItem>' +
 					'<listItem indent="1" type="numbered">[c</listItem>' +
@@ -215,7 +230,7 @@ describe( 'IndentCommand', () => {
 
 				command.execute();
 
-				expect( getData( doc, { withoutSelection: true } ) ).to.equal(
+				expect( getData( model, { withoutSelection: true } ) ).to.equal(
 					'<listItem indent="0" type="bulleted">a</listItem>' +
 					'<listItem indent="1" type="numbered">b</listItem>' +
 					'<listItem indent="2" type="numbered">c</listItem>' +
@@ -240,7 +255,7 @@ describe( 'IndentCommand', () => {
 
 		describe( 'isEnabled', () => {
 			it( 'should be true if selection starts in list item', () => {
-				doc.enqueueChanges( () => {
+				model.change( () => {
 					doc.selection.setCollapsedAt( root.getChild( 5 ) );
 				} );
 
@@ -249,7 +264,7 @@ describe( 'IndentCommand', () => {
 
 			it( 'should be true if selection starts in first list item', () => {
 				// This is in contrary to forward indent command.
-				doc.enqueueChanges( () => {
+				model.change( () => {
 					doc.selection.setCollapsedAt( root.getChild( 0 ) );
 				} );
 
@@ -258,7 +273,7 @@ describe( 'IndentCommand', () => {
 
 			it( 'should be true if selection starts in a list item that has bigger indent than it\'s previous sibling', () => {
 				// This is in contrary to forward indent command.
-				doc.enqueueChanges( () => {
+				model.change( () => {
 					doc.selection.setCollapsedAt( root.getChild( 2 ) );
 				} );
 
@@ -268,13 +283,13 @@ describe( 'IndentCommand', () => {
 
 		describe( 'execute()', () => {
 			it( 'should decrement indent attribute by 1 (if it is bigger than 0)', () => {
-				doc.enqueueChanges( () => {
+				model.change( () => {
 					doc.selection.setCollapsedAt( root.getChild( 5 ) );
 				} );
 
 				command.execute();
 
-				expect( getData( doc, { withoutSelection: true } ) ).to.equal(
+				expect( getData( model, { withoutSelection: true } ) ).to.equal(
 					'<listItem indent="0" type="bulleted">a</listItem>' +
 					'<listItem indent="0" type="bulleted">b</listItem>' +
 					'<listItem indent="1" type="bulleted">c</listItem>' +
@@ -286,13 +301,13 @@ describe( 'IndentCommand', () => {
 			} );
 
 			it( 'should rename listItem to paragraph (if indent is equal to 0)', () => {
-				doc.enqueueChanges( () => {
+				model.change( () => {
 					doc.selection.setCollapsedAt( root.getChild( 0 ) );
 				} );
 
 				command.execute();
 
-				expect( getData( doc, { withoutSelection: true } ) ).to.equal(
+				expect( getData( model, { withoutSelection: true } ) ).to.equal(
 					'<paragraph indent="0" type="bulleted">a</paragraph>' +
 					'<listItem indent="0" type="bulleted">b</listItem>' +
 					'<listItem indent="1" type="bulleted">c</listItem>' +
@@ -304,13 +319,13 @@ describe( 'IndentCommand', () => {
 			} );
 
 			it( 'should decrement indent of all sub-items of outdented item', () => {
-				doc.enqueueChanges( () => {
+				model.change( () => {
 					doc.selection.setCollapsedAt( root.getChild( 1 ) );
 				} );
 
 				command.execute();
 
-				expect( getData( doc, { withoutSelection: true } ) ).to.equal(
+				expect( getData( model, { withoutSelection: true } ) ).to.equal(
 					'<listItem indent="0" type="bulleted">a</listItem>' +
 					'<paragraph indent="0" type="bulleted">b</paragraph>' +
 					'<listItem indent="0" type="bulleted">c</listItem>' +
@@ -322,7 +337,7 @@ describe( 'IndentCommand', () => {
 			} );
 
 			it( 'should outdent all selected item when multiple items are selected', () => {
-				doc.enqueueChanges( () => {
+				model.change( () => {
 					doc.selection.setRanges( [ new Range(
 						new Position( root.getChild( 1 ), [ 0 ] ),
 						new Position( root.getChild( 3 ), [ 1 ] )
@@ -331,7 +346,7 @@ describe( 'IndentCommand', () => {
 
 				command.execute();
 
-				expect( getData( doc, { withoutSelection: true } ) ).to.equal(
+				expect( getData( model, { withoutSelection: true } ) ).to.equal(
 					'<listItem indent="0" type="bulleted">a</listItem>' +
 					'<paragraph indent="0" type="bulleted">b</paragraph>' +
 					'<listItem indent="0" type="bulleted">c</listItem>' +
@@ -344,7 +359,7 @@ describe( 'IndentCommand', () => {
 
 			it( 'should fix list type when item is outdented #1', () => {
 				setData(
-					doc,
+					model,
 					'<listItem indent="0" type="bulleted">a</listItem>' +
 					'<listItem indent="1" type="bulleted">b</listItem>' +
 					'<listItem indent="2" type="numbered">[]c</listItem>'
@@ -352,7 +367,7 @@ describe( 'IndentCommand', () => {
 
 				command.execute();
 
-				expect( getData( doc, { withoutSelection: true } ) ).to.equal(
+				expect( getData( model, { withoutSelection: true } ) ).to.equal(
 					'<listItem indent="0" type="bulleted">a</listItem>' +
 					'<listItem indent="1" type="bulleted">b</listItem>' +
 					'<listItem indent="1" type="bulleted">c</listItem>'
@@ -362,7 +377,7 @@ describe( 'IndentCommand', () => {
 			// Look at next siblings if, after outdenting, a list item is a first item in it's list (list item "c").
 			it( 'should fix list type when item is outdented #2', () => {
 				setData(
-					doc,
+					model,
 					'<listItem indent="0" type="bulleted">a</listItem>' +
 					'<listItem indent="1" type="numbered">[]b</listItem>' +
 					'<listItem indent="2" type="bulleted">c</listItem>' +
@@ -371,7 +386,7 @@ describe( 'IndentCommand', () => {
 
 				command.execute();
 
-				expect( getData( doc, { withoutSelection: true } ) ).to.equal(
+				expect( getData( model, { withoutSelection: true } ) ).to.equal(
 					'<listItem indent="0" type="bulleted">a</listItem>' +
 					'<listItem indent="0" type="bulleted">b</listItem>' +
 					'<listItem indent="1" type="numbered">c</listItem>' +
@@ -382,7 +397,7 @@ describe( 'IndentCommand', () => {
 			// Reported in #53.
 			it( 'should fix list type when item is outdented #3', () => {
 				setData(
-					doc,
+					model,
 					'<listItem indent="0" type="bulleted">a</listItem>' +
 					'<listItem indent="1" type="numbered">[b</listItem>' +
 					'<listItem indent="1" type="numbered">c</listItem>' +
@@ -391,7 +406,7 @@ describe( 'IndentCommand', () => {
 
 				command.execute();
 
-				expect( getData( doc, { withoutSelection: true } ) ).to.equal(
+				expect( getData( model, { withoutSelection: true } ) ).to.equal(
 					'<listItem indent="0" type="bulleted">a</listItem>' +
 					'<listItem indent="0" type="bulleted">b</listItem>' +
 					'<listItem indent="0" type="bulleted">c</listItem>' +
@@ -401,7 +416,7 @@ describe( 'IndentCommand', () => {
 
 			it( 'should fix list type when item is outdented to top level (if needed)', () => {
 				setData(
-					doc,
+					model,
 					'<listItem indent="0" type="bulleted">a</listItem>' +
 					'<listItem indent="1" type="numbered">[]b</listItem>' +
 					'<listItem indent="0" type="numbered">c</listItem>'
@@ -411,7 +426,7 @@ describe( 'IndentCommand', () => {
 
 				// Another possible behaviour would be that "b" list item becomes first list item of a top level
 				// numbered list (so it does not change it's type) but it seems less correct from UX standpoint.
-				expect( getData( doc, { withoutSelection: true } ) ).to.equal(
+				expect( getData( model, { withoutSelection: true } ) ).to.equal(
 					'<listItem indent="0" type="bulleted">a</listItem>' +
 					'<listItem indent="0" type="bulleted">b</listItem>' +
 					'<listItem indent="0" type="numbered">c</listItem>'
@@ -422,7 +437,7 @@ describe( 'IndentCommand', () => {
 				// There was a bug that the nested sub-list changed it's type because for a while, it was on same indent
 				// level as the originally outdented element.
 				setData(
-					doc,
+					model,
 					'<listItem indent="0" type="bulleted">a</listItem>' +
 					'<listItem indent="1" type="numbered">b</listItem>' +
 					'<listItem indent="1" type="numbered">[]c</listItem>' +
@@ -432,7 +447,7 @@ describe( 'IndentCommand', () => {
 
 				command.execute();
 
-				expect( getData( doc, { withoutSelection: true } ) ).to.equal(
+				expect( getData( model, { withoutSelection: true } ) ).to.equal(
 					'<listItem indent="0" type="bulleted">a</listItem>' +
 					'<listItem indent="1" type="numbered">b</listItem>' +
 					'<listItem indent="0" type="bulleted">c</listItem>' +

+ 20 - 20
packages/ckeditor5-list/tests/list.js

@@ -16,7 +16,7 @@ import { getCode } from '@ckeditor/ckeditor5-utils/src/keyboard';
 import { setData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model';
 
 describe( 'List', () => {
-	let editor, doc, bulletedListButton, numberedListButton;
+	let editor, model, bulletedListButton, numberedListButton;
 
 	beforeEach( () => {
 		const editorElement = document.createElement( 'div' );
@@ -25,7 +25,7 @@ describe( 'List', () => {
 		return ClassicTestEditor.create( editorElement, { plugins: [ Paragraph, BlockQuote, List ] } )
 			.then( newEditor => {
 				editor = newEditor;
-				doc = editor.document;
+				model = editor.model;
 
 				bulletedListButton = editor.ui.componentFactory.create( 'bulletedList' );
 				numberedListButton = editor.ui.componentFactory.create( 'numberedList' );
@@ -60,7 +60,7 @@ describe( 'List', () => {
 	} );
 
 	it( 'should bind bulleted list button model to bulledList command', () => {
-		setData( doc, '<listItem type="bulleted" indent="0">[]foo</listItem>' );
+		setData( model, '<listItem type="bulleted" indent="0">[]foo</listItem>' );
 
 		const command = editor.commands.get( 'bulletedList' );
 
@@ -75,7 +75,7 @@ describe( 'List', () => {
 	} );
 
 	it( 'should bind numbered list button model to numberedList command', () => {
-		setData( doc, '<listItem type="bulleted" indent="0">[]foo</listItem>' );
+		setData( model, '<listItem type="bulleted" indent="0">[]foo</listItem>' );
 
 		const command = editor.commands.get( 'numberedList' );
 
@@ -96,7 +96,7 @@ describe( 'List', () => {
 
 			sinon.spy( editor, 'execute' );
 
-			setData( doc, '<listItem type="bulleted" indent="0">[]</listItem>' );
+			setData( model, '<listItem type="bulleted" indent="0">[]</listItem>' );
 
 			editor.editing.view.fire( 'enter', domEvtDataStub );
 
@@ -109,7 +109,7 @@ describe( 'List', () => {
 
 			sinon.spy( editor, 'execute' );
 
-			setData( doc, '<listItem type="bulleted" indent="0">foo[]</listItem>' );
+			setData( model, '<listItem type="bulleted" indent="0">foo[]</listItem>' );
 
 			editor.editing.view.fire( 'enter', domEvtDataStub );
 
@@ -123,7 +123,7 @@ describe( 'List', () => {
 
 			sinon.spy( editor, 'execute' );
 
-			setData( doc, '<listItem type="bulleted" indent="0">[]foo</listItem>' );
+			setData( model, '<listItem type="bulleted" indent="0">[]foo</listItem>' );
 
 			editor.editing.view.fire( 'delete', domEvtDataStub );
 
@@ -135,7 +135,7 @@ describe( 'List', () => {
 
 			sinon.spy( editor, 'execute' );
 
-			setData( doc, '<paragraph>foo</paragraph><listItem type="bulleted" indent="0">[]foo</listItem>' );
+			setData( model, '<paragraph>foo</paragraph><listItem type="bulleted" indent="0">[]foo</listItem>' );
 
 			editor.editing.view.fire( 'delete', domEvtDataStub );
 
@@ -147,7 +147,7 @@ describe( 'List', () => {
 
 			sinon.spy( editor, 'execute' );
 
-			setData( doc, '<listItem type="bulleted" indent="0">[]foo</listItem>' );
+			setData( model, '<listItem type="bulleted" indent="0">[]foo</listItem>' );
 
 			editor.editing.view.fire( 'delete', domEvtDataStub );
 
@@ -159,7 +159,7 @@ describe( 'List', () => {
 
 			sinon.spy( editor, 'execute' );
 
-			setData( doc, '<listItem type="bulleted" indent="0">[fo]o</listItem>' );
+			setData( model, '<listItem type="bulleted" indent="0">[fo]o</listItem>' );
 
 			editor.editing.view.fire( 'delete', domEvtDataStub );
 
@@ -171,7 +171,7 @@ describe( 'List', () => {
 
 			sinon.spy( editor, 'execute' );
 
-			setData( doc, '<paragraph>[]foo</paragraph>' );
+			setData( model, '<paragraph>[]foo</paragraph>' );
 
 			editor.editing.view.fire( 'delete', domEvtDataStub );
 
@@ -183,7 +183,7 @@ describe( 'List', () => {
 
 			sinon.spy( editor, 'execute' );
 
-			setData( doc, '<listItem type="bulleted" indent="0">foo</listItem><listItem type="bulleted" indent="0">[]foo</listItem>' );
+			setData( model, '<listItem type="bulleted" indent="0">foo</listItem><listItem type="bulleted" indent="0">[]foo</listItem>' );
 
 			editor.editing.view.fire( 'delete', domEvtDataStub );
 
@@ -195,7 +195,7 @@ describe( 'List', () => {
 
 			sinon.spy( editor, 'execute' );
 
-			setData( doc, '<listItem type="bulleted" indent="0">fo[]o</listItem>' );
+			setData( model, '<listItem type="bulleted" indent="0">fo[]o</listItem>' );
 
 			editor.editing.view.fire( 'delete', domEvtDataStub );
 
@@ -207,7 +207,7 @@ describe( 'List', () => {
 
 			sinon.spy( editor, 'execute' );
 
-			setData( doc, '<listItem type="bulleted" indent="0">fo[]o</listItem>' );
+			setData( model, '<listItem type="bulleted" indent="0">fo[]o</listItem>' );
 
 			editor.editing.view.fire( 'delete', domEvtDataStub );
 
@@ -219,7 +219,7 @@ describe( 'List', () => {
 
 			sinon.spy( editor, 'execute' );
 
-			setData( doc, '<blockQuote><paragraph>x</paragraph></blockQuote><listItem type="bulleted" indent="0">[]foo</listItem>' );
+			setData( model, '<blockQuote><paragraph>x</paragraph></blockQuote><listItem type="bulleted" indent="0">[]foo</listItem>' );
 
 			editor.editing.view.fire( 'delete', domEvtDataStub );
 
@@ -231,7 +231,7 @@ describe( 'List', () => {
 
 			sinon.spy( editor, 'execute' );
 
-			setData( doc, '<paragraph>x</paragraph><blockQuote><listItem type="bulleted" indent="0">[]foo</listItem></blockQuote>' );
+			setData( model, '<paragraph>x</paragraph><blockQuote><listItem type="bulleted" indent="0">[]foo</listItem></blockQuote>' );
 
 			editor.editing.view.fire( 'delete', domEvtDataStub );
 
@@ -258,7 +258,7 @@ describe( 'List', () => {
 
 		it( 'should execute indentList command on tab key', () => {
 			setData(
-				doc,
+				model,
 				'<listItem type="bulleted" indent="0">foo</listItem>' +
 				'<listItem type="bulleted" indent="0">[]bar</listItem>'
 			);
@@ -275,7 +275,7 @@ describe( 'List', () => {
 			domEvtDataStub.keyCode += getCode( 'Shift' );
 
 			setData(
-				doc,
+				model,
 				'<listItem type="bulleted" indent="0">foo</listItem>' +
 				'<listItem type="bulleted" indent="1">[]bar</listItem>'
 			);
@@ -289,7 +289,7 @@ describe( 'List', () => {
 		} );
 
 		it( 'should not indent if command is disabled', () => {
-			setData( doc, '<listItem type="bulleted" indent="0">[]foo</listItem>' );
+			setData( model, '<listItem type="bulleted" indent="0">[]foo</listItem>' );
 
 			editor.editing.view.fire( 'keydown', domEvtDataStub );
 
@@ -302,7 +302,7 @@ describe( 'List', () => {
 			domEvtDataStub.keyCode += getCode( 'alt' );
 
 			setData(
-				doc,
+				model,
 				'<listItem type="bulleted" indent="0">foo</listItem>' +
 				'<listItem type="bulleted" indent="0">[]bar</listItem>'
 			);

+ 52 - 53
packages/ckeditor5-list/tests/listcommand.js

@@ -4,35 +4,36 @@
  */
 
 import Editor from '@ckeditor/ckeditor5-core/src/editor/editor';
-import Document from '@ckeditor/ckeditor5-engine/src/model/document';
+import Model from '@ckeditor/ckeditor5-engine/src/model/model';
 import ListCommand from '../src/listcommand';
 import Range from '@ckeditor/ckeditor5-engine/src/model/range';
 import Position from '@ckeditor/ckeditor5-engine/src/model/position';
 import { setData, getData } from '@ckeditor/ckeditor5-engine/src/dev-utils/model';
 
 describe( 'ListCommand', () => {
-	let editor, command, doc, root;
+	let editor, command, model, doc, root;
 
 	beforeEach( () => {
 		editor = new Editor();
-		editor.document = new Document();
+		editor.model = new Model();
 
-		doc = editor.document;
+		model = editor.model;
+		doc = model.document;
 		root = doc.createRoot();
 
 		command = new ListCommand( editor, 'bulleted' );
 
-		doc.schema.registerItem( 'listItem', '$block' );
-		doc.schema.registerItem( 'paragraph', '$block' );
-		doc.schema.registerItem( 'widget', '$block' );
+		model.schema.registerItem( 'listItem', '$block' );
+		model.schema.registerItem( 'paragraph', '$block' );
+		model.schema.registerItem( 'widget', '$block' );
 
-		doc.schema.allow( { name: '$block', inside: '$root' } );
-		doc.schema.allow( { name: 'paragraph', inside: 'widget' } );
-		doc.schema.allow( { name: 'listItem', attributes: [ 'type', 'indent' ], inside: '$root' } );
-		doc.schema.disallow( { name: 'listItem', attributes: [ 'type', 'indent' ], inside: 'widget' } );
+		model.schema.allow( { name: '$block', inside: '$root' } );
+		model.schema.allow( { name: 'paragraph', inside: 'widget' } );
+		model.schema.allow( { name: 'listItem', attributes: [ 'type', 'indent' ], inside: '$root' } );
+		model.schema.disallow( { name: 'listItem', attributes: [ 'type', 'indent' ], inside: 'widget' } );
 
 		setData(
-			doc,
+			model,
 			'<paragraph>foo</paragraph>' +
 			'<listItem type="bulleted" indent="0">bulleted</listItem>' +
 			'<listItem type="numbered" indent="0">numbered</listItem>' +
@@ -62,7 +63,7 @@ describe( 'ListCommand', () => {
 
 		describe( 'value', () => {
 			it( 'should be false if first position in selection is not in a list item', () => {
-				doc.enqueueChanges( () => {
+				model.change( () => {
 					doc.selection.setCollapsedAt( doc.getRoot().getChild( 3 ) );
 				} );
 
@@ -70,7 +71,7 @@ describe( 'ListCommand', () => {
 			} );
 
 			it( 'should be false if first position in selection is in a list item of different type', () => {
-				doc.enqueueChanges( () => {
+				model.change( () => {
 					doc.selection.setCollapsedAt( doc.getRoot().getChild( 2 ) );
 				} );
 
@@ -78,7 +79,7 @@ describe( 'ListCommand', () => {
 			} );
 
 			it( 'should be true if first position in selection is in a list item of same type', () => {
-				doc.enqueueChanges( () => {
+				model.change( () => {
 					doc.selection.setCollapsedAt( doc.getRoot().getChild( 1 ) );
 				} );
 
@@ -88,69 +89,67 @@ describe( 'ListCommand', () => {
 
 		describe( 'isEnabled', () => {
 			it( 'should be true if entire selection is in a list', () => {
-				setData( doc, '<listItem type="bulleted" indent="0">[a]</listItem>' );
+				setData( model, '<listItem type="bulleted" indent="0">[a]</listItem>' );
 				expect( command.isEnabled ).to.be.true;
 			} );
 
 			it( 'should be true if entire selection is in a block which can be turned into a list', () => {
-				setData( doc, '<paragraph>[a]</paragraph>' );
+				setData( model, '<paragraph>[a]</paragraph>' );
 				expect( command.isEnabled ).to.be.true;
 			} );
 
 			it( 'should be true if selection first position is in a block which can be turned into a list', () => {
-				setData( doc, '<paragraph>[a</paragraph><widget>b]</widget>' );
+				setData( model, '<paragraph>[a</paragraph><widget>b]</widget>' );
 				expect( command.isEnabled ).to.be.true;
 			} );
 
 			it( 'should be false if selection first position is in an element which cannot be converted to a list item', () => {
-				setData( doc, '<widget><paragraph>[a</paragraph></widget><paragraph>b]</paragraph>' );
+				setData( model, '<widget><paragraph>[a</paragraph></widget><paragraph>b]</paragraph>' );
 				expect( command.isEnabled ).to.be.false;
 			} );
 
 			it( 'should be false in a root which does not allow blocks at all', () => {
 				doc.createRoot( 'paragraph', 'inlineOnlyRoot' );
-				setData( doc, 'a[]b', { rootName: 'inlineOnlyRoot' } );
+				setData( model, 'a[]b', { rootName: 'inlineOnlyRoot' } );
 				expect( command.isEnabled ).to.be.false;
 			} );
 		} );
 
 		describe( 'execute()', () => {
-			describe( 'custom options', () => {
-				it( 'should use provided batch', () => {
-					const batch = editor.document.batch();
+			it( 'should use parent batch', () => {
+				model.change( writer => {
+					expect( writer.batch.deltas.length ).to.equal( 0 );
 
-					expect( batch.deltas.length ).to.equal( 0 );
-
-					command.execute( { batch } );
+					command.execute();
 
-					expect( batch.deltas.length ).to.be.above( 0 );
+					expect( writer.batch.deltas.length ).to.be.above( 0 );
 				} );
 			} );
 
 			describe( 'collapsed selection', () => {
 				it( 'should rename closest block to listItem and set correct attributes', () => {
-					setData( doc, '<paragraph>fo[]o</paragraph>' );
+					setData( model, '<paragraph>fo[]o</paragraph>' );
 
 					command.execute();
 
-					expect( getData( doc ) ).to.equal( '<listItem indent="0" type="bulleted">fo[]o</listItem>' );
+					expect( getData( model ) ).to.equal( '<listItem indent="0" type="bulleted">fo[]o</listItem>' );
 				} );
 
 				it( 'should rename closest listItem to paragraph', () => {
-					setData( doc, '<listItem indent="0" type="bulleted">fo[]o</listItem>' );
+					setData( model, '<listItem indent="0" type="bulleted">fo[]o</listItem>' );
 
 					command.execute();
 
 					// Attributes will be removed by post fixer.
-					expect( getData( doc ) ).to.equal( '<paragraph indent="0" type="bulleted">fo[]o</paragraph>' );
+					expect( getData( model ) ).to.equal( '<paragraph indent="0" type="bulleted">fo[]o</paragraph>' );
 				} );
 
 				it( 'should change closest listItem\' type', () => {
-					setData( doc, '<listItem indent="0" type="numbered">fo[]o</listItem>' );
+					setData( model, '<listItem indent="0" type="numbered">fo[]o</listItem>' );
 
 					command.execute();
 
-					expect( getData( doc ) ).to.equal( '<listItem indent="0" type="bulleted">fo[]o</listItem>' );
+					expect( getData( model ) ).to.equal( '<listItem indent="0" type="bulleted">fo[]o</listItem>' );
 				} );
 
 				it( 'should handle outdenting sub-items when list item is turned off', () => {
@@ -193,7 +192,7 @@ describe( 'ListCommand', () => {
 					/* eslint-enable max-len */
 
 					setData(
-						doc,
+						model,
 						'<listItem indent="0" type="bulleted">---</listItem>' +
 						'<listItem indent="1" type="bulleted">---</listItem>' +
 						'<listItem indent="2" type="bulleted">[]---</listItem>' +
@@ -228,14 +227,14 @@ describe( 'ListCommand', () => {
 						'<listItem indent="1" type="bulleted">---</listItem>' +
 						'<listItem indent="2" type="bulleted">---</listItem>';
 
-					expect( getData( doc ) ).to.equal( expectedData );
+					expect( getData( model ) ).to.equal( expectedData );
 				} );
 			} );
 
 			describe( 'non-collapsed selection', () => {
 				beforeEach( () => {
 					setData(
-						doc,
+						model,
 						'<listItem indent="0" type="bulleted">---</listItem>' +
 						'<listItem indent="0" type="bulleted">---</listItem>' +
 						'<paragraph>---</paragraph>' +
@@ -249,15 +248,15 @@ describe( 'ListCommand', () => {
 
 				// https://github.com/ckeditor/ckeditor5-list/issues/62
 				it( 'should not rename blocks which cannot become listItems', () => {
-					doc.schema.registerItem( 'restricted' );
-					doc.schema.allow( { name: 'restricted', inside: '$root' } );
-					doc.schema.disallow( { name: 'paragraph', inside: 'restricted' } );
+					model.schema.registerItem( 'restricted' );
+					model.schema.allow( { name: 'restricted', inside: '$root' } );
+					model.schema.disallow( { name: 'paragraph', inside: 'restricted' } );
 
-					doc.schema.registerItem( 'fooBlock', '$block' );
-					doc.schema.allow( { name: 'fooBlock', inside: 'restricted' } );
+					model.schema.registerItem( 'fooBlock', '$block' );
+					model.schema.allow( { name: 'fooBlock', inside: 'restricted' } );
 
 					setData(
-						doc,
+						model,
 						'<paragraph>a[bc</paragraph>' +
 						'<restricted><fooBlock></fooBlock></restricted>' +
 						'<paragraph>de]f</paragraph>'
@@ -265,7 +264,7 @@ describe( 'ListCommand', () => {
 
 					command.execute();
 
-					expect( getData( doc ) ).to.equal(
+					expect( getData( model ) ).to.equal(
 						'<listItem indent="0" type="bulleted">a[bc</listItem>' +
 						'<restricted><fooBlock></fooBlock></restricted>' +
 						'<listItem indent="0" type="bulleted">de]f</listItem>'
@@ -275,7 +274,7 @@ describe( 'ListCommand', () => {
 				it( 'should rename closest block to listItem and set correct attributes', () => {
 					// From first paragraph to second paragraph.
 					// Command value=false, we are turning on list items.
-					doc.enqueueChanges( () => {
+					model.change( () => {
 						doc.selection.setRanges( [ new Range(
 							Position.createAt( root.getChild( 2 ) ),
 							Position.createAt( root.getChild( 3 ), 'end' )
@@ -294,13 +293,13 @@ describe( 'ListCommand', () => {
 						'<listItem indent="1" type="bulleted">---</listItem>' +
 						'<listItem indent="2" type="bulleted">---</listItem>';
 
-					expect( getData( doc ) ).to.equal( expectedData );
+					expect( getData( model ) ).to.equal( expectedData );
 				} );
 
 				it( 'should rename closest listItem to paragraph', () => {
 					// From second bullet list item to first numbered list item.
 					// Command value=true, we are turning off list items.
-					doc.enqueueChanges( () => {
+					model.change( () => {
 						doc.selection.setRanges( [ new Range(
 							Position.createAt( root.getChild( 1 ) ),
 							Position.createAt( root.getChild( 4 ), 'end' )
@@ -320,12 +319,12 @@ describe( 'ListCommand', () => {
 						'<listItem indent="1" type="bulleted">---</listItem>' +
 						'<listItem indent="2" type="bulleted">---</listItem>';
 
-					expect( getData( doc ) ).to.equal( expectedData );
+					expect( getData( model ) ).to.equal( expectedData );
 				} );
 
 				it( 'should change closest listItem\'s type', () => {
 					// From first numbered lsit item to third bulleted list item.
-					doc.enqueueChanges( () => {
+					model.change( () => {
 						doc.selection.setRanges( [ new Range(
 							Position.createAt( root.getChild( 4 ) ),
 							Position.createAt( root.getChild( 6 ) )
@@ -345,12 +344,12 @@ describe( 'ListCommand', () => {
 						'<listItem indent="1" type="bulleted">]---</listItem>' +
 						'<listItem indent="2" type="bulleted">---</listItem>';
 
-					expect( getData( doc ) ).to.equal( expectedData );
+					expect( getData( model ) ).to.equal( expectedData );
 				} );
 
 				it( 'should handle outdenting sub-items when list item is turned off', () => {
 					// From first numbered list item to third bulleted list item.
-					doc.enqueueChanges( () => {
+					model.change( () => {
 						doc.selection.setRanges( [ new Range(
 							Position.createAt( root.getChild( 1 ) ),
 							Position.createAt( root.getChild( 5 ), 'end' )
@@ -370,13 +369,13 @@ describe( 'ListCommand', () => {
 						'<listItem indent="0" type="bulleted">---</listItem>' +
 						'<listItem indent="1" type="bulleted">---</listItem>';
 
-					expect( getData( doc ) ).to.equal( expectedData );
+					expect( getData( model ) ).to.equal( expectedData );
 				} );
 
 				// Example from docs.
 				it( 'should change type of all items in nested list if one of items changed', () => {
 					setData(
-						doc,
+						model,
 						'<listItem indent="0" type="numbered">---</listItem>' +
 						'<listItem indent="1" type="numbered">---</listItem>' +
 						'<listItem indent="2" type="numbered">---</listItem>' +
@@ -423,7 +422,7 @@ describe( 'ListCommand', () => {
 						'<listItem indent="2" type="numbered">---</listItem>' +
 						'<listItem indent="0" type="numbered">---</listItem>';
 
-					expect( getData( doc ) ).to.equal( expectedData );
+					expect( getData( model ) ).to.equal( expectedData );
 				} );
 			} );
 		} );

+ 135 - 135
packages/ckeditor5-list/tests/listengine.js

@@ -24,7 +24,7 @@ import { getData as getModelData, setData as setModelData, parse as parseModel }
 import { getData as getViewData, parse as parseView } from '@ckeditor/ckeditor5-engine/src/dev-utils/view';
 
 describe( 'ListEngine', () => {
-	let editor, modelDoc, modelRoot, viewDoc, viewRoot;
+	let editor, model, modelDoc, modelRoot, viewDoc, viewRoot;
 
 	beforeEach( () => {
 		return VirtualTestEditor
@@ -34,7 +34,8 @@ describe( 'ListEngine', () => {
 			.then( newEditor => {
 				editor = newEditor;
 
-				modelDoc = editor.document;
+				model = editor.model;
+				modelDoc = model.document;
 				modelRoot = modelDoc.getRoot();
 
 				viewDoc = editor.editing.view;
@@ -47,17 +48,17 @@ describe( 'ListEngine', () => {
 	} );
 
 	it( 'should set proper schema rules', () => {
-		expect( modelDoc.schema.hasItem( 'listItem' ) );
-		expect( modelDoc.schema.itemExtends( 'listItem', '$block' ) );
+		expect( model.schema.hasItem( 'listItem' ) );
+		expect( model.schema.itemExtends( 'listItem', '$block' ) );
 
-		expect( modelDoc.schema.check( { name: '$inline', inside: 'listItem' } ) ).to.be.true;
-		expect( modelDoc.schema.check( { name: 'listItem', inside: 'listItem' } ) ).to.be.false;
-		expect( modelDoc.schema.check( { name: '$block', inside: 'listItem' } ) ).to.be.false;
+		expect( model.schema.check( { name: '$inline', inside: 'listItem' } ) ).to.be.true;
+		expect( model.schema.check( { name: 'listItem', inside: 'listItem' } ) ).to.be.false;
+		expect( model.schema.check( { name: '$block', inside: 'listItem' } ) ).to.be.false;
 
-		expect( modelDoc.schema.check( { name: 'listItem', inside: '$root' } ) ).to.be.false;
-		expect( modelDoc.schema.check( { name: 'listItem', inside: '$root', attributes: [ 'indent' ] } ) ).to.be.false;
-		expect( modelDoc.schema.check( { name: 'listItem', inside: '$root', attributes: [ 'type' ] } ) ).to.be.false;
-		expect( modelDoc.schema.check( { name: 'listItem', inside: '$root', attributes: [ 'indent', 'type' ] } ) ).to.be.true;
+		expect( model.schema.check( { name: 'listItem', inside: '$root' } ) ).to.be.false;
+		expect( model.schema.check( { name: 'listItem', inside: '$root', attributes: [ 'indent' ] } ) ).to.be.false;
+		expect( model.schema.check( { name: 'listItem', inside: '$root', attributes: [ 'type' ] } ) ).to.be.false;
+		expect( model.schema.check( { name: 'listItem', inside: '$root', attributes: [ 'indent', 'type' ] } ) ).to.be.true;
 	} );
 
 	describe( 'commands', () => {
@@ -116,7 +117,7 @@ describe( 'ListEngine', () => {
 					'<paragraph>yyy</paragraph>' +
 					'<listItem indent="0" type="bulleted">d</listItem>';
 
-				expect( getModelData( modelDoc, { withoutSelection: true } ) ).to.equal( expectedModelData );
+				expect( getModelData( model, { withoutSelection: true } ) ).to.equal( expectedModelData );
 			} );
 		} );
 
@@ -1039,7 +1040,7 @@ describe( 'ListEngine', () => {
 					'<listItem indent="0" type="bulleted">2</listItem>' +
 					'<paragraph>bar</paragraph>';
 
-				expect( getModelData( modelDoc, { withoutSelection: true } ) ).to.equal( expectedModelData );
+				expect( getModelData( model, { withoutSelection: true } ) ).to.equal( expectedModelData );
 			} );
 		} );
 
@@ -1542,11 +1543,9 @@ describe( 'ListEngine', () => {
 						const item1 = '<listItem indent="1" type="numbered">c</listItem>';
 						const item2 = '<listItem indent="1" type="bulleted">d</listItem>';
 
-						modelDoc.enqueueChanges( () => {
-							const batch = modelDoc.batch();
-
-							batch.append( parseModel( item1, modelDoc.schema, modelDoc.batch() ), modelRoot );
-							batch.append( parseModel( item2, modelDoc.schema, modelDoc.batch() ), modelRoot );
+						model.change( writer => {
+							writer.append( parseModel( item1, model.schema ), modelRoot );
+							writer.append( parseModel( item2, model.schema ), modelRoot );
 						} );
 					}
 				);
@@ -2658,27 +2657,25 @@ describe( 'ListEngine', () => {
 				'<paragraph>x</paragraph>' +
 				'<listItem indent="1" type="bulleted">b</listItem>';
 
-			setModelData( modelDoc, input );
+			setModelData( model, input );
 
-			modelDoc.enqueueChanges( () => {
-				modelDoc.batch( 'transparent' )
-					.insert( parseModel( inserted, modelDoc.schema, modelDoc.batch() ), modelDoc.selection.getFirstPosition() );
+			model.enqueueChange( 'transparent', writer => {
+				writer.insert( parseModel( inserted, model.schema ), modelDoc.selection.getFirstPosition() );
 			} );
 
-			expect( getModelData( modelDoc, { withoutSelection: true } ) ).to.equal( output );
+			expect( getModelData( model, { withoutSelection: true } ) ).to.equal( output );
 		} );
 
 		describe( 'insert', () => {
 			function test( testName, input, inserted, output ) {
 				it( testName, () => {
-					setModelData( modelDoc, input );
+					setModelData( model, input );
 
-					modelDoc.enqueueChanges( () => {
-						modelDoc.batch()
-							.insert( parseModel( inserted, modelDoc.schema, modelDoc.batch() ), modelDoc.selection.getFirstPosition() );
+					model.change( writer => {
+						writer.insert( parseModel( inserted, model.schema ), modelDoc.selection.getFirstPosition() );
 					} );
 
-					expect( getModelData( modelDoc, { withoutSelection: true } ) ).to.equal( output );
+					expect( getModelData( model, { withoutSelection: true } ) ).to.equal( output );
 				} );
 			}
 
@@ -2803,32 +2800,30 @@ describe( 'ListEngine', () => {
 					'<listItem indent="1" type="bulleted">c</listItem>' +
 					'<listItem indent="1" type="bulleted">d</listItem>';
 
-				setModelData( modelDoc, input );
+				setModelData( model, input );
 
 				const item1 = '<listItem indent="1" type="numbered">c</listItem>';
 				const item2 = '<listItem indent="1" type="bulleted">d</listItem>';
 
-				modelDoc.enqueueChanges( () => {
-					const batch = modelDoc.batch();
-
-					batch.append( parseModel( item1, modelDoc.schema, modelDoc.batch() ), modelRoot );
-					batch.append( parseModel( item2, modelDoc.schema, modelDoc.batch() ), modelRoot );
+				model.change( writer => {
+					writer.append( parseModel( item1, model.schema ), modelRoot );
+					writer.append( parseModel( item2, model.schema ), modelRoot );
 				} );
 
-				expect( getModelData( modelDoc, { withoutSelection: true } ) ).to.equal( output );
+				expect( getModelData( model, { withoutSelection: true } ) ).to.equal( output );
 			} );
 		} );
 
 		describe( 'remove', () => {
 			function test( testName, input, output ) {
 				it( testName, () => {
-					setModelData( modelDoc, input );
+					setModelData( model, input );
 
-					modelDoc.enqueueChanges( () => {
-						modelDoc.batch().remove( modelDoc.selection.getFirstRange() );
+					model.change( writer => {
+						writer.remove( modelDoc.selection.getFirstRange() );
 					} );
 
-					expect( getModelData( modelDoc, { withoutSelection: true } ) ).to.equal( output );
+					expect( getModelData( model, { withoutSelection: true } ) ).to.equal( output );
 				} );
 			}
 
@@ -2879,15 +2874,15 @@ describe( 'ListEngine', () => {
 		describe( 'move', () => {
 			function test( testName, input, offset, output ) {
 				it( testName, () => {
-					setModelData( modelDoc, input );
+					setModelData( model, input );
 
 					const targetPosition = ModelPosition.createAt( modelRoot, offset );
 
-					modelDoc.enqueueChanges( () => {
-						modelDoc.batch().move( modelDoc.selection.getFirstRange(), targetPosition );
+					model.change( writer => {
+						writer.move( modelDoc.selection.getFirstRange(), targetPosition );
 					} );
 
-					expect( getModelData( modelDoc, { withoutSelection: true } ) ).to.equal( output );
+					expect( getModelData( model, { withoutSelection: true } ) ).to.equal( output );
 				} );
 			}
 
@@ -3053,40 +3048,37 @@ describe( 'ListEngine', () => {
 					'<listItem indent="0" type="bulleted">h</listItem>' +
 					'<listItem indent="1" type="bulleted">i</listItem>';
 
-				setModelData( modelDoc, modelBefore );
+				setModelData( model, modelBefore );
 
 				const element = modelDoc.selection.getFirstPosition().nodeAfter;
 
-				modelDoc.enqueueChanges( () => {
-					modelDoc.batch().rename( element, 'paragraph' );
+				model.change( writer => {
+					writer.rename( element, 'paragraph' );
 				} );
 
-				expect( getModelData( modelDoc, { withoutSelection: true } ) ).to.equal( expectedModel );
+				expect( getModelData( model, { withoutSelection: true } ) ).to.equal( expectedModel );
 			} );
 		} );
 	} );
 
 	describe( 'paste and insertContent integration', () => {
 		it( 'should be triggered on DataController#insertContent()', () => {
-			setModelData( modelDoc,
+			setModelData( model,
 				'<listItem type="bulleted" indent="0">A</listItem>' +
 				'<listItem type="bulleted" indent="1">B[]</listItem>' +
 				'<listItem type="bulleted" indent="2">C</listItem>'
 			);
 
-			modelDoc.enqueueChanges( () => {
-				editor.data.insertContent(
-					parseModel(
-						'<listItem type="bulleted" indent="0">X</listItem>' +
-						'<listItem type="bulleted" indent="1">Y</listItem>',
-						modelDoc.schema,
-						modelDoc.batch()
-					),
-					modelDoc.selection
-				);
-			} );
+			editor.data.insertContent(
+				parseModel(
+					'<listItem type="bulleted" indent="0">X</listItem>' +
+					'<listItem type="bulleted" indent="1">Y</listItem>',
+					model.schema
+				),
+				modelDoc.selection
+			);
 
-			expect( getModelData( modelDoc ) ).to.equal(
+			expect( getModelData( model ) ).to.equal(
 				'<listItem indent="0" type="bulleted">A</listItem>' +
 				'<listItem indent="1" type="bulleted">BX</listItem>' +
 				'<listItem indent="2" type="bulleted">Y[]</listItem>' +
@@ -3096,20 +3088,18 @@ describe( 'ListEngine', () => {
 
 		// Just checking that it doesn't crash. #69
 		it( 'should work if an element is passed to DataController#insertContent()', () => {
-			setModelData( modelDoc,
+			setModelData( model,
 				'<listItem type="bulleted" indent="0">A</listItem>' +
 				'<listItem type="bulleted" indent="1">B[]</listItem>' +
 				'<listItem type="bulleted" indent="2">C</listItem>'
 			);
 
-			modelDoc.enqueueChanges( () => {
-				editor.data.insertContent(
-					new ModelElement( 'listItem', { type: 'bulleted', indent: '0' }, 'X' ),
-					modelDoc.selection
-				);
-			} );
+			editor.data.insertContent(
+				new ModelElement( 'listItem', { type: 'bulleted', indent: '0' }, 'X' ),
+				modelDoc.selection
+			);
 
-			expect( getModelData( modelDoc ) ).to.equal(
+			expect( getModelData( model ) ).to.equal(
 				'<listItem indent="0" type="bulleted">A</listItem>' +
 				'<listItem indent="1" type="bulleted">BX[]</listItem>' +
 				'<listItem indent="2" type="bulleted">C</listItem>'
@@ -3118,20 +3108,18 @@ describe( 'ListEngine', () => {
 
 		// Just checking that it doesn't crash. #69
 		it( 'should work if an element is passed to DataController#insertContent()', () => {
-			setModelData( modelDoc,
+			setModelData( model,
 				'<listItem type="bulleted" indent="0">A</listItem>' +
 				'<listItem type="bulleted" indent="1">B[]</listItem>' +
 				'<listItem type="bulleted" indent="2">C</listItem>'
 			);
 
-			modelDoc.enqueueChanges( () => {
-				editor.data.insertContent(
-					new ModelText( 'X' ),
-					modelDoc.selection
-				);
-			} );
+			editor.data.insertContent(
+				new ModelText( 'X' ),
+				modelDoc.selection
+			);
 
-			expect( getModelData( modelDoc ) ).to.equal(
+			expect( getModelData( model ) ).to.equal(
 				'<listItem indent="0" type="bulleted">A</listItem>' +
 				'<listItem indent="1" type="bulleted">BX[]</listItem>' +
 				'<listItem indent="2" type="bulleted">C</listItem>'
@@ -3139,7 +3127,7 @@ describe( 'ListEngine', () => {
 		} );
 
 		it( 'should fix indents of pasted list items', () => {
-			setModelData( modelDoc,
+			setModelData( model,
 				'<listItem type="bulleted" indent="0">A</listItem>' +
 				'<listItem type="bulleted" indent="1">B[]</listItem>' +
 				'<listItem type="bulleted" indent="2">C</listItem>'
@@ -3151,7 +3139,7 @@ describe( 'ListEngine', () => {
 				content: parseView( '<ul><li>X<ul><li>Y</li></ul></li></ul>' )
 			} );
 
-			expect( getModelData( modelDoc ) ).to.equal(
+			expect( getModelData( model ) ).to.equal(
 				'<listItem indent="0" type="bulleted">A</listItem>' +
 				'<listItem indent="1" type="bulleted">BX</listItem>' +
 				'<listItem indent="2" type="bulleted">Y[]</listItem>' +
@@ -3160,7 +3148,7 @@ describe( 'ListEngine', () => {
 		} );
 
 		it( 'should not fix indents of list items that are separated by non-list element', () => {
-			setModelData( modelDoc,
+			setModelData( model,
 				'<listItem type="bulleted" indent="0">A</listItem>' +
 				'<listItem type="bulleted" indent="1">B[]</listItem>' +
 				'<listItem type="bulleted" indent="2">C</listItem>'
@@ -3172,7 +3160,7 @@ describe( 'ListEngine', () => {
 				content: parseView( '<ul><li>W<ul><li>X</li></ul></li></ul><p>Y</p><ul><li>Z</li></ul>' )
 			} );
 
-			expect( getModelData( modelDoc ) ).to.equal(
+			expect( getModelData( model ) ).to.equal(
 				'<listItem indent="0" type="bulleted">A</listItem>' +
 				'<listItem indent="1" type="bulleted">BW</listItem>' +
 				'<listItem indent="2" type="bulleted">X</listItem>' +
@@ -3183,7 +3171,7 @@ describe( 'ListEngine', () => {
 		} );
 
 		it( 'should co-work correctly with post fixer', () => {
-			setModelData( modelDoc,
+			setModelData( model,
 				'<listItem type="bulleted" indent="0">A</listItem>' +
 				'<listItem type="bulleted" indent="1">B[]</listItem>' +
 				'<listItem type="bulleted" indent="2">C</listItem>'
@@ -3195,7 +3183,7 @@ describe( 'ListEngine', () => {
 				content: parseView( '<p>X</p><ul><li>Y</li></ul>' )
 			} );
 
-			expect( getModelData( modelDoc ) ).to.equal(
+			expect( getModelData( model ) ).to.equal(
 				'<listItem indent="0" type="bulleted">A</listItem>' +
 				'<listItem indent="1" type="bulleted">BX</listItem>' +
 				'<listItem indent="0" type="bulleted">Y[]</listItem>' +
@@ -3204,7 +3192,7 @@ describe( 'ListEngine', () => {
 		} );
 
 		it( 'should work if items are pasted between listItem elements', () => {
-			setModelData( modelDoc,
+			setModelData( model,
 				'<listItem type="bulleted" indent="0">A</listItem>' +
 				'<listItem type="bulleted" indent="1">B</listItem>[]' +
 				'<listItem type="bulleted" indent="2">C</listItem>'
@@ -3216,7 +3204,7 @@ describe( 'ListEngine', () => {
 				content: parseView( '<ul><li>X<ul><li>Y</li></ul></li></ul>' )
 			} );
 
-			expect( getModelData( modelDoc ) ).to.equal(
+			expect( getModelData( model ) ).to.equal(
 				'<listItem indent="0" type="bulleted">A</listItem>' +
 				'<listItem indent="1" type="bulleted">B</listItem>' +
 				'<listItem indent="1" type="bulleted">X</listItem>' +
@@ -3226,7 +3214,7 @@ describe( 'ListEngine', () => {
 		} );
 
 		it( 'should create correct model when list items are pasted in top-level list', () => {
-			setModelData( modelDoc,
+			setModelData( model,
 				'<listItem type="bulleted" indent="0">A[]</listItem>' +
 				'<listItem type="bulleted" indent="1">B</listItem>'
 			);
@@ -3237,7 +3225,7 @@ describe( 'ListEngine', () => {
 				content: parseView( '<ul><li>X<ul><li>Y</li></ul></li></ul>' )
 			} );
 
-			expect( getModelData( modelDoc ) ).to.equal(
+			expect( getModelData( model ) ).to.equal(
 				'<listItem indent="0" type="bulleted">AX</listItem>' +
 				'<listItem indent="1" type="bulleted">Y[]</listItem>' +
 				'<listItem indent="1" type="bulleted">B</listItem>'
@@ -3245,7 +3233,7 @@ describe( 'ListEngine', () => {
 		} );
 
 		it( 'should create correct model when list items are pasted in non-list context', () => {
-			setModelData( modelDoc,
+			setModelData( model,
 				'<paragraph>A[]</paragraph>' +
 				'<paragraph>B</paragraph>'
 			);
@@ -3256,7 +3244,7 @@ describe( 'ListEngine', () => {
 				content: parseView( '<ul><li>X<ul><li>Y</li></ul></li></ul>' )
 			} );
 
-			expect( getModelData( modelDoc ) ).to.equal(
+			expect( getModelData( model ) ).to.equal(
 				'<paragraph>AX</paragraph>' +
 				'<listItem indent="0" type="bulleted">Y[]</listItem>' +
 				'<paragraph>B</paragraph>'
@@ -3264,7 +3252,7 @@ describe( 'ListEngine', () => {
 		} );
 
 		it( 'should not crash when "empty content" is inserted', () => {
-			setModelData( modelDoc, '<paragraph>[]</paragraph>' );
+			setModelData( model, '<paragraph>[]</paragraph>' );
 
 			expect( () => {
 				editor.data.insertContent( new ModelDocumentFragment(), modelDoc.selection );
@@ -3272,7 +3260,7 @@ describe( 'ListEngine', () => {
 		} );
 
 		it( 'should correctly handle item that is pasted without its parent', () => {
-			setModelData( modelDoc,
+			setModelData( model,
 				'<paragraph>Foo</paragraph>' +
 				'<listItem type="numbered" indent="0">A</listItem>' +
 				'<listItem type="numbered" indent="1">B</listItem>' +
@@ -3286,7 +3274,7 @@ describe( 'ListEngine', () => {
 				content: parseView( '<li>X</li>' )
 			} );
 
-			expect( getModelData( modelDoc ) ).to.equal(
+			expect( getModelData( model ) ).to.equal(
 				'<paragraph>Foo</paragraph>' +
 				'<listItem indent="0" type="numbered">A</listItem>' +
 				'<listItem indent="1" type="numbered">B</listItem>' +
@@ -3296,7 +3284,7 @@ describe( 'ListEngine', () => {
 		} );
 
 		it( 'should correctly handle item that is pasted without its parent #2', () => {
-			setModelData( modelDoc,
+			setModelData( model,
 				'<paragraph>Foo</paragraph>' +
 				'<listItem type="numbered" indent="0">A</listItem>' +
 				'<listItem type="numbered" indent="1">B</listItem>' +
@@ -3310,7 +3298,7 @@ describe( 'ListEngine', () => {
 				content: parseView( '<li>X<ul><li>Y</li></ul></li>' )
 			} );
 
-			expect( getModelData( modelDoc ) ).to.equal(
+			expect( getModelData( model ) ).to.equal(
 				'<paragraph>Foo</paragraph>' +
 				'<listItem indent="0" type="numbered">A</listItem>' +
 				'<listItem indent="1" type="numbered">B</listItem>' +
@@ -3328,7 +3316,7 @@ describe( 'ListEngine', () => {
 			}, { priority: 'highest' } );
 
 			// Paragraph is needed, otherwise selection throws.
-			setModelData( modelDoc, '<paragraph>x</paragraph><listItem indent="0" type="bulleted"></listItem>' );
+			setModelData( model, '<paragraph>x</paragraph><listItem indent="0" type="bulleted"></listItem>' );
 
 			expect( getViewData( editor.editing.view, { withoutSelection: true } ) ).to.equal( '<p>x</p>' );
 		} );
@@ -3339,9 +3327,11 @@ describe( 'ListEngine', () => {
 			}, { priority: 'highest' } );
 
 			// Paragraph is needed to prevent autoparagraphing of empty editor.
-			setModelData( modelDoc, '<paragraph>x</paragraph><listItem indent="0" type="bulleted"></listItem>' );
+			setModelData( model, '<paragraph>x</paragraph><listItem indent="0" type="bulleted"></listItem>' );
 
-			modelDoc.batch().remove( modelRoot.getChild( 1 ) );
+			model.change( writer => {
+				writer.remove( modelRoot.getChild( 1 ) );
+			} );
 
 			expect( getViewData( editor.editing.view, { withoutSelection: true } ) ).to.equal( '<p>x</p><ul><li></li></ul>' );
 		} );
@@ -3351,9 +3341,11 @@ describe( 'ListEngine', () => {
 				consumable.consume( data.item, 'changeAttribute:type' );
 			}, { priority: 'highest' } );
 
-			setModelData( modelDoc, '<listItem indent="0" type="bulleted"></listItem>' );
+			setModelData( model, '<listItem indent="0" type="bulleted"></listItem>' );
 
-			modelDoc.batch().setAttribute( 'type', 'numbered', modelRoot.getChild( 0 ) );
+			model.change( writer => {
+				writer.setAttribute( 'type', 'numbered', modelRoot.getChild( 0 ) );
+			} );
 
 			expect( getViewData( editor.editing.view, { withoutSelection: true } ) ).to.equal( '<ul><li></li></ul>' );
 		} );
@@ -3363,9 +3355,11 @@ describe( 'ListEngine', () => {
 				consumable.consume( data.item, 'changeAttribute:indent' );
 			}, { priority: 'highest' } );
 
-			setModelData( modelDoc, '<listItem indent="0" type="bulleted">a</listItem><listItem indent="0" type="bulleted">b</listItem>' );
+			setModelData( model, '<listItem indent="0" type="bulleted">a</listItem><listItem indent="0" type="bulleted">b</listItem>' );
 
-			modelDoc.batch().setAttribute( 'indent', 1, modelRoot.getChild( 1 ) );
+			model.change( writer => {
+				writer.setAttribute( 'indent', 1, modelRoot.getChild( 1 ) );
+			} );
 
 			expect( getViewData( editor.editing.view, { withoutSelection: true } ) ).to.equal( '<ul><li>a</li><li>b</li></ul>' );
 		} );
@@ -3377,7 +3371,7 @@ describe( 'ListEngine', () => {
 
 			editor.setData( '<p></p><ul><li></li></ul>' );
 
-			expect( getModelData( modelDoc, { withoutSelection: true } ) ).to.equal( '<paragraph></paragraph>' );
+			expect( getModelData( model, { withoutSelection: true } ) ).to.equal( '<paragraph></paragraph>' );
 		} );
 
 		it( 'view ul converter should not fire if change was already consumed', () => {
@@ -3387,7 +3381,7 @@ describe( 'ListEngine', () => {
 
 			editor.setData( '<p></p><ul><li></li></ul>' );
 
-			expect( getModelData( modelDoc, { withoutSelection: true } ) ).to.equal( '<paragraph></paragraph>' );
+			expect( getModelData( model, { withoutSelection: true } ) ).to.equal( '<paragraph></paragraph>' );
 		} );
 
 		it( 'view converter should pass model document fragment in data.output', () => {
@@ -3411,7 +3405,9 @@ describe( 'ListEngine', () => {
 				.to.equal( '<ul><li>Foo<span></span></li><li>Bar</li></ul>' );
 
 			// Change indent of the second list item.
-			modelDoc.batch().setAttribute( 'indent', 1, modelRoot.getChild( 1 ) );
+			model.change( writer => {
+				writer.setAttribute( 'indent', 1, modelRoot.getChild( 1 ) );
+			} );
 
 			// Check if the new <ul> was added at correct position.
 			expect( getViewData( editor.editing.view, { withoutSelection: true } ) )
@@ -3431,7 +3427,9 @@ describe( 'ListEngine', () => {
 				.to.equal( '<ul><li>Foo<span></span></li><li>Bar<ul><li>Xxx</li><li>Yyy</li></ul></li></ul>' );
 
 			// Remove second list item. Expect that its sub-list will be moved to first list item.
-			modelDoc.batch().remove( modelRoot.getChild( 1 ) );
+			model.change( writer => {
+				writer.remove( modelRoot.getChild( 1 ) );
+			} );
 
 			// Check if the <ul> was added at correct position.
 			expect( getViewData( editor.editing.view, { withoutSelection: true } ) )
@@ -3453,7 +3451,9 @@ describe( 'ListEngine', () => {
 				// Append ui element before <ul>.
 				viewRoot.insertChildren( 0, [ uiElement ] );
 
-				modelDoc.batch().remove( liFoo );
+				model.change( writer => {
+					writer.remove( liFoo );
+				} );
 
 				expect( getViewData( editor.editing.view, { withoutSelection: true } ) )
 					.to.equal( '<span></span><ul><li>Bar</li></ul>' );
@@ -3463,7 +3463,9 @@ describe( 'ListEngine', () => {
 				// Append ui element before <ul>.
 				viewRoot.getChild( 0 ).insertChildren( 0, [ uiElement ] );
 
-				modelDoc.batch().remove( liFoo );
+				model.change( writer => {
+					writer.remove( liFoo );
+				} );
 
 				expect( getViewData( editor.editing.view, { withoutSelection: true } ) )
 					.to.equal( '<ul><span></span><li>Bar</li></ul>' );
@@ -3473,7 +3475,9 @@ describe( 'ListEngine', () => {
 				// Append ui element before <ul>.
 				viewRoot.getChild( 0 ).insertChildren( 1, [ uiElement ] );
 
-				modelDoc.batch().remove( liBar );
+				model.change( writer => {
+					writer.remove( liBar );
+				} );
 
 				expect( getViewData( editor.editing.view, { withoutSelection: true } ) )
 					.to.equal( '<ul><li>Foo</li><span></span></ul>' );
@@ -3509,21 +3513,21 @@ describe( 'ListEngine', () => {
 		const selEnd = input.indexOf( ']' );
 
 		const item = input.substring( selStart, selEnd );
-		const model = input.substring( 0, selStart ) + input.substring( selEnd );
+		const modelInput = input.substring( 0, selStart ) + input.substring( selEnd );
 
 		const actionCallback = () => {
-			modelDoc.enqueueChanges( () => {
-				modelDoc.batch().insert( parseModel( item, modelDoc.schema, modelDoc.batch() ), modelDoc.selection.getFirstPosition() );
+			model.change( writer => {
+				writer.insert( parseModel( item, model.schema ), modelDoc.selection.getFirstPosition() );
 			} );
 		};
 
-		_test( testName, model, output, actionCallback, testUndo );
+		_test( testName, modelInput, output, actionCallback, testUndo );
 	}
 
 	function testRemove( testName, input, output ) {
 		const actionCallback = () => {
-			modelDoc.enqueueChanges( () => {
-				modelDoc.batch().remove( modelDoc.selection.getFirstRange() );
+			model.change( writer => {
+				writer.remove( modelDoc.selection.getFirstRange() );
 			} );
 		};
 
@@ -3535,8 +3539,8 @@ describe( 'ListEngine', () => {
 			const element = modelDoc.selection.getFirstPosition().nodeAfter;
 			const newType = element.getAttribute( 'type' ) == 'numbered' ? 'bulleted' : 'numbered';
 
-			modelDoc.enqueueChanges( () => {
-				modelDoc.batch().setAttribute( 'type', newType, modelDoc.selection.getFirstRange() );
+			model.change( writer => {
+				writer.setAttribute( 'type', newType, modelDoc.selection.getFirstRange() );
 			} );
 		};
 
@@ -3547,12 +3551,10 @@ describe( 'ListEngine', () => {
 		const actionCallback = () => {
 			const element = modelDoc.selection.getFirstPosition().nodeAfter;
 
-			modelDoc.enqueueChanges( () => {
-				const batch = modelDoc.batch();
-
-				batch.rename( element, 'paragraph' );
-				batch.removeAttribute( 'type', element );
-				batch.removeAttribute( 'indent', element );
+			model.change( writer => {
+				writer.rename( element, 'paragraph' );
+				writer.removeAttribute( 'type', element );
+				writer.removeAttribute( 'indent', element );
 			} );
 		};
 
@@ -3563,11 +3565,9 @@ describe( 'ListEngine', () => {
 		const actionCallback = () => {
 			const element = modelDoc.selection.getFirstPosition().nodeAfter;
 
-			modelDoc.enqueueChanges( () => {
-				const batch = modelDoc.batch();
-
-				batch.setAttributes( { type: 'bulleted', indent: newIndent }, element );
-				batch.rename( element, 'listItem' );
+			model.change( writer => {
+				writer.setAttributes( { type: 'bulleted', indent: newIndent }, element );
+				writer.rename( element, 'listItem' );
 			} );
 		};
 
@@ -3576,8 +3576,8 @@ describe( 'ListEngine', () => {
 
 	function testChangeIndent( testName, newIndent, input, output ) {
 		const actionCallback = () => {
-			modelDoc.enqueueChanges( () => {
-				modelDoc.batch().setAttribute( 'indent', newIndent, modelDoc.selection.getFirstRange() );
+			model.change( writer => {
+				writer.setAttribute( 'indent', newIndent, modelDoc.selection.getFirstRange() );
 			} );
 		};
 
@@ -3588,8 +3588,8 @@ describe( 'ListEngine', () => {
 		const actionCallback = () => {
 			const targetPosition = ModelPosition.createAt( modelRoot, rootOffset );
 
-			modelDoc.enqueueChanges( () => {
-				modelDoc.batch().move( modelDoc.selection.getFirstRange(), targetPosition );
+			model.change( writer => {
+				writer.move( modelDoc.selection.getFirstRange(), targetPosition );
 			} );
 		};
 
@@ -3598,7 +3598,7 @@ describe( 'ListEngine', () => {
 
 	function _test( testName, input, output, actionCallback, testUndo = true ) {
 		it( testName, () => {
-			setModelData( modelDoc, input );
+			setModelData( model, input );
 
 			actionCallback();
 
@@ -3608,24 +3608,24 @@ describe( 'ListEngine', () => {
 		const undoTestFunction = testUndo ? it : it.skip;
 
 		undoTestFunction( testName + ' (undo integration)', () => {
-			setModelData( modelDoc, input );
+			setModelData( model, input );
 
 			const modelBefore = input;
 			const viewBefore = getViewData( viewDoc, { withoutSelection: true } );
 
 			actionCallback();
 
-			const modelAfter = getModelData( modelDoc );
+			const modelAfter = getModelData( model );
 			const viewAfter = getViewData( viewDoc, { withoutSelection: true } );
 
 			editor.execute( 'undo' );
 
-			expect( getModelData( modelDoc ) ).to.equal( modelBefore );
+			expect( getModelData( model ) ).to.equal( modelBefore );
 			expect( getViewData( viewDoc, { withoutSelection: true } ) ).to.equal( viewBefore );
 
 			editor.execute( 'redo' );
 
-			expect( getModelData( modelDoc ) ).to.equal( modelAfter );
+			expect( getModelData( model ) ).to.equal( modelAfter );
 			expect( getViewData( viewDoc, { withoutSelection: true } ) ).to.equal( viewAfter );
 		} );
 	}