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