From 705a7336520c2658112c390e63d5f5dc8bb336b1 Mon Sep 17 00:00:00 2001 From: Timo Tijhof Date: Wed, 28 Sep 2016 19:12:52 +0100 Subject: [PATCH] mw.loader: Add tests for mw.loader StringSet fallback Change-Id: Ia00d793f0332531b5afa006fe8453e2e733d40ba --- resources/src/mediawiki/mediawiki.js | 44 ++++++++++++------- .../mediawiki/mediawiki.loader.test.js | 38 +++++++++++++++- 2 files changed, 64 insertions(+), 18 deletions(-) diff --git a/resources/src/mediawiki/mediawiki.js b/resources/src/mediawiki/mediawiki.js index 33f146b9d4..c2cee7ec6f 100644 --- a/resources/src/mediawiki/mediawiki.js +++ b/resources/src/mediawiki/mediawiki.js @@ -52,23 +52,25 @@ /* eslint-enable no-bitwise */ } - // - StringSet = window.Set || ( function () { - /** - * @private - * @class - */ - function StringSet() { - this.set = {}; - } - StringSet.prototype.add = function ( value ) { - this.set[ value ] = true; - }; - StringSet.prototype.has = function ( value ) { - return hasOwn.call( this.set, value ); - }; - return StringSet; - }() ); + function defineFallbacks() { + // + StringSet = window.Set || ( function () { + /** + * @private + * @class + */ + function StringSet() { + this.set = {}; + } + StringSet.prototype.add = function ( value ) { + this.set[ value ] = true; + }; + StringSet.prototype.has = function ( value ) { + return hasOwn.call( this.set, value ); + }; + return StringSet; + }() ); + } /** * Create an object that can be read from or written to via methods that allow @@ -413,6 +415,8 @@ } }; + defineFallbacks(); + /* eslint-disable no-console */ log = ( function () { // Also update the restoration of methods in mediawiki.log.js @@ -508,6 +512,12 @@ * @class mw */ mw = { + redefineFallbacksForTest: function () { + if ( !window.QUnit ) { + throw new Error( 'Reset not allowed outside unit tests' ); + } + defineFallbacks(); + }, /** * Get the current time, measured in milliseconds since January 1, 1970 (UTC). diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js index 6f9af7677a..477b04dcc9 100644 --- a/tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js @@ -5,6 +5,11 @@ }, teardown: function () { mw.loader.store.enabled = false; + // Teardown for StringSet shim test + if ( this.nativeSet ) { + window.Set = this.nativeSet; + mw.redefineFallbacksForTest(); + } } } ) ); @@ -133,7 +138,8 @@ } ); } ); - QUnit.test( '.using() Error: Circular dependency', function ( assert ) { + // Covers mw.loader#sortDependencies (with native Set if available) + QUnit.test( '.using() Error: Circular dependency [StringSet default]', function ( assert ) { var done = assert.async(); mw.loader.register( [ @@ -152,6 +158,36 @@ .always( done ); } ); + // @covers mw.loader#sortDependencies (with fallback shim) + QUnit.test( '.using() Error: Circular dependency [StringSet shim]', function ( assert ) { + var done = assert.async(); + + if ( !window.Set ) { + assert.expect( 0 ); + done(); + return; + } + + this.nativeSet = window.Set; + window.Set = undefined; + mw.redefineFallbacksForTest(); + + mw.loader.register( [ + [ 'test.shim.circle1', '0', [ 'test.shim.circle2' ] ], + [ 'test.shim.circle2', '0', [ 'test.shim.circle3' ] ], + [ 'test.shim.circle3', '0', [ 'test.shim.circle1' ] ] + ] ); + mw.loader.using( 'test.shim.circle3' ).then( + function done() { + assert.ok( false, 'Unexpected resolution, expected error.' ); + }, + function fail( e ) { + assert.ok( /Circular/.test( String( e ) ), 'Detect circular dependency' ); + } + ) + .always( done ); + } ); + QUnit.test( '.load() - Error: Circular dependency', function ( assert ) { mw.loader.register( [ [ 'test.circleA', '0', [ 'test.circleB' ] ], -- 2.20.1