Module:Documentation/testcases

-- Test cases page for Module:Documentation. See talk page to run tests.

local doc = require('Module:Documentation/sandbox') local ScribuntoUnit = require('Module:ScribuntoUnit') local suite = ScribuntoUnit:new

-- Test case helper functions

local function getEnv(page) -- Gets an env table using the specified page. return doc.getEnvironment{page = page} end

-- Test helper functions

function suite:testMessage self:assertEquals('sandbox', doc.message('sandbox-subpage')) self:assertEquals('Subpages of this foobar', doc.message('subpages-link-display', {'foobar'})) self:assertEquals(true, doc.message('display-strange-usage-category', nil, 'boolean')) end

function suite:testMakeToolbar self:assertEquals(nil, doc.makeToolbar) self:assertEquals(' (Foo) ', doc.makeToolbar('Foo')) self:assertEquals(' (Foo &#124; Bar) ', doc.makeToolbar('Foo', 'Bar')) end

function suite:testMakeWikilink self:assertEquals('Foo', doc.makeWikilink('Foo')) self:assertEquals('Bar', doc.makeWikilink('Foo', 'Bar')) end

function suite:testMakeCategoryLink self:assertEquals('', doc.makeCategoryLink('Foo')) self:assertEquals('', doc.makeCategoryLink('Foo', 'Bar')) end

function suite:testMakeUrlLink self:assertEquals('[Foo Bar]', doc.makeUrlLink('Foo', 'Bar')) end

-- Test env table

function suite:assertEnvFieldEquals(expected, page, field) local env = getEnv(page) self:assertEquals(expected, env[field]) end

function suite:assertEnvTitleEquals(expected, page, titleField) local env = getEnv(page) local title = env[titleField] self:assertEquals(expected, title.prefixedText) end

function suite:testEnvTitle self:assertEnvTitleEquals('Wikipedia:Sandbox', 'Wikipedia:Sandbox', 'title') self:assertEnvTitleEquals('Template:Example/sandbox', 'Template:Example/sandbox', 'title') end

function suite:testEnvBadTitle local env = doc.getEnvironment{page = 'Bad[]Title'} local title = env.title self:assertEquals(nil, title) end

function suite:testEnvTemplateTitle self:assertEnvTitleEquals('Template:Example', 'Template:Example', 'templateTitle') self:assertEnvTitleEquals('Template:Example', 'Template talk:Example', 'templateTitle') self:assertEnvTitleEquals('Template:Example', 'Template:Example/sandbox', 'templateTitle') self:assertEnvTitleEquals('Template:Example', 'Template talk:Example/sandbox', 'templateTitle') self:assertEnvTitleEquals('Template:Example', 'Template:Example/testcases', 'templateTitle') self:assertEnvTitleEquals('Template:Example/foo', 'Template:Example/foo', 'templateTitle') self:assertEnvTitleEquals('File:Example', 'File talk:Example', 'templateTitle') self:assertEnvTitleEquals('File:Example', 'File talk:Example/sandbox', 'templateTitle') end

function suite:testEnvDocTitle self:assertEnvTitleEquals('Template:Example/doc', 'Template:Example', 'docTitle') self:assertEnvTitleEquals('Template:Example/doc', 'Template talk:Example', 'docTitle') self:assertEnvTitleEquals('Template:Example/doc', 'Template:Example/sandbox', 'docTitle') self:assertEnvTitleEquals('Talk:Example/doc', 'Example', 'docTitle') self:assertEnvTitleEquals('File talk:Example.png/doc', 'File:Example.png', 'docTitle') self:assertEnvTitleEquals('File talk:Example.png/doc', 'File talk:Example.png/sandbox', 'docTitle') end

function suite:testEnvSandboxTitle self:assertEnvTitleEquals('Template:Example/sandbox', 'Template:Example', 'sandboxTitle') self:assertEnvTitleEquals('Template:Example/sandbox', 'Template talk:Example', 'sandboxTitle') self:assertEnvTitleEquals('Template:Example/sandbox', 'Template:Example/sandbox', 'sandboxTitle') self:assertEnvTitleEquals('Talk:Example/sandbox', 'Example', 'sandboxTitle') self:assertEnvTitleEquals('File talk:Example.png/sandbox', 'File:Example.png', 'sandboxTitle') end

function suite:testEnvTestcasesTitle self:assertEnvTitleEquals('Template:Example/testcases', 'Template:Example', 'testcasesTitle') self:assertEnvTitleEquals('Template:Example/testcases', 'Template talk:Example', 'testcasesTitle') self:assertEnvTitleEquals('Template:Example/testcases', 'Template:Example/testcases', 'testcasesTitle') self:assertEnvTitleEquals('Talk:Example/testcases', 'Example', 'testcasesTitle') self:assertEnvTitleEquals('File talk:Example.png/testcases', 'File:Example.png', 'testcasesTitle') end

function suite:testEnvProtectionLevels local pipeEnv = getEnv('Template:?') self:assertEquals('autoconfirmed', pipeEnv.protectionLevels.edit[1]) local sandboxEnv = getEnv('Wikipedia:Sandbox') local sandboxEditLevels = sandboxEnv.protectionLevels.edit if sandboxEditLevels then -- sandboxEditLevels may also be nil if the page is unprotected self:assertEquals(nil, sandboxEditLevels[1]) else self:assertEquals(nil, sandboxEditLevels) end end

function suite:testEnvSubjectSpace self:assertEnvFieldEquals(10, 'Template:Sandbox', 'subjectSpace') self:assertEnvFieldEquals(10, 'Template talk:Sandbox', 'subjectSpace') self:assertEnvFieldEquals(0, 'Foo', 'subjectSpace') self:assertEnvFieldEquals(0, 'Talk:Foo', 'subjectSpace') end

function suite:testEnvDocSpace self:assertEnvFieldEquals(10, 'Template:Sandbox', 'docSpace') self:assertEnvFieldEquals(828, 'Module:Sandbox', 'docSpace') self:assertEnvFieldEquals(1, 'Foo', 'docSpace') self:assertEnvFieldEquals(7, 'File:Example.png', 'docSpace') self:assertEnvFieldEquals(9, 'MediaWiki:Watchlist-details', 'docSpace') self:assertEnvFieldEquals(15, 'Category:Wikipedians', 'docSpace') end

function suite:testEnvDocpageBase self:assertEnvFieldEquals('Template:Example', 'Template:Example', 'docpageBase') self:assertEnvFieldEquals('Template:Example', 'Template:Example/sandbox', 'docpageBase') self:assertEnvFieldEquals('Template:Example', 'Template talk:Example', 'docpageBase') self:assertEnvFieldEquals('File talk:Example.png', 'File:Example.png', 'docpageBase') self:assertEnvFieldEquals('File talk:Example.png', 'File talk:Example.png', 'docpageBase') self:assertEnvFieldEquals('File talk:Example.png', 'File talk:Example.png/sandbox', 'docpageBase') end

function suite:testEnvCompareUrl -- We use "Template:Edit protected" rather than "Template:Example" here as it has a space in the title. local expected = 'https://en.wikipedia.org/w/index.php?title=Special%3AComparePages&page1=Template%3AEdit+protected&page2=Template%3AEdit+protected%2Fsandbox' self:assertEnvFieldEquals(expected, 'Template:Edit protected', 'compareUrl') self:assertEnvFieldEquals(expected, 'Template:Edit protected/sandbox', 'compareUrl') self:assertEnvFieldEquals(nil, 'Template:Non-existent template adsfasdg', 'compareUrl') self:assertEnvFieldEquals(nil, 'Template:Fact', 'compareUrl') -- Exists but doesn't have a sandbox. end

-- Test sandbox notice

function suite.getSandboxNoticeTestData(page) local env = getEnv(page) local templatePage = page:match('^(.*)/sandbox$') local image = '' local templateBlurb = 'This is the template sandbox page for ' .. templatePage .. '' local moduleBlurb = 'This is the module sandbox page for ' .. templatePage .. '' local otherBlurb = 'This is the sandbox page for ' .. templatePage .. '' local diff = '[https://en.wikipedia.org/w/index.php?title=Special%3AComparePages&page1=' .. mw.uri.encode(templatePage) .. '&page2=' .. mw.uri.encode(page) .. ' diff]' local testcasesBlurb = 'See also the companion subpage for test cases.' local category = '' local clear = ' ' return env, image, templateBlurb, moduleBlurb, otherBlurb, diff, testcasesBlurb, category, clear end

function suite:testSandboxNoticeNotSandbox local env = getEnv('Template:Example') local notice = doc.sandboxNotice({}, env) self:assertEquals(nil, notice) end

function suite:testSandboxNoticeStaticVals local env, image, templateBlurb, moduleBlurb, otherBlurb, diff, testcasesBlurb, category, clear = suite.getSandboxNoticeTestData('Template:Example/sandbox') local notice = doc.sandboxNotice({}, env)

-- Escape metacharacters (mainly '-') clear = clear:gsub( '%p', '%%%0' )

self:assertStringContains('^' .. clear, notice, false) self:assertStringContains(image, notice, true) self:assertStringContains(category, notice, true) end

function suite:testSandboxNoticeTemplateBlurb local env, image, templateBlurb, moduleBlurb, otherBlurb, diff, testcasesBlurb, category = suite.getSandboxNoticeTestData('Template:Example/sandbox') local notice = doc.sandboxNotice({}, env) self:assertStringContains(templateBlurb, notice, true) end

function suite:testSandboxNoticeModuleBlurb local env, image, templateBlurb, moduleBlurb, otherBlurb, diff, testcasesBlurb, category = suite.getSandboxNoticeTestData('Module:Math/sandbox') local notice = doc.sandboxNotice({}, env) self:assertStringContains(moduleBlurb, notice, true) end

function suite:testSandboxNoticeOtherBlurb local env, image, templateBlurb, moduleBlurb, otherBlurb, diff, testcasesBlurb, category = suite.getSandboxNoticeTestData('User:Mr. Stradivarius/sandbox') local notice = doc.sandboxNotice({}, env) self:assertStringContains(otherBlurb, notice, true) end

function suite:testSandboxNoticeBlurbDiff local env, image, templateBlurb, moduleBlurb, otherBlurb, diff, testcasesBlurb, category = suite.getSandboxNoticeTestData('Template:Example/sandbox') local notice = doc.sandboxNotice({}, env) if mw.title.getCurrentTitle.isTalk then -- This test doesn't work in the debug console due to the use of frame:preprocess. -- The frame test doesn't seem to be working for now, so adding a namespace hack. self:assertStringContains(diff, notice, true) end end

function suite:testSandboxNoticeBlurbDiffNoBasePage local env, image, templateBlurb, moduleBlurb, otherBlurb, diff, testcasesBlurb, category = suite.getSandboxNoticeTestData('Module:User:Mr. Stradivarius/sandbox') local notice = doc.sandboxNotice({}, env) if mw.title.getCurrentTitle.isTalk then -- This test doesn't work in the debug console due to the use of frame:preprocess. -- The frame test doesn't seem to be working for now, so adding a namespace hack. self:assertNotStringContains(diff, notice, true) end end

function suite:testSandboxNoticeTestcases local env, image, templateBlurb, moduleBlurb, otherBlurb, diff, testcasesBlurb, category = suite.getSandboxNoticeTestData('Template:Edit protected/sandbox') local notice = doc.sandboxNotice({}, env) self:assertStringContains(testcasesBlurb, notice, true) end

function suite:testSandboxNoticeNoTestcases local env, image, templateBlurb, moduleBlurb, otherBlurb, diff, testcasesBlurb, category = suite.getSandboxNoticeTestData('Template:Example/sandbox') local notice = doc.sandboxNotice({}, env) self:assertNotStringContains(testcasesBlurb, notice, true) end

-- Test protection template -- -- There's not much we can do with this until gets rewritten in Lua. At the -- moment the protection detection only works for the current page, and the testcases pages -- will be unprotected.

function suite:testProtectionTemplateUnprotectedTemplate local env = getEnv('Template:Example') self:assertEquals(nil, doc.protectionTemplate(env)) end

function suite:testProtectionTemplateProtectedTemplate local env = getEnv('Template:Navbox') -- Test whether there is some content. We don't care what the content is, as the protection level -- detected will be for the current page, not the template. self:assertTrue(doc.protectionTemplate(env)) end

function suite:testProtectionTemplateUnprotectedModule local env = getEnv('Module:Example') self:assertEquals(nil, doc.protectionTemplate(env)) end

function suite:testProtectionTemplateProtectedModule local env = getEnv('Module:Yesno') -- Test whether there is some content. We don't care what the content is, as the protection level -- detected will be for the current page, not the template. self:assertTrue(doc.protectionTemplate(env)) end

-- Test _startBox

function suite:testStartBoxContentArg local pattern = ' \n .- ' local startBox = doc._startBox({content = 'some documentation'}, getEnv('Template:Example')) self:assertStringContains(pattern, startBox) end

function suite:testStartBoxHtml self:assertStringContains(		' \n .- .- ',		doc._startBox({}, getEnv('Template:Example'))	) end

-- Test makeStartBoxLinksData

function suite:testMakeStartBoxLinksData local env = getEnv('Template:Example') local data = doc.makeStartBoxLinksData({}, env) self:assertEquals('Template:Example', data.title.prefixedText) self:assertEquals('Template:Example/doc', data.docTitle.prefixedText) self:assertEquals('view', data.viewLinkDisplay) self:assertEquals('edit', data.editLinkDisplay) self:assertEquals('history', data.historyLinkDisplay) self:assertEquals('purge', data.purgeLinkDisplay) self:assertEquals('create', data.createLinkDisplay) end

function suite:testMakeStartBoxLinksDataTemplatePreload local env = getEnv('Template:Example') local data = doc.makeStartBoxLinksData({}, env) self:assertEquals('Template:Documentation/preload', data.preload) end

function suite:testMakeStartBoxLinksDataArgsPreload local env = getEnv('Template:Example') local data = doc.makeStartBoxLinksData({preload = 'My custom preload'}, env) self:assertEquals('My custom preload', data.preload) end

-- Test renderStartBoxLinks

function suite.makeExampleStartBoxLinksData(exists) -- Makes a data table to be used with testRenderStartBoxLinksExists and testRenderStartBoxLinksDoesntExist. local data = {} if exists then data.title = mw.title.new('Template:Example') data.docTitle = mw.title.new('Template:Example/doc') else data.title = mw.title.new('Template:NonExistentTemplate') data.docTitle = mw.title.new('Template:NonExistentTemplate/doc') end data.viewLinkDisplay = 'view' data.editLinkDisplay = 'edit' data.historyLinkDisplay = 'history' data.purgeLinkDisplay = 'purge' data.createLinkDisplay = 'create' data.preload = 'Template:MyPreload' return data end

function suite:testRenderStartBoxLinksExists local data = suite.makeExampleStartBoxLinksData(true) local expected = '&#91;view&#93; &#91;edit&#93; &#91;history&#93; &#91;purge&#93;' self:assertEquals(expected, doc.renderStartBoxLinks(data)) end

function suite:testRenderStartBoxLinksDoesntExist local data = suite.makeExampleStartBoxLinksData(false) local expected = '&#91;create&#93; &#91;purge&#93;' self:assertEquals(expected, doc.renderStartBoxLinks(data)) end

-- Test makeStartBoxData

function suite:testStartBoxDataBlankHeading local data = doc.makeStartBoxData({heading = ''}, {}) self:assertEquals(nil, data) end

function suite:testStartBoxDataHeadingTemplate local env = getEnv('Template:Example') local data = doc.makeStartBoxData({}, env) local expected = ' Template documentation' self:assertEquals(expected, data.heading) end

function suite:testStartBoxDataHeadingModule local env = getEnv('Module:Example') local data = doc.makeStartBoxData({}, env) local expected = ' Module documentation' self:assertEquals(expected, data.heading) end

function suite:testStartBoxDataHeadingFile local env = getEnv('File:Example.png') local data = doc.makeStartBoxData({}, env) local expected = 'Summary' self:assertEquals(expected, data.heading) end

function suite:testStartBoxDataHeadingOther local env = getEnv('User:Example') local data = doc.makeStartBoxData({}, env) local expected = 'Documentation' self:assertEquals(expected, data.heading) end

function suite:testStartBoxDataHeadingStyle local data = doc.makeStartBoxData({['heading-style'] = 'foo:bar'}, {}) self:assertEquals('foo:bar', data.headingStyleText) end

function suite:testStartBoxDataHeadingStyleTemplate local env = getEnv('Template:Example') local data = doc.makeStartBoxData({}, env) self:assertEquals(nil, data.headingStyleText) end

function suite:testStartBoxDataHeadingStyleOther local env = getEnv('User:Example') local data = doc.makeStartBoxData({}, env) self:assertEquals(nil, data.headingStyleText) end

function suite:testStartBoxDataLinks local env = getEnv('Template:Example') local data = doc.makeStartBoxData({}, env, 'some links') self:assertEquals('some links', data.links) self:assertEquals('mw-editsection-like plainlinks', data.linksClass) end

function suite:testStartBoxDataNoLinks local env = getEnv('Template:Example') local data = doc.makeStartBoxData({}, env) self:assertEquals(nil, data.links) self:assertEquals(nil, data.linksClass) self:assertEquals(nil, data.linksId) end

-- Test renderStartBox

function suite:testRenderStartBox local expected = ' \n ' self:assertEquals(expected, doc.renderStartBox{}) end

function suite:testRenderStartBoxHeadingStyleText self:assertStringContains('\n ', doc.renderStartBox{headingStyleText = 'foo:bar'}, true) end

function suite:testRenderStartBoxHeading self:assertStringContains('\n Foobar ', doc.renderStartBox{heading = 'Foobar'}, true) end

function suite:testRenderStartBoxLinks self:assertStringContains(' list of links ', doc.renderStartBox{links = 'list of links'}, true) end

function suite:testRenderStartBoxLinksClass self:assertStringContains(' list of links ', doc.renderStartBox{linksClass = 'linksclass', links = 'list of links'}, true) self:assertNotStringContains('linksclass', doc.renderStartBox{linksClass = 'linksclass'}, true) end

function suite:testRenderStartBoxLinksId self:assertStringContains(' list of links ', doc.renderStartBox{linksId = 'linksid', links = 'list of links'}, true) self:assertNotStringContains('linksid', doc.renderStartBox{linksId = 'linksid'}, true) end

-- Test _content

function suite:testContentArg self:assertEquals('\nsome documentation\n', doc._content({content = 'some documentation'}, {})) end

function suite:testContentNoContent local env = getEnv('Template:This is a non-existent template agauchvaiu') self:assertEquals('\n\n', doc._content({}, env)) end

function suite:testContentExists local env = doc.getEnvironment{'Template:Documentation/testcases/test3'} local docs = mw.getCurrentFrame:preprocess('') local expected = '\n' .. docs .. '\n' self:assertEquals(expected, doc._content({}, env)) end

-- Test _endBox

function suite:testEndBoxLinkBoxOff local env = getEnv self:assertEquals(nil, doc._endBox({['link box'] = 'off'}, env)) end

function suite:testEndBoxNoDocsOtherNs local env = { subjectSpace = 4, docTitle = { exists = false }	}	self:assertEquals(nil, doc._endBox({}, env)) end

function suite:testEndBoxAlwaysShowNs self:assertTrue(doc._endBox({}, getEnv('Template:Non-existent template asdfalsdhaw'))) self:assertTrue(doc._endBox({}, getEnv('Module:Non-existent module asdhewbydcyg'))) self:assertTrue(doc._endBox({}, getEnv('User:Non-existent user ahfliwebalisyday'))) end

function suite:testEndBoxStyles local env = getEnv('Template:Example') local endBox = doc._endBox({}, env) self:assertStringContains('class="documentation-metadata plainlinks"', endBox, true) end

function suite:testEndBoxLinkBoxArg local env = getEnv self:assertStringContains('Custom link box', doc._endBox({['link box'] = 'Custom link box'}, env)) end

function suite:testEndBoxExperimentBlurbValidNs local expected = 'Editors can experiment in this.- '	self:assertStringContains(expected, doc._endBox({}, getEnv('Template:Example'))) self:assertStringContains(expected, doc._endBox({}, getEnv('Module:Example'))) self:assertStringContains(expected, doc._endBox({}, getEnv('User:Example'))) end

function suite:testEndBoxExperimentBlurbInvalidNs local expected = 'Editors can experiment in this.- '	self:assertNotStringContains(expected, doc._endBox({}, getEnv('Wikipedia:Twinkle'))) -- Wikipedia:Twinkle has an existing /doc subpage end

function suite:testEndBoxCategoriesBlurb local expected = 'Add categories to the %[%[.-|/doc%]%] subpage%.' self:assertStringContains(expected, doc._endBox({}, getEnv('Template:Example'))) self:assertStringContains(expected, doc._endBox({}, getEnv('Module:Example'))) self:assertStringContains(expected, doc._endBox({}, getEnv('User:Example'))) self:assertNotStringContains(expected, doc._endBox({[1] = 'Foo'}, getEnv('Template:Example'))) self:assertNotStringContains(expected, doc._endBox({content = 'Bar'}, getEnv('Template:Example'))) self:assertNotStringContains(expected, doc._endBox({}, getEnv('Wikipedia:Twinkle'))) end

-- Test makeDocPageBlurb

function suite:testDocPageBlurbError self:assertEquals(nil, doc.makeDocPageBlurb({}, {})) end

function suite:testDocPageBlurbTemplateDocExists local env = getEnv('Template:Documentation') local expected = 'The above documentation is transcluded from Template:Documentation/doc. (edit &#124; history) '	self:assertEquals(expected, doc.makeDocPageBlurb({}, env)) end

function suite:testDocPageBlurbTemplateDocDoesntExist local env = getEnv('Template:Non-existent template ajlkfdsa') self:assertEquals(nil, doc.makeDocPageBlurb({}, env)) end

function suite:testDocPageBlurbModuleDocExists local env = getEnv('Module:Example') local expected = 'The above documentation is transcluded from Module:Example/doc. (edit &#124; history) '	self:assertEquals(expected, doc.makeDocPageBlurb({}, env)) end

function suite:testDocPageBlurbModuleDocDoesntExist local env = getEnv('Module:Non-existent module ajlkfdsa') local expected = 'You might want to create a documentation page for this Scribunto module. '	self:assertEquals(expected, doc.makeDocPageBlurb({}, env)) end

-- Test makeExperimentBlurb

function suite:testExperimentBlurbTemplate local env = getEnv('Template:Example') self:assertStringContains("Editors can experiment in this template's .- and .- pages.", doc.makeExperimentBlurb({}, env), false) end

function suite:testExperimentBlurbModule local env = getEnv('Module:Example') self:assertStringContains("Editors can experiment in this module's .- and .- pages.", doc.makeExperimentBlurb({}, env), false) end

function suite:testExperimentBlurbSandboxExists local env = getEnv('Template:Edit protected') local pattern = 'sandbox (edit &#124; diff) ' self:assertStringContains(pattern, doc.makeExperimentBlurb({}, env), true) end

function suite:testExperimentBlurbSandboxDoesntExist local env = getEnv('Template:Non-existent template sajdfasd') local pattern = 'sandbox (create &#124; mirror) ' self:assertStringContains(pattern, doc.makeExperimentBlurb({}, env), true) end

function suite:testExperimentBlurbTestcasesExist local env = getEnv('Template:Edit protected') local pattern = 'testcases (edit) ' self:assertStringContains(pattern, doc.makeExperimentBlurb({}, env), true) end

function suite:testExperimentBlurbTestcasesDontExist local env = getEnv('Template:Non-existent template sajdfasd') local pattern = 'testcases (create) ' self:assertStringContains(pattern, doc.makeExperimentBlurb({}, env), true) end

-- Test makeCategoriesBlurb

function suite:testMakeCategoriesBlurb local env = getEnv('Template:Example') self:assertEquals('Add categories to the /doc subpage.', doc.makeCategoriesBlurb({}, env)) end

-- Test makeSubpagesBlurb

function suite:testMakeSubpagesBlurbTemplate local env = getEnv('Template:Example') self:assertEquals('Subpages of this template.', doc.makeSubpagesBlurb({}, env)) end

function suite:testMakeSubpagesBlurbModule local env = getEnv('Module:Example') self:assertEquals('Subpages of this module.', doc.makeSubpagesBlurb({}, env)) end

function suite:testMakeSubpagesBlurbOther local env = getEnv('File:Example.png') self:assertEquals('.', doc.makeSubpagesBlurb({}, env)) end

-- Test addTrackingCategories

function suite.getStrangeUsageCat return '' end

function suite:testAddTrackingCategoriesTemplatePage local env = getEnv('Template:Example') self:assertEquals('', doc.addTrackingCategories(env)) end

function suite:testAddTrackingCategoriesDocPage local env = getEnv('Template:Example/doc') self:assertEquals(self.getStrangeUsageCat, doc.addTrackingCategories(env)) end

function suite:testAddTrackingCategoriesTestcasesPage local env = getEnv('Template:Example/testcases') self:assertEquals(self.getStrangeUsageCat, doc.addTrackingCategories(env)) end

function suite:testAddTrackingCategoriesModuleDoc local env = getEnv('Module:Math/doc') self:assertEquals(self.getStrangeUsageCat, doc.addTrackingCategories(env)) end

function suite:testAddTrackingCategoriesModuleTestcases local env = getEnv('Module:Math/testcases') self:assertEquals('', doc.addTrackingCategories(env)) end

function suite:testAddTrackingCategoriesInvalidTitle local env = getEnv('Template:Foo[]Bar') self:assertEquals(nil, doc.addTrackingCategories(env)) end

-- Whitespace tests

function suite:testNoTrailingWhitespace self:assertStringContains('of this template%]%]. $', doc._main{page = 'Template:Example'}) end

return suite