Esanders has uploaded a new change for review.

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

Change subject: Unit tests for showSelection
......................................................................

Unit tests for showSelection

Effectively covers testing of ve.ce.Document.getNodeAndOffset.

Split showSelection into getSelection/showSelection for testing.

Change-Id: I36724597cf14572699c2cf768fc5b59751b95dc0
---
M modules/ve/ce/ve.ce.Surface.js
M modules/ve/test/ce/ve.ce.Surface.test.js
2 files changed, 174 insertions(+), 10 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/VisualEditor/VisualEditor 
refs/changes/22/146422/1

diff --git a/modules/ve/ce/ve.ce.Surface.js b/modules/ve/ce/ve.ce.Surface.js
index 5743a50..0dacfef 100644
--- a/modules/ve/ce/ve.ce.Surface.js
+++ b/modules/ve/ce/ve.ce.Surface.js
@@ -2162,26 +2162,44 @@
  * @param {ve.Range} range Range to show selection on
  */
 ve.ce.Surface.prototype.showSelection = function ( range ) {
-       var start, end,
+       var selection = this.getSelection( range ),
                rangySel = rangy.getSelection( this.$document[0] ),
                rangyRange = rangy.createRange( this.$document[0] );
 
+       if ( selection.end ) {
+               rangyRange.setStart( selection.start.node, 
selection.start.offset );
+               rangyRange.setEnd( selection.end.node, selection.end.offset );
+               rangySel.removeAllRanges();
+               rangySel.addRange( rangyRange, selection.isBackwards );
+       } else {
+               rangyRange.setStart( selection.start.node, 
selection.start.offset );
+               rangySel.setSingleRange( rangyRange );
+       }
+};
+
+/**
+ * Get selection for a range.
+ *
+ * @method
+ * @param {ve.Range} range Range to get selection for
+ * @returns {Object} Object containing start and end node/offset selections, 
and an isBackwards flag.
+ */
+ve.ce.Surface.prototype.getSelection = function ( range ) {
        range = new ve.Range(
                this.getNearestCorrectOffset( range.from, -1 ),
                this.getNearestCorrectOffset( range.to, 1 )
        );
 
        if ( !range.isCollapsed() ) {
-               start = this.documentView.getNodeAndOffset( range.start );
-               end = this.documentView.getNodeAndOffset( range.end );
-               rangyRange.setStart( start.node, start.offset );
-               rangyRange.setEnd( end.node, end.offset );
-               rangySel.removeAllRanges();
-               rangySel.addRange( rangyRange, range.start !== range.from );
+               return {
+                       'start': this.documentView.getNodeAndOffset( 
range.start ),
+                       'end': this.documentView.getNodeAndOffset( range.end ),
+                       'isBackwards': range.isBackwards()
+               };
        } else {
-               start = this.documentView.getNodeAndOffset( range.start );
-               rangyRange.setStart( start.node, start.offset );
-               rangySel.setSingleRange( rangyRange );
+               return {
+                       'start': this.documentView.getNodeAndOffset( 
range.start )
+               };
        }
 };
 
diff --git a/modules/ve/test/ce/ve.ce.Surface.test.js 
b/modules/ve/test/ce/ve.ce.Surface.test.js
index 7481cef..1d3bdaa 100644
--- a/modules/ve/test/ce/ve.ce.Surface.test.js
+++ b/modules/ve/test/ce/ve.ce.Surface.test.js
@@ -867,6 +867,152 @@
        }
 } );
 
+QUnit.test( 'getSelection', function ( assert ) {
+       var i, j, l, surface, selection, expectedNode, internlListNode, node, 
msg,
+               expect = 0,
+               cases = [
+                       {
+                               'msg': 'Grouped aliens',
+                               'html': '<p>' +
+                                       'Foo' +
+                                       '<span rel="ve:Alien" 
about="g1">Bar</span>' +
+                                       '<span rel="ve:Alien" 
about="g1">Baz</span>' +
+                                       '<span rel="ve:Alien" 
about="g1">Quux</span>' +
+                                       'Whee' +
+                               '</p>' +
+                               '<p>' +
+                                       '2<b>n</b>d' +
+                               '</p>',
+                               'expected': [
+                                       { startNode: 'Foo', startOffset: 0 },
+                                       { startNode: 'Foo', startOffset: 0 },
+                                       { startNode: 'Foo', startOffset: 1 },
+                                       { startNode: 'Foo', startOffset: 2 },
+                                       { startNode: 'Foo', startOffset: 3 },
+                                       null, // Focusable
+                                       { startNode: 'Whee', startOffset: 0 },
+                                       { startNode: 'Whee', startOffset: 1 },
+                                       { startNode: 'Whee', startOffset: 2 },
+                                       { startNode: 'Whee', startOffset: 3 },
+                                       { startNode: 'Whee', startOffset: 4 },
+                                       { startNode: 'Whee', startOffset: 4, 
endNode: '2', endOffset: 0 },
+                                       { startNode: '2', startOffset: 0 },
+                                       { startNode: '2', startOffset: 1 },
+                                       { startNode: 'n', startOffset: 1 },
+                                       { startNode: 'd', startOffset: 1 }
+                               ]
+                       },
+                       {
+                               'msg': 'Simple example doc',
+                               'html': ve.dm.example.html,
+                               'expected': [
+                                       { startNode: 'a', startOffset: 0 },
+                                       { startNode: 'a', startOffset: 0 },
+                                       { startNode: 'a', startOffset: 1 },
+                                       { startNode: 'b', startOffset: 1 },
+                                       { startNode: 'c', startOffset: 1 },
+                                       { startNode: 'c', startOffset: 1, 
endNode: 'd', endOffset: 0 },
+                                       { startNode: 'c', startOffset: 1, 
endNode: 'd', endOffset: 0 },
+                                       { startNode: 'c', startOffset: 1, 
endNode: 'd', endOffset: 0 },
+                                       { startNode: 'c', startOffset: 1, 
endNode: 'd', endOffset: 0 },
+                                       { startNode: 'c', startOffset: 1, 
endNode: 'd', endOffset: 0 },
+                                       // 10
+                                       { startNode: 'd', startOffset: 0 },
+                                       { startNode: 'd', startOffset: 1 },
+                                       { startNode: 'd', startOffset: 1, 
endNode: 'e', endOffset: 0 },
+                                       { startNode: 'd', startOffset: 1, 
endNode: 'e', endOffset: 0 },
+                                       { startNode: 'd', startOffset: 1, 
endNode: 'e', endOffset: 0 },
+                                       { startNode: 'e', startOffset: 0 },
+                                       { startNode: 'e', startOffset: 1 },
+                                       { startNode: 'e', startOffset: 1, 
endNode: 'f', endOffset: 0 },
+                                       { startNode: 'e', startOffset: 1, 
endNode: 'f', endOffset: 0 },
+                                       { startNode: 'e', startOffset: 1, 
endNode: 'f', endOffset: 0 },
+                                       // 20
+                                       { startNode: 'f', startOffset: 0 },
+                                       { startNode: 'f', startOffset: 1 },
+                                       { startNode: 'f', startOffset: 1, 
endNode: 'g', endOffset: 0 },
+                                       { startNode: 'f', startOffset: 1, 
endNode: 'g', endOffset: 0 },
+                                       { startNode: 'f', startOffset: 1, 
endNode: 'g', endOffset: 0 },
+                                       { startNode: 'f', startOffset: 1, 
endNode: 'g', endOffset: 0 },
+                                       { startNode: 'f', startOffset: 1, 
endNode: 'g', endOffset: 0 },
+                                       { startNode: 'f', startOffset: 1, 
endNode: 'g', endOffset: 0 },
+                                       { startNode: 'f', startOffset: 1, 
endNode: 'g', endOffset: 0 },
+                                       { startNode: 'g', startOffset: 0 },
+                                       // 30
+                                       { startNode: 'g', startOffset: 1 },
+                                       { startNode: 'g', startOffset: 1, 
endNode: 'h', endOffset: 0 },
+                                       { startNode: 'g', startOffset: 1, 
endNode: 'h', endOffset: 0 },
+                                       { startNode: 'g', startOffset: 1, 
endNode: 'h', endOffset: 0 },
+                                       { startNode: 'g', startOffset: 1, 
endNode: 'h', endOffset: 0 },
+                                       { startNode: 'g', startOffset: 1, 
endNode: 'h', endOffset: 0 },
+                                       { startNode: 'g', startOffset: 1, 
endNode: 'h', endOffset: 0 },
+                                       { startNode: 'g', startOffset: 1, 
endNode: 'h', endOffset: 0 },
+                                       { startNode: 'h', startOffset: 0 },
+                                       { startNode: 'h', startOffset: 1 },
+                                       // 40
+                                       null, // Focusable
+                                       { startNode: 'i', startOffset: 0 },
+                                       { startNode: 'i', startOffset: 1 },
+                                       { startNode: 'i', startOffset: 1, 
endNode: 'j', endOffset: 0 },
+                                       { startNode: 'i', startOffset: 1, 
endNode: 'j', endOffset: 0 },
+                                       { startNode: 'i', startOffset: 1, 
endNode: 'j', endOffset: 0 },
+                                       { startNode: 'j', startOffset: 0 },
+                                       { startNode: 'j', startOffset: 1 },
+                                       { startNode: 'j', startOffset: 1, 
endNode: 'k', endOffset: 0 },
+                                       { startNode: 'j', startOffset: 1, 
endNode: 'k', endOffset: 0 },
+                                       // 50
+                                       { startNode: 'j', startOffset: 1, 
endNode: 'k', endOffset: 0 },
+                                       { startNode: 'k', startOffset: 0 },
+                                       { startNode: 'k', startOffset: 1 },
+                                       { startNode: 'k', startOffset: 1, 
endNode: 'l', endOffset: 0 },
+                                       { startNode: 'k', startOffset: 1, 
endNode: 'l', endOffset: 0 },
+                                       { startNode: 'k', startOffset: 1, 
endNode: 'l', endOffset: 0 },
+                                       { startNode: 'l', startOffset: 0 },
+                                       { startNode: 'l', startOffset: 1 },
+                                       { startNode: 'l', startOffset: 1, 
endNode: 'm', endOffset: 0 },
+                                       { startNode: 'm', startOffset: 0 },
+                                       // 60
+                                       { startNode: 'm', startOffset: 1 }
+                               ]
+                       }
+               ];
+
+       for ( i = 0; i < cases.length; i++ ) {
+               for ( j = 0; j < cases[i].expected.length; j++ ) {
+                       expect += cases[i].expected[j] ? ( 
cases[i].expected[j].endNode ? 4 : 2 ) : 1;
+               }
+       }
+
+       QUnit.expect( expect );
+
+       for ( i = 0; i < cases.length; i++ ) {
+               surface = ve.test.utils.createSurfaceFromHtml( cases[i].html );
+               internlListNode = 
surface.getModel().getDocument().getInternalList().getListNode();
+               for ( j = 0, l = internlListNode.getOuterRange().start; j < l; 
j++ ) {
+                       msg = ' at ' + j + ' in ' + cases[i].msg;
+                       node = 
surface.getView().getDocument().getDocumentNode().getNodeFromOffset( j );
+                       if ( node.isFocusable() ) {
+                               assert.equal( null, cases[i].expected[j], 
'Focusable node at ' + j );
+                       } else {
+                               selection = surface.getView().getSelection( new 
ve.Range( j ) );
+                               if ( selection.end ) {
+                                       expectedNode = $( '<div>' ).html( 
cases[i].expected[j].startNode )[0].childNodes[0];
+                                       assert.equalDomElement( 
selection.start.node, expectedNode, 'Start node ' + msg );
+                                       assert.equal( selection.start.offset, 
cases[i].expected[j].startOffset, 'Start offfset ' + msg );
+                                       expectedNode = $( '<div>' ).html( 
cases[i].expected[j].endNode )[0].childNodes[0];
+                                       assert.equalDomElement( 
selection.end.node, expectedNode, 'End node ' + msg );
+                                       assert.equal( selection.end.offset, 
cases[i].expected[j].endOffset, 'End offfset ' + msg );
+                               } else {
+                                       expectedNode = $( '<div>' ).html( 
cases[i].expected[j].startNode )[0].childNodes[0];
+                                       assert.equalDomElement( 
selection.start.node, expectedNode, 'Node ' + msg );
+                                       assert.equal( selection.start.offset, 
cases[i].expected[j].startOffset, 'Offset ' + msg );
+                               }
+                       }
+               }
+       }
+
+} );
+
 /* Methods with return values */
 // TODO: ve.ce.Surface#hasSlugAtOffset
 // TODO: ve.ce.Surface#needsPawn

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I36724597cf14572699c2cf768fc5b59751b95dc0
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