Procházet zdrojové kódy

Range tests and bug fixes.

Piotr Jasiun před 10 roky
rodič
revize
f7f6f7ec2e

+ 1 - 1
packages/ckeditor5-engine/src/document/range.js

@@ -35,7 +35,7 @@ CKEDITOR.define( [ 'document/rangeiterator' ], function( RangeIterator ) {
 		}
 
 		equals( otherRange ) {
-			return this.start === otherRange.start && this.end === otherRange.end;
+			return this.start.equals( otherRange.start ) && this.end.equals( otherRange.end );
 		}
 
 		[ Symbol.iterator ]() {

+ 6 - 6
packages/ckeditor5-engine/src/document/rangeiterator.js

@@ -39,7 +39,7 @@ CKEDITOR.define( [
 		next() {
 			var position = this.position;
 
-			if ( position.eqals( this.range.end ) ) {
+			if ( position.equals( this.range.end ) ) {
 				return { done: true };
 			}
 
@@ -50,7 +50,7 @@ CKEDITOR.define( [
 
 				return formatReturnValue( OPENING_TAG, nodeAfter );
 			} else if ( nodeAfter instanceof Character ) {
-				this.position = new Position( position.parent, this.offset + 1 );
+				this.position = new Position( position.parent, position.offset + 1 );
 
 				return formatReturnValue( CHARACTER, nodeAfter );
 			} else {
@@ -60,21 +60,21 @@ CKEDITOR.define( [
 			}
 		}
 
-		get previous() {
+		previous() {
 			var position = this.position;
 
-			if ( position.eqals( this.range.start ) ) {
+			if ( position.equals( this.range.start ) ) {
 				return { done: true };
 			}
 
-			var nodeBefore = this.nodeBefore;
+			var nodeBefore = position.nodeBefore;
 
 			if ( nodeBefore instanceof Element ) {
 				this.position = new Position( nodeBefore, nodeBefore.children.length );
 
 				return formatReturnValue( CLOSING_TAG, nodeBefore );
 			} else if ( nodeBefore instanceof Character ) {
-				this.position = new Position( position.parent, this.offset - 1 );
+				this.position = new Position( position.parent, position.offset - 1 );
 
 				return formatReturnValue( CHARACTER, nodeBefore );
 			} else {

+ 95 - 0
packages/ckeditor5-engine/tests/document/range.js

@@ -0,0 +1,95 @@
+/**
+ * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+
+/* bender-tags: document */
+
+'use strict';
+
+var modules = bender.amd.require(
+	'document/range',
+	'document/element',
+	'document/position' );
+
+describe( 'range', function() {
+	it( 'should create a range with given positions', function() {
+		var Element = modules[ 'document/element' ];
+		var Position = modules[ 'document/position' ];
+		var Range = modules[ 'document/range' ];
+
+		var elem = new Element();
+
+		var start = new Position( elem, 0 );
+		var end = new Position( elem, 0 );
+
+		var range = new Range( start, end );
+
+		expect( range ).to.have.property( 'start' ).that.equal( start );
+		expect( range ).to.have.property( 'end' ).that.equal( end );
+	} );
+
+	it( 'should be equals same range', function() {
+		var Element = modules[ 'document/element' ];
+		var Position = modules[ 'document/position' ];
+		var Range = modules[ 'document/range' ];
+
+		var elem = new Element();
+
+		var start = new Position( elem, 0 );
+		var end = new Position( elem, 0 );
+
+		var range = new Range( start, end );
+
+		var sameStart = new Position( elem, 0 );
+		var sameEnd = new Position( elem, 0 );
+
+		var sameRange = new Range( sameStart, sameEnd );
+
+		expect( range.equals( sameRange ) ).to.be.true;
+	} );
+
+	it( 'should not be equals if the start position is different', function() {
+		var Element = modules[ 'document/element' ];
+		var Position = modules[ 'document/position' ];
+		var Range = modules[ 'document/range' ];
+
+		var elem = new Element();
+		var childElem = new Element( elem );
+		elem.children.push( childElem );
+
+		var start = new Position( elem, 0 );
+		var end = new Position( elem, 1 );
+
+		var range = new Range( start, end );
+
+		var sameStart = new Position( elem, 1 );
+		var sameEnd = new Position( elem, 1 );
+
+		var sameRange = new Range( sameStart, sameEnd );
+
+		expect( range.equals( sameRange ) ).to.not.be.true;
+	} );
+
+	it( 'should not be equals if the end position is different', function() {
+		var Element = modules[ 'document/element' ];
+		var Position = modules[ 'document/position' ];
+		var Range = modules[ 'document/range' ];
+
+		var elem = new Element();
+		var childElem = new Element( elem );
+		elem.children.push( childElem );
+
+		var start = new Position( elem, 0 );
+		var end = new Position( elem, 1 );
+
+		var range = new Range( start, end );
+
+		var sameStart = new Position( elem, 0 );
+		var sameEnd = new Position( elem, 0 );
+
+		var sameRange = new Range( sameStart, sameEnd );
+
+		expect( range.equals( sameRange ) ).to.not.be.true;
+	} );
+} );

+ 131 - 0
packages/ckeditor5-engine/tests/document/rangeiterator.js

@@ -0,0 +1,131 @@
+/**
+ * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+
+/* bender-tags: document */
+
+'use strict';
+
+var modules = bender.amd.require(
+	'document/document',
+	'document/element',
+	'document/character',
+	'document/rangeiterator',
+	'document/position',
+	'document/range' );
+
+describe( 'range iterator', function() {
+	var document, expectedItems;
+
+	var root, img1, paragraph, charB, charA, charR, img2, charX;
+
+	var OPENING_TAG, CLOSING_TAG, CHARACTER;
+
+	before( function() {
+		var Document = modules[ 'document/document' ];
+
+		var Element = modules[ 'document/element' ];
+		var Character = modules[ 'document/character' ];
+
+		var RangeIterator = modules[ 'document/rangeiterator' ];
+		OPENING_TAG = RangeIterator.OPENING_TAG;
+		CLOSING_TAG = RangeIterator.CLOSING_TAG;
+		CHARACTER = RangeIterator.CHARACTER;
+
+		document = new Document();
+		root = document.root;
+
+		// root
+		//  |- img1
+		//  |- p
+		//     |- B
+		//     |- A
+		//     |- R
+		//     |
+		//     |- img2
+		//     |
+		//     |- X
+		img1 = new Element( root, 'img1' );
+		root.children.push( img1 );
+
+		paragraph = new Element( root, 'p' );
+		root.children.push( paragraph );
+
+		charB = new Character( paragraph, 'B' );
+		paragraph.children.push( charB );
+
+		charA = new Character( paragraph, 'A' );
+		paragraph.children.push( charA );
+
+		charR = new Character( paragraph, 'R' );
+		paragraph.children.push( charR );
+
+		img2 = new Element( paragraph, 'img2' );
+		paragraph.children.push( img2 );
+
+		charX = new Character( paragraph, 'X' );
+		paragraph.children.push( charX );
+
+		expectedItems = [
+				{ type: OPENING_TAG, node: img1 },
+				{ type: CLOSING_TAG, node: img1 },
+				{ type: OPENING_TAG, node: paragraph },
+				{ type: CHARACTER, node: charB },
+				{ type: CHARACTER, node: charA },
+				{ type: CHARACTER, node: charR },
+				{ type: OPENING_TAG, node: img2 },
+				{ type: CLOSING_TAG, node: img2 },
+				{ type: CHARACTER, node: charX },
+				{ type: CLOSING_TAG, node: paragraph }
+			];
+	} );
+
+	it( 'should return next position', function() {
+		var RangeIterator = modules[ 'document/rangeiterator' ];
+		var Position = modules[ 'document/position' ];
+		var Range = modules[ 'document/range' ];
+
+		var start = new Position( root, 0 );
+		var end = new Position( root, 2 );
+		var iterator = new RangeIterator( new Range( start, end ) );
+
+		for ( var i = 0, len = expectedItems.length; i < len; i++ ) {
+			expect( iterator.next() ).to.deep.equal( { done: false, value: expectedItems[ i ] } );
+		}
+		expect( iterator.next() ).to.have.property( 'done' ).that.is.true;
+	} );
+
+	it( 'should return previous position', function() {
+		var RangeIterator = modules[ 'document/rangeiterator' ];
+		var Position = modules[ 'document/position' ];
+		var Range = modules[ 'document/range' ];
+
+		var start = new Position( root, 0 );
+		var end = new Position( root, 2 );
+		var iterator = new RangeIterator( new Range( start, end ), end );
+
+		for ( var i = expectedItems.length - 1; i >= 0; i-- ) {
+			expect( iterator.previous() ).to.deep.equal( { done: false, value: expectedItems[ i ] } );
+		}
+		expect( iterator.previous() ).to.have.property( 'done' ).that.is.true;
+	} );
+
+	it( 'should return iterate over the range', function() {
+		var Position = modules[ 'document/position' ];
+		var Range = modules[ 'document/range' ];
+
+		var start = new Position( root, 0 );
+		var end = new Position( root, 2 );
+		var range = new Range( start, end );
+
+		var i = 0;
+		var value;
+
+		for ( value of range ) {
+			expect( value ).to.deep.equal( expectedItems[ i ] );
+			i++;
+		}
+		expect( i ).to.equal( expectedItems.length );
+	} );
+} );