Esanders has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/161977

Change subject: Add expand method to ranges, finish unit test coverage
......................................................................

Add expand method to ranges, finish unit test coverage

Change-Id: I563f15f707191d4b0ed1f9b3ffbac4d64e1d6f93
---
M src/dm/ve.dm.SurfaceFragment.js
M src/ve.Range.js
M tests/ve.Range.test.js
3 files changed, 63 insertions(+), 16 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/VisualEditor/VisualEditor 
refs/changes/77/161977/1

diff --git a/src/dm/ve.dm.SurfaceFragment.js b/src/dm/ve.dm.SurfaceFragment.js
index 3d17b4b..a0034d0 100644
--- a/src/dm/ve.dm.SurfaceFragment.js
+++ b/src/dm/ve.dm.SurfaceFragment.js
@@ -368,10 +368,7 @@
                                newRange = ve.Range.newCoveringRange( [
                                        this.document.data.getNearestWordRange( 
this.getRange( true ).start ),
                                        this.document.data.getNearestWordRange( 
this.getRange( true ).end )
-                               ] );
-                               if ( oldRange.isBackwards() ) {
-                                       newRange = newRange.flip();
-                               }
+                               ], oldRange.isBackwards() );
                        } else {
                                // optimisation for zero-length ranges
                                newRange = 
this.document.data.getNearestWordRange( oldRange.start );
diff --git a/src/ve.Range.js b/src/ve.Range.js
index a85f22c..55919cb 100644
--- a/src/ve.Range.js
+++ b/src/ve.Range.js
@@ -164,7 +164,7 @@
 /**
  * Create a new range with a limited length.
  *
- * @param {number} length Length of the new range (negative for left-side 
truncation)
+ * @param {number} length Length of the new range (negative for truncate from 
right)
  * @returns {ve.Range} A new range
  */
 ve.Range.prototype.truncate = function ( length ) {
@@ -180,6 +180,16 @@
 };
 
 /**
+ * Expand a range to include another range, preserving direction.
+ *
+ * @param {ve.Range} other Range to expand to include
+ * @return {ve.Range} Range covering this range and other
+ */
+ve.Range.prototype.expand = function ( other ) {
+       return ve.Range.newCoveringRange( [this, other], this.isBackwards() );
+};
+
+/**
  * Check if the range is collapsed.
  *
  * A collapsed range has equal start and end values making its length zero.
diff --git a/tests/ve.Range.test.js b/tests/ve.Range.test.js
index 0af6e09..22ceebf 100644
--- a/tests/ve.Range.test.js
+++ b/tests/ve.Range.test.js
@@ -8,10 +8,9 @@
 
 /* Tests */
 
-QUnit.test( 'Basic usage (clone, isCollapsed, isBackwards, getLength, equals, 
equalsSelection, containsOffset, containsRange)', 27, function ( assert ) {
-       var range;
+QUnit.test( 'Basic usage (clone, isCollapsed, isBackwards, getLength, equals, 
equalsSelection, containsOffset, containsRange)', 26, function ( assert ) {
+       var range = new ve.Range( 100, 200 );
 
-       range = new ve.Range( 100, 200 );
        assert.strictEqual( range.isCollapsed(), false );
        assert.strictEqual( range.isBackwards(), false );
        assert.strictEqual( range.getLength(), 100 );
@@ -38,8 +37,6 @@
        assert.strictEqual( range.containsRange( new ve.Range( 100, 199 ) ), 
true, 'contains 100, 199' );
        assert.strictEqual( range.containsRange( new ve.Range( 100, 200 ) ), 
false, 'doesn\'t contain 100, 200' );
 
-       assert.equalRange( range, range.clone(), 'clone produces an equal 
range' );
-
        range = new ve.Range( 100 );
        assert.strictEqual( range.isCollapsed(), true );
        assert.strictEqual( range.isBackwards(), false );
@@ -47,9 +44,52 @@
 
 } );
 
-// TODO: newFromTranslatedRange
-// TODO: newCoveringRange
-// TODO: newFromJSON
-// TODO: flip
-// TODO: truncate
-// TODO: toJSON
+QUnit.test( 'Modification (flip, truncate, expand, clone)', 15, function ( 
assert ) {
+       var range = new ve.Range( 100, 200 );
+
+       assert.equalRange( range.flip(), new ve.Range( 200, 100 ), 'flip 
reverses the range' );
+       assert.equalRange( range.flip().flip(), range, 'double flip does 
nothing' );
+
+       assert.equalRange( range, range.clone(), 'clone produces an equal 
range' );
+       assert.equalRange( range.flip().clone(), range.flip(), 'clone produces 
an equal range backwards' );
+
+       assert.equalRange( range.truncate( 50 ), new ve.Range( 100, 150 ), 
'truncate 50' );
+       assert.equalRange( range.truncate( 150 ), range, 'truncate 150 does 
nothing' );
+       assert.equalRange( range.truncate( -50 ), new ve.Range( 150, 200 ), 
'truncate -50' );
+       assert.equalRange( range.truncate( -150 ), range, 'truncate -150 does 
nothing' );
+
+       assert.equalRange( range.expand( new ve.Range( 150, 250 ) ), new 
ve.Range( 100, 250 ), 'overlapping expand to right' );
+       assert.equalRange( range.expand( new ve.Range( 250 ) ), new ve.Range( 
100, 250 ), 'non-overlapping expand to right' );
+       assert.equalRange( range.expand( new ve.Range( 250, 150 ) ), new 
ve.Range( 100, 250 ), 'backwards overlapping expand to right' );
+       assert.equalRange( range.expand( new ve.Range( 50, 150 ) ), new 
ve.Range( 50, 200 ), 'overlapping expand to left' );
+       assert.equalRange( range.expand( new ve.Range( 50 ) ), new ve.Range( 
50, 200 ), 'non-overlapping expand to left' );
+       assert.equalRange( range.expand( new ve.Range( 150, 50 ) ), new 
ve.Range( 50, 200 ), 'backwards overlapping expand to left' );
+
+       assert.strictEqual( range.flip().expand( new ve.Range( 250 ) 
).isBackwards(), true, 'expands preserves backwards' );
+
+} );
+
+QUnit.test( 'Factory methods & serialization (newFromTranslatedRange, 
newCoveringRange, newFromJSON, toJSON)', 8, function ( assert ) {
+       var range = new ve.Range( 100, 200 );
+
+       assert.equalRange( ve.Range.newFromTranslatedRange( range, 10 ), new 
ve.Range( 110, 210 ), 'translate 10' );
+       assert.equalRange( ve.Range.newFromTranslatedRange( range, -10 ), new 
ve.Range( 90, 190 ), 'translate -10' );
+
+       assert.equalRange(
+               ve.Range.newCoveringRange( [ range, new ve.Range( 150, 250 ) ] 
),
+               new ve.Range( 100, 250 ),
+               'covering range'
+       );
+       assert.equalRange(
+               ve.Range.newCoveringRange( [ range, new ve.Range( 150, 250 ) ], 
true ),
+               new ve.Range( 250, 100 ),
+               'backwards covering range'
+       );
+
+       assert.strictEqual( range.toJSON(), '[100,200]', 'toJSON' );
+       assert.strictEqual( range.flip().toJSON(), '[200,100]', 'backwards 
toJSON' );
+
+       assert.equalRange( ve.Range.newFromJSON( range.toJSON() ), range, 
'newFromJSON' );
+       assert.equalRange( ve.Range.newFromJSON( range.flip().toJSON() ), 
range.flip(), 'backwards newFromJSON' );
+
+} );

-- 
To view, visit https://gerrit.wikimedia.org/r/161977
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I563f15f707191d4b0ed1f9b3ffbac4d64e1d6f93
Gerrit-PatchSet: 1
Gerrit-Project: VisualEditor/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Esanders <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to