%PDF- %PDF-
| Direktori : /www/varak.net/wiki.varak.net/extensions/VisualEditor/lib/ve/tests/ |
| Current File : //www/varak.net/wiki.varak.net/extensions/VisualEditor/lib/ve/tests/ve.EventSequencer.test.js |
/*!
* VisualEditor EventSequencer tests.
*
* @copyright 2011-2016 VisualEditor Team and others; see http://ve.mit-license.org
*/
QUnit.module( 've.EventSequencer' );
/* Stubs */
// EventSequencer with script-controlled implementation of "postpone"
ve.TestEventSequencer = function VeTestEventSequencer() {
// Parent constructor
ve.TestEventSequencer.super.apply( this, arguments );
// { number: callback } (for faking setTimeout/clearTimeout)
this.postponedCallbacks = {};
this.postponedCallbackId = 1;
};
OO.inheritClass( ve.TestEventSequencer, ve.EventSequencer );
ve.TestEventSequencer.prototype.postpone = function ( callback ) {
this.postponedCallbacks[ this.postponedCallbackId++ ] = callback;
};
ve.TestEventSequencer.prototype.cancelPostponed = function ( timeoutId ) {
delete this.postponedCallbacks[ timeoutId ];
};
ve.TestEventSequencer.prototype.runPostponed = function () {
var i, len, callback, ids;
function sortStringIds( a, b ) {
return parseInt( a ) - parseInt( b );
}
while ( ( ids = Object.keys( this.postponedCallbacks ) ).length > 0 ) {
ids.sort( sortStringIds );
for ( i = 0, len = ids.length; i < len; i++ ) {
callback = this.postponedCallbacks[ ids[ i ] ];
delete this.postponedCallbacks[ ids[ i ] ];
// Check for existence, because a previous iteration may have cancelled
if ( callback ) {
callback();
}
}
}
};
/* Tests */
QUnit.test( 'EventSequencer', 3, function ( assert ) {
var sequencer,
calls = [];
sequencer = new ve.TestEventSequencer( [ 'event1', 'event2', 'event3' ] ).on( {
event1: function () { calls.push( 'on1' ); },
event3: function () { calls.push( 'on3' ); }
} ).after( {
event2: function () { calls.push( 'after2' ); },
event3: function () { calls.push( 'after3' ); }
} ).onLoop(
function () { calls.push( 'onLoop' ); }
).afterLoop(
function () { calls.push( 'afterLoop' ); }
).afterOne( {
event1: function () { calls.push( 'after1One' ); }
} );
sequencer.onEvent( 'event1' );
sequencer.onEvent( 'event2' );
sequencer.onEvent( 'event3' );
sequencer.runPostponed();
assert.deepEqual(
calls,
[ 'onLoop', 'on1', 'after1One', 'after2', 'on3', 'after3', 'afterLoop' ],
'First event loop'
);
calls.length = 0;
sequencer.afterLoopOne( function () { calls.push( 'afterLoopOne' ); } );
sequencer.onEvent( 'event1' );
sequencer.onEvent( 'event2' );
sequencer.onEvent( 'event3' );
sequencer.runPostponed();
assert.deepEqual(
calls,
[ 'onLoop', 'on1', 'after2', 'on3', 'after3', 'afterLoop', 'afterLoopOne' ],
'Second event loop'
);
calls.length = 0;
sequencer = new ve.TestEventSequencer( [ 'keydown', 'keypress' ] ).on( {
keydown: function () { calls.push( 'onkeydown' ); },
keypress: function () { calls.push( 'onkeypress' ); }
} ).after( {
keydown: function () { calls.push( 'afterkeydown' ); },
keypress: function () { calls.push( 'afterkeypress' ); }
} );
sequencer.onEvent( 'keydown' );
sequencer.onEvent( 'keypress' );
sequencer.runPostponed();
assert.deepEqual(
calls,
[ 'onkeydown', 'onkeypress', 'afterkeydown', 'afterkeypress' ],
'Keydown/keypress special-cased ordering'
);
} );