test: Always use strict equalities

Replace assert.(not)ok/(not)equal with strict equality checks:
assert.true/false/(not)strictEqual.

Will be enforced in upcoming eslint-config-wikimedia release.

Change-Id: I4a9523b72834524a4b4e4339d5b175a8346a646c
This commit is contained in:
Ed Sanders 2021-11-08 17:14:34 +00:00 committed by Krinkle
parent ba7ac9f655
commit e2c4f1ef0d
18 changed files with 126 additions and 139 deletions

View file

@ -61,10 +61,10 @@
// Glue code for nicer integration with QUnit setup/teardown
// Inspired by http://sinonjs.org/releases/sinon-qunit-1.0.0.js
sinon.assert.fail = function ( msg ) {
QUnit.assert.ok( false, msg );
QUnit.assert.true( false, msg );
};
sinon.assert.pass = function ( msg ) {
QUnit.assert.ok( true, msg );
QUnit.assert.true( true, msg );
};
sinon.config = {
injectIntoThis: true,
@ -614,7 +614,7 @@
}
} );
QUnit.test( 'beforeEach', function ( assert ) {
assert.ok( this.mwHtmlLive, 'setup() ran' );
assert.notStrictEqual( this.mwHtmlLive, undefined, 'setup() ran' );
mw.html = null;
} );
QUnit.test( 'afterEach', function ( assert ) {
@ -632,7 +632,7 @@
}
} );
QUnit.test( 'setup', function ( assert ) {
assert.ok( this.mwHtmlLive, 'setup() ran' );
assert.notStrictEqual( this.mwHtmlLive, undefined, 'setup() ran' );
mw.html = null;
} );
QUnit.test( 'teardown', function ( assert ) {
@ -644,7 +644,7 @@
QUnit.module( 'testrunner-nested', function () {
QUnit.module( 'testrunner-nested-inner', function () {
QUnit.test( 'Dummy', function ( assert ) {
assert.ok( true, 'Nested modules supported' );
assert.true( true, 'Nested modules supported' );
} );
} );
} );
@ -662,7 +662,7 @@
QUnit.test(
'`after` hook for module `testrunner-hooks` was executed',
function ( assert ) {
assert.ok( afterHookWasExecuted );
assert.true( afterHookWasExecuted );
}
);
},
@ -672,7 +672,7 @@
} );
QUnit.test( '`before` hook was executed', function ( assert ) {
assert.ok( beforeHookWasExecuted );
assert.true( beforeHookWasExecuted );
} );
} );

View file

@ -53,8 +53,8 @@
// The "a" could be capitalized, and the prefix could be anything, e.g. a simple "^" for ctrl-
// (no browser is known using such a short prefix, though) or "Alt+Umschalt+" in German Firefox.
result = /^Title \[(.+)[aA]\]$/.exec( title );
assert.ok( result, 'title should match expected structure.' );
assert.notEqual( result[ 1 ], 'test-', 'Prefix used for testing shouldn\'t be used in production.' );
assert.notStrictEqual( result, null, 'title should match expected structure.' );
assert.notStrictEqual( result[ 1 ], 'test-', 'Prefix used for testing shouldn\'t be used in production.' );
} );
QUnit.test( 'updateTooltipAccessKeys - no access key', function ( assert ) {

View file

@ -224,8 +224,7 @@
function among( actual, expected, message ) {
if ( Array.isArray( expected ) ) {
// eslint-disable-next-line qunit/no-ok-equality
assert.ok( expected.indexOf( actual ) !== -1, message + ' (got ' + actual + '; expected one of ' + expected.join( ', ' ) + ')' );
assert.true( expected.indexOf( actual ) !== -1, message + ' (got ' + actual + '; expected one of ' + expected.join( ', ' ) + ')' );
} else {
assert.strictEqual( actual, expected, message );
}

View file

@ -10,7 +10,7 @@
var api = new mw.ForeignApi( '//localhost:4242/w/api.php' );
this.server.respond( function ( request ) {
assert.ok( request.url.match( /origin=/ ), 'origin is included in GET requests' );
assert.true( /origin=/.test( request.url ), 'origin is included in GET requests' );
request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
} );
@ -21,8 +21,8 @@
var api = new mw.ForeignApi( '//localhost:4242/w/api.php' );
this.server.respond( function ( request ) {
assert.ok( request.requestBody.match( /origin=/ ), 'origin is included in POST request body' );
assert.ok( request.url.match( /origin=/ ), 'origin is included in POST request URL, too' );
assert.true( /origin=/.test( request.requestBody ), 'origin is included in POST request body' );
assert.true( /origin=/.test( request.url ), 'origin is included in POST request URL, too' );
request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
} );

View file

@ -27,7 +27,7 @@
this.server.respond( function ( request ) {
assert.strictEqual( request.method, 'POST', 'Method should be POST' );
assert.strictEqual( request.url, 'http://test.example.com/rest.php/test/bla/bla/bla', 'Url should be correct' );
assert.ok( /^application\/json/.test( request.requestHeaders[ 'Content-Type' ] ), 'Should set JSON content-type' );
assert.true( /^application\/json/.test( request.requestHeaders[ 'Content-Type' ] ), 'Should set JSON content-type' );
assert.strictEqual( request.requestHeaders.authorization, 'my_token', 'Should pass request header' );
assert.deepEqual( JSON.parse( request.requestBody ), { param: 'value' }, 'Body should be correct' );
request.respond( 201, { 'Content-Type': 'application/json' }, '{}' );

View file

@ -15,7 +15,7 @@
api.saveOption( 'foo', 'bar' );
assert.ok( stub.calledOnce, '#saveOptions called once' );
assert.true( stub.calledOnce, '#saveOptions called once' );
assert.deepEqual( stub.getCall( 0 ).args, [ { foo: 'bar' } ], '#saveOptions called correctly' );
} );
@ -50,32 +50,32 @@
// reset an option, not bundleable
'action=options&format=json&formatversion=2&optionname=foo%7Cbar%3Dquux&token=%2B%5C'
].indexOf( request.requestBody ) !== -1 ) {
assert.ok( true, 'Repond to ' + request.requestBody );
assert.true( true, 'Repond to ' + request.requestBody );
request.respond( 200, { 'Content-Type': 'application/json' },
'{ "options": "success" }' );
} else {
assert.ok( false, 'Unexpected request: ' + request.requestBody );
assert.true( false, 'Unexpected request: ' + request.requestBody );
}
} );
return QUnit.whenPromisesComplete(
api.saveOptions( {} ).then( function () {
assert.ok( true, 'Request completed: empty case' );
assert.true( true, 'Request completed: empty case' );
} ),
api.saveOptions( { foo: 'bar' } ).then( function () {
assert.ok( true, 'Request completed: simple' );
assert.true( true, 'Request completed: simple' );
} ),
api.saveOptions( { foo: 'bar', baz: 'quux' } ).then( function () {
assert.ok( true, 'Request completed: two options' );
assert.true( true, 'Request completed: two options' );
} ),
api.saveOptions( { foo: 'bar|quux', bar: 'a|b|c', baz: 'quux' } ).then( function () {
assert.ok( true, 'Request completed: not bundleable' );
assert.true( true, 'Request completed: not bundleable' );
} ),
api.saveOptions( { foo: null } ).then( function () {
assert.ok( true, 'Request completed: reset an option' );
assert.true( true, 'Request completed: reset an option' );
} ),
api.saveOptions( { 'foo|bar=quux': null } ).then( function () {
assert.ok( true, 'Request completed: reset an option, not bundleable' );
assert.true( true, 'Request completed: reset an option, not bundleable' );
} )
);
} );
@ -112,38 +112,38 @@
// reset an option, not bundleable
'action=options&format=json&formatversion=2&optionname=foo%7Cbar%3Dquux&token=%2B%5C'
].indexOf( request.requestBody ) !== -1 ) {
assert.ok( true, 'Repond to ' + request.requestBody );
assert.true( true, 'Repond to ' + request.requestBody );
request.respond(
200,
{ 'Content-Type': 'application/json' },
'{ "options": "success" }'
);
} else {
assert.ok( false, 'Unexpected request: ' + request.requestBody );
assert.true( false, 'Unexpected request: ' + request.requestBody );
}
} );
return QUnit.whenPromisesComplete(
api.saveOptions( {} ).done( function () {
assert.ok( true, 'Request completed: empty case' );
assert.true( true, 'Request completed: empty case' );
} ),
api.saveOptions( { foo: 'bar' } ).done( function () {
assert.ok( true, 'Request completed: simple' );
assert.true( true, 'Request completed: simple' );
} ),
api.saveOptions( { foo: 'bar', baz: 'quux' } ).done( function () {
assert.ok( true, 'Request completed: two options' );
assert.true( true, 'Request completed: two options' );
} ),
api.saveOptions( { foo: 'bar|quux', bar: 'a|b|c', baz: 'quux' } ).done( function () {
assert.ok( true, 'Request completed: bundleable with unit separator' );
assert.true( true, 'Request completed: bundleable with unit separator' );
} ),
api.saveOptions( { foo: 'bar|quux', bar: 'a|b|c', 'baz=baz': 'quux' } ).done( function () {
assert.ok( true, 'Request completed: not bundleable with unit separator' );
assert.true( true, 'Request completed: not bundleable with unit separator' );
} ),
api.saveOptions( { foo: null } ).done( function () {
assert.ok( true, 'Request completed: reset an option' );
assert.true( true, 'Request completed: reset an option' );
} ),
api.saveOptions( { 'foo|bar=quux': null } ).done( function () {
assert.ok( true, 'Request completed: reset an option, not bundleable' );
assert.true( true, 'Request completed: reset an option, not bundleable' );
} )
);
} );

View file

@ -83,10 +83,10 @@
this.server.respond( function ( request ) {
if ( window.FormData ) {
assert.notOk( request.url.match( /action=/ ), 'Request has no query string' );
assert.ok( request.requestBody instanceof FormData, 'Request uses FormData body' );
assert.false( /action=/.test( request.url ), 'Request has no query string' );
assert.true( request.requestBody instanceof FormData, 'Request uses FormData body' );
} else {
assert.notOk( request.url.match( /action=test/ ), 'Request has no query string' );
assert.false( /action=test/.test( request.url ), 'Request has no query string' );
assert.strictEqual( request.requestBody, 'action=test&format=json', 'Request uses query string body' );
}
request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
@ -133,8 +133,8 @@
var api = new mw.Api();
this.server.respond( function ( request ) {
assert.notOk( request.url.match( /foo/ ), 'foo query parameter is not present' );
assert.ok( request.url.match( /bar=true/ ), 'bar query parameter is present with value true' );
assert.false( /foo/.test( request.url ), 'foo query parameter is not present' );
assert.true( /bar=true/.test( request.url ), 'bar query parameter is present with value true' );
request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
} );
@ -149,7 +149,7 @@
// a request as it should be retrieved from mw.user.tokens.
return api.getToken( 'csrf' )
.then( function ( token ) {
assert.ok( token.length, 'Got a token' );
assert.true( token.length > 0, 'Got a token' );
}, function ( err ) {
assert.strictEqual( err, '', 'API error' );
} )
@ -364,7 +364,7 @@
return api.postWithToken( 'csrf',
{ action: 'example' },
function () {
assert.ok( false, 'This parameter cannot be a callback' );
assert.true( false, 'This parameter cannot be a callback' );
}
);
} ).then( function ( data ) {
@ -473,7 +473,7 @@
this.api.abort();
assert.strictEqual( this.requests.length, 2, 'Check both requests triggered' );
this.requests.forEach( function ( request, i ) {
assert.ok( request.abort.calledOnce, 'abort request number ' + i );
assert.true( request.abort.calledOnce, 'abort request number ' + i );
} );
} );
}() );

View file

@ -3,7 +3,7 @@
QUnit.test( 'Basic functionality', function ( assert ) {
var api = new mw.Api();
assert.ok( api.upload );
assert.strictEqual( typeof api.upload, 'function' );
assert.throws( function () {
api.upload();
} );

View file

@ -11,7 +11,7 @@
this.server.respond( function ( request ) {
assert.strictEqual( request.method, 'GET' );
assert.ok(
assert.true(
/rest.php\/test\/rest\/path\?queryParam=%2Fslash-will-be-encoded%3F$/.test( request.url ),
'Should have correct request URL'
);
@ -36,7 +36,7 @@
} );
this.server.respond( function ( request ) {
assert.ok( /test.php\/test\/rest\/path$/.test( request.url ), 'Should have correct request URL' );
assert.true( /test.php\/test\/rest\/path$/.test( request.url ), 'Should have correct request URL' );
request.respond( 200, { 'Content-Type': 'application/json' }, '{}' );
} );
@ -50,8 +50,8 @@
this.server.respond( function ( request ) {
assert.strictEqual( request.method, 'POST', 'Method should be POST' );
assert.ok( /rest.php\/test\/bla\/bla\/bla$/.test( request.url ), 'Url should be correct' );
assert.ok( /^application\/json/.test( request.requestHeaders[ 'Content-Type' ] ), 'Should set JSON content-type' );
assert.true( /rest.php\/test\/bla\/bla\/bla$/.test( request.url ), 'Url should be correct' );
assert.true( /^application\/json/.test( request.requestHeaders[ 'Content-Type' ] ), 'Should set JSON content-type' );
assert.strictEqual( request.requestHeaders.authorization, 'my_token', 'Should pass request header' );
assert.deepEqual( JSON.parse( request.requestBody ), { param: 'value' }, 'Body should be correct' );
request.respond( 201, { 'Content-Type': 'application/json' }, '{}' );
@ -99,7 +99,7 @@
this.api.abort();
assert.strictEqual( this.requests.length, 2, 'Check both requests triggered' );
this.requests.forEach( function ( request, i ) {
assert.ok( request.abort.calledOnce, 'abort request number ' + i );
assert.true( request.abort.calledOnce, 'abort request number ' + i );
} );
} );
}() );

View file

@ -281,7 +281,7 @@
model.initializeFilters( filterDefinition, viewsDefinition );
// Test that all items were created
assert.ok(
assert.true(
Object.keys( baseFilterRepresentation ).every( function ( filterName ) {
return model.getItemByName( filterName ) instanceof mw.rcfilters.dm.FilterItem;
} ),
@ -542,7 +542,7 @@
} );
foundMatches = model.findMatches( 'foo' );
assert.ok(
assert.true(
$.isEmptyObject( foundMatches ),
'findMatches returns an empty object when no results found'
);

View file

@ -240,12 +240,9 @@
foo: 'quux',
pif: 'paf'
} );
// eslint-disable-next-line qunit/no-ok-equality
assert.ok( uri.toString().indexOf( 'foo=quux' ) !== -1, 'extend query arguments' );
// eslint-disable-next-line qunit/no-ok-equality
assert.notOk( uri.toString().indexOf( 'foo=bar' ) !== -1, 'extend query arguments' );
// eslint-disable-next-line qunit/no-ok-equality
assert.ok( uri.toString().indexOf( 'pif=paf' ) !== -1, 'extend query arguments' );
assert.true( uri.toString().indexOf( 'foo=quux' ) !== -1, 'extend query arguments' );
assert.false( uri.toString().indexOf( 'foo=bar' ) !== -1, 'extend query arguments' );
assert.true( uri.toString().indexOf( 'pif=paf' ) !== -1, 'extend query arguments' );
} );
QUnit.test( '.getQueryString()', function ( assert ) {
@ -338,8 +335,8 @@
assert.notStrictEqual( clone, original, 'clone is a different object when compared by reference' );
clone.host = 'bar.example.org';
assert.notEqual( original.host, clone.host, 'manipulating clone did not effect original' );
assert.notEqual( original.toString(), clone.toString(), 'Stringified url no longer matches original' );
assert.notStrictEqual( original.host, clone.host, 'manipulating clone did not effect original' );
assert.notStrictEqual( original.toString(), clone.toString(), 'Stringified url no longer matches original' );
clone.query.three = 3;
@ -361,10 +358,8 @@
// Verify parts and total length instead of entire string because order
// of iteration can vary.
// eslint-disable-next-line qunit/no-ok-equality
assert.ok( uri.toString().indexOf( 'm=bar' ) !== -1, 'toString preserves other values' );
// eslint-disable-next-line qunit/no-ok-equality
assert.ok( uri.toString().indexOf( 'n=x&n=y&n=z' ) !== -1, 'toString parameter includes all values of an array query parameter' );
assert.true( uri.toString().indexOf( 'm=bar' ) !== -1, 'toString preserves other values' );
assert.true( uri.toString().indexOf( 'n=x&n=y&n=z' ) !== -1, 'toString parameter includes all values of an array query parameter' );
assert.strictEqual( uri.toString().length, 'http://www.example.com/dir/?m=bar&n=x&n=y&n=z'.length, 'toString matches expected string' );
uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', {
@ -376,10 +371,8 @@
// Verify parts and total length instead of entire string because order
// of iteration can vary.
// eslint-disable-next-line qunit/no-ok-equality
assert.ok( uri.toString().indexOf( 'm=foo&m=bar' ) !== -1, 'toString preserves other values' );
// eslint-disable-next-line qunit/no-ok-equality
assert.ok( uri.toString().indexOf( 'n=x&n=y&n=z' ) !== -1, 'toString parameter includes all values of an array query parameter' );
assert.true( uri.toString().indexOf( 'm=foo&m=bar' ) !== -1, 'toString preserves other values' );
assert.true( uri.toString().indexOf( 'n=x&n=y&n=z' ) !== -1, 'toString parameter includes all values of an array query parameter' );
assert.strictEqual( uri.toString().length, 'http://www.example.com/dir/?m=foo&m=bar&n=x&n=y&n=z'.length, 'toString matches expected string' );
// Remove query values
@ -489,19 +482,15 @@
assert.strictEqual( uri.getHostPort(), 'www.example.com:81', 'hostport equal to host:port' );
queryString = uri.getQueryString();
// eslint-disable-next-line qunit/no-ok-equality
assert.ok( queryString.indexOf( 'q1=0' ) !== -1, 'query param with numbers' );
// eslint-disable-next-line qunit/no-ok-equality
assert.ok( queryString.indexOf( 'test1' ) !== -1, 'query param with null value is included' );
// eslint-disable-next-line qunit/no-ok-equality
assert.notOk( queryString.indexOf( 'test1=' ) !== -1, 'query param with null value does not generate equals sign' );
// eslint-disable-next-line qunit/no-ok-equality
assert.ok( queryString.indexOf( 'test2=value+%28escaped%29' ) !== -1, 'query param is url escaped' );
assert.true( queryString.indexOf( 'q1=0' ) !== -1, 'query param with numbers' );
assert.true( queryString.indexOf( 'test1' ) !== -1, 'query param with null value is included' );
assert.false( queryString.indexOf( 'test1=' ) !== -1, 'query param with null value does not generate equals sign' );
assert.true( queryString.indexOf( 'test2=value+%28escaped%29' ) !== -1, 'query param is url escaped' );
relativePath = uri.getRelativePath();
assert.ok( relativePath.indexOf( uri.path ) >= 0, 'path in relative path' );
assert.ok( relativePath.indexOf( uri.getQueryString() ) >= 0, 'query string in relative path' );
assert.ok( relativePath.indexOf( mw.Uri.encode( uri.fragment ) ) >= 0, 'escaped fragment in relative path' );
assert.true( relativePath.indexOf( uri.path ) >= 0, 'path in relative path' );
assert.true( relativePath.indexOf( uri.getQueryString() ) >= 0, 'query string in relative path' );
assert.true( relativePath.indexOf( mw.Uri.encode( uri.fragment ) ) >= 0, 'escaped fragment in relative path' );
} );
QUnit.test( 'Parse a uri with an @ symbol in the path and query', function ( assert ) {

View file

@ -14,7 +14,7 @@
mw.errorLogger.installGlobalHandler( w );
assert.ok( w.onerror, 'Global handler has been installed' );
assert.strictEqual( typeof w.onerror, 'function', 'Global handler has been installed' );
assert.strictEqual(
w.onerror(
errorMessage,

View file

@ -1273,7 +1273,7 @@
mw.messages.set( 'object-double-replace', 'Foo 1: $1 2: $1' );
$messageArgument = $( '<div class="bar">&gt;</div>' );
$message = $( '<span>' ).msg( 'object-double-replace', $messageArgument );
assert.ok(
assert.true(
$message[ 0 ].contains( $messageArgument[ 0 ] ),
'The original jQuery object is actually in the DOM'
);

View file

@ -21,7 +21,7 @@
} ) );
QUnit.test( 'options', function ( assert ) {
assert.ok( mw.user.options instanceof mw.Map, 'options instance of mw.Map' );
assert.true( mw.user.options instanceof mw.Map, 'options instance of mw.Map' );
} );
QUnit.test( 'getters (anonymous)', function ( assert ) {
@ -95,7 +95,7 @@
assert.strictEqual( result.length, 20, 'size' );
result2 = mw.user.generateRandomSessionId();
assert.notEqual( result, result2, 'different when called multiple times' );
assert.notStrictEqual( result, result2, 'different when called multiple times' );
} );
@ -118,7 +118,7 @@
assert.strictEqual( result.length, 20, 'size' );
result2 = mw.user.generateRandomSessionId();
assert.notEqual( result, result2, 'different when called multiple times' );
assert.notStrictEqual( result, result2, 'different when called multiple times' );
} );
QUnit.test( 'getPageviewToken', function ( assert ) {

View file

@ -601,14 +601,14 @@
mw.util.setOptionsForTest( { GenerateThumbnailOnParse: false } );
data = mw.util.parseImageUrl( thisCase.url );
if ( thisCase.name !== undefined ) {
assert.ok( data, 'Parses successfully' );
assert.notStrictEqual( data, null, 'Parses successfully' );
assert.strictEqual( data.name, thisCase.name, 'File name is correct' );
assert.strictEqual( data.width, thisCase.width, 'Width is correct' );
if ( thisCase.resizedUrl ) {
assert.ok( data.resizeUrl, 'resizeUrl is set' );
assert.strictEqual( typeof data.resizeUrl, 'function', 'resizeUrl is set' );
assert.strictEqual( data.resizeUrl( 1000 ), thisCase.resizedUrl, 'Resized URL is correct' );
} else {
assert.notOk( data.resizeUrl, 'resizeUrl is not set' );
assert.strictEqual( data.resizeUrl, null, 'resizeUrl is not set' );
}
} else {
assert.strictEqual( data, null, thisCase.typeOfUrl + ', should not produce an mw.Title object' );
@ -622,7 +622,7 @@
mw.util.setOptionsForTest( { GenerateThumbnailOnParse: true } );
this.sandbox.stub( mw.config.values, 'wgScript', '/w' );
resizeUrl = mw.util.parseImageUrl( '//upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Princess_Alexandra_of_Denmark_%28later_Queen_Alexandra%2C_wife_of_Edward_VII%29_with_her_two_eldest_sons%2C_Prince_Albert_Victor_%28Eddy%29_and_George_Frederick_Ernest_Albert_%28later_George_V%29.jpg/939px-thumbnail.jpg' ).resizeUrl;
assert.ok( resizeUrl, 'resizeUrl is set' );
assert.strictEqual( typeof resizeUrl, 'function', 'resizeUrl is set' );
assert.strictEqual( resizeUrl( 500 ), '/w?title=Special:Redirect/file/Princess_Alexandra_of_Denmark_(later_Queen_Alexandra,_wife_of_Edward_VII)_with_her_two_eldest_sons,_Prince_Albert_Victor_(Eddy)_and_George_Frederick_Ernest_Albert_(later_George_V).jpg&width=500', 'Resized URL is correct' );
} );
} );
@ -705,7 +705,7 @@
);
util.init();
assert.ok( util.$content instanceof $, 'jQuery object' );
assert.true( util.$content instanceof $, 'jQuery object' );
assert.strictEqual( mw.util.$content[ 0 ], node, 'node' );
assert.strictEqual( mw.util.$content.length, 1, 'length' );
} );
@ -717,14 +717,14 @@
);
util.init();
assert.ok( util.$content instanceof $, 'jQuery object' );
assert.true( util.$content instanceof $, 'jQuery object' );
assert.strictEqual( mw.util.$content[ 0 ], node, 'node' );
assert.strictEqual( mw.util.$content.length, 1, 'length' );
} );
QUnit.test( 'init (body fallback)', function ( assert ) {
util.init();
assert.ok( util.$content instanceof $, 'jQuery object' );
assert.true( util.$content instanceof $, 'jQuery object' );
assert.strictEqual( mw.util.$content[ 0 ], document.body, 'node' );
assert.strictEqual( mw.util.$content.length, 1, 'length' );
} );

View file

@ -27,36 +27,36 @@
QUnit.test( 'isElementInViewport', function ( assert ) {
var viewport = $.extend( {}, DEFAULT_VIEWPORT );
assert.ok( mw.viewport.isElementInViewport( this.el, viewport ),
assert.true( mw.viewport.isElementInViewport( this.el, viewport ),
'It should return true when the element is fully enclosed in the viewport' );
viewport.right = 20;
viewport.bottom = 20;
assert.ok( mw.viewport.isElementInViewport( this.el, viewport ),
assert.true( mw.viewport.isElementInViewport( this.el, viewport ),
'It should return true when only the top-left of the element is within the viewport' );
viewport.top = 40;
viewport.left = 40;
viewport.right = 50;
viewport.bottom = 50;
assert.ok( mw.viewport.isElementInViewport( this.el, viewport ),
assert.true( mw.viewport.isElementInViewport( this.el, viewport ),
'It should return true when only the bottom-right is within the viewport' );
viewport.top = 30;
viewport.left = 30;
viewport.right = 35;
viewport.bottom = 35;
assert.ok( mw.viewport.isElementInViewport( this.el, viewport ),
assert.true( mw.viewport.isElementInViewport( this.el, viewport ),
'It should return true when the element encapsulates the viewport' );
viewport.top = 0;
viewport.left = 0;
viewport.right = 19;
viewport.bottom = 19;
assert.notOk( mw.viewport.isElementInViewport( this.el, viewport ),
assert.false( mw.viewport.isElementInViewport( this.el, viewport ),
'It should return false when the element is not within the viewport' );
assert.ok( mw.viewport.isElementInViewport( this.el ),
assert.true( mw.viewport.isElementInViewport( this.el ),
'It should default to the window object if no viewport is given' );
} );
@ -77,7 +77,7 @@
} )
.get( 0 );
window.scrollTo( viewport.left, viewport.top );
assert.ok( mw.viewport.isElementInViewport( el, viewport ),
assert.true( mw.viewport.isElementInViewport( el, viewport ),
'It should return true when the element is fully enclosed in the ' +
'viewport even when the page is scrolled down' );
window.scrollTo( 0, 0 );
@ -101,11 +101,11 @@
} )
.get( 0 );
assert.ok( mw.viewport.isElementCloseToViewport( this.el, 60, viewport ),
assert.true( mw.viewport.isElementCloseToViewport( this.el, 60, viewport ),
'It should return true when the element is within the given threshold away' );
assert.notOk( mw.viewport.isElementCloseToViewport( this.el, 20, viewport ),
assert.false( mw.viewport.isElementCloseToViewport( this.el, 20, viewport ),
'It should return false when the element is further than the given threshold away' );
assert.notOk( mw.viewport.isElementCloseToViewport( distantElement ),
assert.false( mw.viewport.isElementCloseToViewport( distantElement ),
'It should default to a threshold of 50px and the window\'s viewport' );
} );

View file

@ -32,16 +32,16 @@
} ) );
QUnit.test( 'Initial check', function ( assert ) {
assert.ok( window.jQuery, 'jQuery defined' );
assert.ok( window.$, '$ defined' );
assert.strictEqual( typeof window.jQuery, 'function', 'jQuery defined' );
assert.strictEqual( typeof window.$, 'function', '$ defined' );
assert.strictEqual( window.$, window.jQuery, '$ alias to jQuery' );
// window.mw and window.mediaWiki are not deprecated, but for some reason
// PhantomJS is triggerring the accessors on all mw.* properties in this test,
// and with that lots of unrelated deprecation notices.
this.suppressWarnings();
assert.ok( window.mediaWiki, 'mediaWiki defined' );
assert.ok( window.mw, 'mw defined' );
assert.strictEqual( typeof window.mediaWiki, 'object', 'mediaWiki defined' );
assert.strictEqual( typeof window.mw, 'object', 'mw defined' );
assert.strictEqual( window.mw, window.mediaWiki, 'mw alias to mediaWiki' );
this.restoreWarnings();
} );
@ -82,8 +82,8 @@
}
}
assert.ok( mw.messages, 'messages defined' );
assert.ok( mw.messages.set( 'hello', 'Hello <b>awesome</b> world' ), 'mw.messages.set: Register' );
assert.strictEqual( typeof mw.messages, 'object', 'messages defined' );
assert.true( mw.messages.set( 'hello', 'Hello <b>awesome</b> world' ), 'mw.messages.set: Register' );
hello = mw.message( 'hello' );
@ -95,7 +95,7 @@
assert.deepEqual( hello.parameters, [], 'Message property "parameters" defaults to an empty array' );
// TODO
assert.ok( hello.params, 'Message prototype "params"' );
assert.strictEqual( typeof hello.params, 'function', 'Message prototype "params"' );
hello.format = 'plain';
assert.strictEqual( hello.toString(), 'Hello <b>awesome</b> world', 'Message.toString returns the message as a string with the current "format"' );
@ -103,12 +103,12 @@
assert.strictEqual( hello.escaped(), 'Hello &lt;b&gt;awesome&lt;/b&gt; world', 'Message.escaped returns the escaped message' );
assert.strictEqual( hello.format, 'escaped', 'Message.escaped correctly updated the "format" property' );
assert.ok( mw.messages.set( 'multiple-curly-brace', '"{{SITENAME}}" is the home of {{int:other-message}}' ), 'mw.messages.set: Register' );
assert.true( mw.messages.set( 'multiple-curly-brace', '"{{SITENAME}}" is the home of {{int:other-message}}' ), 'mw.messages.set: Register' );
assertMultipleFormats( [ 'multiple-curly-brace' ], [ 'text', 'parse' ], '"' + siteName + '" is the home of Other Message', 'Curly brace format works correctly' );
assert.strictEqual( mw.message( 'multiple-curly-brace' ).plain(), mw.messages.get( 'multiple-curly-brace' ), 'Plain format works correctly for curly brace message' );
assert.strictEqual( mw.message( 'multiple-curly-brace' ).escaped(), mw.html.escape( '"' + siteName + '" is the home of Other Message' ), 'Escaped format works correctly for curly brace message' );
assert.ok( mw.messages.set( 'multiple-square-brackets-and-ampersand', 'Visit the [[Project:Community portal|community portal]] & [[Project:Help desk|help desk]]' ), 'mw.messages.set: Register' );
assert.true( mw.messages.set( 'multiple-square-brackets-and-ampersand', 'Visit the [[Project:Community portal|community portal]] & [[Project:Help desk|help desk]]' ), 'mw.messages.set: Register' );
assertMultipleFormats( [ 'multiple-square-brackets-and-ampersand' ], [ 'plain', 'text' ], mw.messages.get( 'multiple-square-brackets-and-ampersand' ), 'Square bracket message is not processed' );
assert.strictEqual( mw.message( 'multiple-square-brackets-and-ampersand' ).escaped(), 'Visit the [[Project:Community portal|community portal]] &amp; [[Project:Help desk|help desk]]', 'Escaped format works correctly for square bracket message' );
assert.htmlEqual( mw.message( 'multiple-square-brackets-and-ampersand' ).parse(), 'Visit the ' +
@ -138,14 +138,14 @@
assertMultipleFormats( [ 'good<>bye' ], [ 'plain', 'text', 'parse', 'escaped' ], '⧼good&lt;&gt;bye⧽', 'Message.toString returns ⧼key⧽ if key does not exist' );
assert.ok( mw.messages.set( 'plural-test-msg', 'There {{PLURAL:$1|is|are}} $1 {{PLURAL:$1|result|results}}' ), 'mw.messages.set: Register' );
assert.true( mw.messages.set( 'plural-test-msg', 'There {{PLURAL:$1|is|are}} $1 {{PLURAL:$1|result|results}}' ), 'mw.messages.set: Register' );
assertMultipleFormats( [ 'plural-test-msg', 6 ], [ 'text', 'parse', 'escaped' ], 'There are 6 results', 'plural get resolved' );
assert.strictEqual( mw.message( 'plural-test-msg', 6 ).plain(), 'There {{PLURAL:6|is|are}} 6 {{PLURAL:6|result|results}}', 'Parameter is substituted but plural is not resolved in plain' );
assert.ok( mw.messages.set( 'plural-test-msg-explicit', 'There {{plural:$1|is one car|are $1 cars|0=are no cars|12=are a dozen cars}}' ), 'mw.messages.set: Register message with explicit plural forms' );
assert.true( mw.messages.set( 'plural-test-msg-explicit', 'There {{plural:$1|is one car|are $1 cars|0=are no cars|12=are a dozen cars}}' ), 'mw.messages.set: Register message with explicit plural forms' );
assertMultipleFormats( [ 'plural-test-msg-explicit', 12 ], [ 'text', 'parse', 'escaped' ], 'There are a dozen cars', 'explicit plural get resolved' );
assert.ok( mw.messages.set( 'plural-test-msg-explicit-beginning', 'Basket has {{plural:$1|0=no eggs|12=a dozen eggs|6=half a dozen eggs|one egg|$1 eggs}}' ), 'mw.messages.set: Register message with explicit plural forms' );
assert.true( mw.messages.set( 'plural-test-msg-explicit-beginning', 'Basket has {{plural:$1|0=no eggs|12=a dozen eggs|6=half a dozen eggs|one egg|$1 eggs}}' ), 'mw.messages.set: Register message with explicit plural forms' );
assertMultipleFormats( [ 'plural-test-msg-explicit-beginning', 1 ], [ 'text', 'parse', 'escaped' ], 'Basket has one egg', 'explicit plural given at beginning get resolved for singular' );
assertMultipleFormats( [ 'plural-test-msg-explicit-beginning', 4 ], [ 'text', 'parse', 'escaped' ], 'Basket has 4 eggs', 'explicit plural given at beginning get resolved for plural' );
assertMultipleFormats( [ 'plural-test-msg-explicit-beginning', 6 ], [ 'text', 'parse', 'escaped' ], 'Basket has half a dozen eggs', 'explicit plural given at beginning get resolved for 6' );
@ -157,10 +157,10 @@
assert.strictEqual( mw.message( 'mediawiki-test-pagetriage-del-talk-page-notify-summary', specialCharactersPageName ).escaped(), 'Notifying author of deletion nomination for [[' + mw.html.escape( specialCharactersPageName ) + ']]', 'Double square brackets with one parameter, when escaped' );
assert.ok( mw.messages.set( 'mediawiki-test-categorytree-collapse-bullet', '[<b></b>]' ), 'mw.messages.set: Register' );
assert.true( mw.messages.set( 'mediawiki-test-categorytree-collapse-bullet', '[<b></b>]' ), 'mw.messages.set: Register' );
assert.strictEqual( mw.message( 'mediawiki-test-categorytree-collapse-bullet' ).plain(), mw.messages.get( 'mediawiki-test-categorytree-collapse-bullet' ), 'Single square brackets unchanged in plain mode' );
assert.ok( mw.messages.set( 'mediawiki-test-wikieditor-toolbar-help-content-signature-result', '<a href=\'#\' title=\'{{#special:mypage}}\'>Username</a> (<a href=\'#\' title=\'{{#special:mytalk}}\'>talk</a>)' ), 'mw.messages.set: Register' );
assert.true( mw.messages.set( 'mediawiki-test-wikieditor-toolbar-help-content-signature-result', '<a href=\'#\' title=\'{{#special:mypage}}\'>Username</a> (<a href=\'#\' title=\'{{#special:mytalk}}\'>talk</a>)' ), 'mw.messages.set: Register' );
assert.strictEqual( mw.message( 'mediawiki-test-wikieditor-toolbar-help-content-signature-result' ).plain(), mw.messages.get( 'mediawiki-test-wikieditor-toolbar-help-content-signature-result' ), 'HTML message with curly braces is not changed in plain mode' );
assertMultipleFormats( [ 'gender-plural-msg', 'male', 1 ], [ 'text', 'parse', 'escaped' ], 'he is awesome', 'Gender and plural are resolved' );
@ -176,7 +176,7 @@
assertMultipleFormats( [ 'int-msg' ], [ 'text', 'parse', 'escaped' ], 'Some Other Message', 'int is resolved' );
assert.strictEqual( mw.message( 'int-msg' ).plain(), mw.messages.get( 'int-msg' ), 'int is not resolved in plain mode' );
assert.ok( mw.messages.set( 'mediawiki-italics-msg', '<i>Very</i> important' ), 'mw.messages.set: Register' );
assert.true( mw.messages.set( 'mediawiki-italics-msg', '<i>Very</i> important' ), 'mw.messages.set: Register' );
assertMultipleFormats( [ 'mediawiki-italics-msg' ], [ 'plain', 'text', 'parse' ], mw.messages.get( 'mediawiki-italics-msg' ), 'Simple italics unchanged' );
assert.htmlEqual(
mw.message( 'mediawiki-italics-msg' ).escaped(),
@ -184,7 +184,7 @@
'Italics are escaped in escaped mode'
);
assert.ok( mw.messages.set( 'mediawiki-italics-with-link', 'An <i>italicized [[link|wiki-link]]</i>' ), 'mw.messages.set: Register' );
assert.true( mw.messages.set( 'mediawiki-italics-with-link', 'An <i>italicized [[link|wiki-link]]</i>' ), 'mw.messages.set: Register' );
assertMultipleFormats( [ 'mediawiki-italics-with-link' ], [ 'plain', 'text' ], mw.messages.get( 'mediawiki-italics-with-link' ), 'Italics with link unchanged' );
assert.htmlEqual(
mw.message( 'mediawiki-italics-with-link' ).escaped(),
@ -197,7 +197,7 @@
'Italics with link inside in parse mode'
);
assert.ok( mw.messages.set( 'mediawiki-script-msg', '<script >alert( "Who put this script here?" );</script>' ), 'mw.messages.set: Register' );
assert.true( mw.messages.set( 'mediawiki-script-msg', '<script >alert( "Who put this script here?" );</script>' ), 'mw.messages.set: Register' );
assertMultipleFormats( [ 'mediawiki-script-msg' ], [ 'plain', 'text' ], mw.messages.get( 'mediawiki-script-msg' ), 'Script unchanged' );
assert.htmlEqual(
mw.message( 'mediawiki-script-msg' ).escaped(),
@ -223,11 +223,11 @@
} );
QUnit.test( 'mw.msg', function ( assert ) {
assert.ok( mw.messages.set( 'hello', 'Hello <b>awesome</b> world' ), 'mw.messages.set: Register' );
assert.true( mw.messages.set( 'hello', 'Hello <b>awesome</b> world' ), 'mw.messages.set: Register' );
assert.strictEqual( mw.msg( 'hello' ), 'Hello <b>awesome</b> world', 'Gets message with default options (existing message)' );
assert.strictEqual( mw.msg( 'goodbye' ), '⧼goodbye⧽', 'Gets message with default options (nonexistent message)' );
assert.ok( mw.messages.set( 'plural-item', 'Found $1 {{PLURAL:$1|item|items}}' ), 'mw.messages.set: Register' );
assert.true( mw.messages.set( 'plural-item', 'Found $1 {{PLURAL:$1|item|items}}' ), 'mw.messages.set: Register' );
assert.strictEqual( mw.msg( 'plural-item', 5 ), 'Found 5 items', 'Apply plural for count 5' );
assert.strictEqual( mw.msg( 'plural-item', 0 ), 'Found 0 items', 'Apply plural for count 0' );
assert.strictEqual( mw.msg( 'plural-item', 1 ), 'Found 1 item', 'Apply plural for count 1' );

View file

@ -3,7 +3,7 @@
setup: function ( assert ) {
// Expose for load.mock.php
mw.loader.testFail = function ( reason ) {
assert.ok( false, reason );
assert.true( false, reason );
};
this.resetStore = false;
@ -155,10 +155,10 @@
] );
mw.loader.using( 'test.set.circleC' ).then(
function () {
assert.ok( false, 'Unexpected resolution, expected error.' );
assert.true( false, 'Unexpected resolution, expected error.' );
},
function ( e ) {
assert.ok( /Circular/.test( String( e ) ), 'Detect circular dependency' );
assert.true( /Circular/.test( String( e ) ), 'Detect circular dependency' );
}
)
.always( done );
@ -185,10 +185,10 @@
] );
mw.loader.using( 'test.shim.circleC' ).then(
function () {
assert.ok( false, 'Unexpected resolution, expected error.' );
assert.true( false, 'Unexpected resolution, expected error.' );
},
function ( e ) {
assert.ok( /Circular/.test( String( e ) ), 'Detect circular dependency' );
assert.true( /Circular/.test( String( e ) ), 'Detect circular dependency' );
}
)
.always( done );
@ -251,10 +251,10 @@
mw.loader.using( 'test.using.unreg' ).then(
function () {
assert.ok( false, 'Unexpected resolution, expected error.' );
assert.true( false, 'Unexpected resolution, expected error.' );
},
function ( e ) {
assert.ok( /Unknown/.test( String( e ) ), 'Detect unknown dependency' );
assert.true( /Unknown/.test( String( e ) ), 'Detect unknown dependency' );
}
).always( done );
} );
@ -298,7 +298,7 @@
QUnit.test( '.implement( styles={ "css": [text, ..] } )', function ( assert ) {
var $element = $( '<div class="mw-test-implement-a"></div>' ).appendTo( '#qunit-fixture' );
assert.notEqual(
assert.notStrictEqual(
$element.css( 'float' ),
'right',
'style is clear'
@ -327,17 +327,17 @@
$element3 = $( '<div class="mw-test-implement-b3"></div>' ).appendTo( '#qunit-fixture' ),
done = assert.async();
assert.notEqual(
assert.notStrictEqual(
$element1.css( 'text-align' ),
'center',
'style is clear'
);
assert.notEqual(
assert.notStrictEqual(
$element2.css( 'float' ),
'left',
'style is clear'
);
assert.notEqual(
assert.notStrictEqual(
$element3.css( 'text-align' ),
'right',
'style is clear'
@ -351,7 +351,7 @@
// assertStyleAsync calls have completed.
var pending = 2;
assertStyleAsync( assert, $element2, 'float', 'left', function () {
assert.notEqual( $element1.css( 'text-align' ), 'center', 'print style is not applied' );
assert.notStrictEqual( $element1.css( 'text-align' ), 'center', 'print style is not applied' );
pending--;
if ( pending === 0 ) {
@ -359,7 +359,7 @@
}
} );
assertStyleAsync( assert, $element3, 'float', 'right', function () {
assert.notEqual( $element1.css( 'text-align' ), 'center', 'print style is not applied' );
assert.notStrictEqual( $element1.css( 'text-align' ), 'center', 'print style is not applied' );
pending--;
if ( pending === 0 ) {
@ -435,12 +435,12 @@
var $element = $( '<div class="mw-test-implement-e"></div>' ).appendTo( '#qunit-fixture' ),
$element2 = $( '<div class="mw-test-implement-e2"></div>' ).appendTo( '#qunit-fixture' );
assert.notEqual(
assert.notStrictEqual(
$element.css( 'float' ),
'right',
'style is clear'
);
assert.notEqual(
assert.notStrictEqual(
$element2.css( 'float' ),
'left',
'style is clear'
@ -495,7 +495,7 @@
mw.loader.implement( 'test.implement.msgs', [], {}, { T31107: 'loaded' } );
return mw.loader.using( 'test.implement.msgs', function () {
assert.ok( mw.messages.exists( 'T31107' ), 'T31107: messages-only module should implement ok' );
assert.true( mw.messages.exists( 'T31107' ), 'T31107: messages-only module should implement ok' );
} );
} );
@ -543,7 +543,7 @@
{}
);
mw.loader.using( 'test.implement.packageFiles' ).done( function () {
assert.ok( initJsRan, 'main JS file is executed' );
assert.true( initJsRan, 'main JS file is executed' );
done();
} );
} );
@ -755,8 +755,7 @@
function ( e, modules ) {
// When the server sets state of 'testMissing' to 'missing'
// it should bubble up and trigger the error callback of the job for 'testUsesNestedMissing'.
// eslint-disable-next-line qunit/no-ok-equality
assert.ok( modules.indexOf( 'testMissing' ) !== -1, 'Triggered by testMissing.' );
assert.true( modules.indexOf( 'testMissing' ) !== -1, 'Triggered by testMissing.' );
verifyModuleStates();
}
@ -801,7 +800,7 @@
mw.loader.testCallback = function () {
// Ensure once, delete now
delete mw.loader.testCallback;
assert.ok( true, 'callback' );
assert.true( true, 'callback' );
done();
};
@ -820,7 +819,7 @@
mw.loader.testCallback = function () {
// Ensure once, delete now
delete mw.loader.testCallback;
assert.ok( true, 'callback' );
assert.true( true, 'callback' );
done();
};
@ -942,7 +941,7 @@
// Legacy behaviour is storing under the expected version,
// which woudl lead to whitewashing and stale values (T117587).
assert.ok( mw.loader.store.get( 'test.stalebc' ), 'In store' );
assert.strictEqual( typeof mw.loader.store.get( 'test.stalebc' ), 'string', 'In store' );
} );
} );