User:Evad37/rater/test.js

//

$( function($) {	// Only load on script's pages	if ( mw.config.get('wgPageName').indexOf(':Evad37/rater') === -1 ) {		return;	}	// Create (hidden) output div, if needed	$(' ').attr('id', 'qunit').hide.insertBefore('#firstHeading');	// Load QUnit	mw.loader.load( 'https://en.wikipedia.org/w/index.php?title=User:Evad37/qunit-2.8.0.css&action=raw&ctype=text/css', 'text/css' );	/* ========== Unit tests ======================================================================== */	var runTests = function {	$.getScript( 'https://en.wikipedia.org/w/index.php?title=User:Evad37/qunit-2.8.0.js&action=raw&ctype=text/javascript', function { // Show output div $('#qunit').show; // Import vars var config = window.testRater.config; var API = window.testRater.API; var getListOfBanner = window.testRater.getListOfBaners; var Page = window.testRater.Page; var Template = window.testRater.Template; var SuggestionLookupTextInputWidget = window.testRater.SuggestionLookupTextInputWidget; var ComboBoxInputPrompt = window.testRater.ComboBoxInputPrompt; var OverlayDialog = window.testRater.OverlayDialog; var windowFactory = window.testRater.windowFactory; var windowManager = window.testRater.windowManager; var Dialog = window.testRater.Dialog; var setupRater = window.testRater.setupRater; var autoStart = window.testRater.autoStart; var writeToCache = window.testRater.writeToCache; QUnit.module("Config") QUnit.test("Banners are set", function( assert ) {		assert.expect;		var done = assert.async;		config.gotListOfBanners.always(function { assert.ok(config.banners != null, "config.banners is set"); assert.ok(config.banners.withRatings != null, "config.banners.withRatings is set"); assert.ok(config.banners.withoutRatings != null, "config.banners.withoutRatings is set"); assert.ok(config.banners.withoutRatings != null, "config.banners.withoutRatings is set"); assert.ok(config.banners.wrappers != null, "config.banners.wrappers is set"); assert.ok(config.banners.withRatings instanceof Object, "config.banners.withRatings is an Object"); assert.ok(config.banners.withoutRatings instanceof Array, "config.banners.withoutRatings is an Array"); assert.ok(config.banners.withoutRatings instanceof Array, "config.banners.withoutRatings is an Array"); assert.ok(config.banners.wrappers instanceof Array, "config.banners.wrappers is an Array"); done; });	})	QUnit.module( "Page class"); QUnit.test( "newFromText", function( assert ) {		assert.ok( Page.newFromText('Example') instanceof Page, "'Example' makes a Page object" );		assert.ok( Page.newFromText('Talk:Example') instanceof Page, "'Talk:Example' makes a Page object" );		assert.notOk( Page.newFromText(':::Example') instanceof Page, "':::Example' does not make a Page object" );	}); QUnit.test( "getTalk", function( assert ) {		assert.equal( Page.newFromText('Example').getTalk, 'Talk:Example', "Talk page for 'Example' is 'Talk:Example'" );		assert.equal( Page.newFromText('Talk:Example').getTalk, 'Talk:Example', "Talk page for 'Talk:Example' is 'Talk:Example'" );		assert.equal( Page.newFromText('Template:Example').getTalk, 'Template talk:Example', "Talk page for 'Template:Example' is 'Template talk:Example'" );		assert.equal( Page.newFromText('Template talk:Example').getTalk, 'Template talk:Example', "Talk page for 'Template talk:Example' is 'Template talk:Example'" );	}); QUnit.test( "getSubject", function( assert ) {		assert.equal( Page.newFromText('Example').getSubject, 'Example', "Subject page for 'Example' is 'Example'" );		assert.equal( Page.newFromText('Talk:Example').getSubject, 'Example', "Subject page for 'Talk:Example' is 'Example'" );		assert.equal( Page.newFromText('Template:Example').getSubject, 'Template:Example', "Subject page for 'Template:Example' is 'Template:Example'" );		assert.equal( Page.newFromText('Template talk:Example').getSubject, 'Template:Example', "Subject page for 'Template talk:Example' is 'Template:Example'" );	}); QUnit.test( "getListasAutofill", function( assert ) {		assert.equal( Page.newFromText('Single').getListasAutofill, 'Single', "Single" );		assert.equal( Page.newFromText('First Last').getListasAutofill, 'Last, First', "First Last" );		assert.equal( Page.newFromText('First Middle Last').getListasAutofill, 'Last, First Middle', "First Middle Last" );		assert.equal( Page.newFromText('First Middle Other Last').getListasAutofill, 'Last, First Middle Other', "First Middle Other Last" );		assert.equal( Page.newFromText('Single (disambig)').getListasAutofill, 'Single', "Single (disambig)" );		assert.equal( Page.newFromText('First Last (disambig)').getListasAutofill, 'Last, First', "First Last (disambig)" );		assert.equal( Page.newFromText('First Middle Last (disambig)').getListasAutofill, 'Last, First Middle', "First Middle Last (disambig)" );		assert.equal( Page.newFromText('First Middle Other Last (disambig)').getListasAutofill, 'Last, First Middle Other', "First Middle Other Last (disambig)" ); assert.equal( Page.newFromText('Single Jr.').getListasAutofill, 'Single Jr.', "Single Jr." ); assert.equal( Page.newFromText('First Last Jr.').getListasAutofill, 'Last, First Jr.', "First Last Jr." ); assert.equal( Page.newFromText('First Middle Last Jr.').getListasAutofill, 'Last, First Middle Jr.', "First Middle Last Jr." ); assert.equal( Page.newFromText('First Middle Other Last Jr.').getListasAutofill, 'Last, First Middle Other Jr.', "First Middle Other Last Jr." ); assert.equal( Page.newFromText('Single Jr. (disambig)').getListasAutofill, 'Single Jr.', "Single Jr. (disambig)" ); assert.equal( Page.newFromText('First Last Jr. (disambig)').getListasAutofill, 'Last, First Jr.', "First Last Jr. (disambig)" ); assert.equal( Page.newFromText('First Middle Last Jr. (disambig)').getListasAutofill, 'Last, First Middle Jr.', "First Middle Last Jr. (disambig)" ); assert.equal( Page.newFromText('First Middle Other Last Jr. (disambig)').getListasAutofill, 'Last, First Middle Other Jr.', "First Middle Other Last Jr. (disambig)" ); assert.equal( Page.newFromText('Single XIV').getListasAutofill, 'Single XIV', "Single XIV" ); assert.equal( Page.newFromText('First Last XIV').getListasAutofill, 'Last, First XIV', "First Last XIV" ); assert.equal( Page.newFromText('First Middle Last XIV').getListasAutofill, 'Last, First Middle XIV', "First Middle Last XIV" ); assert.equal( Page.newFromText('First Middle Other Last XIV').getListasAutofill, 'Last, First Middle Other XIV', "First Middle Other Last XIV" ); assert.equal( Page.newFromText('Single XIV (disambig)').getListasAutofill, 'Single XIV', "Single XIV (disambig)" ); assert.equal( Page.newFromText('First Last XIV (disambig)').getListasAutofill, 'Last, First XIV', "First Last XIV (disambig)" ); assert.equal( Page.newFromText('First Middle Last XIV (disambig)').getListasAutofill, 'Last, First Middle XIV', "First Middle Last XIV (disambig)" ); assert.equal( Page.newFromText('First Middle Other Last XIV (disambig)').getListasAutofill, 'Last, First Middle Other XIV', "First Middle Other Last XIV (disambig)" ); });	QUnit.test( "getBannerFromNameOrRedirect", function( assert ) { var examplePage = Page.newFromText('Perth (suburb)'); examplePage.banners = [ Template.newFromRawWikitext(''), Template.newFromRawWikitext(''), Template.newFromRawWikitext('') ];		examplePage.banners[0].redirectsTo = Template.newFromRawWikitext(''); assert.notOk( Page.newFromText('Example').getBannerFromNameOrRedirect('Some banner name'), "Page has no banners" ); assert.notOk( examplePage.getBannerFromNameOrRedirect('Some banner name'), "Banner not present" ); assert.deepEqual( examplePage.getBannerFromNameOrRedirect('WikiProject Biography'), examplePage.banners[1], "Banner is present" ); assert.deepEqual( examplePage.getBannerFromNameOrRedirect('WikiProject Australia'), examplePage.banners[0], "Banner's redirect is present" ); });	QUnit.test( "getTalkpageTopSection", function( assert ) { assert.expect; var done = assert.async; var exampleWhereTalkExists = Page.newFromText('Perth (suburb)'); var exampleWhereTalkDoesNotExist = Page.newFromText('ifdjbingjuhtrsiugbbvhsiuriutniuv'); $.when(			exampleWhereTalkExists.getTalkpageTopSection,			exampleWhereTalkDoesNotExist.getTalkpageTopSection		).always(function {			assert.ok( exampleWhereTalkExists.oldTopSection, "Page exists --> oldTopSection is set" );			assert.equal( exampleWhereTalkDoesNotExist.oldTopSection, '', "Page does not exist --> oldTopSection is empty string" );			done;		}); });	QUnit.test( "getLatestSubjectRevisionID", function( assert ) { assert.expect; var done = assert.async; var exampleWhereTalkExists = Page.newFromText('Perth (suburb)'); var exampleWhereTalkDoesNotExist = Page.newFromText('ifdjbingjuhtrsiugbbvhsiuriutniuv'); $.when(			exampleWhereTalkExists.getLatestSubjectRevisionID,			exampleWhereTalkDoesNotExist.getLatestSubjectRevisionID		) .done(function {			assert.equal( typeof exampleWhereTalkExists.latestSubjectRevisionID, 'number', "Page exists --> latestSubjectRevisionID is a number" );		}) .always(function{			assert.notOk( exampleWhereTalkDoesNotExist.latestSubjectRevisionID, "Page does not exist --> latestSubjectRevisionID not set" );			done;		}); });	QUnit.test( "getOresScore", function( assert ) { assert.expect; var done = assert.async; var examplePage = Page.newFromText('Example'); var randomTitle = ''+Math.floor(Math.random*20); var randomPage = Page.newFromText(randomTitle); $.when( examplePage.getLatestSubjectRevisionID, randomPage.getLatestSubjectRevisionID ).then(function{			$.when( examplePage.getOresScore, randomPage.getOresScore ).always(function { assert.equal(typeof examplePage.oresScore, 'string', 'ORES score is a string for "Example"'); assert.notEqual( config.bannerDefaults.classes.indexOf(examplePage.oresScore), -1, 'ORES score is a valid class for "Example"'); assert.equal(typeof randomPage.oresScore, 'string', 'ORES score is a string for random page "'+randomTitle+'"'); assert.notEqual( config.bannerDefaults.classes.indexOf(examplePage.oresScore), -1, 'ORES score ("'+randomPage.oresScore+'") is a valid class for random page "'+randomTitle+'"'); done; });		});	});	QUnit.test( "splitOldTopSection", function(assert) { var examplePage = Page.newFromText('Example'); assert.deepEqual(examplePage.splitOldTopSection, {above:, projects:, below: ''}, 'Splits correctly with empty talk page, no banners'); var example2Page = Page.newFromText('Example2'); example2Page.oldTopSection = 'Lorem ipsum dorem par'; assert.deepEqual(example2Page.splitOldTopSection, {above:'Lorem ipsum dorem par', projects:, below: }, 'Splits correctly with non-empty talk page, no banners'); examplePage.banners = [ Template.newFromRawWikitext('\n'), Template.newFromRawWikitext('\n'), Template.newFromRawWikitext('') ];		assert.deepEqual(examplePage.splitOldTopSection, {above:, projects:, below: ''}, 'Splits correctly with empty talk page, and added banners'); examplePage.oldTopSection = '\n\n'; assert.deepEqual(			examplePage.splitOldTopSection,			{	above: ,				projects: '\n\n',				below: 			},			'Splits correctly with only banners'		); examplePage.oldTopSection = '\n\n\n'; assert.deepEqual(			examplePage.splitOldTopSection,			{	above: ,				projects: '\n\n',				below: 			},			'Splits correctly with banners and content above'		); examplePage.oldTopSection = '\n\n\n'; assert.deepEqual(			examplePage.splitOldTopSection,			{	above: ,				projects: '\n\n',				below: 			},			'Splits correctly with banners and contennt below'		); examplePage.oldTopSection = '\n\n\n\n'; assert.deepEqual(			examplePage.splitOldTopSection,			{	above: ,				projects: '\n\n',				below: 			},			'Splits correctly with banners and contennt above and below'		); });	QUnit.test("makeBannerShellWikitext", function(assert) { var examplePage = Page.newFromText('Example'); examplePage.hasShellTemplate = true; assert.notOk(examplePage.makeBannerShellWikitext, 'No shell if there is already a shell'); examplePage.hasShellTemplate = false; assert.notOk(examplePage.makeBannerShellWikitext, 'No shell if there are no banners'); examplePage.banners = [ Template.newFromRawWikitext('\n') ];		assert.notOk(examplePage.makeBannerShellWikitext, 'No shell if there is one banner'); examplePage.banners.push(			Template.newFromRawWikitext('\n')		); assert.notOk(examplePage.makeBannerShellWikitext, 'No shell if there are two banners'); examplePage.banners.push(			Template.newFromRawWikitext('\n')		); assert.ok(examplePage.makeBannerShellWikitext, 'Is a shell if there are three banners'); assert.deepEqual(examplePage.makeBannerShellWikitext, {			top:''		}, 'Standard wikitext when no Bio banner'); examplePage.banners.push(			Template.newFromRawWikitext('\n')		); assert.ok(examplePage.makeBannerShellWikitext, 'Is a shell if there are four banners'); assert.deepEqual(examplePage.makeBannerShellWikitext, {			top:''		}, 'Standard wikitext when Bio banner has no parameters'); examplePage.banners[3].setParamValue('living', 'yes'); assert.deepEqual(examplePage.makeBannerShellWikitext, {			top:''		}, 'Wikitext has `|living=yes` when Bio banner does'); examplePage.banners[3].setParamValue('activepol', '1'); assert.deepEqual(examplePage.makeBannerShellWikitext, {			top:''		}, 'Wikitext has `|living=yes|activepol=yes` when Bio banner does'); examplePage.banners[3].setParamValue('living', 'no'); assert.deepEqual(examplePage.makeBannerShellWikitext, {			top:''		}, 'Standard wikitext when Bio banner has living=no'); examplePage.banners[3].setParamValue('blpo', 'true'); assert.deepEqual(examplePage.makeBannerShellWikitext, {			top:''		}, 'Wikitext has `|blpo=yes` when Bio banner has that and `living=no`'); });	QUnit.test("makeUpdatedBanners", function(assert) { var examplePage = Page.newFromText('Example'); examplePage.banners = [ Template.newFromRawWikitext('\n'), Template.newFromRawWikitext('\n'), Template.newFromRawWikitext('') ];		var isTrue = function { return true; }; var isFalse = function { return false; }; examplePage.banners[0].setParamValue('class', 'C'); examplePage.banners[1].setParamValue('class', 'C'); examplePage.banners[2].setParamValue('class', 'C'); examplePage.banners[0].isNew = isTrue; examplePage.banners[1].isNew = isTrue; examplePage.banners[2].isNew = isTrue; assert.equal(examplePage.makeUpdatedBanners(''), '\n\n', 'No existing projects'); examplePage.banners[0].isNew = isFalse; examplePage.banners[1].isNew = isFalse; assert.equal(examplePage.makeUpdatedBanners('\n'), '\n\n', 'Some existing projects'); examplePage.banners[2].isNew = isFalse; assert.equal(examplePage.makeUpdatedBanners('\n\n'), '\n\n', 'All existing projects'); examplePage.banners[2].isNew = isFalse; examplePage.banners[1].remove = true; assert.equal(examplePage.makeUpdatedBanners('\n\n'), '\n', 'A project to remove'); examplePage.banners[1].remove = false; examplePage.banners[0].rawWikitext = ''; examplePage.banners[1].rawWikitext = ''; examplePage.banners[2].rawWikitext = ''; assert.equal(examplePage.makeUpdatedBanners('\n\n'), '\n\n', 'All existing projects with parameters to update'); examplePage.banners[0].rawWikitext = ''; examplePage.banners[0].setParamValue('small', 'yes');	examplePage.banners[0].deleteParam('small'); examplePage.banners[1].rawWikitext = ''; examplePage.banners[1].setParamValue('blpo', 'true');	examplePage.banners[1].deleteParam('blpo'); examplePage.banners[2].rawWikitext = ''; examplePage.banners[2].setParamValue('WA', 'yes');	examplePage.banners[2].deleteParam('WA'); assert.equal(examplePage.makeUpdatedBanners('\n\n'), '\n\n', 'All existing projects with parameters to update and parameters to remove'); });	QUnit.test("makeEditSummary", function(assert) { var examplePage = Page.newFromText('Example'); var isTrue = function { return true; }; var isFalse = function { return false; }; assert.equal(examplePage.makeEditSummary, 'Assessment', 'No additions, modifications, or removals'); examplePage.banners = [ Template.newFromRawWikitext('\n'), ];		examplePage.banners[0].isNew = isTrue; assert.equal(examplePage.makeEditSummary, 'Assessment: +Biography', ' banner added'); examplePage.banners[0].isNew = isFalse; examplePage.banners[0].touched = {foo: true}; assert.equal(examplePage.makeEditSummary, 'Assessment: Biography', ' banner modified'); examplePage.banners[0].remove = true; assert.equal(examplePage.makeEditSummary, 'Assessment: −Biography', ' banner removed'); examplePage.banners[0].remove = false; examplePage.banners[0].setParamValue('class', 'C'); assert.equal(examplePage.makeEditSummary, 'Assessment: Biography (C)', ' banner modified, class changed'); examplePage.banners[0].touched = {}; examplePage.banners[0].setParamValue('importance', 'Low'); assert.equal(examplePage.makeEditSummary, 'Assessment: Biography (Low)', ' banner modified, including importance changed'); examplePage.banners[0].setParamValue('class', 'C'); assert.equal(examplePage.makeEditSummary, 'Assessment: Biography (C/Low)', ' banner modified, including class and importance changed'); examplePage.banners = [ Template.newFromRawWikitext('\n'), ];		examplePage.banners[0].isNew = isTrue; assert.equal(examplePage.makeEditSummary, 'Assessment: +WP Australia', ' banner added'); examplePage.banners[0].isNew = isFalse; examplePage.banners[0].touched = {foo: true}; assert.equal(examplePage.makeEditSummary, 'Assessment: WP Australia', ' banner modified'); examplePage.banners[0].remove = true; assert.equal(examplePage.makeEditSummary, 'Assessment: −WP Australia', ' banner removed'); examplePage.banners[0].remove = false; examplePage.banners[0].setParamValue('class', 'C'); assert.equal(examplePage.makeEditSummary, 'Assessment: WP Australia (C)', ' banner modified, class changed'); examplePage.banners[0].touched = {}; examplePage.banners[0].setParamValue('importance', 'Low'); assert.equal(examplePage.makeEditSummary, 'Assessment: WP Australia (Low)', ' banner modified, including importance changed'); examplePage.banners[0].setParamValue('class', 'C'); assert.equal(examplePage.makeEditSummary, 'Assessment: WP Australia (C/Low)', ' banner modified, including class and importance changed'); /* Example from Mr. Guye (Template talk:Infobox government agency: 9 December 2017) −		 +		Expected:	`Assessment: −WP Australia; +Politics of the United Kingdom` Actual was:	`Assessment: +Politics of the United Kingdom` */		exampleTwo = Page.newFromText('Template talk:Infobox government agency'); exampleTwo.banners = [ Template.newFromRawWikitext(''), Template.newFromRawWikitext(''), Template.newFromRawWikitext('') ];		exampleTwo.banners[0].remove = true; exampleTwo.banners[0].isNew = isFalse; exampleTwo.banners[1].isNew = isFalse; exampleTwo.banners[2].isNew = isTrue; assert.equal(exampleTwo.makeEditSummary, 'Assessment: −WP Australia; +Politics of the United Kingdom', 'One banner removed, a second unchanged, another added'); });	QUnit.module( "Template class");	QUnit.test("Template.makeParamsObject", function(assert) { assert.deepEqual(Template.makeParamsObject('|class=c'), {'class':'c'}, 'Single named parameter'); assert.deepEqual(Template.makeParamsObject('|class=c|importance=low'), {'class':'c', 'importance':'low'}, 'Two named parameters'); assert.deepEqual(Template.makeParamsObject('|foo'), {'1':'foo'}, 'Single unnamed parameter'); assert.deepEqual(Template.makeParamsObject('|foo|bar'), {'1':'foo', '2':'bar'}, 'Two unnamed parameters'); assert.deepEqual(Template.makeParamsObject('|1=foo'), {'1':'foo'}, 'Single numbered parameter'); assert.deepEqual(Template.makeParamsObject('|1=foo|2=bar'), {'1':'foo', '2':'bar'}, 'Two numbered parameters'); assert.deepEqual(Template.makeParamsObject('|foo|bar=qux'), {'1':'foo', 'bar':'qux'}, 'Unnamed and then named parameter'); assert.deepEqual(Template.makeParamsObject('|bar=qux|foo'), {'1':'foo', 'bar':'qux'}, 'Named and then unnamed parameter'); assert.deepEqual(Template.makeParamsObject('|class=c|bar=qux|foo|baz'), {'1':'foo', '2':'baz', 'class':'c', 'bar':'qux'}, 'Two named and two unnamed parameters (1)'); assert.deepEqual(Template.makeParamsObject('|class=c|foo|bar=qux|baz'), {'1':'foo', '2':'baz', 'class':'c', 'bar':'qux'}, 'Two named and two unnamed parameters (2)'); assert.deepEqual(Template.makeParamsObject('|foo|class=c|bar=qux|baz'), {'1':'foo', '2':'baz', 'class':'c', 'bar':'qux'}, 'Two named and two unnamed parameters (3)'); assert.deepEqual(Template.makeParamsObject('|class=c|foo|baz|bar=qux'), {'1':'foo', '2':'baz', 'class':'c', 'bar':'qux'}, 'Two named and two unnamed parameters (4)'); assert.deepEqual(Template.makeParamsObject('|foo|class=c|baz|bar=qux'), {'1':'foo', '2':'baz', 'class':'c', 'bar':'qux'}, 'Two named and two unnamed parameters (5)'); assert.deepEqual(Template.makeParamsObject('|foo|baz|class=c|bar=qux'), {'1':'foo', '2':'baz', 'class':'c', 'bar':'qux'}, 'Two named and two unnamed parameters (6)'); assert.deepEqual(Template.makeParamsObject('|class =c'), {'class':'c'}, 'Spacing should not matter - single param (1)'); assert.deepEqual(Template.makeParamsObject('|class= c'), {'class':'c'}, 'Spacing should not matter - single param (2)'); assert.deepEqual(Template.makeParamsObject('|class = c'), {'class':'c'}, 'Spacing should not matter - single param (3)'); assert.deepEqual(Template.makeParamsObject('|class =  c'), {'class':'c'}, 'Spacing should not matter - single param (4)'); assert.deepEqual(Template.makeParamsObject('| class =c'), {'class':'c'}, 'Spacing should not matter - single param (5)'); assert.deepEqual(Template.makeParamsObject('| class= c'), {'class':'c'}, 'Spacing should not matter - single param (6)'); assert.deepEqual(Template.makeParamsObject('| class = c'), {'class':'c'}, 'Spacing should not matter - single param (7)'); assert.deepEqual(Template.makeParamsObject('| class  =  c'), {'class':'c'}, 'Spacing should not matter - single param (8)'); assert.deepEqual(Template.makeParamsObject('|nested='), {'nested':''}, 'Nested template (without its own parameters) - in named parameter'); assert.deepEqual(Template.makeParamsObject('|nested='), {'nested':''}, 'Nested template (with its own single parameter) - in named parameter'); assert.deepEqual(Template.makeParamsObject('|nested='), {'nested':''}, 'Nested template (with its own parameters) - in named parameter'); assert.deepEqual(Template.makeParamsObject('|1='), {'1':''}, 'Nested template (without its own parameters) - in numbered parameter'); assert.deepEqual(Template.makeParamsObject('|1='), {'1':''}, 'Nested template (with its own single parameter) - in numbered parameter'); assert.deepEqual(Template.makeParamsObject('|1='), {'1':''}, 'Nested template (with its own parameters) - in numbered parameter'); assert.deepEqual(Template.makeParamsObject('|'), {'1':''}, 'Nested template (without its own parameters) - in unnamed parameter'); assert.deepEqual(Template.makeParamsObject('|'), {'1':''}, 'Nested template (with its own single parameter) - in unnamed parameter'); assert.deepEqual(Template.makeParamsObject('|'), {'1':''}, 'Nested template (with its own parameters) - in unnamed parameter'); });	QUnit.test("setParamDataAndSuggestions", function(assert) { assert.expect; var done = assert.async; var templateWithData = Template.newFromRawWikitext(''); var templateNoData = Template.newFromRawWikitext(''); $.when( templateWithData.setParamDataAndSuggestions, templateNoData.setParamDataAndSuggestions ) .then( function {			assert.ok(templateWithData.paramData, 'paramData set for template with TemplateData');			assert.ok(templateWithData.parameterSuggestions, 'parameterSuggestions set for template with TemplateData');			assert.ok(templateNoData.paramData, 'paramData set for template without TemplateData');			assert.ok(templateNoData.parameterSuggestions, 'parameterSuggestions set for template without TemplateData');			done;		}) .fail(function {			assert.ok(false, 'Deferred failed');		}); });	});	};	// Add portlet link mw.util.addPortletLink( 'p-views', '#', 'Test script', 'ca-testScript', 'Run unit tests for this script' ); $('#ca-testScript').click(function(e) {		e.preventDefault;		runTests;	}); // On test page, run automatically after 2.5 seconds if ( mw.config.get('wgPageName') === 'User:Evad37/rater/test' ) { setTimeout(runTests, 2500); }	});

//