Esanders has uploaded a new change for review. https://gerrit.wikimedia.org/r/238225
Change subject: Add more tests to ve.dm.SurfaceFragment ...................................................................... Add more tests to ve.dm.SurfaceFragment Change-Id: I0f2fe21df5604402a673d12518ae07c0672b8901 Bonus: Sync documentation of truncateLinearSelection with ve.Range#truncate --- M src/dm/ve.dm.SurfaceFragment.js M src/ve.Range.js M tests/dm/ve.dm.SurfaceFragment.test.js 3 files changed, 75 insertions(+), 8 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/VisualEditor/VisualEditor refs/changes/25/238225/1 diff --git a/src/dm/ve.dm.SurfaceFragment.js b/src/dm/ve.dm.SurfaceFragment.js index 4d32000..7fbedbe 100644 --- a/src/dm/ve.dm.SurfaceFragment.js +++ b/src/dm/ve.dm.SurfaceFragment.js @@ -260,7 +260,7 @@ * Get a new fragment with a truncated length. * * @method - * @param {number} limit Maximum length of range (negative for left-side truncation) + * @param {number} limit Maximum length of new range (negative for left-side truncation) * @return {ve.dm.SurfaceFragment} Truncated fragment */ ve.dm.SurfaceFragment.prototype.truncateLinearSelection = function ( limit ) { diff --git a/src/ve.Range.js b/src/ve.Range.js index e574252..7c540f7 100644 --- a/src/ve.Range.js +++ b/src/ve.Range.js @@ -178,19 +178,19 @@ }; /** - * Create a new range with a limited length. + * Create a new range with a truncated length. * - * @param {number} length Length of the new range (negative for truncate from right) + * @param {number} limit Maximum length of new range (negative for left-side truncation) * @return {ve.Range} A new range */ -ve.Range.prototype.truncate = function ( length ) { - if ( length >= 0 ) { +ve.Range.prototype.truncate = function ( limit ) { + if ( limit >= 0 ) { return new ve.Range( - this.start, Math.min( this.start + length, this.end ) + this.start, Math.min( this.start + limit, this.end ) ); } else { return new ve.Range( - Math.max( this.end + length, this.start ), this.end + Math.max( this.end + limit, this.start ), this.end ); } }; diff --git a/tests/dm/ve.dm.SurfaceFragment.test.js b/tests/dm/ve.dm.SurfaceFragment.test.js index d9bf3aa..c44e2af 100644 --- a/tests/dm/ve.dm.SurfaceFragment.test.js +++ b/tests/dm/ve.dm.SurfaceFragment.test.js @@ -67,11 +67,49 @@ } ); +QUnit.test( 'getSelectedModels', 4, function ( assert ) { + var doc = ve.dm.example.createExampleDocument(), + surface = new ve.dm.Surface( doc ); + + assert.deepEqual( + surface.getLinearFragment( new ve.Range( 1, 3 ) ).getSelectedModels(), + [], + 'Empty' + ); + assert.deepEqual( + surface.getLinearFragment( new ve.Range( 2, 3 ) ).getSelectedModels(), + [ doc.data.store.value( 0 ) ], + 'Bold annotation' + ); + assert.deepEqual( + surface.getLinearFragment( new ve.Range( 1, 3 ) ).getSelectedModels( true ), + [ + doc.getDocumentNode().children[ 0 ].children[ 0 ], + doc.data.store.value( 0 ) + ], + 'Bold annotation and text node' + ); + assert.deepEqual( + surface.getLinearFragment( new ve.Range( 39, 41 ) ).getSelectedModels(), + [ doc.getDocumentNode().children[ 2 ].children[ 1 ] ], + 'Inline image node' + ); +} ); + +QUnit.test( 'hasAnnotations', 2, function ( assert ) { + var doc = ve.dm.example.createExampleDocument(), + surface = new ve.dm.Surface( doc ); + + assert.strictEqual( surface.getLinearFragment( new ve.Range( 1, 2 ) ).hasAnnotations(), false, 'Plain text has none' ); + assert.strictEqual( surface.getLinearFragment( new ve.Range( 2, 3 ) ).hasAnnotations(), true, 'Bold text has some' ); +} ); + QUnit.test( 'adjustLinearSelection', 4, function ( assert ) { var doc = ve.dm.example.createExampleDocument(), surface = new ve.dm.Surface( doc ), fragment = surface.getLinearFragment( new ve.Range( 20, 21 ) ), adjustedFragment = fragment.adjustLinearSelection( -19, 35 ); + assert.ok( fragment !== adjustedFragment, 'adjustLinearSelection produces a new fragment' ); assert.equalRange( fragment.getSelection().getRange(), new ve.Range( 20, 21 ), 'old fragment is not changed' ); assert.equalRange( adjustedFragment.getSelection().getRange(), new ve.Range( 1, 56 ), 'new range is used' ); @@ -80,11 +118,24 @@ assert.deepEqual( adjustedFragment, fragment, 'fragment is clone if no parameters supplied' ); } ); +QUnit.test( 'truncateLinearSelection', 4, function ( assert ) { + var range = new ve.Range( 100, 200 ), + doc = ve.dm.example.createExampleDocument(), + surface = new ve.dm.Surface( doc ), + fragment = surface.getLinearFragment( range ); + + assert.equalRange( fragment.truncateLinearSelection( 50 ).getSelection().getRange(), new ve.Range( 100, 150 ), 'truncate 50' ); + assert.equalRange( fragment.truncateLinearSelection( 150 ).getSelection().getRange(), range, 'truncate 150 does nothing' ); + assert.equalRange( fragment.truncateLinearSelection( -50 ).getSelection().getRange(), new ve.Range( 150, 200 ), 'truncate -50' ); + assert.equalRange( fragment.truncateLinearSelection( -150 ).getSelection().getRange(), range, 'truncate -150 does nothing' ); +} ); + QUnit.test( 'collapseToStart/End', 6, function ( assert ) { var doc = ve.dm.example.createExampleDocument(), surface = new ve.dm.Surface( doc ), fragment = surface.getLinearFragment( new ve.Range( 20, 21 ) ), collapsedFragment = fragment.collapseToStart(); + assert.ok( fragment !== collapsedFragment, 'collapseToStart produces a new fragment' ); assert.equalRange( fragment.getSelection().getRange(), new ve.Range( 20, 21 ), 'old fragment is not changed' ); assert.equalRange( collapsedFragment.getSelection().getRange(), new ve.Range( 20 ), 'new range is used' ); @@ -366,10 +417,11 @@ } } ); -QUnit.test( 'insertContent', 8, function ( assert ) { +QUnit.test( 'insertContent', 9, function ( assert ) { var doc = ve.dm.example.createExampleDocument(), surface = new ve.dm.Surface( doc ), fragment = surface.getLinearFragment( new ve.Range( 1, 4 ) ); + fragment.insertContent( [ '1', '2', '3' ] ); assert.deepEqual( doc.getData( new ve.Range( 1, 4 ) ), @@ -398,6 +450,21 @@ 'range restored after undo' ); + fragment = surface.getLinearFragment( new ve.Range( 0 ) ); + fragment.insertContent( 'foo\nbar' ); + assert.deepEqual( + doc.getData( new ve.Range( 0, 10 ) ), + [ + { type: 'paragraph' }, + 'f', 'o', 'o', + { type: '/paragraph' }, + { type: 'paragraph' }, + 'b', 'a', 'r', + { type: '/paragraph' } + ], + 'newlines converted to paragraphs' + ); + fragment = surface.getLinearFragment( new ve.Range( 1 ) ); fragment.insertContent( [ { type: 'table' }, { type: '/table' } ] ); assert.deepEqual( -- To view, visit https://gerrit.wikimedia.org/r/238225 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I0f2fe21df5604402a673d12518ae07c0672b8901 Gerrit-PatchSet: 1 Gerrit-Project: VisualEditor/VisualEditor Gerrit-Branch: master Gerrit-Owner: Esanders <esand...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits