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