Divec has uploaded a new change for review.
https://gerrit.wikimedia.org/r/324028
Change subject: Hijack EventSequencer timeouts in unit testing
......................................................................
Hijack EventSequencer timeouts in unit testing
Change-Id: I9839edf578ef7d9693500dbb36cf76810e1e1555
---
M tests/ce/ve.ce.Surface.test.js
M tests/ce/ve.ce.TestRunner.js
M tests/ve.test.utils.js
3 files changed, 45 insertions(+), 30 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/VisualEditor/VisualEditor
refs/changes/28/324028/1
diff --git a/tests/ce/ve.ce.Surface.test.js b/tests/ce/ve.ce.Surface.test.js
index 0743891..0ce15e8 100644
--- a/tests/ce/ve.ce.Surface.test.js
+++ b/tests/ce/ve.ce.Surface.test.js
@@ -16,6 +16,8 @@
model = view.getModel(),
data = ve.copy( model.getDocument().getFullData() );
+ ve.test.utils.hijackEventSequencerTimeouts( view.eventSequencer );
+
model.setSelection(
ve.test.utils.selectionFromRangeOrSelection(
model.getDocument(), rangeOrSelection )
);
@@ -34,14 +36,12 @@
// TODO: Could probably switch to using this for every
test, but it
// would need the faked testing surface to be improved.
view.eventSequencer.onEvent( 'keydown', $.Event(
'keydown', e ) );
+ view.eventSequencer.onEvent( 'keypress', $.Event(
'keypress', e ) );
if ( forceSelection ) {
view.showSelectionState(
view.getSelectionState( forceSelection ) );
}
- view.eventSequencer.runPendingCalls( 'keydown' );
- view.eventSequencer.onEvent( 'keypress', $.Event(
'keypress', e ) );
- view.eventSequencer.runPendingCalls( 'keypress' );
view.eventSequencer.onEvent( 'keyup', $.Event( 'keyup',
e ) );
- view.eventSequencer.runPendingCalls( 'keyup' );
+ view.eventSequencer.endLoop();
} else {
if ( forceSelection ) {
view.showSelectionState(
view.getSelectionState( forceSelection ) );
@@ -60,7 +60,6 @@
{ type: 'linear', range: expectedRangeOrSelection } :
expectedRangeOrSelection
);
-
assert.equalHash( model.getSelection(), expectedSelection, msg + ':
selection' );
view.destroy();
};
diff --git a/tests/ce/ve.ce.TestRunner.js b/tests/ce/ve.ce.TestRunner.js
index 6308d6f..534d3f6 100644
--- a/tests/ce/ve.ce.TestRunner.js
+++ b/tests/ce/ve.ce.TestRunner.js
@@ -118,13 +118,10 @@
* @param {ve.ce.Surface} surface The UI Surface
*/
ve.ce.TestRunner = function VeCeTestRunner( surface ) {
- var testRunner,
- callId = 0;
this.view = surface;
this.model = surface.getModel();
this.doc = surface.getElementDocument();
this.nativeSelection = surface.nativeSelection;
- this.postponedCalls = {};
// TODO: The code assumes that the document consists of exactly one
paragraph
this.lastText = this.getParagraph().textContent;
@@ -133,14 +130,7 @@
surface.surfaceObserver.pollInterval = null;
// Take control of eventSequencer 'setTimeouts'
- testRunner = this;
- this.view.eventSequencer.postpone = function ( f ) {
- testRunner.postponedCalls[ ++callId ] = f;
- return callId;
- };
- this.view.eventSequencer.cancelPostponed = function ( callId ) {
- delete testRunner.postponedCalls[ callId ];
- };
+ ve.test.utils.hijackEventSequencerTimeouts( this.view.eventSequencer );
};
/* Methods */
@@ -166,22 +156,10 @@
/**
* Run any pending postponed calls
*
- * Exceptions thrown may leave this.postponedCalls in an inconsistent state
+ * Exceptions thrown will leave postponed calls in an inconsistent state
*/
ve.ce.TestRunner.prototype.endLoop = function () {
- var callId, postponedCalls,
- check = true;
-
- // postponed calls may add more postponed calls
- while ( check ) {
- postponedCalls = this.postponedCalls;
- this.postponedCalls = {};
- check = false;
- for ( callId in postponedCalls ) {
- check = true;
- postponedCalls[ callId ]();
- }
- }
+ this.view.eventSequencer.endLoop();
};
/**
diff --git a/tests/ve.test.utils.js b/tests/ve.test.utils.js
index 0a5006c..e53993f 100644
--- a/tests/ve.test.utils.js
+++ b/tests/ve.test.utils.js
@@ -459,4 +459,42 @@
add( rootNode );
return html.join( '' );
};
+
+ /**
+ * Take control of EventSequencer timeouts
+ *
+ * Modifies an EventSequencer object in-place to allow setTimeout
behaviour to be
+ * simulated by test code. Replaces `postpone` and `cancelPostponed`
with methods that
+ * queue/unqueue to an array, and adds an `endLoop` method to unqueue
and run every
+ * queued call.
+ *
+ * @param {ve.EventSequencer} eventSequencer The EventSequencer to
hijack
+ */
+ ve.test.utils.hijackEventSequencerTimeouts = function ( eventSequencer
) {
+ eventSequencer.postponedCalls = [];
+
+ eventSequencer.postpone = function ( f ) {
+ this.postponedCalls.push( f );
+ return this.postponedCalls.length - 1;
+ };
+
+ eventSequencer.cancelPostponed = function ( callId ) {
+ this.postponedCalls[ callId ] = null;
+ };
+
+ eventSequencer.endLoop = function () {
+ var i, f;
+ // Run every postponed call in order of postponement.
Do not cache
+ // list length, because postponed calls may add more
postponed calls
+ for ( i = 0; i < this.postponedCalls.length; i++ ) {
+ f = this.postponedCalls[ i ];
+ if ( f ) {
+ // Exceptions thrown here will leave
the postponed calls
+ // list in an inconsistent state
+ f();
+ }
+ }
+ this.postponedCalls.length = 0;
+ };
+ };
}() );
--
To view, visit https://gerrit.wikimedia.org/r/324028
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I9839edf578ef7d9693500dbb36cf76810e1e1555
Gerrit-PatchSet: 1
Gerrit-Project: VisualEditor/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Divec <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits