Kaynağa Gözat

Merge branch 'master' into t/629b

Piotrek Koszuliński 9 yıl önce
ebeveyn
işleme
27efaedec3
100 değiştirilmiş dosya ile 1153 ekleme ve 811 silme
  1. 26 0
      packages/ckeditor5-engine/.travis.yml
  2. 5 0
      packages/ckeditor5-engine/README.md
  3. 5 2
      packages/ckeditor5-engine/package.json
  4. 1 1
      packages/ckeditor5-engine/src/controller/insert.js
  5. 24 10
      packages/ckeditor5-engine/src/model/liveposition.js
  6. 7 2
      packages/ckeditor5-engine/src/model/liverange.js
  7. 95 11
      packages/ckeditor5-engine/src/model/liveselection.js
  8. 1 1
      packages/ckeditor5-engine/src/model/position.js
  9. 2 1
      packages/ckeditor5-engine/src/view/domconverter.js
  10. 119 46
      packages/ckeditor5-engine/src/view/renderer.js
  11. 0 1
      packages/ckeditor5-engine/tests/__template__.html
  12. 10 10
      packages/ckeditor5-engine/tests/controller/datacontroller.js
  13. 14 14
      packages/ckeditor5-engine/tests/controller/editingcontroller.js
  14. 8 8
      packages/ckeditor5-engine/tests/controller/insert.js
  15. 24 24
      packages/ckeditor5-engine/tests/conversion/advanced-converters.js
  16. 17 17
      packages/ckeditor5-engine/tests/conversion/buildmodelconverter.js
  17. 14 14
      packages/ckeditor5-engine/tests/conversion/buildviewconverter.js
  18. 12 12
      packages/ckeditor5-engine/tests/conversion/mapper.js
  19. 16 16
      packages/ckeditor5-engine/tests/conversion/model-selection-to-view-converters.js
  20. 16 16
      packages/ckeditor5-engine/tests/conversion/model-to-view-converters.js
  21. 4 4
      packages/ckeditor5-engine/tests/conversion/modelconsumable.js
  22. 9 9
      packages/ckeditor5-engine/tests/conversion/modelconversiondispatcher.js
  23. 8 8
      packages/ckeditor5-engine/tests/conversion/view-selection-to-model-converters.js
  24. 9 9
      packages/ckeditor5-engine/tests/conversion/view-to-model-converters.js
  25. 4 4
      packages/ckeditor5-engine/tests/conversion/viewconsumable.js
  26. 6 6
      packages/ckeditor5-engine/tests/conversion/viewconversiondispatcher.js
  27. 1 1
      packages/ckeditor5-engine/tests/dataprocessor/basichtmlwriter.js
  28. 4 4
      packages/ckeditor5-engine/tests/dataprocessor/htmldataprocessor.js
  29. 4 4
      packages/ckeditor5-engine/tests/dataprocessor/xmldataprocessor.js
  30. 8 8
      packages/ckeditor5-engine/tests/dev-utils/model.js
  31. 11 11
      packages/ckeditor5-engine/tests/dev-utils/view.js
  32. 0 0
      packages/ckeditor5-engine/tests/manual/tickets/401/1.html
  33. 0 0
      packages/ckeditor5-engine/tests/manual/tickets/401/1.js
  34. 0 0
      packages/ckeditor5-engine/tests/manual/tickets/401/1.md
  35. 0 0
      packages/ckeditor5-engine/tests/manual/tickets/462/1.html
  36. 0 0
      packages/ckeditor5-engine/tests/manual/tickets/462/1.js
  37. 0 0
      packages/ckeditor5-engine/tests/manual/tickets/462/1.md
  38. 0 0
      packages/ckeditor5-engine/tests/manual/tickets/475/1.html
  39. 0 0
      packages/ckeditor5-engine/tests/manual/tickets/475/1.js
  40. 0 0
      packages/ckeditor5-engine/tests/manual/tickets/475/1.md
  41. 0 0
      packages/ckeditor5-engine/tests/manual/tickets/603/1.html
  42. 0 0
      packages/ckeditor5-engine/tests/manual/tickets/603/1.js
  43. 0 0
      packages/ckeditor5-engine/tests/manual/tickets/603/1.md
  44. 5 5
      packages/ckeditor5-engine/tests/model/_utils/utils.js
  45. 8 8
      packages/ckeditor5-engine/tests/model/batch.js
  46. 4 4
      packages/ckeditor5-engine/tests/model/composer/composer.js
  47. 15 21
      packages/ckeditor5-engine/tests/model/composer/deletecontents.js
  48. 4 4
      packages/ckeditor5-engine/tests/model/composer/modifyselection.js
  49. 10 10
      packages/ckeditor5-engine/tests/model/delta/attributedelta.js
  50. 16 16
      packages/ckeditor5-engine/tests/model/delta/delta.js
  51. 15 15
      packages/ckeditor5-engine/tests/model/delta/deltafactory.js
  52. 9 9
      packages/ckeditor5-engine/tests/model/delta/insertdelta.js
  53. 12 12
      packages/ckeditor5-engine/tests/model/delta/mergedelta.js
  54. 10 10
      packages/ckeditor5-engine/tests/model/delta/movedelta.js
  55. 7 7
      packages/ckeditor5-engine/tests/model/delta/removedelta.js
  56. 6 6
      packages/ckeditor5-engine/tests/model/delta/renamedelta.js
  57. 12 12
      packages/ckeditor5-engine/tests/model/delta/splitdelta.js
  58. 21 21
      packages/ckeditor5-engine/tests/model/delta/transform/_utils/utils.js
  59. 8 8
      packages/ckeditor5-engine/tests/model/delta/transform/attributedelta.js
  60. 6 6
      packages/ckeditor5-engine/tests/model/delta/transform/delta.js
  61. 12 12
      packages/ckeditor5-engine/tests/model/delta/transform/insertdelta.js
  62. 12 12
      packages/ckeditor5-engine/tests/model/delta/transform/mergedelta.js
  63. 9 9
      packages/ckeditor5-engine/tests/model/delta/transform/movedelta.js
  64. 9 9
      packages/ckeditor5-engine/tests/model/delta/transform/removedelta.js
  65. 13 13
      packages/ckeditor5-engine/tests/model/delta/transform/splitdelta.js
  66. 10 10
      packages/ckeditor5-engine/tests/model/delta/transform/unwrapdelta.js
  67. 10 10
      packages/ckeditor5-engine/tests/model/delta/transform/weakinsertdelta.js
  68. 11 11
      packages/ckeditor5-engine/tests/model/delta/transform/wrapdelta.js
  69. 11 11
      packages/ckeditor5-engine/tests/model/delta/unwrapdelta.js
  70. 4 4
      packages/ckeditor5-engine/tests/model/delta/weakinsertdelta.js
  71. 12 12
      packages/ckeditor5-engine/tests/model/delta/wrapdelta.js
  72. 10 10
      packages/ckeditor5-engine/tests/model/document/change-event.js
  73. 11 19
      packages/ckeditor5-engine/tests/model/document/document.js
  74. 6 6
      packages/ckeditor5-engine/tests/model/documentfragment.js
  75. 7 7
      packages/ckeditor5-engine/tests/model/element.js
  76. 5 5
      packages/ckeditor5-engine/tests/model/history.js
  77. 50 16
      packages/ckeditor5-engine/tests/model/liveposition.js
  78. 62 24
      packages/ckeditor5-engine/tests/model/liverange.js
  79. 91 17
      packages/ckeditor5-engine/tests/model/liveselection.js
  80. 8 8
      packages/ckeditor5-engine/tests/model/node.js
  81. 6 6
      packages/ckeditor5-engine/tests/model/nodelist.js
  82. 9 9
      packages/ckeditor5-engine/tests/model/operation/attributeoperation.js
  83. 8 8
      packages/ckeditor5-engine/tests/model/operation/insertoperation.js
  84. 7 7
      packages/ckeditor5-engine/tests/model/operation/moveoperation.js
  85. 3 3
      packages/ckeditor5-engine/tests/model/operation/nooperation.js
  86. 3 3
      packages/ckeditor5-engine/tests/model/operation/operation.js
  87. 8 8
      packages/ckeditor5-engine/tests/model/operation/reinsertoperation.js
  88. 8 8
      packages/ckeditor5-engine/tests/model/operation/removeoperation.js
  89. 6 6
      packages/ckeditor5-engine/tests/model/operation/renameoperation.js
  90. 4 4
      packages/ckeditor5-engine/tests/model/operation/rootattributeoperation.js
  91. 15 15
      packages/ckeditor5-engine/tests/model/operation/transform.js
  92. 10 10
      packages/ckeditor5-engine/tests/model/position.js
  93. 8 8
      packages/ckeditor5-engine/tests/model/range.js
  94. 5 5
      packages/ckeditor5-engine/tests/model/rootelement.js
  95. 8 8
      packages/ckeditor5-engine/tests/model/schema/schema.js
  96. 3 3
      packages/ckeditor5-engine/tests/model/schema/schemaitem.js
  97. 10 10
      packages/ckeditor5-engine/tests/model/selection.js
  98. 4 4
      packages/ckeditor5-engine/tests/model/text.js
  99. 5 5
      packages/ckeditor5-engine/tests/model/textproxy.js
  100. 8 8
      packages/ckeditor5-engine/tests/model/treewalker.js

+ 26 - 0
packages/ckeditor5-engine/.travis.yml

@@ -0,0 +1,26 @@
+sudo: required
+dist: trusty
+addons:
+  apt:
+    sources:
+      - google-chrome
+    packages:
+      - google-chrome-stable
+language: node_js
+node_js:
+  - "6"
+cache:
+  - node_modules
+before_install:
+  - export CHROME_BIN=chromium-browser
+  - export DISPLAY=:99.0
+  - sh -e /etc/init.d/xvfb start
+install:
+  - npm install
+  - npm install @ckeditor/ckeditor5-dev-tests
+  - npm install codeclimate-test-reporter
+script:
+  - node_modules/.bin/ckeditor5-dev-tests --coverage --ignore-duplicates
+after_success:
+  - sed -i.backup 's/\.build\/ckeditor5\/[^\/]*/src/g' .build/coverage/lcov.info
+  - node_modules/.bin/codeclimate-test-reporter < .build/coverage/lcov.info

+ 5 - 0
packages/ckeditor5-engine/README.md

@@ -1,6 +1,11 @@
 CKEditor 5 Editing Engine
 ========================================
 
+[![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-engine.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine)
+[![Build Status](https://travis-ci.org/ckeditor/ckeditor5-engine.svg?branch=master)](https://travis-ci.org/ckeditor/ckeditor5-engine)
+[![Test Coverage](https://codeclimate.com/github/ckeditor/ckeditor5-engine/badges/coverage.svg)](https://codeclimate.com/github/ckeditor/ckeditor5-engine/coverage)
+[![Code Climate](https://codeclimate.com/github/ckeditor/ckeditor5-engine/badges/gpa.svg)](https://codeclimate.com/github/ckeditor/ckeditor5-engine)
+[![Dependency Status](https://david-dm.org/ckeditor/ckeditor5-engine/status.svg)](https://david-dm.org/ckeditor/ckeditor5-engine#info=dependencies)
 [![devDependency Status](https://david-dm.org/ckeditor/ckeditor5-engine/dev-status.svg)](https://david-dm.org/ckeditor/ckeditor5-engine#info=devDependencies)
 
 The editing engine of CKEditor 5 project. More information about the project can be found at the following url: <https://github.com/ckeditor/ckeditor5>.

+ 5 - 2
packages/ckeditor5-engine/package.json

@@ -1,13 +1,16 @@
 {
   "name": "ckeditor5-engine",
-  "version": "0.3.0",
+  "version": "0.4.0",
   "description": "CKEditor 5 Editing Engine",
   "keywords": [
     "CKEditor"
   ],
-  "dependencies": {},
+  "dependencies": {
+    "ckeditor5-utils": "ckeditor/ckeditor5-utils"
+  },
   "devDependencies": {
     "@ckeditor/ckeditor5-dev-lint": "^1.0.1",
+    "ckeditor5-core": "ckeditor/ckeditor5-core",
     "gulp": "^3.9.0",
     "guppy-pre-commit": "^0.4.0"
   },

+ 1 - 1
packages/ckeditor5-engine/src/controller/insert.js

@@ -291,7 +291,7 @@ class Insertion {
 
 			// OK:  <p>xx[]</p> + <p>yy</p> => <p>xx[]yy</p> (when sticks to previous)
 			// NOK: <p>xx[]</p> + <p>yy</p> => <p>xxyy[]</p> (when sticks to next)
-			position = new LivePosition( this.position.root, this.position.path, 'STICKS_TO_PREVIOUS' );
+			position = new LivePosition( this.position.root, this.position.path, 'sticksToPrevious' );
 
 			this.batch.merge( mergePosRight );
 

+ 24 - 10
packages/ckeditor5-engine/src/model/liveposition.js

@@ -30,7 +30,7 @@ export default class LivePosition extends Position {
 	 * @see engine.model.Position
 	 * @param {engine.model.RootElement} root
 	 * @param {Array.<Number>} path
-	 * @param {engine.model.PositionStickiness} [stickiness] Defaults to `'STICKS_TO_NEXT'`.
+	 * @param {engine.model.PositionStickiness} [stickiness] Defaults to `'sticksToNext'`.
 	 * See {@link engine.model.LivePosition#stickiness}.
 	 */
 	constructor( root, path, stickiness ) {
@@ -65,7 +65,7 @@ export default class LivePosition extends Position {
 		 *
 		 * @member {engine.model.PositionStickiness} engine.model.LivePosition#stickiness
 		 */
-		this.stickiness = stickiness || 'STICKS_TO_NEXT';
+		this.stickiness = stickiness || 'sticksToNext';
 
 		bindWithDocument.call( this );
 	}
@@ -111,6 +111,13 @@ export default class LivePosition extends Position {
 	 * @param {engine.model.Position} position
 	 * @returns {engine.model.LivePosition}
 	 */
+
+	/**
+	 * Fired when `LivePosition` instance is changed due to changes on {@link engine.model.Document}.
+	 *
+	 * @event engine.model.LivePosition#change
+	 * @param {engine.model.Position} oldPosition Position equal to this live position before it got changed.
+	 */
 }
 
 /**
@@ -133,7 +140,8 @@ function bindWithDocument() {
 			if ( supportedTypes.has( type ) ) {
 				transform.call( this, type, changes.range, changes.sourcePosition );
 			}
-		}
+		},
+		{ priority: 'high' }
 	);
 }
 
@@ -155,7 +163,7 @@ function transform( type, range, position ) {
 
 	switch ( type ) {
 		case 'insert':
-			let insertBefore = this.stickiness == 'STICKS_TO_NEXT';
+			let insertBefore = this.stickiness == 'sticksToNext';
 			transformed = this._getTransformedByInsertion( range.start, howMany, insertBefore );
 			break;
 
@@ -165,28 +173,34 @@ function transform( type, range, position ) {
 			let originalRange = Range.createFromPositionAndShift( position, howMany );
 
 			let gotMoved = originalRange.containsPosition( this ) ||
-				( originalRange.start.isEqual( this ) && this.stickiness == 'STICKS_TO_NEXT' ) ||
-				( originalRange.end.isEqual( this ) && this.stickiness == 'STICKS_TO_PREVIOUS' );
+				( originalRange.start.isEqual( this ) && this.stickiness == 'sticksToNext' ) ||
+				( originalRange.end.isEqual( this ) && this.stickiness == 'sticksToPrevious' );
 
 			// We can't use ._getTransformedByMove() because we have a different if-condition.
 			if ( gotMoved ) {
 				transformed = this._getCombined( position, range.start );
 			} else {
-				let insertBefore = this.stickiness == 'STICKS_TO_NEXT';
+				let insertBefore = this.stickiness == 'sticksToNext';
 				transformed = this._getTransformedByMove( position, range.start, howMany, insertBefore );
 			}
 			break;
 	}
 
-	this.path = transformed.path;
-	this.root = transformed.root;
+	if ( !this.isEqual( transformed ) ) {
+		const oldPosition = Position.createFromPosition( this );
+
+		this.path = transformed.path;
+		this.root = transformed.root;
+
+		this.fire( 'change', oldPosition );
+	}
 }
 
 mix( LivePosition, EmitterMixin );
 
 /**
  * Enum representing how position is "sticking" with their neighbour nodes.
- * Possible values: `'STICKS_TO_NEXT'`, `'STICKS_TO_PREVIOUS'`.
+ * Possible values: `'sticksToNext'`, `'sticksToPrevious'`.
  *
  * @typedef {String} engine.model.PositionStickiness
  */

+ 7 - 2
packages/ckeditor5-engine/src/model/liverange.js

@@ -77,6 +77,8 @@ export default class LiveRange extends Range {
 	 * Fired when `LiveRange` instance is changed due to changes on {@link engine.model.Document}.
 	 *
 	 * @event engine.model.LiveRange#change
+	 * @param {engine.model.Range} oldRange Range with start and end position equal to start and end position of this live range
+	 * before it got changed.
 	 */
 }
 
@@ -99,7 +101,8 @@ function bindWithDocument() {
 			if ( supportedTypes.has( type ) ) {
 				transform.call( this, type, changes.range, changes.sourcePosition );
 			}
-		}
+		},
+		{ priority: 'high' }
 	);
 }
 
@@ -158,10 +161,12 @@ function transform( type, range, position ) {
 
 	// If anything changed, update the range and fire an event.
 	if ( !updated.start.isEqual( this.start ) || !updated.end.isEqual( this.end ) ) {
+		const oldRange = Range.createFromRange( this );
+
 		this.start = updated.start;
 		this.end = updated.end;
 
-		this.fire( 'change' );
+		this.fire( 'change', oldRange );
 	}
 }
 

+ 95 - 11
packages/ckeditor5-engine/src/model/liveselection.js

@@ -3,12 +3,14 @@
  * For licensing, see LICENSE.md.
  */
 
+import Position from './position.js';
 import Range from './range.js';
 import LiveRange from './liverange.js';
 import Text from './text.js';
 import TextProxy from './textproxy.js';
 import toMap from '../../utils/tomap.js';
 import CKEditorError from '../../utils/ckeditorerror.js';
+import log from '../../utils/log.js';
 
 import Selection from './selection.js';
 
@@ -63,14 +65,6 @@ export default class LiveSelection extends Selection {
 		 */
 		this._attributePriority = new Map();
 
-		// Whenever selection range changes, if the change comes directly from selection API (direct user change).
-		this.on( 'change:range', ( evt, data ) => {
-			if ( data.directChange ) {
-				// Reset attributes on selection (clear attributes and priorities) and get attributes from surrounding nodes.
-				this._updateAttributes( true );
-			}
-		}, { priority: 'high' } );
-
 		// Whenever attribute operation is performed on document, update attributes. This is not the most efficient
 		// way to update selection attributes, but should be okay for now. `_updateAttributes` will be fired too often,
 		// but it won't change attributes or fire `change:attribute` event if not needed.
@@ -147,6 +141,30 @@ export default class LiveSelection extends Selection {
 		return super.getLastRange() || this._document._getDefaultRange();
 	}
 
+	/**
+	 * @inheritDoc
+	 */
+	addRange( range, isBackward = false ) {
+		super.addRange( range, isBackward );
+		this.refreshAttributes();
+	}
+
+	/**
+	 * @inheritDoc
+	 */
+	removeAllRanges() {
+		super.removeAllRanges();
+		this.refreshAttributes();
+	}
+
+	/**
+	 * @inheritDoc
+	 */
+	setRanges( newRanges, isLastBackward = false ) {
+		super.setRanges( newRanges, isLastBackward );
+		this.refreshAttributes();
+	}
+
 	/**
 	 * @inheritDoc
 	 */
@@ -205,6 +223,13 @@ export default class LiveSelection extends Selection {
 		this.setAttributesTo( [] );
 	}
 
+	/**
+	 * Removes all attributes from the selection and sets attributes according to the surrounding nodes.
+	 */
+	refreshAttributes() {
+		this._updateAttributes( true );
+	}
+
 	/**
 	 * Creates and returns an instance of `LiveSelection` that is a clone of given selection, meaning that it has same
 	 * ranges and same direction as this selection.
@@ -230,22 +255,58 @@ export default class LiveSelection extends Selection {
 	 * @inheritDoc
 	 */
 	_pushRange( range ) {
+		const liveRange = this._prepareRange( range );
+
+		// `undefined` is returned when given `range` is in graveyard root.
+		if ( liveRange ) {
+			this._ranges.push( liveRange );
+		}
+	}
+
+	/**
+	 * Prepares given range to be added to selection. Checks if it is correct, converts it to {@link engine.model.LiveRange LiveRange}
+	 * and sets listeners listening to the range's change event.
+	 *
+	 * @private
+	 * @param {engine.model.Range} range
+	 */
+	_prepareRange( range ) {
 		if ( !( range instanceof Range ) ) {
+			/**
+			 * Trying to add an object that is not an instance of Range.
+			 *
+			 * @error model-selection-added-not-range
+			 */
 			throw new CKEditorError( 'model-selection-added-not-range: Trying to add an object that is not an instance of Range.' );
 		}
 
+		if ( range.root == this._document.graveyard ) {
+			/**
+			 * Trying to add a Range that is in the graveyard root. Range rejected.
+			 *
+			 * @warning model-selection-range-in-graveyard
+			 */
+			log.warn( 'model-selection-range-in-graveyard: Trying to add a Range that is in the graveyard root. Range rejected.' );
+
+			return;
+		}
+
 		this._checkRange( range );
 
 		const liveRange = LiveRange.createFromRange( range );
-		this.listenTo( liveRange, 'change', () => {
+		this.listenTo( liveRange, 'change', ( evt, oldRange ) => {
+			if ( liveRange.root == this._document.graveyard ) {
+				this._fixGraveyardSelection( liveRange, oldRange );
+			}
+
 			this.fire( 'change:range', { directChange: false } );
 		} );
 
-		this._ranges.push( liveRange );
+		return liveRange;
 	}
 
 	/**
-	 * Updates this selection attributes according to it's ranges and the {@link engine.model.Document model document}.
+	 * Updates this selection attributes according to its ranges and the {@link engine.model.Document model document}.
 	 *
 	 * @protected
 	 * @param {Boolean} clearAll
@@ -544,6 +605,29 @@ export default class LiveSelection extends Selection {
 
 		return attrs;
 	}
+
+	/**
+	 * Fixes a selection range after it ends up in graveyard root.
+	 *
+	 * @private
+	 * @param {engine.model.LiveRange} gyRange The range added in selection, that ended up in graveyard root.
+	 * @param {engine.model.Range} oldRange The state of that range before it was added to graveyard root.
+	 */
+	_fixGraveyardSelection( gyRange, oldRange ) {
+		const gyPath = gyRange.start.path;
+
+		const newPathLength = oldRange.start.path.length - ( gyPath.length - 2 );
+		const newPath = oldRange.start.path.slice( 0, newPathLength );
+		newPath[ newPath.length - 1 ] -= gyPath[ 1 ];
+
+		const newPosition = new Position( oldRange.root, newPath );
+		const newRange = this._prepareRange( new Range( newPosition, newPosition ) );
+
+		const index = this._ranges.indexOf( gyRange );
+		this._ranges.splice( index, 1, newRange );
+
+		gyRange.detach();
+	}
 }
 
 // Helper function for {@link engine.model.LiveSelection#_updateAttributes}. It takes model item, checks whether

+ 1 - 1
packages/ckeditor5-engine/src/model/position.js

@@ -104,7 +104,7 @@ export default class Position {
 	}
 
 	/**
-	 * Offset at which this position is located in it's {@link engine.model.Position#parent parent}. It is equal
+	 * Offset at which this position is located in its {@link engine.model.Position#parent parent}. It is equal
 	 * to the last item in position {@link engine.model.Position#path path}.
 	 *
 	 * @type {Number}

+ 2 - 1
packages/ckeditor5-engine/src/view/domconverter.js

@@ -486,7 +486,8 @@ export default class DomConverter {
 			} else {
 				const viewBefore = this.getCorrespondingView( domParent.childNodes[ domOffset - 1 ] );
 
-				if ( viewBefore ) {
+				// TODO #663
+				if ( viewBefore && viewBefore.parent ) {
 					return new ViewPosition( viewBefore.parent, viewBefore.index + 1 );
 				}
 			}

+ 119 - 46
packages/ckeditor5-engine/src/view/renderer.js

@@ -88,13 +88,12 @@ export default class Renderer {
 		this.selection = selection;
 
 		/**
-		 * Position of the inline {@link engine.view.filler filler}.
-		 * It should always be put before the text which contains filler.
+		 * The text node in which the inline filler was rendered.
 		 *
 		 * @private
-		 * @member {engine.view.Position} engine.view.Renderer#_inlineFillerPosition
+		 * @member {Text} engine.view.Renderer#_inlineFiller
 		 */
-		this._inlineFillerPosition = null;
+		this._inlineFiller = null;
 
 		/**
 		 * Indicates if view document is focused and selection can be rendered. Selection will not be rendered if
@@ -176,21 +175,30 @@ export default class Renderer {
 	 * removed as long selection is in the text node which needed it at first.
 	 */
 	render() {
-		if ( !this._isInlineFillerAtSelection() ) {
+		let inlineFillerPosition;
+
+		// There was inline filler rendered in the DOM but it's not
+		// at the selection position any more, so we can remove it
+		// (cause even if it's needed, it must be placed in another location).
+		if ( this._inlineFiller && !this._isSelectionInInlineFiller() ) {
 			this._removeInlineFiller();
+		}
 
-			if ( this._needAddInlineFiller() ) {
-				this._inlineFillerPosition = this.selection.getFirstPosition();
-				// Do not use `markToSync` so it will be added even if the parent is already added.
-				this.markedChildren.add( this._inlineFillerPosition.parent );
-			} else {
-				this._inlineFillerPosition = null;
-			}
+		// If we've got the filler, let's try to guess its position in the view.
+		if ( this._inlineFiller ) {
+			inlineFillerPosition = this._getInlineFillerPosition();
+		}
+		// Othewise, if it's needed, create it at the selection position.
+		else if ( this._needsInlineFillerAtSelection() ) {
+			inlineFillerPosition = this.selection.getFirstPosition();
+
+			// Do not use `markToSync` so it will be added even if the parent is already added.
+			this.markedChildren.add( inlineFillerPosition.parent );
 		}
 
 		for ( let node of this.markedTexts ) {
 			if ( !this.markedChildren.has( node.parent ) && this.domConverter.getCorrespondingDom( node.parent ) ) {
-				this._updateText( node );
+				this._updateText( node, { inlineFillerPosition } );
 			}
 		}
 
@@ -199,7 +207,7 @@ export default class Renderer {
 		}
 
 		for ( let element of this.markedChildren ) {
-			this._updateChildren( element );
+			this._updateChildren( element, { inlineFillerPosition } );
 		}
 
 		this._updateSelection();
@@ -208,63 +216,120 @@ export default class Renderer {
 		this.markedTexts.clear();
 		this.markedAttributes.clear();
 		this.markedChildren.clear();
+
+		// Remember the filler by its node.
+		this._inlineFiller = this._getInlineFillerNode( inlineFillerPosition );
+	}
+
+	/**
+	 * Gets the text node in which the inline filler is kept.
+	 *
+	 * @private
+	 * @param {engine.view.Position} fillerPosition The position on which the filler is needed in the view.
+	 * @returns {Text} The text node with the filler.
+	 */
+	_getInlineFillerNode( fillerPosition ) {
+		if ( !fillerPosition ) {
+			this._inlineFiller = null;
+
+			return;
+		}
+
+		const domPosition = this.domConverter.viewPositionToDom( fillerPosition );
+
+		/* istanbul ignore if */
+		if ( !domPosition || !startsWithFiller( domPosition.parent ) ) {
+			/**
+			 * Cannot find filler node by its position.
+			 *
+			 * @error view-renderer-cannot-find-filler
+			 */
+			throw new CKEditorError( 'view-renderer-cannot-find-filler: Cannot find filler node by its position.' );
+		}
+
+		return domPosition.parent;
+	}
+
+	/**
+	 * Gets the position of the inline filler based on the current selection.
+	 * Here, we assume that we know that the filler is needed and
+	 * {@link #_isSelectionInInlineFiller is at the selection position}, and, since it's needed,
+	 * it's somewhere at the selection postion.
+	 *
+	 * Note: we cannot restore the filler position based on the filler's DOM text node, because
+	 * when this method is called (before rendering) the bindings will often be broken. View to DOM
+	 * bindings are only dependable after rendering.
+	 *
+	 * @private
+	 * @returns {engine.view.Position}
+	 */
+	_getInlineFillerPosition() {
+		const firstPos = this.selection.getFirstPosition();
+
+		if ( firstPos.parent  instanceof ViewText ) {
+			return ViewPosition.createBefore( this.selection.getFirstPosition().parent );
+		} else {
+			return firstPos;
+		}
 	}
 
 	/**
-	 * Returns `true` if the inline filler and selection are in the same place.
-	 * If it is true it means filler had been added for a reason and selection does not
-	 * left text node, user can be in the middle of the composition so it should not be touched.
+	 * Returns `true` if the selection hasn't left the inline filler's text node.
+	 * If it is `true` it means that the filler had been added for a reason and the selection does not
+	 * left the filler's text node. E.g. the user can be in the middle of a composition so it should not be touched.
 	 *
 	 * @private
 	 * @returns {Boolean} True if the inline filler and selection are in the same place.
 	 */
-	_isInlineFillerAtSelection() {
+	_isSelectionInInlineFiller() {
 		if ( this.selection.rangeCount != 1 || !this.selection.isCollapsed ) {
 			return false;
 		}
 
+		// Note, we can't check if selection's position equals position of the
+		// this._inlineFiller node, because of #663. We may not be able to calculate
+		// the filler's position in the view at this stage.
+		// Instead, we check it the other way – whether selection is anchored in
+		// that text node or next to it.
+
+		// Possible options are:
+		// "FILLER{}"
+		// "FILLERadded-text{}"
+
 		const selectionPosition = this.selection.getFirstPosition();
-		const fillerPosition = this._inlineFillerPosition;
 
-		if ( !fillerPosition ) {
+		// If we cannot convert this position's parent it means that selection is in not yet rendered
+		// node, which means that the filler can't be there.
+		if ( !this.domConverter.getCorrespondingDom( selectionPosition.parent ) ) {
 			return false;
 		}
 
-		if ( fillerPosition.isEqual( selectionPosition )  ) {
-			return true;
-		}
+		const { parent: domParent } = this.domConverter.viewPositionToDom( selectionPosition );
 
-		if ( selectionPosition.parent instanceof ViewText ) {
-			if ( fillerPosition.isEqual( ViewPosition.createBefore( selectionPosition.parent ) ) ) {
-				return true;
-			}
+		if ( this.domConverter.isText( domParent ) && startsWithFiller( domParent ) ) {
+			return true;
 		}
 
 		return false;
 	}
 
 	/**
-	 * Removes inline filler.
+	 * Removes the inline filler.
 	 *
 	 * @private
 	 */
 	_removeInlineFiller() {
-		if ( !this._inlineFillerPosition ) {
-			// Nothing to remove.
-			return;
-		}
+		const domFillerNode = this._inlineFiller;
 
-		const domFillerPosition = this.domConverter.viewPositionToDom( this._inlineFillerPosition );
-		const domFillerNode = domFillerPosition.parent;
-
-		// If there is no filler viewPositionToDom will return parent node, so domFillerNode will be an element.
-		if ( !( this.domConverter.isText( domFillerNode ) ) || !startsWithFiller( domFillerNode ) ) {
+		// Something weird happened and the stored node doesn't contain the filler's text.
+		if ( !startsWithFiller( domFillerNode ) ) {
 			/**
-			 * No inline filler on expected position.
+			 * The inline filler node was lost. Most likely, something overwrote the filler text node
+			 * in the DOM.
 			 *
-			 * @error renderer-render-no-inline-filler.
+			 * @error view-renderer-filler-was-lost
 			 */
-			throw new CKEditorError( 'view-renderer-render-no-inline-filler: No inline filler on expected position.' );
+			throw new CKEditorError( 'view-renderer-filler-was-lost: The inline filler node was lost.' );
 		}
 
 		if ( isInlineFiller( domFillerNode ) ) {
@@ -272,15 +337,17 @@ export default class Renderer {
 		} else {
 			domFillerNode.data = domFillerNode.data.substr( INLINE_FILLER_LENGTH );
 		}
+
+		this._inlineFiller = null;
 	}
 
 	/**
-	 * Checks if the inline {@link engine.view.filler fillers} should be added.
+	 * Checks if the inline {@link engine.view.filler filler} should be added.
 	 *
 	 * @private
 	 * @returns {Boolean} True if the inline fillers should be added.
 	 */
-	_needAddInlineFiller() {
+	_needsInlineFillerAtSelection() {
 		if ( this.selection.rangeCount != 1 || !this.selection.isCollapsed ) {
 			return false;
 		}
@@ -318,15 +385,18 @@ export default class Renderer {
 	 *
 	 * @private
 	 * @param {engine.view.Text} viewText View text to update.
+	 * @param {Object} options
+	 * @param {engine.view.Position} options.inlineFillerPosition The position on which the inline
+	 * filler should be rendered.
 	 */
-	_updateText( viewText ) {
+	_updateText( viewText, options ) {
 		const domText = this.domConverter.getCorrespondingDom( viewText );
 		const newDomText = this.domConverter.viewToDom( viewText, domText.ownerDocument );
 
 		const actualText = domText.data;
 		let expectedText = newDomText.data;
 
-		const filler = this._inlineFillerPosition;
+		const filler = options.inlineFillerPosition;
 
 		if ( filler && filler.parent == viewText.parent && filler.offset == viewText.index ) {
 			expectedText = INLINE_FILLER + expectedText;
@@ -366,13 +436,16 @@ export default class Renderer {
 	 *
 	 * @private
 	 * @param {engine.view.Element} viewElement View element to update.
+	 * @param {Object} options
+	 * @param {engine.view.Position} options.inlineFillerPosition The position on which the inline
+	 * filler should be rendered.
 	 */
-	_updateChildren( viewElement ) {
+	_updateChildren( viewElement, options ) {
 		const domConverter = this.domConverter;
 		const domElement = domConverter.getCorrespondingDom( viewElement );
 		const domDocument = domElement.ownerDocument;
 
-		const filler = this._inlineFillerPosition;
+		const filler = options.inlineFillerPosition;
 
 		const actualDomChildren = domElement.childNodes;
 		const expectedDomChildren = Array.from( domConverter.viewChildrenToDom( viewElement, domDocument, { bind: true } ) );

+ 0 - 1
packages/ckeditor5-engine/tests/__template__.html

@@ -1 +0,0 @@
-<div contenteditable="true" id="editor"></div>

+ 10 - 10
packages/ckeditor5-engine/tests/controller/datacontroller.js

@@ -5,19 +5,19 @@
 
 /* bender-tags: view */
 
-import ModelDocument from '/ckeditor5/engine/model/document.js';
-import DataController from '/ckeditor5/engine/controller/datacontroller.js';
-import HtmlDataProcessor from '/ckeditor5/engine/dataprocessor/htmldataprocessor.js';
+import ModelDocument from 'ckeditor5/engine/model/document.js';
+import DataController from 'ckeditor5/engine/controller/datacontroller.js';
+import HtmlDataProcessor from 'ckeditor5/engine/dataprocessor/htmldataprocessor.js';
 
-import buildViewConverter  from '/ckeditor5/engine/conversion/buildviewconverter.js';
-import buildModelConverter  from '/ckeditor5/engine/conversion/buildmodelconverter.js';
+import buildViewConverter  from 'ckeditor5/engine/conversion/buildviewconverter.js';
+import buildModelConverter  from 'ckeditor5/engine/conversion/buildmodelconverter.js';
 
-import ViewDocumentFragment from '/ckeditor5/engine/view/documentfragment.js';
-import ViewText from '/ckeditor5/engine/view/text.js';
+import ViewDocumentFragment from 'ckeditor5/engine/view/documentfragment.js';
+import ViewText from 'ckeditor5/engine/view/text.js';
 
-import { getData, setData, stringify, parse } from '/ckeditor5/engine/dev-utils/model.js';
+import { getData, setData, stringify, parse } from 'ckeditor5/engine/dev-utils/model.js';
 
-import count from '/ckeditor5/utils/count.js';
+import count from 'ckeditor5/utils/count.js';
 
 describe( 'DataController', () => {
 	let modelDocument, htmlDataProcessor, data, schema;
@@ -34,7 +34,7 @@ describe( 'DataController', () => {
 		schema = modelDocument.schema;
 	} );
 
-	describe( 'constructor', () => {
+	describe( 'constructor()', () => {
 		it( 'works without data processor', () => {
 			const data = new DataController( modelDocument );
 

+ 14 - 14
packages/ckeditor5-engine/tests/controller/editingcontroller.js

@@ -6,28 +6,28 @@
 /* globals setTimeout, Range, document */
 /* bender-tags: view */
 
-import EmitterMixin from '/ckeditor5/utils/emittermixin.js';
+import EmitterMixin from 'ckeditor5/utils/emittermixin.js';
 
-import EditingController from '/ckeditor5/engine/controller/editingcontroller.js';
+import EditingController from 'ckeditor5/engine/controller/editingcontroller.js';
 
-import ViewDocument from '/ckeditor5/engine/view/document.js';
+import ViewDocument from 'ckeditor5/engine/view/document.js';
 
-import Mapper from '/ckeditor5/engine/conversion/mapper.js';
-import ModelConversionDispatcher from '/ckeditor5/engine/conversion/modelconversiondispatcher.js';
-import buildModelConverter from '/ckeditor5/engine/conversion/buildmodelconverter.js';
+import Mapper from 'ckeditor5/engine/conversion/mapper.js';
+import ModelConversionDispatcher from 'ckeditor5/engine/conversion/modelconversiondispatcher.js';
+import buildModelConverter from 'ckeditor5/engine/conversion/buildmodelconverter.js';
 
-import ModelDocument from '/ckeditor5/engine/model/document.js';
-import ModelPosition from '/ckeditor5/engine/model/position.js';
-import ModelRange from '/ckeditor5/engine/model/range.js';
-import ModelDocumentFragment from '/ckeditor5/engine/model/documentfragment.js';
+import ModelDocument from 'ckeditor5/engine/model/document.js';
+import ModelPosition from 'ckeditor5/engine/model/position.js';
+import ModelRange from 'ckeditor5/engine/model/range.js';
+import ModelDocumentFragment from 'ckeditor5/engine/model/documentfragment.js';
 
-import createElement from '/ckeditor5/utils/dom/createelement.js';
+import createElement from 'ckeditor5/utils/dom/createelement.js';
 
-import { parse, getData as getModelData } from '/ckeditor5/engine/dev-utils/model.js';
-import { getData as getViewData } from '/ckeditor5/engine/dev-utils/view.js';
+import { parse, getData as getModelData } from 'ckeditor5/engine/dev-utils/model.js';
+import { getData as getViewData } from 'ckeditor5/engine/dev-utils/view.js';
 
 describe( 'EditingController', () => {
-	describe( 'constructor', () => {
+	describe( 'constructor()', () => {
 		let model, editing;
 
 		beforeEach( () => {

+ 8 - 8
packages/ckeditor5-engine/tests/controller/insert.js

@@ -5,16 +5,16 @@
 
 /* bender-tags: model */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import DataController from '/ckeditor5/engine/controller/datacontroller.js';
-import insert from '/ckeditor5/engine/controller/insert.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import DataController from 'ckeditor5/engine/controller/datacontroller.js';
+import insert from 'ckeditor5/engine/controller/insert.js';
 
-import ViewDocumentFragment from '/ckeditor5/engine/view/documentfragment.js';
-import ViewText from '/ckeditor5/engine/view/text.js';
-import ModelDocumentFragment from '/ckeditor5/engine/model/documentfragment.js';
-import Text from '/ckeditor5/engine/model/text.js';
+import ViewDocumentFragment from 'ckeditor5/engine/view/documentfragment.js';
+import ViewText from 'ckeditor5/engine/view/text.js';
+import ModelDocumentFragment from 'ckeditor5/engine/model/documentfragment.js';
+import Text from 'ckeditor5/engine/model/text.js';
 
-import { setData, getData, parse } from '/ckeditor5/engine/dev-utils/model.js';
+import { setData, getData, parse } from 'ckeditor5/engine/dev-utils/model.js';
 
 describe( 'DataController', () => {
 	let doc, dataController;

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

@@ -5,27 +5,27 @@
 
 /* bender-tags: conversion */
 
-import ModelDocument from '/ckeditor5/engine/model/document.js';
-import ModelDocumentFragment from '/ckeditor5/engine/model/documentfragment.js';
-import ModelElement from '/ckeditor5/engine/model/element.js';
-import ModelText from '/ckeditor5/engine/model/text.js';
-import ModelTextProxy from '/ckeditor5/engine/model/textproxy.js';
-import ModelRange from '/ckeditor5/engine/model/range.js';
-import ModelPosition from '/ckeditor5/engine/model/position.js';
-import ModelWalker from '/ckeditor5/engine/model/treewalker.js';
-import modelWriter from '/ckeditor5/engine/model/writer.js';
-
-import ViewElement from '/ckeditor5/engine/view/element.js';
-import ViewContainerElement from '/ckeditor5/engine/view/containerelement.js';
-import ViewAttributeElement from '/ckeditor5/engine/view/attributeelement.js';
-import ViewText from '/ckeditor5/engine/view/text.js';
-import viewWriter from  '/ckeditor5/engine/view/writer.js';
-import ViewPosition from '/ckeditor5/engine/view/position.js';
-import ViewRange from '/ckeditor5/engine/view/range.js';
-
-import Mapper from '/ckeditor5/engine/conversion/mapper.js';
-import ModelConversionDispatcher from '/ckeditor5/engine/conversion/modelconversiondispatcher.js';
-import ViewConversionDispatcher from '/ckeditor5/engine/conversion/viewconversiondispatcher.js';
+import ModelDocument from 'ckeditor5/engine/model/document.js';
+import ModelDocumentFragment from 'ckeditor5/engine/model/documentfragment.js';
+import ModelElement from 'ckeditor5/engine/model/element.js';
+import ModelText from 'ckeditor5/engine/model/text.js';
+import ModelTextProxy from 'ckeditor5/engine/model/textproxy.js';
+import ModelRange from 'ckeditor5/engine/model/range.js';
+import ModelPosition from 'ckeditor5/engine/model/position.js';
+import ModelWalker from 'ckeditor5/engine/model/treewalker.js';
+import modelWriter from 'ckeditor5/engine/model/writer.js';
+
+import ViewElement from 'ckeditor5/engine/view/element.js';
+import ViewContainerElement from 'ckeditor5/engine/view/containerelement.js';
+import ViewAttributeElement from 'ckeditor5/engine/view/attributeelement.js';
+import ViewText from 'ckeditor5/engine/view/text.js';
+import viewWriter from 'ckeditor5/engine/view/writer.js';
+import ViewPosition from 'ckeditor5/engine/view/position.js';
+import ViewRange from 'ckeditor5/engine/view/range.js';
+
+import Mapper from 'ckeditor5/engine/conversion/mapper.js';
+import ModelConversionDispatcher from 'ckeditor5/engine/conversion/modelconversiondispatcher.js';
+import ViewConversionDispatcher from 'ckeditor5/engine/conversion/viewconversiondispatcher.js';
 
 import {
 	insertElement,
@@ -37,10 +37,10 @@ import {
 	move,
 	remove,
 	eventNameToConsumableType
-} from '/ckeditor5/engine/conversion/model-to-view-converters.js';
-import { convertToModelFragment, convertText } from '/ckeditor5/engine/conversion/view-to-model-converters.js';
+} from 'ckeditor5/engine/conversion/model-to-view-converters.js';
+import { convertToModelFragment, convertText } from 'ckeditor5/engine/conversion/view-to-model-converters.js';
 
-import { createRangeOnElementOnly } from '/tests/engine/model/_utils/utils.js';
+import { createRangeOnElementOnly } from 'tests/engine/model/_utils/utils.js';
 
 let modelDoc, modelRoot, viewRoot, mapper, modelDispatcher, viewDispatcher;
 

+ 17 - 17
packages/ckeditor5-engine/tests/conversion/buildmodelconverter.js

@@ -5,36 +5,36 @@
 
 /* bender-tags: conversion */
 
-import buildModelConverter from '/ckeditor5/engine/conversion/buildmodelconverter.js';
+import buildModelConverter from 'ckeditor5/engine/conversion/buildmodelconverter.js';
 
-import ModelDocument from '/ckeditor5/engine/model/document.js';
-import ModelElement from '/ckeditor5/engine/model/element.js';
-import ModelText from '/ckeditor5/engine/model/text.js';
-import ModelRange from '/ckeditor5/engine/model/range.js';
-import ModelPosition from '/ckeditor5/engine/model/position.js';
-import modelWriter from '/ckeditor5/engine/model/writer.js';
+import ModelDocument from 'ckeditor5/engine/model/document.js';
+import ModelElement from 'ckeditor5/engine/model/element.js';
+import ModelText from 'ckeditor5/engine/model/text.js';
+import ModelRange from 'ckeditor5/engine/model/range.js';
+import ModelPosition from 'ckeditor5/engine/model/position.js';
+import modelWriter from 'ckeditor5/engine/model/writer.js';
 
-import ViewDocument from '/ckeditor5/engine/view/document.js';
-import ViewElement from '/ckeditor5/engine/view/element.js';
-import ViewContainerElement from '/ckeditor5/engine/view/containerelement.js';
-import ViewAttributeElement from '/ckeditor5/engine/view/attributeelement.js';
-import ViewText from '/ckeditor5/engine/view/text.js';
+import ViewDocument from 'ckeditor5/engine/view/document.js';
+import ViewElement from 'ckeditor5/engine/view/element.js';
+import ViewContainerElement from 'ckeditor5/engine/view/containerelement.js';
+import ViewAttributeElement from 'ckeditor5/engine/view/attributeelement.js';
+import ViewText from 'ckeditor5/engine/view/text.js';
 
-import Mapper from '/ckeditor5/engine/conversion/mapper.js';
-import ModelConversionDispatcher from '/ckeditor5/engine/conversion/modelconversiondispatcher.js';
+import Mapper from 'ckeditor5/engine/conversion/mapper.js';
+import ModelConversionDispatcher from 'ckeditor5/engine/conversion/modelconversiondispatcher.js';
 
 import {
 	insertText,
 	move,
 	remove
-} from '/ckeditor5/engine/conversion/model-to-view-converters.js';
+} from 'ckeditor5/engine/conversion/model-to-view-converters.js';
 
 import {
 	convertCollapsedSelection,
 	clearAttributes
-} from '/ckeditor5/engine/conversion/model-selection-to-view-converters.js';
+} from 'ckeditor5/engine/conversion/model-selection-to-view-converters.js';
 
-import { createRangeOnElementOnly } from '/tests/engine/model/_utils/utils.js';
+import { createRangeOnElementOnly } from 'tests/engine/model/_utils/utils.js';
 
 function viewAttributesToString( item ) {
 	let result = '';

+ 14 - 14
packages/ckeditor5-engine/tests/conversion/buildviewconverter.js

@@ -5,24 +5,24 @@
 
 /* bender-tags: conversion */
 
-import buildViewConverter from '/ckeditor5/engine/conversion/buildviewconverter.js';
+import buildViewConverter from 'ckeditor5/engine/conversion/buildviewconverter.js';
 
-import ModelSchema from '/ckeditor5/engine/model/schema.js';
-import ModelDocument from '/ckeditor5/engine/model/document.js';
-import ModelElement from '/ckeditor5/engine/model/element.js';
-import ModelTextProxy from '/ckeditor5/engine/model/textproxy.js';
-import ModelRange from '/ckeditor5/engine/model/range.js';
-import ModelWalker from '/ckeditor5/engine/model/treewalker.js';
+import ModelSchema from 'ckeditor5/engine/model/schema.js';
+import ModelDocument from 'ckeditor5/engine/model/document.js';
+import ModelElement from 'ckeditor5/engine/model/element.js';
+import ModelTextProxy from 'ckeditor5/engine/model/textproxy.js';
+import ModelRange from 'ckeditor5/engine/model/range.js';
+import ModelWalker from 'ckeditor5/engine/model/treewalker.js';
 
-import ViewDocumentFragment from '/ckeditor5/engine/view/documentfragment.js';
-import ViewContainerElement from '/ckeditor5/engine/view/containerelement.js';
-import ViewAttributeElement from '/ckeditor5/engine/view/attributeelement.js';
-import ViewText from '/ckeditor5/engine/view/text.js';
-import ViewMatcher from '/ckeditor5/engine/view/matcher.js';
+import ViewDocumentFragment from 'ckeditor5/engine/view/documentfragment.js';
+import ViewContainerElement from 'ckeditor5/engine/view/containerelement.js';
+import ViewAttributeElement from 'ckeditor5/engine/view/attributeelement.js';
+import ViewText from 'ckeditor5/engine/view/text.js';
+import ViewMatcher from 'ckeditor5/engine/view/matcher.js';
 
-import ViewConversionDispatcher from '/ckeditor5/engine/conversion/viewconversiondispatcher.js';
+import ViewConversionDispatcher from 'ckeditor5/engine/conversion/viewconversiondispatcher.js';
 
-import { convertToModelFragment, convertText } from '/ckeditor5/engine/conversion/view-to-model-converters.js';
+import { convertToModelFragment, convertText } from 'ckeditor5/engine/conversion/view-to-model-converters.js';
 
 function modelAttributesToString( item ) {
 	let result = '';

+ 12 - 12
packages/ckeditor5-engine/tests/conversion/mapper.js

@@ -5,18 +5,18 @@
 
 /* bender-tags: conversion */
 
-import Mapper from '/ckeditor5/engine/conversion/mapper.js';
-
-import ModelElement from '/ckeditor5/engine/model/element.js';
-import ModelRootElement from '/ckeditor5/engine/model/rootelement.js';
-import ModelText from '/ckeditor5/engine/model/text.js';
-import ModelPosition from '/ckeditor5/engine/model/position.js';
-import ModelRange from '/ckeditor5/engine/model/range.js';
-
-import ViewElement from '/ckeditor5/engine/view/element.js';
-import ViewText from '/ckeditor5/engine/view/text.js';
-import ViewPosition from '/ckeditor5/engine/view/position.js';
-import ViewRange from '/ckeditor5/engine/view/range.js';
+import Mapper from 'ckeditor5/engine/conversion/mapper.js';
+
+import ModelElement from 'ckeditor5/engine/model/element.js';
+import ModelRootElement from 'ckeditor5/engine/model/rootelement.js';
+import ModelText from 'ckeditor5/engine/model/text.js';
+import ModelPosition from 'ckeditor5/engine/model/position.js';
+import ModelRange from 'ckeditor5/engine/model/range.js';
+
+import ViewElement from 'ckeditor5/engine/view/element.js';
+import ViewText from 'ckeditor5/engine/view/text.js';
+import ViewPosition from 'ckeditor5/engine/view/position.js';
+import ViewRange from 'ckeditor5/engine/view/range.js';
 
 describe( 'Mapper', () => {
 	describe( 'clearBindings', () => {

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

@@ -5,34 +5,34 @@
 
 /* bender-tags: conversion */
 
-import ModelDocument from '/ckeditor5/engine/model/document.js';
-import ModelElement from '/ckeditor5/engine/model/element.js';
-import ModelRange from '/ckeditor5/engine/model/range.js';
-import ModelPosition from '/ckeditor5/engine/model/position.js';
-
-import ViewDocument from '/ckeditor5/engine/view/document.js';
-import ViewContainerElement from '/ckeditor5/engine/view/containerelement.js';
-import ViewAttributeElement from '/ckeditor5/engine/view/attributeelement.js';
-import { mergeAttributes } from '/ckeditor5/engine/view/writer.js';
-
-import Mapper from '/ckeditor5/engine/conversion/mapper.js';
-import ModelConversionDispatcher from '/ckeditor5/engine/conversion/modelconversiondispatcher.js';
+import ModelDocument from 'ckeditor5/engine/model/document.js';
+import ModelElement from 'ckeditor5/engine/model/element.js';
+import ModelRange from 'ckeditor5/engine/model/range.js';
+import ModelPosition from 'ckeditor5/engine/model/position.js';
+
+import ViewDocument from 'ckeditor5/engine/view/document.js';
+import ViewContainerElement from 'ckeditor5/engine/view/containerelement.js';
+import ViewAttributeElement from 'ckeditor5/engine/view/attributeelement.js';
+import { mergeAttributes } from 'ckeditor5/engine/view/writer.js';
+
+import Mapper from 'ckeditor5/engine/conversion/mapper.js';
+import ModelConversionDispatcher from 'ckeditor5/engine/conversion/modelconversiondispatcher.js';
 import {
 	convertRangeSelection,
 	convertCollapsedSelection,
 	convertSelectionAttribute,
 	clearAttributes,
 	clearFakeSelection
-} from '/ckeditor5/engine/conversion/model-selection-to-view-converters.js';
+} from 'ckeditor5/engine/conversion/model-selection-to-view-converters.js';
 
 import {
 	insertElement,
 	insertText,
 	wrap
-} from '/ckeditor5/engine/conversion/model-to-view-converters.js';
+} from 'ckeditor5/engine/conversion/model-to-view-converters.js';
 
-import { stringify as stringifyView } from '/ckeditor5/engine/dev-utils/view.js';
-import { setData as setModelData } from '/ckeditor5/engine/dev-utils/model.js';
+import { stringify as stringifyView } from 'ckeditor5/engine/dev-utils/view.js';
+import { setData as setModelData } from 'ckeditor5/engine/dev-utils/model.js';
 
 let dispatcher, mapper;
 let modelDoc, modelRoot, modelSelection;

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

@@ -5,20 +5,20 @@
 
 /* bender-tags: conversion */
 
-import ModelDocument from '/ckeditor5/engine/model/document.js';
-import ModelElement from '/ckeditor5/engine/model/element.js';
-import ModelText from '/ckeditor5/engine/model/text.js';
-import ModelRange from '/ckeditor5/engine/model/range.js';
-import ModelPosition from '/ckeditor5/engine/model/position.js';
-import modelWriter from '/ckeditor5/engine/model/writer.js';
-
-import ViewElement from '/ckeditor5/engine/view/element.js';
-import ViewContainerElement from '/ckeditor5/engine/view/containerelement.js';
-import ViewAttributeElement from '/ckeditor5/engine/view/attributeelement.js';
-import ViewText from '/ckeditor5/engine/view/text.js';
-
-import Mapper from '/ckeditor5/engine/conversion/mapper.js';
-import ModelConversionDispatcher from '/ckeditor5/engine/conversion/modelconversiondispatcher.js';
+import ModelDocument from 'ckeditor5/engine/model/document.js';
+import ModelElement from 'ckeditor5/engine/model/element.js';
+import ModelText from 'ckeditor5/engine/model/text.js';
+import ModelRange from 'ckeditor5/engine/model/range.js';
+import ModelPosition from 'ckeditor5/engine/model/position.js';
+import modelWriter from 'ckeditor5/engine/model/writer.js';
+
+import ViewElement from 'ckeditor5/engine/view/element.js';
+import ViewContainerElement from 'ckeditor5/engine/view/containerelement.js';
+import ViewAttributeElement from 'ckeditor5/engine/view/attributeelement.js';
+import ViewText from 'ckeditor5/engine/view/text.js';
+
+import Mapper from 'ckeditor5/engine/conversion/mapper.js';
+import ModelConversionDispatcher from 'ckeditor5/engine/conversion/modelconversiondispatcher.js';
 import {
 	insertElement,
 	insertText,
@@ -29,9 +29,9 @@ import {
 	move,
 	remove,
 	rename
-} from '/ckeditor5/engine/conversion/model-to-view-converters.js';
+} from 'ckeditor5/engine/conversion/model-to-view-converters.js';
 
-import { createRangeOnElementOnly } from '/tests/engine/model/_utils/utils.js';
+import { createRangeOnElementOnly } from 'tests/engine/model/_utils/utils.js';
 
 let dispatcher, modelDoc, modelRoot, mapper, viewRoot;
 

+ 4 - 4
packages/ckeditor5-engine/tests/conversion/modelconsumable.js

@@ -5,10 +5,10 @@
 
 /* bender-tags: conversion */
 
-import ModelConsumable from '/ckeditor5/engine/conversion/modelconsumable.js';
-import ModelElement from '/ckeditor5/engine/model/element.js';
-import ModelTextProxy from '/ckeditor5/engine/model/textproxy.js';
-import ModelText from '/ckeditor5/engine/model/text.js';
+import ModelConsumable from 'ckeditor5/engine/conversion/modelconsumable.js';
+import ModelElement from 'ckeditor5/engine/model/element.js';
+import ModelTextProxy from 'ckeditor5/engine/model/textproxy.js';
+import ModelText from 'ckeditor5/engine/model/text.js';
 
 describe( 'ModelConsumable', () => {
 	let modelConsumable, modelElement;

+ 9 - 9
packages/ckeditor5-engine/tests/conversion/modelconversiondispatcher.js

@@ -5,14 +5,14 @@
 
 /* bender-tags: conversion */
 
-import ModelConversionDispatcher from '/ckeditor5/engine/conversion/modelconversiondispatcher.js';
-import ModelDocument from '/ckeditor5/engine/model/document.js';
-import ModelText from '/ckeditor5/engine/model/text.js';
-import ModelElement from '/ckeditor5/engine/model/element.js';
-import ModelRange from '/ckeditor5/engine/model/range.js';
-import ModelPosition from '/ckeditor5/engine/model/position.js';
-import RemoveOperation from '/ckeditor5/engine/model/operation/removeoperation.js';
-import { wrapInDelta } from '/tests/engine/model/_utils/utils.js';
+import ModelConversionDispatcher from 'ckeditor5/engine/conversion/modelconversiondispatcher.js';
+import ModelDocument from 'ckeditor5/engine/model/document.js';
+import ModelText from 'ckeditor5/engine/model/text.js';
+import ModelElement from 'ckeditor5/engine/model/element.js';
+import ModelRange from 'ckeditor5/engine/model/range.js';
+import ModelPosition from 'ckeditor5/engine/model/position.js';
+import RemoveOperation from 'ckeditor5/engine/model/operation/removeoperation.js';
+import { wrapInDelta } from 'tests/engine/model/_utils/utils.js';
 
 describe( 'ModelConversionDispatcher', () => {
 	let dispatcher, doc, root;
@@ -23,7 +23,7 @@ describe( 'ModelConversionDispatcher', () => {
 		root = doc.createRoot();
 	} );
 
-	describe( 'constructor', () => {
+	describe( 'constructor()', () => {
 		it( 'should create ModelConversionDispatcher with given api', () => {
 			const apiObj = {};
 			const dispatcher = new ModelConversionDispatcher( { apiObj } );

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

@@ -5,17 +5,17 @@
 
 /* bender-tags: conversion */
 
-import ViewDocument from '/ckeditor5/engine/view/document.js';
-import ViewSelection from '/ckeditor5/engine/view/selection.js';
-import ViewRange from '/ckeditor5/engine/view/range.js';
+import ViewDocument from 'ckeditor5/engine/view/document.js';
+import ViewSelection from 'ckeditor5/engine/view/selection.js';
+import ViewRange from 'ckeditor5/engine/view/range.js';
 
-import ModelDocument from '/ckeditor5/engine/model/document.js';
+import ModelDocument from 'ckeditor5/engine/model/document.js';
 
-import Mapper from '/ckeditor5/engine/conversion/mapper.js';
-import { convertSelectionChange } from '/ckeditor5/engine/conversion/view-selection-to-model-converters.js';
+import Mapper from 'ckeditor5/engine/conversion/mapper.js';
+import { convertSelectionChange } from 'ckeditor5/engine/conversion/view-selection-to-model-converters.js';
 
-import { setData as modelSetData, getData as modelGetData } from '/ckeditor5/engine/dev-utils/model.js';
-import { setData as viewSetData } from '/ckeditor5/engine/dev-utils/view.js';
+import { setData as modelSetData, getData as modelGetData } from 'ckeditor5/engine/dev-utils/model.js';
+import { setData as viewSetData } from 'ckeditor5/engine/dev-utils/view.js';
 
 describe( 'convertSelectionChange', () => {
 	let model, view, mapper, convertSelection, modelRoot, viewRoot;

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

@@ -5,17 +5,17 @@
 
 /* bender-tags: conversion */
 
-import ViewConversionDispatcher from '/ckeditor5/engine/conversion/viewconversiondispatcher.js';
-import ViewContainerElement from '/ckeditor5/engine/view/containerelement.js';
-import ViewDocumentFragment from '/ckeditor5/engine/view/documentfragment.js';
-import ViewText from '/ckeditor5/engine/view/text.js';
+import ViewConversionDispatcher from 'ckeditor5/engine/conversion/viewconversiondispatcher.js';
+import ViewContainerElement from 'ckeditor5/engine/view/containerelement.js';
+import ViewDocumentFragment from 'ckeditor5/engine/view/documentfragment.js';
+import ViewText from 'ckeditor5/engine/view/text.js';
 
-import ModelSchema from '/ckeditor5/engine/model/schema.js';
-import ModelDocumentFragment from '/ckeditor5/engine/model/documentfragment.js';
-import ModelElement from '/ckeditor5/engine/model/element.js';
-import ModelText from '/ckeditor5/engine/model/text.js';
+import ModelSchema from 'ckeditor5/engine/model/schema.js';
+import ModelDocumentFragment from 'ckeditor5/engine/model/documentfragment.js';
+import ModelElement from 'ckeditor5/engine/model/element.js';
+import ModelText from 'ckeditor5/engine/model/text.js';
 
-import { convertToModelFragment, convertText } from '/ckeditor5/engine/conversion/view-to-model-converters.js';
+import { convertToModelFragment, convertText } from 'ckeditor5/engine/conversion/view-to-model-converters.js';
 
 let dispatcher, schema, objWithContext;
 

+ 4 - 4
packages/ckeditor5-engine/tests/conversion/viewconsumable.js

@@ -5,10 +5,10 @@
 
 /* bender-tags: conversion */
 
-import ViewElement from '/ckeditor5/engine/view/element.js';
-import ViewText from '/ckeditor5/engine/view/text.js';
-import ViewDocumentFragment from '/ckeditor5/engine/view/documentfragment.js';
-import ViewConsumable from '/ckeditor5/engine/conversion/viewconsumable.js';
+import ViewElement from 'ckeditor5/engine/view/element.js';
+import ViewText from 'ckeditor5/engine/view/text.js';
+import ViewDocumentFragment from 'ckeditor5/engine/view/documentfragment.js';
+import ViewConsumable from 'ckeditor5/engine/conversion/viewconsumable.js';
 
 describe( 'ViewConsumable', () => {
 	let viewConsumable;

+ 6 - 6
packages/ckeditor5-engine/tests/conversion/viewconversiondispatcher.js

@@ -5,14 +5,14 @@
 
 /* bender-tags: conversion */
 
-import ViewConversionDispatcher from '/ckeditor5/engine/conversion/viewconversiondispatcher.js';
-import ViewContainerElement from '/ckeditor5/engine/view/containerelement.js';
-import ViewAttributeElement from '/ckeditor5/engine/view/attributeelement.js';
-import ViewDocumentFragment from '/ckeditor5/engine/view/documentfragment.js';
-import ViewText from '/ckeditor5/engine/view/text.js';
+import ViewConversionDispatcher from 'ckeditor5/engine/conversion/viewconversiondispatcher.js';
+import ViewContainerElement from 'ckeditor5/engine/view/containerelement.js';
+import ViewAttributeElement from 'ckeditor5/engine/view/attributeelement.js';
+import ViewDocumentFragment from 'ckeditor5/engine/view/documentfragment.js';
+import ViewText from 'ckeditor5/engine/view/text.js';
 
 describe( 'ViewConversionDispatcher', () => {
-	describe( 'constructor', () => {
+	describe( 'constructor()', () => {
 		it( 'should create ViewConversionDispatcher with passed api', () => {
 			const apiObj = {};
 			const dispatcher = new ViewConversionDispatcher( { apiObj } );

+ 1 - 1
packages/ckeditor5-engine/tests/dataprocessor/basichtmlwriter.js

@@ -6,7 +6,7 @@
 /* globals document */
 /* bender-tags: browser-only */
 
-import BasicHtmlWriter from '/ckeditor5/engine/dataprocessor/basichtmlwriter.js';
+import BasicHtmlWriter from 'ckeditor5/engine/dataprocessor/basichtmlwriter.js';
 
 describe( 'BasicHtmlWriter', () => {
 	const basicHtmlWriter = new BasicHtmlWriter();

+ 4 - 4
packages/ckeditor5-engine/tests/dataprocessor/htmldataprocessor.js

@@ -6,10 +6,10 @@
 /* globals setTimeout, window */
 /* bender-tags: browser-only */
 
-import HtmlDataProcessor from '/ckeditor5/engine/dataprocessor/htmldataprocessor.js';
-import xssTemplates from '/tests/engine/dataprocessor/_utils/xsstemplates.js';
-import ViewDocumentFragment from '/ckeditor5/engine/view/documentfragment.js';
-import { stringify, parse } from '/ckeditor5/engine/dev-utils/view.js';
+import HtmlDataProcessor from 'ckeditor5/engine/dataprocessor/htmldataprocessor.js';
+import xssTemplates from 'tests/engine/dataprocessor/_utils/xsstemplates.js';
+import ViewDocumentFragment from 'ckeditor5/engine/view/documentfragment.js';
+import { stringify, parse } from 'ckeditor5/engine/dev-utils/view.js';
 
 describe( 'HtmlDataProcessor', () => {
 	const dataProcessor = new HtmlDataProcessor();

+ 4 - 4
packages/ckeditor5-engine/tests/dataprocessor/xmldataprocessor.js

@@ -6,10 +6,10 @@
 /* bender-tags: browser-only */
 /* globals window */
 
-import XmlDataProcessor from '/ckeditor5/engine/dataprocessor/xmldataprocessor.js';
-import xssTemplates from '/tests/engine/dataprocessor/_utils/xsstemplates.js';
-import ViewDocumentFragment from '/ckeditor5/engine/view/documentfragment.js';
-import { stringify, parse } from '/ckeditor5/engine/dev-utils/view.js';
+import XmlDataProcessor from 'ckeditor5/engine/dataprocessor/xmldataprocessor.js';
+import xssTemplates from 'tests/engine/dataprocessor/_utils/xsstemplates.js';
+import ViewDocumentFragment from 'ckeditor5/engine/view/documentfragment.js';
+import { stringify, parse } from 'ckeditor5/engine/dev-utils/view.js';
 
 describe( 'XmlDataProcessor', () => {
 	let dataProcessor;

+ 8 - 8
packages/ckeditor5-engine/tests/dev-utils/model.js

@@ -3,14 +3,14 @@
  * For licensing, see LICENSE.md.
  */
 
-import { stringify, parse, getData, setData } from '/ckeditor5/engine/dev-utils/model.js';
-import Document from '/ckeditor5/engine/model/document.js';
-import DocumentFragment from '/ckeditor5/engine/model/documentfragment.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import Range from '/ckeditor5/engine/model/range.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import count from '/ckeditor5/utils/count.js';
+import { stringify, parse, getData, setData } from 'ckeditor5/engine/dev-utils/model.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import DocumentFragment from 'ckeditor5/engine/model/documentfragment.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import Range from 'ckeditor5/engine/model/range.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import count from 'ckeditor5/utils/count.js';
 
 describe( 'model test utils', () => {
 	let document, root, selection, sandbox;

+ 11 - 11
packages/ckeditor5-engine/tests/dev-utils/view.js

@@ -6,17 +6,17 @@
 /* globals document */
 /* bender-tags: browser-only */
 
-import { parse, stringify, getData, setData }from '/ckeditor5/engine/dev-utils/view.js';
-import DocumentFragment from '/ckeditor5/engine/view/documentfragment.js';
-import Position from '/ckeditor5/engine/view/position.js';
-import Element from '/ckeditor5/engine/view/element.js';
-import AttributeElement from '/ckeditor5/engine/view/attributeelement.js';
-import ContainerElement from '/ckeditor5/engine/view/containerelement.js';
-import Text from '/ckeditor5/engine/view/text.js';
-import Selection from '/ckeditor5/engine/view/selection.js';
-import Range from '/ckeditor5/engine/view/range.js';
-import Document from '/ckeditor5/engine/view/document.js';
-import XmlDataProcessor from '/ckeditor5/engine/dataprocessor/xmldataprocessor.js';
+import { parse, stringify, getData, setData }from 'ckeditor5/engine/dev-utils/view.js';
+import DocumentFragment from 'ckeditor5/engine/view/documentfragment.js';
+import Position from 'ckeditor5/engine/view/position.js';
+import Element from 'ckeditor5/engine/view/element.js';
+import AttributeElement from 'ckeditor5/engine/view/attributeelement.js';
+import ContainerElement from 'ckeditor5/engine/view/containerelement.js';
+import Text from 'ckeditor5/engine/view/text.js';
+import Selection from 'ckeditor5/engine/view/selection.js';
+import Range from 'ckeditor5/engine/view/range.js';
+import Document from 'ckeditor5/engine/view/document.js';
+import XmlDataProcessor from 'ckeditor5/engine/dataprocessor/xmldataprocessor.js';
 
 describe( 'view test utils', () => {
 	describe( 'getData, setData', () => {

+ 0 - 0
packages/ckeditor5-engine/tests/tickets/401/1.html → packages/ckeditor5-engine/tests/manual/tickets/401/1.html


+ 0 - 0
packages/ckeditor5-engine/tests/tickets/401/1.js → packages/ckeditor5-engine/tests/manual/tickets/401/1.js


+ 0 - 0
packages/ckeditor5-engine/tests/tickets/401/1.md → packages/ckeditor5-engine/tests/manual/tickets/401/1.md


+ 0 - 0
packages/ckeditor5-engine/tests/tickets/462/1.html → packages/ckeditor5-engine/tests/manual/tickets/462/1.html


+ 0 - 0
packages/ckeditor5-engine/tests/tickets/462/1.js → packages/ckeditor5-engine/tests/manual/tickets/462/1.js


+ 0 - 0
packages/ckeditor5-engine/tests/tickets/462/1.md → packages/ckeditor5-engine/tests/manual/tickets/462/1.md


+ 0 - 0
packages/ckeditor5-engine/tests/tickets/475/1.html → packages/ckeditor5-engine/tests/manual/tickets/475/1.html


+ 0 - 0
packages/ckeditor5-engine/tests/tickets/475/1.js → packages/ckeditor5-engine/tests/manual/tickets/475/1.js


+ 0 - 0
packages/ckeditor5-engine/tests/tickets/475/1.md → packages/ckeditor5-engine/tests/manual/tickets/475/1.md


+ 0 - 0
packages/ckeditor5-engine/tests/tickets/603/1.html → packages/ckeditor5-engine/tests/manual/tickets/603/1.html


+ 0 - 0
packages/ckeditor5-engine/tests/tickets/603/1.js → packages/ckeditor5-engine/tests/manual/tickets/603/1.js


+ 0 - 0
packages/ckeditor5-engine/tests/tickets/603/1.md → packages/ckeditor5-engine/tests/manual/tickets/603/1.md


+ 5 - 5
packages/ckeditor5-engine/tests/model/_utils/utils.js

@@ -3,11 +3,11 @@
  * For licensing, see LICENSE.md.
  */
 
-import Range from '/ckeditor5/engine/model/range.js';
-import TreeWalker from '/ckeditor5/engine/model/treewalker.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import TextProxy from '/ckeditor5/engine/model/textproxy.js';
-import Delta from '/ckeditor5/engine/model/delta/delta.js';
+import Range from 'ckeditor5/engine/model/range.js';
+import TreeWalker from 'ckeditor5/engine/model/treewalker.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import TextProxy from 'ckeditor5/engine/model/textproxy.js';
+import Delta from 'ckeditor5/engine/model/delta/delta.js';
 
 /**
  * Returns tree structure as a simplified string. Elements are uppercase and characters are lowercase.

+ 8 - 8
packages/ckeditor5-engine/tests/model/batch.js

@@ -5,14 +5,14 @@
 
 /* bender-tags: model, delta */
 
-import deltas from '/ckeditor5/engine/model/delta/basic-deltas.js'; // jshint ignore:line
-
-import Document from '/ckeditor5/engine/model/document.js';
-import Batch from '/ckeditor5/engine/model/batch.js';
-import { register } from '/ckeditor5/engine/model/batch.js';
-import Delta from '/ckeditor5/engine/model/delta/delta.js';
-import Operation from '/ckeditor5/engine/model/operation/operation.js';
-import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
+import deltas from 'ckeditor5/engine/model/delta/basic-deltas.js'; // jshint ignore:line
+
+import Document from 'ckeditor5/engine/model/document.js';
+import Batch from 'ckeditor5/engine/model/batch.js';
+import { register } from 'ckeditor5/engine/model/batch.js';
+import Delta from 'ckeditor5/engine/model/delta/delta.js';
+import Operation from 'ckeditor5/engine/model/operation/operation.js';
+import CKEditorError from 'ckeditor5/utils/ckeditorerror.js';
 
 describe( 'Batch', () => {
 	it( 'should have registered basic methods', () => {

+ 4 - 4
packages/ckeditor5-engine/tests/model/composer/composer.js

@@ -5,9 +5,9 @@
 
 /* bender-tags: model, composer */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import Composer from '/ckeditor5/engine/model/composer/composer.js';
-import { setData, getData } from '/ckeditor5/engine/dev-utils/model.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import Composer from 'ckeditor5/engine/model/composer/composer.js';
+import { setData, getData } from 'ckeditor5/engine/dev-utils/model.js';
 
 describe( 'Composer', () => {
 	let document, composer;
@@ -20,7 +20,7 @@ describe( 'Composer', () => {
 		composer = new Composer();
 	} );
 
-	describe( 'constructor', () => {
+	describe( 'constructor()', () => {
 		it( 'attaches deleteContents default listener', () => {
 			setData( document, '<p>f[oo</p><p>ba]r</p>' );
 

+ 15 - 21
packages/ckeditor5-engine/tests/model/composer/deletecontents.js

@@ -5,9 +5,9 @@
 
 /* bender-tags: model, composer */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import deleteContents from '/ckeditor5/engine/model/composer/deletecontents.js';
-import { setData, getData } from '/ckeditor5/engine/dev-utils/model.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import deleteContents from 'ckeditor5/engine/model/composer/deletecontents.js';
+import { setData, getData } from 'ckeditor5/engine/dev-utils/model.js';
 
 describe( 'Delete utils', () => {
 	let doc;
@@ -93,9 +93,7 @@ describe( 'Delete utils', () => {
 			} );
 
 			it( 'deletes characters (first half has attrs)', () => {
-				setData( doc, '<$text bold="true">fo[o</$text>b]ar', { selectionAttributes: {
-					bold: true
-				} } );
+				setData( doc, '<$text bold="true">fo[o</$text>b]ar' );
 
 				deleteContents( doc.batch(), doc.selection );
 
@@ -104,9 +102,7 @@ describe( 'Delete utils', () => {
 			} );
 
 			it( 'deletes characters (2nd half has attrs)', () => {
-				setData( doc, 'fo[o<$text bold="true">b]ar</$text>', { selectionAttributes: {
-					bold: true
-				} } );
+				setData( doc, 'fo[o<$text bold="true">b]ar</$text>' );
 
 				deleteContents( doc.batch(), doc.selection );
 
@@ -115,15 +111,7 @@ describe( 'Delete utils', () => {
 			} );
 
 			it( 'clears selection attrs when emptied content', () => {
-				setData(
-					doc,
-					'<paragraph>x</paragraph><paragraph>[<$text bold="true">foo</$text>]</paragraph><paragraph>y</paragraph>',
-					{
-						selectionAttributes: {
-							bold: true
-						}
-					}
-				);
+				setData( doc, '<paragraph>x</paragraph><paragraph>[<$text bold="true">foo</$text>]</paragraph><paragraph>y</paragraph>' );
 
 				deleteContents( doc.batch(), doc.selection );
 
@@ -132,9 +120,15 @@ describe( 'Delete utils', () => {
 			} );
 
 			it( 'leaves selection attributes when text contains them', () => {
-				setData( doc, '<paragraph>x<$text bold="true">a[foo]b</$text>y</paragraph>', { selectionAttributes: {
-					bold: true
-				} } );
+				setData(
+					doc,
+					'<paragraph>x<$text bold="true">a[foo]b</$text>y</paragraph>',
+					{
+						selectionAttributes: {
+							bold: true
+						}
+					}
+				);
 
 				deleteContents( doc.batch(), doc.selection );
 

+ 4 - 4
packages/ckeditor5-engine/tests/model/composer/modifyselection.js

@@ -5,10 +5,10 @@
 
 /* bender-tags: model, composer */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import Selection from '/ckeditor5/engine/model/selection.js';
-import modifySelection from '/ckeditor5/engine/model/composer/modifyselection.js';
-import { setData, stringify } from '/ckeditor5/engine/dev-utils/model.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import Selection from 'ckeditor5/engine/model/selection.js';
+import modifySelection from 'ckeditor5/engine/model/composer/modifyselection.js';
+import { setData, stringify } from 'ckeditor5/engine/dev-utils/model.js';
 
 describe( 'Delete utils', () => {
 	let document;

+ 10 - 10
packages/ckeditor5-engine/tests/model/delta/attributedelta.js

@@ -5,16 +5,16 @@
 
 /* bender-tags: model, delta */
 
-import count from '/ckeditor5/utils/count.js';
-import Document from '/ckeditor5/engine/model/document.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import Range from '/ckeditor5/engine/model/range.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Element from '/ckeditor5/engine/model/element.js';
-
-import AttributeDelta from '/ckeditor5/engine/model/delta/attributedelta.js';
-import { RootAttributeDelta } from '/ckeditor5/engine/model/delta/attributedelta.js';
-import AttributeOperation from '/ckeditor5/engine/model/operation/attributeoperation.js';
+import count from 'ckeditor5/utils/count.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import Range from 'ckeditor5/engine/model/range.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Element from 'ckeditor5/engine/model/element.js';
+
+import AttributeDelta from 'ckeditor5/engine/model/delta/attributedelta.js';
+import { RootAttributeDelta } from 'ckeditor5/engine/model/delta/attributedelta.js';
+import AttributeOperation from 'ckeditor5/engine/model/operation/attributeoperation.js';
 
 let doc, root;
 

+ 16 - 16
packages/ckeditor5-engine/tests/model/delta/delta.js

@@ -5,21 +5,21 @@
 
 /* bender-tags: model, delta */
 
-import count from '/ckeditor5/utils/count.js';
-import Delta from '/ckeditor5/engine/model/delta/delta.js';
-import Operation from '/ckeditor5/engine/model/operation/operation.js';
-import AttributeOperation from '/ckeditor5/engine/model/operation/attributeoperation.js';
-import InsertOperation from '/ckeditor5/engine/model/operation/insertoperation.js';
-import MoveOperation from '/ckeditor5/engine/model/operation/moveoperation.js';
-import NoOperation from '/ckeditor5/engine/model/operation/nooperation.js';
-import ReinsertOperation from '/ckeditor5/engine/model/operation/reinsertoperation.js';
-import RemoveOperation from '/ckeditor5/engine/model/operation/removeoperation.js';
-import RootAttributeOperation from '/ckeditor5/engine/model/operation/rootattributeoperation.js';
-import DeltaFactory from '/ckeditor5/engine/model/delta/deltafactory.js';
-import Document from '/ckeditor5/engine/model/document.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Range from '/ckeditor5/engine/model/range.js';
-import { jsonParseStringify } from '/tests/engine/model/_utils/utils.js';
+import count from 'ckeditor5/utils/count.js';
+import Delta from 'ckeditor5/engine/model/delta/delta.js';
+import Operation from 'ckeditor5/engine/model/operation/operation.js';
+import AttributeOperation from 'ckeditor5/engine/model/operation/attributeoperation.js';
+import InsertOperation from 'ckeditor5/engine/model/operation/insertoperation.js';
+import MoveOperation from 'ckeditor5/engine/model/operation/moveoperation.js';
+import NoOperation from 'ckeditor5/engine/model/operation/nooperation.js';
+import ReinsertOperation from 'ckeditor5/engine/model/operation/reinsertoperation.js';
+import RemoveOperation from 'ckeditor5/engine/model/operation/removeoperation.js';
+import RootAttributeOperation from 'ckeditor5/engine/model/operation/rootattributeoperation.js';
+import DeltaFactory from 'ckeditor5/engine/model/delta/deltafactory.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Range from 'ckeditor5/engine/model/range.js';
+import { jsonParseStringify } from 'tests/engine/model/_utils/utils.js';
 
 // Some test examples of operations.
 class FooOperation extends Operation {
@@ -48,7 +48,7 @@ class FooDelta extends Delta {
 }
 
 describe( 'Delta', () => {
-	describe( 'constructor', () => {
+	describe( 'constructor()', () => {
 		it( 'should create an delta with empty properties', () => {
 			const delta = new Delta();
 

+ 15 - 15
packages/ckeditor5-engine/tests/model/delta/deltafactory.js

@@ -5,25 +5,25 @@
 
 /* bender-tags: model, delta */
 
-import Delta from '/ckeditor5/engine/model/delta/delta.js';
-import InsertDelta from '/ckeditor5/engine/model/delta/insertdelta.js';
+import Delta from 'ckeditor5/engine/model/delta/delta.js';
+import InsertDelta from 'ckeditor5/engine/model/delta/insertdelta.js';
 
-import AttributeOperation from '/ckeditor5/engine/model/operation/attributeoperation.js';
-import InsertOperation from '/ckeditor5/engine/model/operation/insertoperation.js';
-import MoveOperation from '/ckeditor5/engine/model/operation/moveoperation.js';
-import NoOperation from '/ckeditor5/engine/model/operation/nooperation.js';
-import ReinsertOperation from '/ckeditor5/engine/model/operation/reinsertoperation.js';
-import RemoveOperation from '/ckeditor5/engine/model/operation/removeoperation.js';
-import RootAttributeOperation from '/ckeditor5/engine/model/operation/rootattributeoperation.js';
+import AttributeOperation from 'ckeditor5/engine/model/operation/attributeoperation.js';
+import InsertOperation from 'ckeditor5/engine/model/operation/insertoperation.js';
+import MoveOperation from 'ckeditor5/engine/model/operation/moveoperation.js';
+import NoOperation from 'ckeditor5/engine/model/operation/nooperation.js';
+import ReinsertOperation from 'ckeditor5/engine/model/operation/reinsertoperation.js';
+import RemoveOperation from 'ckeditor5/engine/model/operation/removeoperation.js';
+import RootAttributeOperation from 'ckeditor5/engine/model/operation/rootattributeoperation.js';
 
-import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
+import CKEditorError from 'ckeditor5/utils/ckeditorerror.js';
 
-import DeltaFactory from '/ckeditor5/engine/model/delta/deltafactory.js';
+import DeltaFactory from 'ckeditor5/engine/model/delta/deltafactory.js';
 
-import Document from '/ckeditor5/engine/model/document.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Range from '/ckeditor5/engine/model/range.js';
-import { jsonParseStringify } from '/tests/engine/model/_utils/utils.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Range from 'ckeditor5/engine/model/range.js';
+import { jsonParseStringify } from 'tests/engine/model/_utils/utils.js';
 
 class FooDelta extends Delta {
 	static get className() {

+ 9 - 9
packages/ckeditor5-engine/tests/model/delta/insertdelta.js

@@ -5,16 +5,16 @@
 
 /* bender-tags: model, delta */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Text from '/ckeditor5/engine/model/text.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Text from 'ckeditor5/engine/model/text.js';
 
-import InsertOperation from '/ckeditor5/engine/model/operation/insertoperation.js';
-import InsertDelta from '/ckeditor5/engine/model/delta/insertdelta.js';
+import InsertOperation from 'ckeditor5/engine/model/operation/insertoperation.js';
+import InsertDelta from 'ckeditor5/engine/model/delta/insertdelta.js';
 
-import RemoveDelta from '/ckeditor5/engine/model/delta/removedelta.js';
-import RemoveOperation from '/ckeditor5/engine/model/operation/removeoperation.js';
+import RemoveDelta from 'ckeditor5/engine/model/delta/removedelta.js';
+import RemoveOperation from 'ckeditor5/engine/model/operation/removeoperation.js';
 
 describe( 'Batch', () => {
 	let doc, root, batch, p, ul, chain;
@@ -66,7 +66,7 @@ describe( 'InsertDelta', () => {
 		insertDelta = new InsertDelta();
 	} );
 
-	describe( 'constructor', () => {
+	describe( 'constructor()', () => {
 		it( 'should create insert delta with no operations added', () => {
 			expect( insertDelta.operations.length ).to.equal( 0 );
 		} );

+ 12 - 12
packages/ckeditor5-engine/tests/model/delta/mergedelta.js

@@ -5,20 +5,20 @@
 
 /* bender-tags: model, delta */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import CKEditorError from 'ckeditor5/utils/ckeditorerror.js';
 
-import MergeDelta from '/ckeditor5/engine/model/delta/mergedelta.js';
-import SplitDelta from '/ckeditor5/engine/model/delta/splitdelta.js';
+import MergeDelta from 'ckeditor5/engine/model/delta/mergedelta.js';
+import SplitDelta from 'ckeditor5/engine/model/delta/splitdelta.js';
 
-import MoveOperation from '/ckeditor5/engine/model/operation/moveoperation.js';
-import RemoveOperation from '/ckeditor5/engine/model/operation/removeoperation.js';
-import ReinsertOperation from '/ckeditor5/engine/model/operation/reinsertoperation.js';
+import MoveOperation from 'ckeditor5/engine/model/operation/moveoperation.js';
+import RemoveOperation from 'ckeditor5/engine/model/operation/removeoperation.js';
+import ReinsertOperation from 'ckeditor5/engine/model/operation/reinsertoperation.js';
 
-import count from '/ckeditor5/utils/count.js';
+import count from 'ckeditor5/utils/count.js';
 
 describe( 'Batch', () => {
 	let doc, root, p1, p2, batch;
@@ -86,7 +86,7 @@ describe( 'MergeDelta', () => {
 		mergeDelta = new MergeDelta();
 	} );
 
-	describe( 'constructor', () => {
+	describe( 'constructor()', () => {
 		it( 'should create merge delta with no operations added', () => {
 			expect( mergeDelta.operations.length ).to.equal( 0 );
 		} );

+ 10 - 10
packages/ckeditor5-engine/tests/model/delta/movedelta.js

@@ -5,16 +5,16 @@
 
 /* bender-tags: model, delta */
 
-import { getNodesAndText } from '/tests/engine/model/_utils/utils.js';
-import Document from '/ckeditor5/engine/model/document.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Range from '/ckeditor5/engine/model/range.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
+import { getNodesAndText } from 'tests/engine/model/_utils/utils.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Range from 'ckeditor5/engine/model/range.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import CKEditorError from 'ckeditor5/utils/ckeditorerror.js';
 
-import MoveDelta from '/ckeditor5/engine/model/delta/movedelta.js';
-import MoveOperation from '/ckeditor5/engine/model/operation/moveoperation.js';
+import MoveDelta from 'ckeditor5/engine/model/delta/movedelta.js';
+import MoveOperation from 'ckeditor5/engine/model/operation/moveoperation.js';
 
 describe( 'Batch', () => {
 	let doc, root, div, p, batch, chain;
@@ -87,7 +87,7 @@ describe( 'MoveDelta', () => {
 		moveDelta = new MoveDelta();
 	} );
 
-	describe( 'constructor', () => {
+	describe( 'constructor()', () => {
 		it( 'should create move delta with no operations added', () => {
 			expect( moveDelta.operations.length ).to.equal( 0 );
 		} );

+ 7 - 7
packages/ckeditor5-engine/tests/model/delta/removedelta.js

@@ -5,13 +5,13 @@
 
 /* bender-tags: model, delta */
 
-import { getNodesAndText } from '/tests/engine/model/_utils/utils.js';
-import Document from '/ckeditor5/engine/model/document.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Range from '/ckeditor5/engine/model/range.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import RemoveDelta from '/ckeditor5/engine/model/delta/removedelta.js';
+import { getNodesAndText } from 'tests/engine/model/_utils/utils.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Range from 'ckeditor5/engine/model/range.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import RemoveDelta from 'ckeditor5/engine/model/delta/removedelta.js';
 
 describe( 'Batch', () => {
 	let doc, root, div, p, batch, chain, range;

+ 6 - 6
packages/ckeditor5-engine/tests/model/delta/renamedelta.js

@@ -5,12 +5,12 @@
 
 /* bender-tags: model, delta */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import CKEditorError from 'ckeditor5/utils/ckeditorerror.js';
 
-import RenameDelta from '/ckeditor5/engine/model/delta/renamedelta.js';
+import RenameDelta from 'ckeditor5/engine/model/delta/renamedelta.js';
 
 describe( 'Batch', () => {
 	let doc, root, batch, chain;
@@ -66,7 +66,7 @@ describe( 'RenameDelta', () => {
 		renameDelta = new RenameDelta();
 	} );
 
-	describe( 'constructor', () => {
+	describe( 'constructor()', () => {
 		it( 'should create rename delta with no operations added', () => {
 			expect( renameDelta.operations.length ).to.equal( 0 );
 		} );

+ 12 - 12
packages/ckeditor5-engine/tests/model/delta/splitdelta.js

@@ -5,20 +5,20 @@
 
 /* bender-tags: model, delta */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import CKEditorError from 'ckeditor5/utils/ckeditorerror.js';
 
-import MergeDelta from '/ckeditor5/engine/model/delta/mergedelta.js';
-import SplitDelta from '/ckeditor5/engine/model/delta/splitdelta.js';
+import MergeDelta from 'ckeditor5/engine/model/delta/mergedelta.js';
+import SplitDelta from 'ckeditor5/engine/model/delta/splitdelta.js';
 
-import InsertOperation from '/ckeditor5/engine/model/operation/insertoperation.js';
-import MoveOperation from '/ckeditor5/engine/model/operation/moveoperation.js';
-import RemoveOperation from '/ckeditor5/engine/model/operation/removeoperation.js';
+import InsertOperation from 'ckeditor5/engine/model/operation/insertoperation.js';
+import MoveOperation from 'ckeditor5/engine/model/operation/moveoperation.js';
+import RemoveOperation from 'ckeditor5/engine/model/operation/removeoperation.js';
 
-import count from '/ckeditor5/utils/count.js';
+import count from 'ckeditor5/utils/count.js';
 
 describe( 'Batch', () => {
 	let doc, root, p;
@@ -103,7 +103,7 @@ describe( 'SplitDelta', () => {
 		splitDelta = new SplitDelta();
 	} );
 
-	describe( 'constructor', () => {
+	describe( 'constructor()', () => {
 		it( 'should create split delta with no operations added', () => {
 			expect( splitDelta.operations.length ).to.equal( 0 );
 		} );

+ 21 - 21
packages/ckeditor5-engine/tests/model/delta/transform/_utils/utils.js

@@ -5,27 +5,27 @@
 
 /* bender-tags: model, operation */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import Text from '/ckeditor5/engine/model/text.js';
-
-import Position from '/ckeditor5/engine/model/position.js';
-import Range from '/ckeditor5/engine/model/range.js';
-
-import AttributeDelta from '/ckeditor5/engine/model/delta/attributedelta.js';
-import InsertDelta from '/ckeditor5/engine/model/delta/insertdelta.js';
-import WeakInsertDelta from '/ckeditor5/engine/model/delta/weakinsertdelta.js';
-import RemoveDelta from '/ckeditor5/engine/model/delta/removedelta.js';
-import MoveDelta from '/ckeditor5/engine/model/delta/movedelta.js';
-import MergeDelta from '/ckeditor5/engine/model/delta/mergedelta.js';
-import SplitDelta from '/ckeditor5/engine/model/delta/splitdelta.js';
-import WrapDelta from '/ckeditor5/engine/model/delta/wrapdelta.js';
-import UnwrapDelta from '/ckeditor5/engine/model/delta/unwrapdelta.js';
-
-import AttributeOperation from '/ckeditor5/engine/model/operation/attributeoperation.js';
-import InsertOperation from '/ckeditor5/engine/model/operation/insertoperation.js';
-import MoveOperation from '/ckeditor5/engine/model/operation/moveoperation.js';
-import RemoveOperation from '/ckeditor5/engine/model/operation/removeoperation.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Text from 'ckeditor5/engine/model/text.js';
+
+import Position from 'ckeditor5/engine/model/position.js';
+import Range from 'ckeditor5/engine/model/range.js';
+
+import AttributeDelta from 'ckeditor5/engine/model/delta/attributedelta.js';
+import InsertDelta from 'ckeditor5/engine/model/delta/insertdelta.js';
+import WeakInsertDelta from 'ckeditor5/engine/model/delta/weakinsertdelta.js';
+import RemoveDelta from 'ckeditor5/engine/model/delta/removedelta.js';
+import MoveDelta from 'ckeditor5/engine/model/delta/movedelta.js';
+import MergeDelta from 'ckeditor5/engine/model/delta/mergedelta.js';
+import SplitDelta from 'ckeditor5/engine/model/delta/splitdelta.js';
+import WrapDelta from 'ckeditor5/engine/model/delta/wrapdelta.js';
+import UnwrapDelta from 'ckeditor5/engine/model/delta/unwrapdelta.js';
+
+import AttributeOperation from 'ckeditor5/engine/model/operation/attributeoperation.js';
+import InsertOperation from 'ckeditor5/engine/model/operation/insertoperation.js';
+import MoveOperation from 'ckeditor5/engine/model/operation/moveoperation.js';
+import RemoveOperation from 'ckeditor5/engine/model/operation/removeoperation.js';
 
 export function getAttributeDelta( range, key, oldValue, newValue, version ) {
 	let delta = new AttributeDelta();

+ 8 - 8
packages/ckeditor5-engine/tests/model/delta/transform/attributedelta.js

@@ -5,24 +5,24 @@
 
 /* bender-tags: model, operation */
 
-import transformations from '/ckeditor5/engine/model/delta/basic-transformations.js';
+import transformations from 'ckeditor5/engine/model/delta/basic-transformations.js';
 /*jshint unused: false*/
 
-import transform from '/ckeditor5/engine/model/delta/transform.js';
+import transform from 'ckeditor5/engine/model/delta/transform.js';
 
-import Text from '/ckeditor5/engine/model/text.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Range from '/ckeditor5/engine/model/range.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Range from 'ckeditor5/engine/model/range.js';
 
-import AttributeDelta from '/ckeditor5/engine/model/delta/attributedelta.js';
-import AttributeOperation from '/ckeditor5/engine/model/operation/attributeoperation.js';
+import AttributeDelta from 'ckeditor5/engine/model/delta/attributedelta.js';
+import AttributeOperation from 'ckeditor5/engine/model/operation/attributeoperation.js';
 
 import {
 	expectDelta,
 	getFilledDocument,
 	getAttributeDelta,
 	getWeakInsertDelta,
-} from '/tests/engine/model/delta/transform/_utils/utils.js';
+} from 'tests/engine/model/delta/transform/_utils/utils.js';
 
 describe( 'transform', () => {
 	let doc, root, baseVersion;

+ 6 - 6
packages/ckeditor5-engine/tests/model/delta/transform/delta.js

@@ -5,19 +5,19 @@
 
 /* bender-tags: model, operation */
 
-import transformations from '/ckeditor5/engine/model/delta/basic-transformations.js';
+import transformations from 'ckeditor5/engine/model/delta/basic-transformations.js';
 /*jshint unused: false*/
 
-import transform from '/ckeditor5/engine/model/delta/transform.js';
+import transform from 'ckeditor5/engine/model/delta/transform.js';
 
-import Position from '/ckeditor5/engine/model/position.js';
-import MoveOperation from '/ckeditor5/engine/model/operation/moveoperation.js';
-import Delta from '/ckeditor5/engine/model/delta/delta.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import MoveOperation from 'ckeditor5/engine/model/operation/moveoperation.js';
+import Delta from 'ckeditor5/engine/model/delta/delta.js';
 
 import {
 	expectDelta,
 	getFilledDocument,
-} from '/tests/engine/model/delta/transform/_utils/utils.js';
+} from 'tests/engine/model/delta/transform/_utils/utils.js';
 
 describe( 'Delta', () => {
 	let doc, root, baseVersion;

+ 12 - 12
packages/ckeditor5-engine/tests/model/delta/transform/insertdelta.js

@@ -5,23 +5,23 @@
 
 /* bender-tags: model, operation */
 
-import transformations from '/ckeditor5/engine/model/delta/basic-transformations.js';
+import transformations from 'ckeditor5/engine/model/delta/basic-transformations.js';
 /*jshint unused: false*/
 
-import transform from '/ckeditor5/engine/model/delta/transform.js';
+import transform from 'ckeditor5/engine/model/delta/transform.js';
 
-import Element from '/ckeditor5/engine/model/element.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Range from '/ckeditor5/engine/model/range.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Range from 'ckeditor5/engine/model/range.js';
 
-import InsertDelta from '/ckeditor5/engine/model/delta/insertdelta.js';
-import SplitDelta from '/ckeditor5/engine/model/delta/splitdelta.js';
+import InsertDelta from 'ckeditor5/engine/model/delta/insertdelta.js';
+import SplitDelta from 'ckeditor5/engine/model/delta/splitdelta.js';
 
-import InsertOperation from '/ckeditor5/engine/model/operation/insertoperation.js';
-import MoveOperation from '/ckeditor5/engine/model/operation/moveoperation.js';
-import ReinsertOperation from '/ckeditor5/engine/model/operation/reinsertoperation.js';
+import InsertOperation from 'ckeditor5/engine/model/operation/insertoperation.js';
+import MoveOperation from 'ckeditor5/engine/model/operation/moveoperation.js';
+import ReinsertOperation from 'ckeditor5/engine/model/operation/reinsertoperation.js';
 
-import { getNodesAndText, jsonParseStringify } from '/tests/engine/model/_utils/utils.js';
+import { getNodesAndText, jsonParseStringify } from 'tests/engine/model/_utils/utils.js';
 
 import {
 	applyDelta,
@@ -29,7 +29,7 @@ import {
 	getFilledDocument,
 	getInsertDelta,
 	getMergeDelta
-} from '/tests/engine/model/delta/transform/_utils/utils.js';
+} from 'tests/engine/model/delta/transform/_utils/utils.js';
 
 describe( 'transform', () => {
 	let doc, root, gy, baseVersion;

+ 12 - 12
packages/ckeditor5-engine/tests/model/delta/transform/mergedelta.js

@@ -5,23 +5,23 @@
 
 /* bender-tags: model, operation */
 
-import transformations from '/ckeditor5/engine/model/delta/basic-transformations.js';
+import transformations from 'ckeditor5/engine/model/delta/basic-transformations.js';
 /*jshint unused: false*/
 
-import transform from '/ckeditor5/engine/model/delta/transform.js';
+import transform from 'ckeditor5/engine/model/delta/transform.js';
 
-import Element from '/ckeditor5/engine/model/element.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Range from '/ckeditor5/engine/model/range.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Range from 'ckeditor5/engine/model/range.js';
 
-import Delta from '/ckeditor5/engine/model/delta/delta.js';
-import MergeDelta from '/ckeditor5/engine/model/delta/mergedelta.js';
+import Delta from 'ckeditor5/engine/model/delta/delta.js';
+import MergeDelta from 'ckeditor5/engine/model/delta/mergedelta.js';
 
-import MoveOperation from '/ckeditor5/engine/model/operation/moveoperation.js';
-import RemoveOperation from '/ckeditor5/engine/model/operation/removeoperation.js';
-import NoOperation from '/ckeditor5/engine/model/operation/nooperation.js';
+import MoveOperation from 'ckeditor5/engine/model/operation/moveoperation.js';
+import RemoveOperation from 'ckeditor5/engine/model/operation/removeoperation.js';
+import NoOperation from 'ckeditor5/engine/model/operation/nooperation.js';
 
-import { getNodesAndText, jsonParseStringify } from '/tests/engine/model/_utils/utils.js';
+import { getNodesAndText, jsonParseStringify } from 'tests/engine/model/_utils/utils.js';
 
 import {
 	applyDelta,
@@ -30,7 +30,7 @@ import {
 	getInsertDelta,
 	getMergeDelta,
 	getMoveDelta
-} from '/tests/engine/model/delta/transform/_utils/utils.js';
+} from 'tests/engine/model/delta/transform/_utils/utils.js';
 
 describe( 'transform', () => {
 	let doc, root, gy, baseVersion;

+ 9 - 9
packages/ckeditor5-engine/tests/model/delta/transform/movedelta.js

@@ -5,20 +5,20 @@
 
 /* bender-tags: model, operation */
 
-import transformations from '/ckeditor5/engine/model/delta/basic-transformations.js';
+import transformations from 'ckeditor5/engine/model/delta/basic-transformations.js';
 /*jshint unused: false*/
 
-import transform from '/ckeditor5/engine/model/delta/transform.js';
+import transform from 'ckeditor5/engine/model/delta/transform.js';
 
-import Position from '/ckeditor5/engine/model/position.js';
-import Range from '/ckeditor5/engine/model/range.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Range from 'ckeditor5/engine/model/range.js';
 
-import MoveDelta from '/ckeditor5/engine/model/delta/movedelta.js';
-import SplitDelta from '/ckeditor5/engine/model/delta/splitdelta.js';
+import MoveDelta from 'ckeditor5/engine/model/delta/movedelta.js';
+import SplitDelta from 'ckeditor5/engine/model/delta/splitdelta.js';
 
-import MoveOperation from '/ckeditor5/engine/model/operation/moveoperation.js';
+import MoveOperation from 'ckeditor5/engine/model/operation/moveoperation.js';
 
-import { getNodesAndText, jsonParseStringify } from '/tests/engine/model/_utils/utils.js';
+import { getNodesAndText, jsonParseStringify } from 'tests/engine/model/_utils/utils.js';
 
 import {
 	applyDelta,
@@ -26,7 +26,7 @@ import {
 	getFilledDocument,
 	getMergeDelta,
 	getMoveDelta
-} from '/tests/engine/model/delta/transform/_utils/utils.js';
+} from 'tests/engine/model/delta/transform/_utils/utils.js';
 
 describe( 'transform', () => {
 	let doc, root, gy, baseVersion;

+ 9 - 9
packages/ckeditor5-engine/tests/model/delta/transform/removedelta.js

@@ -5,20 +5,20 @@
 
 /* bender-tags: model, operation */
 
-import transformations from '/ckeditor5/engine/model/delta/basic-transformations.js';
+import transformations from 'ckeditor5/engine/model/delta/basic-transformations.js';
 /*jshint unused: false*/
 
-import transform from '/ckeditor5/engine/model/delta/transform.js';
+import transform from 'ckeditor5/engine/model/delta/transform.js';
 
-import Position from '/ckeditor5/engine/model/position.js';
-import Range from '/ckeditor5/engine/model/range.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Range from 'ckeditor5/engine/model/range.js';
 
-import RemoveDelta from '/ckeditor5/engine/model/delta/movedelta.js';
-import SplitDelta from '/ckeditor5/engine/model/delta/splitdelta.js';
+import RemoveDelta from 'ckeditor5/engine/model/delta/movedelta.js';
+import SplitDelta from 'ckeditor5/engine/model/delta/splitdelta.js';
 
-import MoveOperation from '/ckeditor5/engine/model/operation/moveoperation.js';
+import MoveOperation from 'ckeditor5/engine/model/operation/moveoperation.js';
 
-import { getNodesAndText, jsonParseStringify } from '/tests/engine/model/_utils/utils.js';
+import { getNodesAndText, jsonParseStringify } from 'tests/engine/model/_utils/utils.js';
 
 import {
 	applyDelta,
@@ -26,7 +26,7 @@ import {
 	getFilledDocument,
 	getMergeDelta,
 	getRemoveDelta
-} from '/tests/engine/model/delta/transform/_utils/utils.js';
+} from 'tests/engine/model/delta/transform/_utils/utils.js';
 
 describe( 'transform', () => {
 	let doc, root, gy, baseVersion;

+ 13 - 13
packages/ckeditor5-engine/tests/model/delta/transform/splitdelta.js

@@ -5,24 +5,24 @@
 
 /* bender-tags: model, operation */
 
-import transformations from '/ckeditor5/engine/model/delta/basic-transformations.js';
+import transformations from 'ckeditor5/engine/model/delta/basic-transformations.js';
 /*jshint unused: false*/
 
-import transform from '/ckeditor5/engine/model/delta/transform.js';
+import transform from 'ckeditor5/engine/model/delta/transform.js';
 
-import Element from '/ckeditor5/engine/model/element.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Range from '/ckeditor5/engine/model/range.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Range from 'ckeditor5/engine/model/range.js';
 
-import Delta from '/ckeditor5/engine/model/delta/delta.js';
-import SplitDelta from '/ckeditor5/engine/model/delta/splitdelta.js';
+import Delta from 'ckeditor5/engine/model/delta/delta.js';
+import SplitDelta from 'ckeditor5/engine/model/delta/splitdelta.js';
 
-import InsertOperation from '/ckeditor5/engine/model/operation/insertoperation.js';
-import ReinsertOperation from '/ckeditor5/engine/model/operation/reinsertoperation.js';
-import MoveOperation from '/ckeditor5/engine/model/operation/moveoperation.js';
-import NoOperation from '/ckeditor5/engine/model/operation/nooperation.js';
+import InsertOperation from 'ckeditor5/engine/model/operation/insertoperation.js';
+import ReinsertOperation from 'ckeditor5/engine/model/operation/reinsertoperation.js';
+import MoveOperation from 'ckeditor5/engine/model/operation/moveoperation.js';
+import NoOperation from 'ckeditor5/engine/model/operation/nooperation.js';
 
-import { getNodesAndText, jsonParseStringify } from '/tests/engine/model/_utils/utils.js';
+import { getNodesAndText, jsonParseStringify } from 'tests/engine/model/_utils/utils.js';
 
 import {
 	applyDelta,
@@ -31,7 +31,7 @@ import {
 	getSplitDelta,
 	getWrapDelta,
 	getUnwrapDelta
-} from '/tests/engine/model/delta/transform/_utils/utils.js';
+} from 'tests/engine/model/delta/transform/_utils/utils.js';
 
 describe( 'transform', () => {
 	let doc, root, gy, baseVersion;

+ 10 - 10
packages/ckeditor5-engine/tests/model/delta/transform/unwrapdelta.js

@@ -5,21 +5,21 @@
 
 /* bender-tags: model, operation */
 
-import transformations from '/ckeditor5/engine/model/delta/basic-transformations.js';
+import transformations from 'ckeditor5/engine/model/delta/basic-transformations.js';
 /*jshint unused: false*/
 
-import transform from '/ckeditor5/engine/model/delta/transform.js';
+import transform from 'ckeditor5/engine/model/delta/transform.js';
 
-import Element from '/ckeditor5/engine/model/element.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Range from '/ckeditor5/engine/model/range.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Range from 'ckeditor5/engine/model/range.js';
 
-import MoveOperation from '/ckeditor5/engine/model/operation/moveoperation.js';
+import MoveOperation from 'ckeditor5/engine/model/operation/moveoperation.js';
 
-import MergeDelta from '/ckeditor5/engine/model/delta/mergedelta.js';
-import UnwrapDelta from '/ckeditor5/engine/model/delta/unwrapdelta.js';
+import MergeDelta from 'ckeditor5/engine/model/delta/mergedelta.js';
+import UnwrapDelta from 'ckeditor5/engine/model/delta/unwrapdelta.js';
 
-import { getNodesAndText, jsonParseStringify } from '/tests/engine/model/_utils/utils.js';
+import { getNodesAndText, jsonParseStringify } from 'tests/engine/model/_utils/utils.js';
 
 import {
 	applyDelta,
@@ -27,7 +27,7 @@ import {
 	getFilledDocument,
 	getSplitDelta,
 	getUnwrapDelta
-} from '/tests/engine/model/delta/transform/_utils/utils.js';
+} from 'tests/engine/model/delta/transform/_utils/utils.js';
 
 describe( 'transform', () => {
 	let doc, root, gy, baseVersion;

+ 10 - 10
packages/ckeditor5-engine/tests/model/delta/transform/weakinsertdelta.js

@@ -5,27 +5,27 @@
 
 /* bender-tags: model, operation */
 
-import transformations from '/ckeditor5/engine/model/delta/basic-transformations.js';
+import transformations from 'ckeditor5/engine/model/delta/basic-transformations.js';
 /*jshint unused: false*/
 
-import transform from '/ckeditor5/engine/model/delta/transform.js';
+import transform from 'ckeditor5/engine/model/delta/transform.js';
 
-import Text from '/ckeditor5/engine/model/text.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Range from '/ckeditor5/engine/model/range.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Range from 'ckeditor5/engine/model/range.js';
 
-import WeakInsertDelta from '/ckeditor5/engine/model/delta/weakinsertdelta.js';
-import AttributeDelta from '/ckeditor5/engine/model/delta/attributedelta.js';
+import WeakInsertDelta from 'ckeditor5/engine/model/delta/weakinsertdelta.js';
+import AttributeDelta from 'ckeditor5/engine/model/delta/attributedelta.js';
 
-import InsertOperation from '/ckeditor5/engine/model/operation/insertoperation.js';
-import AttributeOperation from '/ckeditor5/engine/model/operation/attributeoperation.js';
+import InsertOperation from 'ckeditor5/engine/model/operation/insertoperation.js';
+import AttributeOperation from 'ckeditor5/engine/model/operation/attributeoperation.js';
 
 import {
 	expectDelta,
 	getFilledDocument,
 	getAttributeDelta,
 	getWeakInsertDelta
-} from '/tests/engine/model/delta/transform/_utils/utils.js';
+} from 'tests/engine/model/delta/transform/_utils/utils.js';
 
 describe( 'transform', () => {
 	let doc, root, baseVersion;

+ 11 - 11
packages/ckeditor5-engine/tests/model/delta/transform/wrapdelta.js

@@ -5,22 +5,22 @@
 
 /* bender-tags: model, operation */
 
-import transformations from '/ckeditor5/engine/model/delta/basic-transformations.js';
+import transformations from 'ckeditor5/engine/model/delta/basic-transformations.js';
 /*jshint unused: false*/
 
-import transform from '/ckeditor5/engine/model/delta/transform.js';
+import transform from 'ckeditor5/engine/model/delta/transform.js';
 
-import Element from '/ckeditor5/engine/model/element.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Range from '/ckeditor5/engine/model/range.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Range from 'ckeditor5/engine/model/range.js';
 
-import MoveOperation from '/ckeditor5/engine/model/operation/moveoperation.js';
-import InsertOperation from '/ckeditor5/engine/model/operation/insertoperation.js';
+import MoveOperation from 'ckeditor5/engine/model/operation/moveoperation.js';
+import InsertOperation from 'ckeditor5/engine/model/operation/insertoperation.js';
 
-import MergeDelta from '/ckeditor5/engine/model/delta/mergedelta.js';
-import WrapDelta from '/ckeditor5/engine/model/delta/wrapdelta.js';
+import MergeDelta from 'ckeditor5/engine/model/delta/mergedelta.js';
+import WrapDelta from 'ckeditor5/engine/model/delta/wrapdelta.js';
 
-import { getNodesAndText, jsonParseStringify } from '/tests/engine/model/_utils/utils.js';
+import { getNodesAndText, jsonParseStringify } from 'tests/engine/model/_utils/utils.js';
 
 import {
 	applyDelta,
@@ -28,7 +28,7 @@ import {
 	getFilledDocument,
 	getSplitDelta,
 	getWrapDelta
-} from '/tests/engine/model/delta/transform/_utils/utils.js';
+} from 'tests/engine/model/delta/transform/_utils/utils.js';
 
 describe( 'transform', () => {
 	let doc, root, gy, baseVersion;

+ 11 - 11
packages/ckeditor5-engine/tests/model/delta/unwrapdelta.js

@@ -5,18 +5,18 @@
 
 /* bender-tags: model, delta */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import CKEditorError from 'ckeditor5/utils/ckeditorerror.js';
 
-import UnwrapDelta from '/ckeditor5/engine/model/delta/unwrapdelta.js';
-import WrapDelta from '/ckeditor5/engine/model/delta/wrapdelta.js';
+import UnwrapDelta from 'ckeditor5/engine/model/delta/unwrapdelta.js';
+import WrapDelta from 'ckeditor5/engine/model/delta/wrapdelta.js';
 
-import MoveOperation from '/ckeditor5/engine/model/operation/moveoperation.js';
-import RemoveOperation from '/ckeditor5/engine/model/operation/removeoperation.js';
-import ReinsertOperation from '/ckeditor5/engine/model/operation/reinsertoperation.js';
+import MoveOperation from 'ckeditor5/engine/model/operation/moveoperation.js';
+import RemoveOperation from 'ckeditor5/engine/model/operation/removeoperation.js';
+import ReinsertOperation from 'ckeditor5/engine/model/operation/reinsertoperation.js';
 
 describe( 'Batch', () => {
 	let doc, root, p;
@@ -74,7 +74,7 @@ describe( 'UnwrapDelta', () => {
 		unwrapDelta = new UnwrapDelta();
 	} );
 
-	describe( 'constructor', () => {
+	describe( 'constructor()', () => {
 		it( 'should create unwrap delta with no operations added', () => {
 			expect( unwrapDelta.operations.length ).to.equal( 0 );
 		} );

+ 4 - 4
packages/ckeditor5-engine/tests/model/delta/weakinsertdelta.js

@@ -5,10 +5,10 @@
 
 /* bender-tags: model, delta */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import WeakInsertDelta from '/ckeditor5/engine/model/delta/weakinsertdelta.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import WeakInsertDelta from 'ckeditor5/engine/model/delta/weakinsertdelta.js';
 
 describe( 'Batch', () => {
 	let doc, root, batch, chain, attrs;

+ 12 - 12
packages/ckeditor5-engine/tests/model/delta/wrapdelta.js

@@ -5,19 +5,19 @@
 
 /* bender-tags: model, delta */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Range from '/ckeditor5/engine/model/range.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Range from 'ckeditor5/engine/model/range.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import CKEditorError from 'ckeditor5/utils/ckeditorerror.js';
 
-import WrapDelta from '/ckeditor5/engine/model/delta/wrapdelta.js';
-import UnwrapDelta from '/ckeditor5/engine/model/delta/unwrapdelta.js';
+import WrapDelta from 'ckeditor5/engine/model/delta/wrapdelta.js';
+import UnwrapDelta from 'ckeditor5/engine/model/delta/unwrapdelta.js';
 
-import InsertOperation from '/ckeditor5/engine/model/operation/insertoperation.js';
-import MoveOperation from '/ckeditor5/engine/model/operation/moveoperation.js';
-import RemoveOperation from '/ckeditor5/engine/model/operation/removeoperation.js';
+import InsertOperation from 'ckeditor5/engine/model/operation/insertoperation.js';
+import MoveOperation from 'ckeditor5/engine/model/operation/moveoperation.js';
+import RemoveOperation from 'ckeditor5/engine/model/operation/removeoperation.js';
 
 describe( 'Batch', () => {
 	let doc, root, range;
@@ -108,7 +108,7 @@ describe( 'WrapDelta', () => {
 		wrapDelta = new WrapDelta();
 	} );
 
-	describe( 'constructor', () => {
+	describe( 'constructor()', () => {
 		it( 'should create wrap delta with no operations added', () => {
 			expect( wrapDelta.operations.length ).to.equal( 0 );
 		} );

+ 10 - 10
packages/ckeditor5-engine/tests/model/document/change-event.js

@@ -5,16 +5,16 @@
 
 /* bender-tags: model */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Range from '/ckeditor5/engine/model/range.js';
-import AttributeOperation from '/ckeditor5/engine/model/operation/attributeoperation.js';
-import InsertOperation from '/ckeditor5/engine/model/operation/insertoperation.js';
-import MoveOperation from '/ckeditor5/engine/model/operation/moveoperation.js';
-import RemoveOperation from '/ckeditor5/engine/model/operation/removeoperation.js';
-import { wrapInDelta } from '/tests/engine/model/_utils/utils.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Range from 'ckeditor5/engine/model/range.js';
+import AttributeOperation from 'ckeditor5/engine/model/operation/attributeoperation.js';
+import InsertOperation from 'ckeditor5/engine/model/operation/insertoperation.js';
+import MoveOperation from 'ckeditor5/engine/model/operation/moveoperation.js';
+import RemoveOperation from 'ckeditor5/engine/model/operation/removeoperation.js';
+import { wrapInDelta } from 'tests/engine/model/_utils/utils.js';
 
 describe( 'Document change event', () => {
 	let doc, root, graveyard, types, changes;

+ 11 - 19
packages/ckeditor5-engine/tests/model/document/document.js

@@ -5,16 +5,16 @@
 
 /* bender-tags: model */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import Schema from '/ckeditor5/engine/model/schema.js';
-import Composer from '/ckeditor5/engine/model/composer/composer.js';
-import RootElement from '/ckeditor5/engine/model/rootelement.js';
-import Batch from '/ckeditor5/engine/model/batch.js';
-import Delta from '/ckeditor5/engine/model/delta/delta.js';
-import Range from '/ckeditor5/engine/model/range.js';
-import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
-import count from '/ckeditor5/utils/count.js';
-import { jsonParseStringify } from '/tests/engine/model/_utils/utils.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import Schema from 'ckeditor5/engine/model/schema.js';
+import Composer from 'ckeditor5/engine/model/composer/composer.js';
+import RootElement from 'ckeditor5/engine/model/rootelement.js';
+import Batch from 'ckeditor5/engine/model/batch.js';
+import Delta from 'ckeditor5/engine/model/delta/delta.js';
+import Range from 'ckeditor5/engine/model/range.js';
+import CKEditorError from 'ckeditor5/utils/ckeditorerror.js';
+import count from 'ckeditor5/utils/count.js';
+import { jsonParseStringify } from 'tests/engine/model/_utils/utils.js';
 
 describe( 'Document', () => {
 	let doc;
@@ -23,7 +23,7 @@ describe( 'Document', () => {
 		doc = new Document();
 	} );
 
-	describe( 'constructor', () => {
+	describe( 'constructor()', () => {
 		it( 'should create Document with no data, empty graveyard and selection set to default range', () => {
 			expect( doc ).to.have.property( '_roots' ).that.is.instanceof( Map );
 			expect( doc._roots.size ).to.equal( 1 );
@@ -225,14 +225,6 @@ describe( 'Document', () => {
 	} );
 
 	describe( 'selection', () => {
-		it( 'should get updated attributes whenever selection gets updated', () => {
-			sinon.spy( doc.selection, '_updateAttributes' );
-
-			doc.selection.fire( 'change:range', { directChange: true } );
-
-			expect( doc.selection._updateAttributes.called ).to.be.true;
-		} );
-
 		it( 'should get updated attributes whenever attribute operation is applied', () => {
 			sinon.spy( doc.selection, '_updateAttributes' );
 

+ 6 - 6
packages/ckeditor5-engine/tests/model/documentfragment.js

@@ -5,14 +5,14 @@
 
 /* bender-tags: model */
 
-import Element from '/ckeditor5/engine/model/element.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import DocumentFragment from '/ckeditor5/engine/model/documentfragment.js';
-import { jsonParseStringify } from '/tests/engine/model/_utils/utils.js';
-import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import DocumentFragment from 'ckeditor5/engine/model/documentfragment.js';
+import { jsonParseStringify } from 'tests/engine/model/_utils/utils.js';
+import CKEditorError from 'ckeditor5/utils/ckeditorerror.js';
 
 describe( 'DocumentFragment', () => {
-	describe( 'constructor', () => {
+	describe( 'constructor()', () => {
 		it( 'should create empty document fragment', () => {
 			let frag = new DocumentFragment();
 

+ 7 - 7
packages/ckeditor5-engine/tests/model/element.js

@@ -5,15 +5,15 @@
 
 /* bender-tags: model */
 
-import Node from '/ckeditor5/engine/model/node.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import { jsonParseStringify } from '/tests/engine/model/_utils/utils.js';
-import count from '/ckeditor5/utils/count.js';
-import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
+import Node from 'ckeditor5/engine/model/node.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import { jsonParseStringify } from 'tests/engine/model/_utils/utils.js';
+import count from 'ckeditor5/utils/count.js';
+import CKEditorError from 'ckeditor5/utils/ckeditorerror.js';
 
 describe( 'Element', () => {
-	describe( 'constructor', () => {
+	describe( 'constructor()', () => {
 		it( 'should create empty element', () => {
 			let element = new Element( 'elem' );
 

+ 5 - 5
packages/ckeditor5-engine/tests/model/history.js

@@ -3,11 +3,11 @@
  * For licensing, see LICENSE.md.
  */
 
-import History from '/ckeditor5/engine/model/history.js';
-import Delta from '/ckeditor5/engine/model/delta/delta.js';
-import Operation from '/ckeditor5/engine/model/operation/operation.js';
+import History from 'ckeditor5/engine/model/history.js';
+import Delta from 'ckeditor5/engine/model/delta/delta.js';
+import Operation from 'ckeditor5/engine/model/operation/operation.js';
 
-import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
+import CKEditorError from 'ckeditor5/utils/ckeditorerror.js';
 
 describe( 'History', () => {
 	let history;
@@ -16,7 +16,7 @@ describe( 'History', () => {
 		history = new History();
 	} );
 
-	describe( 'constructor', () => {
+	describe( 'constructor()', () => {
 		it( 'should create an empty History instance', () => {
 			expect( Array.from( history.getDeltas() ).length ).to.equal( 0 );
 		} );

+ 50 - 16
packages/ckeditor5-engine/tests/model/liveposition.js

@@ -5,14 +5,14 @@
 
 /* bender-tags: model */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import DocumentFragment from '/ckeditor5/engine/model/documentfragment.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import LivePosition from '/ckeditor5/engine/model/liveposition.js';
-import Range from '/ckeditor5/engine/model/range.js';
-import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import DocumentFragment from 'ckeditor5/engine/model/documentfragment.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import LivePosition from 'ckeditor5/engine/model/liveposition.js';
+import Range from 'ckeditor5/engine/model/range.js';
+import CKEditorError from 'ckeditor5/utils/ckeditorerror.js';
 
 describe( 'LivePosition', () => {
 	let doc, root, ul, p, li1, li2;
@@ -89,10 +89,13 @@ describe( 'LivePosition', () => {
 	} );
 
 	describe( 'should get transformed if', () => {
-		let live;
+		let live, spy;
 
 		beforeEach( () => {
 			live = new LivePosition( root, [ 1, 4, 6 ] );
+
+			spy = sinon.spy();
+			live.on( 'change', spy );
 		} );
 
 		afterEach( () => {
@@ -106,6 +109,7 @@ describe( 'LivePosition', () => {
 				doc.fire( 'change', 'insert', { range: insertRange }, null );
 
 				expect( live.path ).to.deep.equal( [ 1, 4, 9 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 
 			it( 'is at the same position and live position is sticking to right side', () => {
@@ -114,6 +118,7 @@ describe( 'LivePosition', () => {
 				doc.fire( 'change', 'insert', { range: insertRange }, null );
 
 				expect( live.path ).to.deep.equal( [ 1, 4, 9 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 
 			it( 'is before a node from the live position path', () => {
@@ -122,6 +127,7 @@ describe( 'LivePosition', () => {
 				doc.fire( 'change', 'insert', { range: insertRange }, null );
 
 				expect( live.path ).to.deep.equal( [ 1, 6, 6 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 		} );
 
@@ -137,6 +143,7 @@ describe( 'LivePosition', () => {
 				doc.fire( 'change', 'move', changes, null );
 
 				expect( live.path ).to.deep.equal( [ 1, 4, 9 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 
 			it( 'is at the same position and live position is sticking to right side', () => {
@@ -150,6 +157,7 @@ describe( 'LivePosition', () => {
 				doc.fire( 'change', 'move', changes, null );
 
 				expect( live.path ).to.deep.equal( [ 1, 4, 9 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 
 			it( 'is at a position before a node from the live position path', () => {
@@ -163,6 +171,7 @@ describe( 'LivePosition', () => {
 				doc.fire( 'change', 'move', changes, null );
 
 				expect( live.path ).to.deep.equal( [ 1, 6, 6 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 
 			it( 'is from the same parent and closer offset', () => {
@@ -176,6 +185,7 @@ describe( 'LivePosition', () => {
 				doc.fire( 'change', 'move', changes, null );
 
 				expect( live.path ).to.deep.equal( [ 1, 4, 2 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 
 			it( 'is from a position before a node from the live position path', () => {
@@ -189,6 +199,7 @@ describe( 'LivePosition', () => {
 				doc.fire( 'change', 'move', changes, null );
 
 				expect( live.path ).to.deep.equal( [ 1, 0, 6 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 
 			it( 'contains live position (same level)', () => {
@@ -202,6 +213,7 @@ describe( 'LivePosition', () => {
 				doc.fire( 'change', 'move', changes, null );
 
 				expect( live.path ).to.deep.equal( [ 2, 2 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 
 			it( 'contains live position (deep)', () => {
@@ -215,12 +227,13 @@ describe( 'LivePosition', () => {
 				doc.fire( 'change', 'move', changes, null );
 
 				expect( live.path ).to.deep.equal( [ 2, 1, 6 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 		} );
 	} );
 
 	describe( 'should not get transformed if', () => {
-		let path, otherRoot;
+		let path, otherRoot, spy;
 
 		before( () => {
 			path = [ 1, 4, 6 ];
@@ -231,6 +244,9 @@ describe( 'LivePosition', () => {
 
 		beforeEach( () => {
 			live = new LivePosition( root, path );
+
+			spy = sinon.spy();
+			live.on( 'change', spy );
 		} );
 
 		afterEach( () => {
@@ -244,17 +260,22 @@ describe( 'LivePosition', () => {
 				doc.fire( 'change', 'insert', { range: insertRange }, null );
 
 				expect( live.path ).to.deep.equal( path );
+				expect( spy.called ).to.be.false;
 			} );
 
 			it( 'is at the same position and live position is sticking to left side', () => {
-				let live = new LivePosition( root, path, 'STICKS_TO_PREVIOUS' );
+				let newLive = new LivePosition( root, path, 'sticksToPrevious' );
+				spy = sinon.spy();
+				newLive.on( 'change', spy );
+
 				let insertRange = new Range( new Position( root, [ 1, 4, 6 ] ), new Position( root, [ 1, 4, 9 ] ) );
 
 				doc.fire( 'change', 'insert', { range: insertRange }, null );
 
-				expect( live.path ).to.deep.equal( path );
+				expect( newLive.path ).to.deep.equal( path );
+				expect( spy.called ).to.be.false;
 
-				live.detach();
+				newLive.detach();
 			} );
 
 			it( 'is after a node from the position path', () => {
@@ -263,6 +284,7 @@ describe( 'LivePosition', () => {
 				doc.fire( 'change', 'insert', { range: insertRange }, null );
 
 				expect( live.path ).to.deep.equal( path );
+				expect( spy.called ).to.be.false;
 			} );
 
 			it( 'is in different root', () => {
@@ -271,6 +293,7 @@ describe( 'LivePosition', () => {
 				doc.fire( 'change', 'insert', { range: insertRange }, null );
 
 				expect( live.path ).to.deep.equal( path );
+				expect( spy.called ).to.be.false;
 			} );
 		} );
 
@@ -286,10 +309,14 @@ describe( 'LivePosition', () => {
 				doc.fire( 'change', 'move', changes, null );
 
 				expect( live.path ).to.deep.equal( path );
+				expect( spy.called ).to.be.false;
 			} );
 
 			it( 'is at the same position and live position is sticking to left side', () => {
-				let live = new LivePosition( root, path, 'STICKS_TO_PREVIOUS' );
+				let newLive = new LivePosition( root, path, 'sticksToPrevious' );
+				spy = sinon.spy();
+				newLive.on( 'change', spy );
+
 				let moveSource = new Position( root, [ 2 ] );
 				let moveRange = new Range( new Position( root, [ 1, 4, 6 ] ), new Position( root, [ 1, 4, 9 ] ) );
 
@@ -299,9 +326,10 @@ describe( 'LivePosition', () => {
 				};
 				doc.fire( 'change', 'move', changes, null );
 
-				expect( live.path ).to.deep.equal( path );
+				expect( newLive.path ).to.deep.equal( path );
+				expect( spy.called ).to.be.false;
 
-				live.detach();
+				newLive.detach();
 			} );
 
 			it( 'is at a position after a node from the live position path', () => {
@@ -315,6 +343,7 @@ describe( 'LivePosition', () => {
 				doc.fire( 'change', 'move', changes, null );
 
 				expect( live.path ).to.deep.equal( path );
+				expect( spy.called ).to.be.false;
 			} );
 
 			it( 'is from the same parent and further offset', () => {
@@ -328,6 +357,7 @@ describe( 'LivePosition', () => {
 				doc.fire( 'change', 'move', changes, null );
 
 				expect( live.path ).to.deep.equal( path );
+				expect( spy.called ).to.be.false;
 			} );
 
 			it( 'is from a position after a node from the live position path', () => {
@@ -341,6 +371,7 @@ describe( 'LivePosition', () => {
 				doc.fire( 'change', 'move', changes, null );
 
 				expect( live.path ).to.deep.equal( path );
+				expect( spy.called ).to.be.false;
 			} );
 
 			it( 'is to different root', () => {
@@ -354,6 +385,7 @@ describe( 'LivePosition', () => {
 				doc.fire( 'change', 'move', changes, null );
 
 				expect( live.path ).to.deep.equal( path );
+				expect( spy.called ).to.be.false;
 			} );
 
 			it( 'is from different root', () => {
@@ -367,6 +399,7 @@ describe( 'LivePosition', () => {
 				doc.fire( 'change', 'move', changes, null );
 
 				expect( live.path ).to.deep.equal( path );
+				expect( spy.called ).to.be.false;
 			} );
 		} );
 
@@ -381,6 +414,7 @@ describe( 'LivePosition', () => {
 			doc.fire( 'change', 'setAttribute', changes, null );
 
 			expect( live.path ).to.deep.equal( path );
+			expect( spy.called ).to.be.false;
 		} );
 	} );
 } );

+ 62 - 24
packages/ckeditor5-engine/tests/model/liverange.js

@@ -5,12 +5,12 @@
 
 /* bender-tags: model */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import LiveRange from '/ckeditor5/engine/model/liverange.js';
-import Range from '/ckeditor5/engine/model/range.js';
-import Text from '/ckeditor5/engine/model/text.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import LiveRange from 'ckeditor5/engine/model/liverange.js';
+import Range from 'ckeditor5/engine/model/range.js';
+import Text from 'ckeditor5/engine/model/text.js';
 
 describe( 'LiveRange', () => {
 	let doc, root, ul, p;
@@ -94,10 +94,13 @@ describe( 'LiveRange', () => {
 	// structure is representing what is _after_ operation is executed. So live LiveRange properties are describing
 	// virtual tree that is not existing anymore and event ranges are operating on the tree generated above.
 	describe( 'should get transformed if', () => {
-		let live;
+		let live, spy;
 
 		beforeEach( () => {
 			live = new LiveRange( new Position( root, [ 0, 1, 4 ] ), new Position( root, [ 0, 2, 2 ] ) );
+
+			spy = sinon.spy();
+			live.on( 'change', spy );
 		} );
 
 		afterEach( () => {
@@ -112,6 +115,7 @@ describe( 'LiveRange', () => {
 
 				expect( live.start.path ).to.deep.equal( [ 0, 1, 8 ] );
 				expect( live.end.path ).to.deep.equal( [ 0, 2, 2 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 
 			it( 'is in the same parent as range end and before it', () => {
@@ -121,6 +125,7 @@ describe( 'LiveRange', () => {
 
 				expect( live.start.path ).to.deep.equal( [ 0, 1, 4 ] );
 				expect( live.end.path ).to.deep.equal( [ 0, 2, 5 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 
 			it( 'is at a position before a node from range start path', () => {
@@ -130,6 +135,7 @@ describe( 'LiveRange', () => {
 
 				expect( live.start.path ).to.deep.equal( [ 0, 3, 4 ] );
 				expect( live.end.path ).to.deep.equal( [ 0, 4, 2 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 
 			it( 'is at a position before a node from range end path', () => {
@@ -139,6 +145,7 @@ describe( 'LiveRange', () => {
 
 				expect( live.start.path ).to.deep.equal( [ 0, 1, 4 ] );
 				expect( live.end.path ).to.deep.equal( [ 0, 3, 2 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 
 			it( 'is at the live range start position and live range is collapsed', () => {
@@ -150,6 +157,7 @@ describe( 'LiveRange', () => {
 
 				expect( live.start.path ).to.deep.equal( [ 0, 1, 8 ] );
 				expect( live.end.path ).to.deep.equal( [ 0, 1, 8 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 		} );
 
@@ -166,6 +174,7 @@ describe( 'LiveRange', () => {
 
 				expect( live.start.path ).to.deep.equal( [ 0, 1, 8 ] );
 				expect( live.end.path ).to.deep.equal( [ 0, 2, 2 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 
 			it( 'is to the same parent as range end and before it', () => {
@@ -180,6 +189,7 @@ describe( 'LiveRange', () => {
 
 				expect( live.start.path ).to.deep.equal( [ 0, 1, 4 ] );
 				expect( live.end.path ).to.deep.equal( [ 0, 2, 6 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 
 			it( 'is to a position before a node from range start path', () => {
@@ -194,6 +204,7 @@ describe( 'LiveRange', () => {
 
 				expect( live.start.path ).to.deep.equal( [ 0, 3, 4 ] );
 				expect( live.end.path ).to.deep.equal( [ 0, 4, 2 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 
 			it( 'is to a position before a node from range end path', () => {
@@ -208,6 +219,7 @@ describe( 'LiveRange', () => {
 
 				expect( live.start.path ).to.deep.equal( [ 0, 1, 4 ] );
 				expect( live.end.path ).to.deep.equal( [ 0, 3, 2 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 
 			it( 'is from the same parent as range start and before it', () => {
@@ -222,6 +234,7 @@ describe( 'LiveRange', () => {
 
 				expect( live.start.path ).to.deep.equal( [ 0, 1, 1 ] );
 				expect( live.end.path ).to.deep.equal( [ 0, 2, 2 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 
 			it( 'is from the same parent as range end and before it', () => {
@@ -236,6 +249,7 @@ describe( 'LiveRange', () => {
 
 				expect( live.start.path ).to.deep.equal( [ 0, 1, 4 ] );
 				expect( live.end.path ).to.deep.equal( [ 0, 2, 0 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 
 			it( 'is from a position before a node from range start path', () => {
@@ -250,6 +264,7 @@ describe( 'LiveRange', () => {
 
 				expect( live.start.path ).to.deep.equal( [ 0, 0, 4 ] );
 				expect( live.end.path ).to.deep.equal( [ 0, 1, 2 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 
 			it( 'intersects on live range left side', () => {
@@ -264,6 +279,7 @@ describe( 'LiveRange', () => {
 
 				expect( live.start.path ).to.deep.equal( [ 0, 1, 2 ] );
 				expect( live.end.path ).to.deep.equal( [ 0, 2, 2 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 
 			it( 'intersects on live range right side', () => {
@@ -278,6 +294,7 @@ describe( 'LiveRange', () => {
 
 				expect( live.start.path ).to.deep.equal( [ 0, 1, 4 ] );
 				expect( live.end.path ).to.deep.equal( [ 0, 2, 1 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 
 			it( 'intersects on live range left side and live range new start is touching moved range end', () => {
@@ -292,6 +309,7 @@ describe( 'LiveRange', () => {
 
 				expect( live.start.path ).to.deep.equal( [ 0, 5 ] );
 				expect( live.end.path ).to.deep.equal( [ 0, 7, 2 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 
 			it( 'intersects on live range right side and live range new end is touching moved range start', () => {
@@ -308,6 +326,7 @@ describe( 'LiveRange', () => {
 
 				expect( live.start.path ).to.deep.equal( [ 0, 1, 4 ] );
 				expect( live.end.path ).to.deep.equal( [ 0, 3, 2 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 
 			it( 'is equal to live range', () => {
@@ -324,6 +343,7 @@ describe( 'LiveRange', () => {
 
 				expect( live.start.path ).to.deep.equal( [ 0, 3, 0 ] );
 				expect( live.end.path ).to.deep.equal( [ 0, 3, 3 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 
 			it( 'contains live range', () => {
@@ -340,22 +360,7 @@ describe( 'LiveRange', () => {
 
 				expect( live.start.path ).to.deep.equal( [ 0, 3, 1 ] );
 				expect( live.end.path ).to.deep.equal( [ 0, 3, 4 ] );
-			} );
-
-			it( 'is inside live range and points to live range', () => {
-				live.end.path = [ 0, 1, 12 ];
-
-				let moveSource = new Position( root, [ 0, 1, 6 ] );
-				let moveRange = new Range( new Position( root, [ 0, 1, 8 ] ), new Position( root, [ 0, 1, 10 ] ) );
-
-				let changes = {
-					range: moveRange,
-					sourcePosition: moveSource
-				};
-				doc.fire( 'change', 'move', changes, null );
-
-				expect( live.start.path ).to.deep.equal( [ 0, 1, 4 ] );
-				expect( live.end.path ).to.deep.equal( [ 0, 1, 12 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 
 			it( 'is intersecting with live range and points to live range', () => {
@@ -372,12 +377,13 @@ describe( 'LiveRange', () => {
 
 				expect( live.start.path ).to.deep.equal( [ 0, 1, 2 ] );
 				expect( live.end.path ).to.deep.equal( [ 0, 1, 12 ] );
+				expect( spy.calledOnce ).to.be.true;
 			} );
 		} );
 	} );
 
 	describe( 'should not get transformed if', () => {
-		let otherRoot;
+		let otherRoot, spy;
 
 		before( () => {
 			otherRoot = doc.createRoot( '$root', 'otherRoot' );
@@ -388,6 +394,9 @@ describe( 'LiveRange', () => {
 		beforeEach( () => {
 			live = new LiveRange( new Position( root, [ 0, 1, 4 ] ), new Position( root, [ 0, 2, 2 ] ) );
 			clone = Range.createFromRange( live );
+
+			spy = sinon.spy();
+			live.on( 'change', spy );
 		} );
 
 		afterEach( () => {
@@ -401,6 +410,7 @@ describe( 'LiveRange', () => {
 				doc.fire( 'change', 'insert', { range: insertRange }, null );
 
 				expect( live.isEqual( clone ) ).to.be.true;
+				expect( spy.called ).to.be.false;
 			} );
 
 			it( 'is in the same parent as range end and after it', () => {
@@ -409,6 +419,7 @@ describe( 'LiveRange', () => {
 				doc.fire( 'change', 'insert', { range: insertRange }, null );
 
 				expect( live.isEqual( clone ) ).to.be.true;
+				expect( spy.called ).to.be.false;
 			} );
 
 			it( 'is to a position after a node from range end path', () => {
@@ -417,6 +428,7 @@ describe( 'LiveRange', () => {
 				doc.fire( 'change', 'insert', { range: insertRange }, null );
 
 				expect( live.isEqual( clone ) ).to.be.true;
+				expect( spy.called ).to.be.false;
 			} );
 
 			it( 'is in different root', () => {
@@ -425,6 +437,7 @@ describe( 'LiveRange', () => {
 				doc.fire( 'change', 'insert', { range: insertRange }, null );
 
 				expect( live.isEqual( clone ) ).to.be.true;
+				expect( spy.called ).to.be.false;
 			} );
 		} );
 
@@ -440,6 +453,7 @@ describe( 'LiveRange', () => {
 				doc.fire( 'change', 'move', changes, null );
 
 				expect( live.isEqual( clone ) ).to.be.true;
+				expect( spy.called ).to.be.false;
 			} );
 
 			it( 'is to the same parent as range end and after it', () => {
@@ -453,6 +467,7 @@ describe( 'LiveRange', () => {
 				doc.fire( 'change', 'move', changes, null );
 
 				expect( live.isEqual( clone ) ).to.be.true;
+				expect( spy.called ).to.be.false;
 			} );
 
 			it( 'is to a position after a node from range end path', () => {
@@ -466,6 +481,7 @@ describe( 'LiveRange', () => {
 				doc.fire( 'change', 'move', changes, null );
 
 				expect( live.isEqual( clone ) ).to.be.true;
+				expect( spy.called ).to.be.false;
 			} );
 
 			it( 'is from the same parent as range start and after it', () => {
@@ -479,6 +495,7 @@ describe( 'LiveRange', () => {
 				doc.fire( 'change', 'move', changes, null );
 
 				expect( live.isEqual( clone ) ).to.be.true;
+				expect( spy.called ).to.be.false;
 			} );
 
 			it( 'is from the same parent as range end and after it', () => {
@@ -492,6 +509,7 @@ describe( 'LiveRange', () => {
 				doc.fire( 'change', 'move', changes, null );
 
 				expect( live.isEqual( clone ) ).to.be.true;
+				expect( spy.called ).to.be.false;
 			} );
 
 			it( 'is from a position after a node from range end path', () => {
@@ -505,6 +523,7 @@ describe( 'LiveRange', () => {
 				doc.fire( 'change', 'move', changes, null );
 
 				expect( live.isEqual( clone ) ).to.be.true;
+				expect( spy.called ).to.be.false;
 			} );
 
 			it( 'is to different root', () => {
@@ -518,6 +537,7 @@ describe( 'LiveRange', () => {
 				doc.fire( 'change', 'move', changes, null );
 
 				expect( live.isEqual( clone ) ).to.be.true;
+				expect( spy.called ).to.be.false;
 			} );
 
 			it( 'is from different root', () => {
@@ -531,6 +551,24 @@ describe( 'LiveRange', () => {
 				doc.fire( 'change', 'move', changes, null );
 
 				expect( live.isEqual( clone ) ).to.be.true;
+				expect( spy.called ).to.be.false;
+			} );
+
+			it( 'is inside live range and points to live range', () => {
+				live.end.path = [ 0, 1, 12 ];
+
+				let moveSource = new Position( root, [ 0, 1, 6 ] );
+				let moveRange = new Range( new Position( root, [ 0, 1, 8 ] ), new Position( root, [ 0, 1, 10 ] ) );
+
+				let changes = {
+					range: moveRange,
+					sourcePosition: moveSource
+				};
+				doc.fire( 'change', 'move', changes, null );
+
+				expect( live.start.path ).to.deep.equal( [ 0, 1, 4 ] );
+				expect( live.end.path ).to.deep.equal( [ 0, 1, 12 ] );
+				expect( spy.calledOnce ).to.be.false;
 			} );
 		} );
 	} );

+ 91 - 17
packages/ckeditor5-engine/tests/model/liveselection.js

@@ -5,20 +5,21 @@
 
 /* bender-tags: model */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import Range from '/ckeditor5/engine/model/range.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import LiveRange from '/ckeditor5/engine/model/liverange.js';
-import LiveSelection from '/ckeditor5/engine/model/liveselection.js';
-import InsertOperation from '/ckeditor5/engine/model/operation/insertoperation.js';
-import MoveOperation from '/ckeditor5/engine/model/operation/moveoperation.js';
-import AttributeOperation from '/ckeditor5/engine/model/operation/attributeoperation.js';
-import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
-import count from '/ckeditor5/utils/count.js';
-import testUtils from '/tests/core/_utils/utils.js';
-import { wrapInDelta } from '/tests/engine/model/_utils/utils.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import Range from 'ckeditor5/engine/model/range.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import LiveRange from 'ckeditor5/engine/model/liverange.js';
+import LiveSelection from 'ckeditor5/engine/model/liveselection.js';
+import InsertOperation from 'ckeditor5/engine/model/operation/insertoperation.js';
+import MoveOperation from 'ckeditor5/engine/model/operation/moveoperation.js';
+import RemoveOperation from 'ckeditor5/engine/model/operation/removeoperation.js';
+import AttributeOperation from 'ckeditor5/engine/model/operation/attributeoperation.js';
+import CKEditorError from 'ckeditor5/utils/ckeditorerror.js';
+import count from 'ckeditor5/utils/count.js';
+import testUtils from 'tests/core/_utils/utils.js';
+import { wrapInDelta } from 'tests/engine/model/_utils/utils.js';
 
 testUtils.createSinonSandbox();
 
@@ -125,9 +126,7 @@ describe( 'LiveSelection', () => {
 		it( 'should convert added Range to LiveRange', () => {
 			selection.addRange( range );
 
-			const ranges = selection._ranges;
-
-			expect( ranges[ 0 ] ).to.be.instanceof( LiveRange );
+			expect( selection._ranges[ 0 ] ).to.be.instanceof( LiveRange );
 		} );
 
 		it( 'should throw an error when range is invalid', () => {
@@ -135,6 +134,20 @@ describe( 'LiveSelection', () => {
 				selection.addRange( { invalid: 'range' } );
 			} ).to.throw( CKEditorError, /model-selection-added-not-range/ );
 		} );
+
+		it( 'should not add a range that is in graveyard', () => {
+			selection.addRange( Range.createIn( doc.graveyard ) );
+
+			expect( selection._ranges.length ).to.equal( 0 );
+		} );
+
+		it( 'should refresh attributes', () => {
+			const spy = sinon.spy( selection, '_updateAttributes' );
+
+			selection.addRange( range );
+
+			expect( spy.called ).to.be.true;
+		} );
 	} );
 
 	describe( 'collapse', () => {
@@ -227,6 +240,14 @@ describe( 'LiveSelection', () => {
 			expect( ranges[ 0 ].detach.called ).to.be.true;
 			expect( ranges[ 1 ].detach.called ).to.be.true;
 		} );
+
+		it( 'should refresh attributes', () => {
+			const spy = sinon.spy( selection, '_updateAttributes' );
+
+			selection.removeAllRanges();
+
+			expect( spy.called ).to.be.true;
+		} );
 	} );
 
 	describe( 'setRanges', () => {
@@ -250,6 +271,14 @@ describe( 'LiveSelection', () => {
 			expect( oldRanges[ 0 ].detach.called ).to.be.true;
 			expect( oldRanges[ 1 ].detach.called ).to.be.true;
 		} );
+
+		it( 'should refresh attributes', () => {
+			const spy = sinon.spy( selection, '_updateAttributes' );
+
+			selection.setRanges( [ range ] );
+
+			expect( spy.called ).to.be.true;
+		} );
 	} );
 
 	describe( 'getFirstRange', () => {
@@ -284,6 +313,7 @@ describe( 'LiveSelection', () => {
 		let spyRange;
 
 		beforeEach( () => {
+			root.removeChildren( 0, root.childCount );
 			root.insertChildren( 0, [
 				new Element( 'ul', [], new Text( 'abcdef' ) ),
 				new Element( 'p', [], new Text( 'foobar' ) ),
@@ -518,6 +548,50 @@ describe( 'LiveSelection', () => {
 				expect( spyAttribute.called ).to.be.false;
 			} );
 		} );
+
+		describe( 'RemoveOperation', () => {
+			it( 'fix selection range if it ends up in graveyard #1', () => {
+				selection.collapse( new Position( root, [ 1, 3 ] ) );
+
+				doc.applyOperation( wrapInDelta(
+					new RemoveOperation(
+						new Position( root, [ 1, 2 ] ),
+						2,
+						doc.version
+					)
+				) );
+
+				expect( selection.getFirstPosition().path ).to.deep.equal( [ 1, 2 ] );
+			} );
+
+			it( 'fix selection range if it ends up in graveyard #2', () => {
+				selection.setRanges( [ new Range( new Position( root, [ 1, 2 ] ), new Position( root, [ 1, 4 ] ) ) ] );
+
+				doc.applyOperation( wrapInDelta(
+					new RemoveOperation(
+						new Position( root, [ 1, 2 ] ),
+						2,
+						doc.version
+					)
+				) );
+
+				expect( selection.getFirstPosition().path ).to.deep.equal( [ 1, 2 ] );
+			} );
+
+			it( 'fix selection range if it ends up in graveyard #3', () => {
+				selection.setRanges( [ new Range( new Position( root, [ 1, 2 ] ), new Position( root, [ 1, 4 ] ) ) ] );
+
+				doc.applyOperation( wrapInDelta(
+					new RemoveOperation(
+						new Position( root, [ 0 ] ),
+						3,
+						doc.version
+					)
+				) );
+
+				expect( selection.getFirstPosition().path ).to.deep.equal( [ 0 ] );
+			} );
+		} );
 	} );
 
 	describe( 'attributes interface', () => {

+ 8 - 8
packages/ckeditor5-engine/tests/model/node.js

@@ -5,13 +5,13 @@
 
 /* bender-tags: model */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import DocumentFragment from '/ckeditor5/engine/model/documentfragment.js';
-import Node from '/ckeditor5/engine/model/node.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
-import count from '/ckeditor5/utils/count.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import DocumentFragment from 'ckeditor5/engine/model/documentfragment.js';
+import Node from 'ckeditor5/engine/model/node.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import CKEditorError from 'ckeditor5/utils/ckeditorerror.js';
+import count from 'ckeditor5/utils/count.js';
 
 describe( 'Node', () => {
 	let doc, root, node;
@@ -96,7 +96,7 @@ describe( 'Node', () => {
 		} );
 	} );
 
-	describe( 'constructor', () => {
+	describe( 'constructor()', () => {
 		it( 'should create empty attribute list if no parameters were passed', () => {
 			expect( count( node.getAttributes() ) ).to.equal( 0 );
 		} );

+ 6 - 6
packages/ckeditor5-engine/tests/model/nodelist.js

@@ -5,11 +5,11 @@
 
 /* bender-tags: model */
 
-import NodeList from '/ckeditor5/engine/model/nodelist.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import { jsonParseStringify } from '/tests/engine/model/_utils/utils.js';
-import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
+import NodeList from 'ckeditor5/engine/model/nodelist.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import { jsonParseStringify } from 'tests/engine/model/_utils/utils.js';
+import CKEditorError from 'ckeditor5/utils/ckeditorerror.js';
 
 describe( 'NodeList', () => {
 	let nodes, p, foo, img;
@@ -21,7 +21,7 @@ describe( 'NodeList', () => {
 		nodes = new NodeList( [ p, foo, img ] );
 	} );
 
-	describe( 'constructor', () => {
+	describe( 'constructor()', () => {
 		it( 'should create empty node list', () => {
 			expect( new NodeList().length ).to.equal( 0 );
 		} );

+ 9 - 9
packages/ckeditor5-engine/tests/model/operation/attributeoperation.js

@@ -5,15 +5,15 @@
 
 /* bender-tags: model, operation */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import AttributeOperation from '/ckeditor5/engine/model/operation/attributeoperation.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Range from '/ckeditor5/engine/model/range.js';
-import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
-import count from '/ckeditor5/utils/count.js';
-import { jsonParseStringify, wrapInDelta } from '/tests/engine/model/_utils/utils.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import AttributeOperation from 'ckeditor5/engine/model/operation/attributeoperation.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Range from 'ckeditor5/engine/model/range.js';
+import CKEditorError from 'ckeditor5/utils/ckeditorerror.js';
+import count from 'ckeditor5/utils/count.js';
+import { jsonParseStringify, wrapInDelta } from 'tests/engine/model/_utils/utils.js';
 
 describe( 'AttributeOperation', () => {
 	let doc, root;

+ 8 - 8
packages/ckeditor5-engine/tests/model/operation/insertoperation.js

@@ -5,14 +5,14 @@
 
 /* bender-tags: model, operation */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import NodeList from '/ckeditor5/engine/model/nodelist.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import InsertOperation from '/ckeditor5/engine/model/operation/insertoperation.js';
-import RemoveOperation from '/ckeditor5/engine/model/operation/removeoperation.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import { jsonParseStringify, wrapInDelta } from '/tests/engine/model/_utils/utils.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import NodeList from 'ckeditor5/engine/model/nodelist.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import InsertOperation from 'ckeditor5/engine/model/operation/insertoperation.js';
+import RemoveOperation from 'ckeditor5/engine/model/operation/removeoperation.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import { jsonParseStringify, wrapInDelta } from 'tests/engine/model/_utils/utils.js';
 
 describe( 'InsertOperation', () => {
 	let doc, root;

+ 7 - 7
packages/ckeditor5-engine/tests/model/operation/moveoperation.js

@@ -5,13 +5,13 @@
 
 /* bender-tags: model, operation */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import MoveOperation from '/ckeditor5/engine/model/operation/moveoperation.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
-import { jsonParseStringify, wrapInDelta } from '/tests/engine/model/_utils/utils.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import MoveOperation from 'ckeditor5/engine/model/operation/moveoperation.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import CKEditorError from 'ckeditor5/utils/ckeditorerror.js';
+import { jsonParseStringify, wrapInDelta } from 'tests/engine/model/_utils/utils.js';
 
 describe( 'MoveOperation', () => {
 	let doc, root;

+ 3 - 3
packages/ckeditor5-engine/tests/model/operation/nooperation.js

@@ -5,9 +5,9 @@
 
 /* bender-tags: model, operation */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import NoOperation from '/ckeditor5/engine/model/operation/nooperation.js';
-import { jsonParseStringify, wrapInDelta } from '/tests/engine/model/_utils/utils.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import NoOperation from 'ckeditor5/engine/model/operation/nooperation.js';
+import { jsonParseStringify, wrapInDelta } from 'tests/engine/model/_utils/utils.js';
 
 describe( 'NoOperation', () => {
 	let noop, doc, root;

+ 3 - 3
packages/ckeditor5-engine/tests/model/operation/operation.js

@@ -5,9 +5,9 @@
 
 /* bender-tags: model, delta */
 
-import Delta from '/ckeditor5/engine/model/delta/delta.js';
-import Operation from '/ckeditor5/engine/model/operation/operation.js';
-import { jsonParseStringify } from '/tests/engine/model/_utils/utils.js';
+import Delta from 'ckeditor5/engine/model/delta/delta.js';
+import Operation from 'ckeditor5/engine/model/operation/operation.js';
+import { jsonParseStringify } from 'tests/engine/model/_utils/utils.js';
 
 describe( 'Operation', () => {
 	it( 'should save its base version', () => {

+ 8 - 8
packages/ckeditor5-engine/tests/model/operation/reinsertoperation.js

@@ -5,14 +5,14 @@
 
 /* bender-tags: model, operation */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import ReinsertOperation from '/ckeditor5/engine/model/operation/reinsertoperation.js';
-import RemoveOperation from '/ckeditor5/engine/model/operation/removeoperation.js';
-import MoveOperation from '/ckeditor5/engine/model/operation/moveoperation.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import { jsonParseStringify, wrapInDelta } from '/tests/engine/model/_utils/utils.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import ReinsertOperation from 'ckeditor5/engine/model/operation/reinsertoperation.js';
+import RemoveOperation from 'ckeditor5/engine/model/operation/removeoperation.js';
+import MoveOperation from 'ckeditor5/engine/model/operation/moveoperation.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import { jsonParseStringify, wrapInDelta } from 'tests/engine/model/_utils/utils.js';
 
 describe( 'ReinsertOperation', () => {
 	let doc, root, graveyard, operation, graveyardPosition, rootPosition;

+ 8 - 8
packages/ckeditor5-engine/tests/model/operation/removeoperation.js

@@ -5,14 +5,14 @@
 
 /* bender-tags: model, operation */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import ReinsertOperation from '/ckeditor5/engine/model/operation/reinsertoperation.js';
-import RemoveOperation from '/ckeditor5/engine/model/operation/removeoperation.js';
-import MoveOperation from '/ckeditor5/engine/model/operation/moveoperation.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import Delta from '/ckeditor5/engine/model/delta/delta.js';
-import { jsonParseStringify, wrapInDelta } from '/tests/engine/model/_utils/utils.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import ReinsertOperation from 'ckeditor5/engine/model/operation/reinsertoperation.js';
+import RemoveOperation from 'ckeditor5/engine/model/operation/removeoperation.js';
+import MoveOperation from 'ckeditor5/engine/model/operation/moveoperation.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import Delta from 'ckeditor5/engine/model/delta/delta.js';
+import { jsonParseStringify, wrapInDelta } from 'tests/engine/model/_utils/utils.js';
 
 describe( 'RemoveOperation', () => {
 	let doc, root, graveyard;

+ 6 - 6
packages/ckeditor5-engine/tests/model/operation/renameoperation.js

@@ -5,12 +5,12 @@
 
 /* bender-tags: model, operation */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import RenameOperation from '/ckeditor5/engine/model/operation/renameoperation.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
-import { jsonParseStringify, wrapInDelta } from '/tests/engine/model/_utils/utils.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import RenameOperation from 'ckeditor5/engine/model/operation/renameoperation.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import CKEditorError from 'ckeditor5/utils/ckeditorerror.js';
+import { jsonParseStringify, wrapInDelta } from 'tests/engine/model/_utils/utils.js';
 
 describe( 'RenameOperation', () => {
 	const oldName = 'oldName';

+ 4 - 4
packages/ckeditor5-engine/tests/model/operation/rootattributeoperation.js

@@ -5,10 +5,10 @@
 
 /* bender-tags: model, operation */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import RootAttributeOperation from '/ckeditor5/engine/model/operation/rootattributeoperation.js';
-import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
-import { jsonParseStringify, wrapInDelta } from '/tests/engine/model/_utils/utils.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import RootAttributeOperation from 'ckeditor5/engine/model/operation/rootattributeoperation.js';
+import CKEditorError from 'ckeditor5/utils/ckeditorerror.js';
+import { jsonParseStringify, wrapInDelta } from 'tests/engine/model/_utils/utils.js';
 
 describe( 'RootAttributeOperation', () => {
 	let doc, root;

+ 15 - 15
packages/ckeditor5-engine/tests/model/operation/transform.js

@@ -5,21 +5,21 @@
 
 /* bender-tags: model, operation */
 
-import transform from '/ckeditor5/engine/model/operation/transform.js';
-
-import Document from '/ckeditor5/engine/model/document.js';
-import RootElement from '/ckeditor5/engine/model/rootelement.js';
-import Node from '/ckeditor5/engine/model/node.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Range from '/ckeditor5/engine/model/range.js';
-
-import InsertOperation from '/ckeditor5/engine/model/operation/insertoperation.js';
-import AttributeOperation from '/ckeditor5/engine/model/operation/attributeoperation.js';
-import RootAttributeOperation from '/ckeditor5/engine/model/operation/rootattributeoperation.js';
-import MoveOperation from '/ckeditor5/engine/model/operation/moveoperation.js';
-import RemoveOperation from '/ckeditor5/engine/model/operation/removeoperation.js';
-import RenameOperation from '/ckeditor5/engine/model/operation/renameoperation.js';
-import NoOperation from '/ckeditor5/engine/model/operation/nooperation.js';
+import transform from 'ckeditor5/engine/model/operation/transform.js';
+
+import Document from 'ckeditor5/engine/model/document.js';
+import RootElement from 'ckeditor5/engine/model/rootelement.js';
+import Node from 'ckeditor5/engine/model/node.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Range from 'ckeditor5/engine/model/range.js';
+
+import InsertOperation from 'ckeditor5/engine/model/operation/insertoperation.js';
+import AttributeOperation from 'ckeditor5/engine/model/operation/attributeoperation.js';
+import RootAttributeOperation from 'ckeditor5/engine/model/operation/rootattributeoperation.js';
+import MoveOperation from 'ckeditor5/engine/model/operation/moveoperation.js';
+import RemoveOperation from 'ckeditor5/engine/model/operation/removeoperation.js';
+import RenameOperation from 'ckeditor5/engine/model/operation/renameoperation.js';
+import NoOperation from 'ckeditor5/engine/model/operation/nooperation.js';
 
 describe( 'transform', () => {
 	let doc, root, op, nodeA, nodeB, expected, baseVersion;

+ 10 - 10
packages/ckeditor5-engine/tests/model/position.js

@@ -5,15 +5,15 @@
 
 /* bender-tags: model */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import DocumentFragment from '/ckeditor5/engine/model/documentfragment.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import TextProxy from '/ckeditor5/engine/model/textproxy.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
-import testUtils from '/tests/core/_utils/utils.js';
-import { jsonParseStringify } from '/tests/engine/model/_utils/utils.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import DocumentFragment from 'ckeditor5/engine/model/documentfragment.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import TextProxy from 'ckeditor5/engine/model/textproxy.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import CKEditorError from 'ckeditor5/utils/ckeditorerror.js';
+import testUtils from 'tests/core/_utils/utils.js';
+import { jsonParseStringify } from 'tests/engine/model/_utils/utils.js';
 
 testUtils.createSinonSandbox();
 
@@ -60,7 +60,7 @@ describe( 'position', () => {
 		root.insertChildren( 0, [ p, ul ] );
 	} );
 
-	describe( 'constructor', () => {
+	describe( 'constructor()', () => {
 		it( 'should create a position with path and document', () => {
 			let position = new Position( root, [ 0 ] );
 

+ 8 - 8
packages/ckeditor5-engine/tests/model/range.js

@@ -5,13 +5,13 @@
 
 /* bender-tags: model */
 
-import Range from '/ckeditor5/engine/model/range.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import Document from '/ckeditor5/engine/model/document.js';
-import TreeWalker from '/ckeditor5/engine/model/treewalker.js';
-import { jsonParseStringify } from '/tests/engine/model/_utils/utils.js';
+import Range from 'ckeditor5/engine/model/range.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import TreeWalker from 'ckeditor5/engine/model/treewalker.js';
+import { jsonParseStringify } from 'tests/engine/model/_utils/utils.js';
 
 describe( 'Range', () => {
 	let doc, range, start, end, root, otherRoot;
@@ -27,7 +27,7 @@ describe( 'Range', () => {
 		range = new Range( start, end );
 	} );
 
-	describe( 'constructor', () => {
+	describe( 'constructor()', () => {
 		it( 'should create a range with given positions', () => {
 			expect( range.start.isEqual( start ) ).to.be.true;
 			expect( range.end.isEqual( end ) ).to.be.true;

+ 5 - 5
packages/ckeditor5-engine/tests/model/rootelement.js

@@ -5,13 +5,13 @@
 
 /* bender-tags: model */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import RootElement from '/ckeditor5/engine/model/rootelement.js';
-import count from '/ckeditor5/utils/count.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import RootElement from 'ckeditor5/engine/model/rootelement.js';
+import count from 'ckeditor5/utils/count.js';
 
 describe( 'Element', () => {
-	describe( 'constructor', () => {
+	describe( 'constructor()', () => {
 		it( 'should create root element without attributes', () => {
 			let doc = new Document();
 			let root = new RootElement( doc );

+ 8 - 8
packages/ckeditor5-engine/tests/model/schema/schema.js

@@ -5,13 +5,13 @@
 
 /* bender-tags: model */
 
-import Schema from '/ckeditor5/engine/model/schema.js';
-import { SchemaItem as SchemaItem } from '/ckeditor5/engine/model/schema.js';
-import Document from '/ckeditor5/engine/model/document.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
-import testUtils from '/tests/core/_utils/utils.js';
+import Schema from 'ckeditor5/engine/model/schema.js';
+import { SchemaItem as SchemaItem } from 'ckeditor5/engine/model/schema.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import CKEditorError from 'ckeditor5/utils/ckeditorerror.js';
+import testUtils from 'tests/core/_utils/utils.js';
 
 testUtils.createSinonSandbox();
 
@@ -21,7 +21,7 @@ beforeEach( () => {
 	schema = new Schema();
 } );
 
-describe( 'constructor', () => {
+describe( 'constructor()', () => {
 	it( 'should register base items: inline, block, root', () => {
 		testUtils.sinon.spy( Schema.prototype, 'registerItem' );
 

+ 3 - 3
packages/ckeditor5-engine/tests/model/schema/schemaitem.js

@@ -5,8 +5,8 @@
 
 /* bender-tags: model */
 
-import Schema from '/ckeditor5/engine/model/schema.js';
-import { SchemaItem as SchemaItem } from '/ckeditor5/engine/model/schema.js';
+import Schema from 'ckeditor5/engine/model/schema.js';
+import { SchemaItem as SchemaItem } from 'ckeditor5/engine/model/schema.js';
 
 let schema, item;
 
@@ -23,7 +23,7 @@ beforeEach( () => {
 	item = new SchemaItem( schema );
 } );
 
-describe( 'constructor', () => {
+describe( 'constructor()', () => {
 	it( 'should create empty schema item', () => {
 		let item = new SchemaItem( schema );
 

+ 10 - 10
packages/ckeditor5-engine/tests/model/selection.js

@@ -5,16 +5,16 @@
 
 /* bender-tags: model */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import Range from '/ckeditor5/engine/model/range.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import LiveRange from '/ckeditor5/engine/model/liverange.js';
-import Selection from '/ckeditor5/engine/model/selection.js';
-import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
-import testUtils from '/tests/core/_utils/utils.js';
-import count from '/ckeditor5/utils/count.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import Range from 'ckeditor5/engine/model/range.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import LiveRange from 'ckeditor5/engine/model/liverange.js';
+import Selection from 'ckeditor5/engine/model/selection.js';
+import CKEditorError from 'ckeditor5/utils/ckeditorerror.js';
+import testUtils from 'tests/core/_utils/utils.js';
+import count from 'ckeditor5/utils/count.js';
 
 testUtils.createSinonSandbox();
 

+ 4 - 4
packages/ckeditor5-engine/tests/model/text.js

@@ -5,12 +5,12 @@
 
 /* bender-tags: model */
 
-import Text from '/ckeditor5/engine/model/text.js';
-import Node from '/ckeditor5/engine/model/node.js';
-import { jsonParseStringify } from '/tests/engine/model/_utils/utils.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import Node from 'ckeditor5/engine/model/node.js';
+import { jsonParseStringify } from 'tests/engine/model/_utils/utils.js';
 
 describe( 'Text', () => {
-	describe( 'constructor', () => {
+	describe( 'constructor()', () => {
 		it( 'should create text node without attributes', () => {
 			let text = new Text( 'bar', { bold: true } );
 

+ 5 - 5
packages/ckeditor5-engine/tests/model/textproxy.js

@@ -5,11 +5,11 @@
 
 /* bender-tags: model */
 
-import Element from '/ckeditor5/engine/model/element.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import TextProxy from '/ckeditor5/engine/model/textproxy.js';
-import Document from '/ckeditor5/engine/model/document.js';
-import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import TextProxy from 'ckeditor5/engine/model/textproxy.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import CKEditorError from 'ckeditor5/utils/ckeditorerror.js';
 
 describe( 'TextProxy', () => {
 	let doc, element, textProxy, root, textProxyNoParent, text, textNoParent;

+ 8 - 8
packages/ckeditor5-engine/tests/model/treewalker.js

@@ -5,13 +5,13 @@
 
 /* bender-tags: model */
 
-import Document from '/ckeditor5/engine/model/document.js';
-import Element from '/ckeditor5/engine/model/element.js';
-import Text from '/ckeditor5/engine/model/text.js';
-import TreeWalker from '/ckeditor5/engine/model/treewalker.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Range from '/ckeditor5/engine/model/range.js';
-import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
+import Document from 'ckeditor5/engine/model/document.js';
+import Element from 'ckeditor5/engine/model/element.js';
+import Text from 'ckeditor5/engine/model/text.js';
+import TreeWalker from 'ckeditor5/engine/model/treewalker.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Range from 'ckeditor5/engine/model/range.js';
+import CKEditorError from 'ckeditor5/utils/ckeditorerror.js';
 
 describe( 'TreeWalker', () => {
 	let doc, root, img1, paragraph, ba, r, img2, x;
@@ -46,7 +46,7 @@ describe( 'TreeWalker', () => {
 		rootEnding = new Position( root, [ 2 ] );
 	} );
 
-	describe( 'constructor', () => {
+	describe( 'constructor()', () => {
 		it( 'should throw if neither boundaries nor starting position is set', () => {
 			expect( () => {
 				new TreeWalker();

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor