มอดูล: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 | 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, envfield)
end	
function suite:assertEnvTitleEquals(expected, page, titleField)
	local env = getEnv(page)
	local title = envtitleField
	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 = 'BadTitle'}
	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.edit1)
	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, sandboxEditLevels1)
	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 = 'link='
	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 = ' .. 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 = 'view edit history purge'
	self:assertEquals(expected, doc.renderStartBoxLinks(data))
end
function suite:testRenderStartBoxLinksDoesntExist()
	local data = suite.makeExampleStartBoxLinksData(false)
	local expected = ' create purge'
	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 = 'alt= Template documentation'
	self:assertEquals(expected, data.heading)
end
function suite:testStartBoxDataHeadingModule()
	local env = getEnv('Module:Example')
	local data = doc.makeStartBoxData({}, env)
	local expected = 'alt= 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('\nFoobar', 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 | 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 | 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 |  diff)'
	self:assertStringContains(pattern, doc.makeExperimentBlurb({}, env), true)
end
function suite:testExperimentBlurbSandboxDoesntExist()
	local env = getEnv('Template:Non-existent template sajdfasd')
	local pattern = 'sandbox ( create |  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('Subpages of this page.', 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:FooBar')
	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