jenkins-bot has submitted this change and it was merged.
Change subject: Add tests for define and require methods
......................................................................
Add tests for define and require methods
Introduce ModuleLoader class
Bug: T46264
Change-Id: I054d0fa089009cb1f8cf5d26cd2edcd5219528de
---
M javascripts/modules.js
A tests/qunit/test_modules.js
2 files changed, 78 insertions(+), 11 deletions(-)
Approvals:
Jdlrobson: Looks good to me, approved
jenkins-bot: Verified
diff --git a/javascripts/modules.js b/javascripts/modules.js
index 884146d..73fa40c 100644
--- a/javascripts/modules.js
+++ b/javascripts/modules.js
@@ -1,11 +1,19 @@
-/**
- *
- * @class mw.mobileFrontend
- * @singleton
- */
( function () {
- mw.mobileFrontend = {
- _modules: {},
+ var loader;
+
+ /**
+ * Class for managing modules
+ * @class ModuleLoader
+ */
+ function ModuleLoader() {
+ /**
+ * @type {Object} register of defined modules
+ * @private
+ */
+ this._register = {};
+ }
+
+ ModuleLoader.prototype = {
/**
* Require (import) a module previously defined using define().
*
@@ -13,10 +21,10 @@
* @return {Object} Required module, can be any JavaScript
object.
*/
require: function ( id ) {
- if ( !this._modules.hasOwnProperty( id ) ) {
+ if ( !this._register.hasOwnProperty( id ) ) {
throw new Error( 'Module not found: ' + id );
}
- return this._modules[ id ];
+ return this._register[ id ];
},
/**
@@ -26,10 +34,38 @@
* @param {Object} obj Defined module body, can be any
JavaScript object.
*/
define: function ( id, obj ) {
- if ( this._modules.hasOwnProperty( id ) ) {
+ if ( this._register.hasOwnProperty( id ) ) {
throw new Error( 'Module already exists: ' + id
);
}
- this._modules[ id ] = obj;
+ this._register[ id ] = obj;
}
};
+
+ loader = new ModuleLoader();
+
+ /**
+ *
+ * FIXME: In a wonderful world all this could run in a file called
init.js,
+ * all the above code would be core and everyone would be happy.
+ * @class mw.mobileFrontend
+ * @singleton
+ */
+ mw.mobileFrontend = {
+ /**
+ * @see ModuleLoader#define
+ */
+ define: function () {
+ loader.define.apply( loader, arguments );
+ },
+ /**
+ * @see ModuleLoader#require
+ */
+ require: function () {
+ return loader.require.apply( loader, arguments );
+ }
+ };
+
+ // inception to support testing (!!)
+ mw.mobileFrontend.define( 'ModuleLoader', ModuleLoader );
+
} () );
diff --git a/tests/qunit/test_modules.js b/tests/qunit/test_modules.js
new file mode 100644
index 0000000..0fa7eb3
--- /dev/null
+++ b/tests/qunit/test_modules.js
@@ -0,0 +1,31 @@
+//jscs:disable jsDoc
+( function ( M ) {
+ var ModuleLoader = M.require( 'ModuleLoader' );
+
+ QUnit.module( 'MobileFrontend ModuleLoader', {
+ setup: function () {
+ this.loader = new ModuleLoader();
+ }
+ } );
+
+ QUnit.test( '#require', 3, function ( assert ) {
+ this.loader.define( 'foo', 1 );
+ this.loader.define( 'bar', 5 );
+
+ assert.strictEqual( this.loader.require( 'foo' ), 1, 'Returns
appropriate module' );
+ assert.strictEqual( this.loader.require( 'bar' ), 5, 'Returns
appropriate module' );
+ assert.throws( function () {
+ this.loader.require( 'undefinedmodule' );
+ }, 'Cannot require an undefined module.' );
+ } );
+
+ QUnit.test( '#define', 2, function ( assert ) {
+ var loader = this.loader;
+ loader.define( 'foo', 1 );
+ loader.define( 'bar', 5 );
+ assert.throws( function () {
+ loader.define( 'bar', 50 );
+ }, 'Cannot define two modules with the same name' );
+ assert.strictEqual( this.loader.require( 'bar' ), 5, 'Returns
first definition of module.' );
+ } );
+}( mw.mobileFrontend ) );
--
To view, visit https://gerrit.wikimedia.org/r/182968
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I054d0fa089009cb1f8cf5d26cd2edcd5219528de
Gerrit-PatchSet: 9
Gerrit-Project: mediawiki/extensions/MobileFrontend
Gerrit-Branch: master
Gerrit-Owner: Jdlrobson <[email protected]>
Gerrit-Reviewer: Bmansurov <[email protected]>
Gerrit-Reviewer: Jdlrobson <[email protected]>
Gerrit-Reviewer: Phuedx <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits