summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/MultimediaViewer/tests/qunit/mmv/model/mmv.model.TaskQueue.test.js
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/MultimediaViewer/tests/qunit/mmv/model/mmv.model.TaskQueue.test.js')
-rw-r--r--www/wiki/extensions/MultimediaViewer/tests/qunit/mmv/model/mmv.model.TaskQueue.test.js276
1 files changed, 276 insertions, 0 deletions
diff --git a/www/wiki/extensions/MultimediaViewer/tests/qunit/mmv/model/mmv.model.TaskQueue.test.js b/www/wiki/extensions/MultimediaViewer/tests/qunit/mmv/model/mmv.model.TaskQueue.test.js
new file mode 100644
index 00000000..f3958a24
--- /dev/null
+++ b/www/wiki/extensions/MultimediaViewer/tests/qunit/mmv/model/mmv.model.TaskQueue.test.js
@@ -0,0 +1,276 @@
+/*
+ * This file is part of the MediaWiki extension MediaViewer.
+ *
+ * MediaViewer is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * MediaViewer is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MediaViewer. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+( function ( mw, $ ) {
+ QUnit.module( 'mmv.model.TaskQueue', QUnit.newMwEnvironment() );
+
+ QUnit.test( 'TaskQueue constructor sanity check', function ( assert ) {
+ var taskQueue = new mw.mmv.model.TaskQueue();
+
+ assert.ok( taskQueue, 'TaskQueue created successfully' );
+ } );
+
+ QUnit.test( 'Queue length check', function ( assert ) {
+ var taskQueue = new mw.mmv.model.TaskQueue();
+
+ assert.strictEqual( taskQueue.queue.length, 0, 'queue is initially empty' );
+
+ taskQueue.push( function () {} );
+
+ assert.strictEqual( taskQueue.queue.length, 1, 'queue length is incremented on push' );
+ } );
+
+ QUnit.test( 'State check', function ( assert ) {
+ var taskQueue = new mw.mmv.model.TaskQueue(),
+ task = $.Deferred(),
+ promise;
+
+ taskQueue.push( function () { return task; } );
+
+ assert.strictEqual( taskQueue.state, mw.mmv.model.TaskQueue.State.NOT_STARTED,
+ 'state is initially NOT_STARTED' );
+
+ promise = taskQueue.execute().then( function () {
+ assert.strictEqual( taskQueue.state, mw.mmv.model.TaskQueue.State.FINISHED,
+ 'state is FINISHED after execution finished' );
+ } );
+
+ assert.strictEqual( taskQueue.state, mw.mmv.model.TaskQueue.State.RUNNING,
+ 'state is RUNNING after execution started' );
+
+ task.resolve();
+
+ return promise;
+ } );
+
+ QUnit.test( 'State check for cancellation', function ( assert ) {
+ var taskQueue = new mw.mmv.model.TaskQueue(),
+ task = $.Deferred();
+
+ taskQueue.push( function () { return task; } );
+ taskQueue.execute();
+ taskQueue.cancel();
+
+ assert.strictEqual( taskQueue.state, mw.mmv.model.TaskQueue.State.CANCELLED,
+ 'state is CANCELLED after cancellation' );
+ } );
+
+ QUnit.test( 'Test executing empty queue', function ( assert ) {
+ var taskQueue = new mw.mmv.model.TaskQueue();
+
+ return taskQueue.execute().done( function () {
+ assert.ok( true, 'Queue promise resolved' );
+ } );
+ } );
+
+ QUnit.test( 'Simple execution test', function ( assert ) {
+ var taskQueue = new mw.mmv.model.TaskQueue(),
+ called = false;
+
+ taskQueue.push( function () {
+ called = true;
+ } );
+
+ return taskQueue.execute().then( function () {
+ assert.strictEqual( called, true, 'Task executed successfully' );
+ } );
+ } );
+
+ QUnit.test( 'Task execution order test', function ( assert ) {
+ var taskQueue = new mw.mmv.model.TaskQueue(),
+ order = [];
+
+ taskQueue.push( function () {
+ order.push( 1 );
+ } );
+
+ taskQueue.push( function () {
+ var deferred = $.Deferred();
+
+ order.push( 2 );
+
+ setTimeout( function () {
+ deferred.resolve();
+ }, 0 );
+
+ return deferred;
+ } );
+
+ taskQueue.push( function () {
+ order.push( 3 );
+ } );
+
+ return taskQueue.execute().then( function () {
+ assert.deepEqual( order, [ 1, 2, 3 ], 'Tasks executed in order' );
+ } );
+ } );
+
+ QUnit.test( 'Double execution test', function ( assert ) {
+ var taskQueue = new mw.mmv.model.TaskQueue(),
+ called = 0;
+
+ taskQueue.push( function () {
+ called++;
+ } );
+
+ return taskQueue.execute().then( function () {
+ return taskQueue.execute();
+ } ).then( function () {
+ assert.strictEqual( called, 1, 'Task executed only once' );
+ } );
+ } );
+
+ QUnit.test( 'Parallel execution test', function ( assert ) {
+ var taskQueue = new mw.mmv.model.TaskQueue(),
+ called = 0;
+
+ taskQueue.push( function () {
+ called++;
+ } );
+
+ return $.when(
+ taskQueue.execute(),
+ taskQueue.execute()
+ ).then( function () {
+ assert.strictEqual( called, 1, 'Task executed only once' );
+ } );
+ } );
+
+ QUnit.test( 'Test push after execute', function ( assert ) {
+ var taskQueue = new mw.mmv.model.TaskQueue();
+
+ taskQueue.execute();
+
+ try {
+ taskQueue.push( function () {} );
+ } catch ( e ) {
+ assert.ok( e, 'Exception thrown when trying to push to an already running queue' );
+ }
+ } );
+
+ QUnit.test( 'Test failed task', function ( assert ) {
+ var taskQueue = new mw.mmv.model.TaskQueue();
+
+ taskQueue.push( function () {
+ return $.Deferred().reject();
+ } );
+
+ return taskQueue.execute().done( function () {
+ assert.ok( true, 'Queue promise resolved' );
+ } );
+ } );
+
+ QUnit.test( 'Test that tasks wait for each other', function ( assert ) {
+ var taskQueue = new mw.mmv.model.TaskQueue(),
+ longRunningTaskFinished = false,
+ seenFinished = false;
+
+ taskQueue.push( function () {
+ var deferred = $.Deferred();
+
+ setTimeout( function () {
+ longRunningTaskFinished = true;
+ deferred.resolve();
+ }, 0 );
+
+ return deferred;
+ } );
+
+ taskQueue.push( function () {
+ seenFinished = longRunningTaskFinished;
+ } );
+
+ return taskQueue.execute().then( function () {
+ assert.ok( seenFinished, 'Task waits for previous task to finish' );
+ } );
+ } );
+
+ QUnit.test( 'Test cancellation before start', function ( assert ) {
+ var taskQueue = new mw.mmv.model.TaskQueue(),
+ triggered = false,
+ verificationTask = function () {
+ triggered = true;
+ };
+
+ taskQueue.push( verificationTask );
+
+ taskQueue.cancel();
+
+ taskQueue.execute()
+ .done( function () {
+ assert.ok( false, 'Queue promise rejected' );
+ } )
+ .fail( function () {
+ assert.ok( true, 'Queue promise rejected' );
+ assert.strictEqual( triggered, false, 'Task was not triggered' );
+ } )
+ .always( assert.async() );
+ } );
+
+ QUnit.test( 'Test cancellation within callback', function ( assert ) {
+ var taskQueue = new mw.mmv.model.TaskQueue(),
+ triggered = false,
+ verificationTask = function () {
+ triggered = true;
+ };
+
+ taskQueue.push( function () {
+ taskQueue.cancel();
+ } );
+ taskQueue.push( verificationTask );
+
+ taskQueue.execute()
+ .done( function () {
+ assert.ok( false, 'Queue promise rejected' );
+ } )
+ .fail( function () {
+ assert.ok( true, 'Queue promise rejected' );
+ assert.strictEqual( triggered, false, 'Task was not triggered' );
+ } )
+ .always( assert.async() );
+ } );
+
+ QUnit.test( 'Test cancellation from task', function ( assert ) {
+ var taskQueue = new mw.mmv.model.TaskQueue(),
+ triggered = false,
+ task1 = $.Deferred(),
+ verificationTask = function () {
+ triggered = true;
+ };
+
+ taskQueue.push( function () {
+ return task1;
+ } );
+ taskQueue.push( verificationTask );
+
+ setTimeout( function () {
+ taskQueue.cancel();
+ task1.resolve();
+ }, 0 );
+
+ taskQueue.execute()
+ .done( function () {
+ assert.ok( false, 'Queue promise rejected' );
+ } )
+ .fail( function () {
+ assert.ok( true, 'Queue promise rejected' );
+ assert.strictEqual( triggered, false, 'Task was not triggered' );
+ } )
+ .always( assert.async() );
+ } );
+
+}( mediaWiki, jQuery ) );