|
|
@@ -8,21 +8,24 @@
|
|
|
'use strict';
|
|
|
|
|
|
import Document from '/ckeditor5/core/treemodel/document.js';
|
|
|
+import Attribute from '/ckeditor5/core/treemodel/attribute.js';
|
|
|
import Element from '/ckeditor5/core/treemodel/element.js';
|
|
|
import Character from '/ckeditor5/core/treemodel/character.js';
|
|
|
+import Text from '/ckeditor5/core/treemodel/text.js';
|
|
|
import PositionIterator from '/ckeditor5/core/treemodel/positioniterator.js';
|
|
|
import Position from '/ckeditor5/core/treemodel/position.js';
|
|
|
import Range from '/ckeditor5/core/treemodel/range.js';
|
|
|
|
|
|
describe( 'range iterator', () => {
|
|
|
- let ELEMENT_ENTER, ELEMENT_LEAVE, CHARACTER;
|
|
|
+ let ELEMENT_ENTER, ELEMENT_LEAVE, CHARACTER, TEXT;
|
|
|
|
|
|
- let doc, expectedItems, root, img1, paragraph, b, a, r, img2, x;
|
|
|
+ let doc, expectedItems, expectedItemsMerged, root, img1, paragraph, b, a, r, img2, x;
|
|
|
|
|
|
before( () => {
|
|
|
ELEMENT_ENTER = PositionIterator.ELEMENT_ENTER;
|
|
|
ELEMENT_LEAVE = PositionIterator.ELEMENT_LEAVE;
|
|
|
CHARACTER = PositionIterator.CHARACTER;
|
|
|
+ TEXT = PositionIterator.TEXT;
|
|
|
|
|
|
doc = new Document();
|
|
|
root = doc.createRoot( 'root' );
|
|
|
@@ -38,8 +41,10 @@ describe( 'range iterator', () => {
|
|
|
// |
|
|
|
// |- X
|
|
|
|
|
|
- b = new Character( 'b' );
|
|
|
- a = new Character( 'a' );
|
|
|
+ let attrBoldTrue = new Attribute( 'bold', true );
|
|
|
+
|
|
|
+ b = new Character( 'b', [ attrBoldTrue ] );
|
|
|
+ a = new Character( 'a', [ attrBoldTrue ] );
|
|
|
r = new Character( 'r' );
|
|
|
img2 = new Element( 'img2' );
|
|
|
x = new Character( 'x' );
|
|
|
@@ -61,6 +66,18 @@ describe( 'range iterator', () => {
|
|
|
{ type: CHARACTER, node: x },
|
|
|
{ type: ELEMENT_LEAVE, node: paragraph }
|
|
|
];
|
|
|
+
|
|
|
+ expectedItemsMerged = [
|
|
|
+ { type: ELEMENT_ENTER, node: img1 },
|
|
|
+ { type: ELEMENT_LEAVE, node: img1 },
|
|
|
+ { type: ELEMENT_ENTER, node: paragraph },
|
|
|
+ { type: TEXT, node: new Text( 'ba', [ attrBoldTrue ] ) },
|
|
|
+ { type: TEXT, node: new Text( 'r' ) },
|
|
|
+ { type: ELEMENT_ENTER, node: img2 },
|
|
|
+ { type: ELEMENT_LEAVE, node: img2 },
|
|
|
+ { type: TEXT, node: new Text( 'x' ) },
|
|
|
+ { type: ELEMENT_LEAVE, node: paragraph }
|
|
|
+ ];
|
|
|
} );
|
|
|
|
|
|
it( 'should return next position', () => {
|
|
|
@@ -111,17 +128,34 @@ describe( 'range iterator', () => {
|
|
|
} );
|
|
|
|
|
|
it( 'should return iterate over the range', () => {
|
|
|
- let start = new Position( root, [ 0 ] ); // begging of root
|
|
|
+ let start = new Position( root, [ 0 ] ); // beginning of root
|
|
|
let end = new Position( root, [ 2 ] ); // ending of root
|
|
|
let range = new Range( start, end );
|
|
|
|
|
|
let i = 0;
|
|
|
- let value;
|
|
|
|
|
|
- for ( value of range ) {
|
|
|
+ for ( let value of range ) {
|
|
|
expect( value ).to.deep.equal( expectedItems[ i ] );
|
|
|
i++;
|
|
|
}
|
|
|
expect( i ).to.equal( expectedItems.length );
|
|
|
} );
|
|
|
+
|
|
|
+ it( 'should merge characters when iterating over the range', () => {
|
|
|
+ let start = new Position( root, [ 0 ] ); // beginning of root
|
|
|
+ let end = new Position( root, [ 2 ] ); // ending of root
|
|
|
+ let range = new Range( start, end );
|
|
|
+
|
|
|
+ let iterator = new PositionIterator( range, range.start, true );
|
|
|
+ let step = iterator.next();
|
|
|
+ let i = 0;
|
|
|
+
|
|
|
+ while ( !step.done ) {
|
|
|
+ expect( step.value ).to.deep.equal( expectedItemsMerged[ i ] );
|
|
|
+ step = iterator.next();
|
|
|
+ i++;
|
|
|
+ }
|
|
|
+
|
|
|
+ expect( i ).to.equal( expectedItemsMerged.length );
|
|
|
+ } );
|
|
|
} );
|