Difference between revisions of "Module:Redirect hatnote/testcases"

From blackwiki
Jump to navigation Jump to search
test>Mr. Stradivarius
(add a check for the options table)
test>Mr. Stradivarius
(start updating these)
Line 251: Line 251:
  
 
local d = {}
 
local d = {}
d.trackingCategory = '[[Category:Missing redirects]]'
+
 
d.existingRedirect = 'Foo'
+
-- Categories
d.nonExistingRedirect = 'This page does not exist - ashdofawdukfgku'
+
d.missingCat = 'Missing redirects'
 +
d.invalidCat = 'Invalid redirects'
 +
 
 +
-- Pages by namespace
 
d.mainspacePage = 'Foo'
 
d.mainspacePage = 'Foo'
d.nonMainspacePage = 'Wikipedia:Foo'
+
d.otherNamespacePage = 'Wikipedia:Foo'
  
function suite:assertContainsTrackingCategory(result)
+
-- Pages by namespace and status
self:assertStringContains(d.trackingCategory, result, true)
+
d.mainspaceExistingRedirect = 'Foo'
 +
d.mainspaceExistingNonRedirect = 'Example'
 +
d.mainspaceNonExisting = 'This page does not exist - ashdofawdukfgku'
 +
d.nonMainspaceNonExisting = 'Wikipedia:This page does not exist - asjhflwaiebf'
 +
d.nonMainspaceExistingRedirect = 'Wikipedia:AN'
 +
d.nonMainspaceExistingNonRedirect = "Wikipedia:Administrators' noticeboard"
 +
d.invalidPage = 'Foo<>Bar'
 +
 
 +
function suite:assertContainsTrackingCategory(category, result)
 +
category = string.format('[[Category:%s]]', category)
 +
self:assertStringContains(category, result, true)
 
end
 
end
  
 
function suite:assertNotContainsTrackingCategory(result)
 
function suite:assertNotContainsTrackingCategory(result)
self:assertNotStringContains(d.trackingCategory, result, true)
+
self:assertNotStringContains('%[%[Category:[^%]]+%]%]', result)
 
end
 
end
  
Line 270: Line 283:
 
end
 
end
  
function suite:testTrackingCategoryNamespace()
+
function suite:testTrackingCategoryNonMainspace()
self:assertNotContainsTrackingCategory(suite.runRedirectWithTitle(d.nonExistingRedirect, d.nonMainspacePage))
+
local redirects = {
self:assertContainsTrackingCategory(suite.runRedirectWithTitle(d.nonExistingRedirect, d.mainspacePage))
+
d.mainspaceNonExisting,
end
+
d.mainspaceExistingNonRedirect,
 
+
d.nonMainspaceNonExisting,
function suite:testTrackingCategoryRedirectExistence()
+
d.nonMainspaceExistingNonRedirect
self:assertContainsTrackingCategory(suite.runRedirectWithTitle(d.nonExistingRedirect, d.mainspacePage))
+
}
self:assertNotContainsTrackingCategory(suite.runRedirectWithTitle(d.existingRedirect, d.mainspacePage))
+
for _, redirect in ipairs(redirects) do
 +
self:assertNotContainsTrackingCategory(suite.runRedirectWithTitle(
 +
redirect, d.otherNamespacePage
 +
))
 +
end
 
end
 
end
  
 
function suite:testTrackingCategoryExceptions()
 
function suite:testTrackingCategoryExceptions()
self:assertNotContainsTrackingCategory(suite.runRedirectWithTitle('REDIRECT', d.mainspacePage))
+
for _, s in ipairs{'REDIRECT', 'REDIRECT1', 'REDIRECT1678', 'TERM'} do
self:assertNotContainsTrackingCategory(suite.runRedirectWithTitle('REDIRECT1', d.mainspacePage))
+
self:assertNotContainsTrackingCategory(suite.runRedirectWithTitle(s, d.mainspacePage))
self:assertNotContainsTrackingCategory(suite.runRedirectWithTitle('REDIRECT1678', d.mainspacePage))
+
end
self:assertNotContainsTrackingCategory(suite.runRedirectWithTitle('TERM', d.mainspacePage))
 
 
end
 
end
  
 
return suite
 
return suite

Revision as of 09:49, 5 September 2014

Documentation for this module may be created at Module:Redirect hatnote/testcases/doc

local mRedirectHatnote = require('Module:Redirect hatnote')
local _redirect = mRedirectHatnote._redirect
local mHatnote = require('Module:Hatnote')
local ScribuntoUnit = require('Module:ScribuntoUnit')
local suite = ScribuntoUnit:new()

--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------

function suite.runRedirect(args)
	-- Runs the "redirect" function with an args table passed from a
	-- parent frame.
	local frame = mw.getCurrentFrame()
	local parent = frame:newChild{args = args}
	local child = parent:newChild{}
	return mRedirectHatnote.redirect(child)
end

--------------------------------------------------------------------------------
-- Test #invoke function basic
--------------------------------------------------------------------------------

function suite:testBlank()
	local result = suite.runRedirect{}
	self:assertStringContains('no redirect specified', result, true)
	self:assertStringContains('Template:Redirect#Errors', result, true)
end

function suite:testRedirectOnly()
	local result = suite.runRedirect{'REDIRECT'}
	self:assertStringContains('"REDIRECT" redirects here. For other uses, see [[REDIRECT (disambiguation)]].', result, true)
end

function suite:testUse1()
	local result = suite.runRedirect{'REDIRECT', 'USE1'}
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[REDIRECT (disambiguation)]].', result, true)
end

function suite:testPage1()
	local result = suite.runRedirect{'REDIRECT', 'USE1', 'PAGE1'}
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[PAGE1]].', result, true)
end

function suite:testUse2()
	local result = suite.runRedirect{'REDIRECT', 'USE1', 'PAGE1', 'USE2'}
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[PAGE1]]. For USE2, see [[USE2 (disambiguation)]].', result, true)
end

function suite:testPage2()
	local result = suite.runRedirect{'REDIRECT', 'USE1', 'PAGE1', 'USE2', 'PAGE2'}
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[PAGE1]]. For USE2, see [[PAGE2]].', result, true)
end

function suite:testUse3()
	local result = suite.runRedirect{'REDIRECT', 'USE1', 'PAGE1', 'USE2', 'PAGE2', 'USE3'}
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[PAGE1]]. For USE2, see [[PAGE2]]. For USE3, see [[USE3 (disambiguation)]].', result, true)
end

function suite:testPage3()
	local result = suite.runRedirect{'REDIRECT', 'USE1', 'PAGE1', 'USE2', 'PAGE2', 'USE3', 'PAGE3'}
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[PAGE1]]. For USE2, see [[PAGE2]]. For USE3, see [[PAGE3]].', result, true)
end

function suite:testUse4()
	local result = suite.runRedirect{'REDIRECT', 'USE1', 'PAGE1', 'USE2', 'PAGE2', 'USE3', 'PAGE3', 'USE4'}
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[PAGE1]]. For USE2, see [[PAGE2]]. For USE3, see [[PAGE3]]. For USE4, see [[USE4 (disambiguation)]].', result, true)
end

function suite:testPage4()
	local result = suite.runRedirect{'REDIRECT', 'USE1', 'PAGE1', 'USE2', 'PAGE2', 'USE3', 'PAGE3', 'USE4', 'PAGE4'}
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[PAGE1]]. For USE2, see [[PAGE2]]. For USE3, see [[PAGE3]]. For USE4, see [[PAGE4]].', result, true)
end

function suite:testPipeInput()
	local result = suite.runRedirect{'REDIRECT', 'USE1', 'PAGE1 (disambiguation)|PAGE1', 'USE2', 'PAGE2 (disambiguation)|PAGE2', 'USE3', 'PAGE3 (disambiguation)|PAGE3', 'USE4', 'PAGE4 (disambiguation)|PAGE4'}
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[PAGE1 (disambiguation)|PAGE1]]. For USE2, see [[PAGE2 (disambiguation)|PAGE2]]. For USE3, see [[PAGE3 (disambiguation)|PAGE3]]. For USE4, see [[PAGE4 (disambiguation)|PAGE4]].', result, true)
end

--------------------------------------------------------------------------------
-- Test "and"
--------------------------------------------------------------------------------

function suite:testPage1AndPage2()
	local result = suite.runRedirect{'REDIRECT', 'USE1', 'PAGE1', 'and', 'PAGE2'}
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[PAGE1]] and [[PAGE2]].', result, true)
end

function suite:testPage2AndPage3()
	local result = suite.runRedirect{'REDIRECT', 'USE1', 'PAGE1', 'USE2', 'PAGE2', 'and', 'PAGE3'}
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[PAGE1]]. For USE2, see [[PAGE2]] and [[PAGE3]].', result, true)
end

function suite:testPage1AndPage2Page3AndPage4()
	local result = suite.runRedirect{'REDIRECT', 'USE1', 'PAGE1', 'and', 'PAGE2', 'USE2', 'PAGE3', 'and', 'PAGE4'}
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[PAGE1]] and [[PAGE2]]. For USE2, see [[PAGE3]] and [[PAGE4]].', result, true)
end

function suite:testTwoAnds()
	local result = suite.runRedirect{'REDIRECT', 'USE1', 'PAGE1', 'and', 'PAGE2', 'and', 'PAGE3'}
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[PAGE1]], [[PAGE2]] and [[PAGE3]].', result, true)
end

function suite:testThreeAnds()
	local result = suite.runRedirect{'REDIRECT', 'USE1', 'PAGE1', 'and', 'PAGE2', 'and', 'PAGE3', 'and', 'PAGE4'}
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[PAGE1]], [[PAGE2]], [[PAGE3]] and [[PAGE4]].', result, true)
end

function suite:testTwoAndsUse2()
	local result = suite.runRedirect{'REDIRECT', 'USE1', 'PAGE1', 'and', 'PAGE2', 'and', 'PAGE3', 'USE2', 'PAGE4'}
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[PAGE1]], [[PAGE2]] and [[PAGE3]]. For USE2, see [[PAGE4]].', result, true)
end

--------------------------------------------------------------------------------
-- Test skipping parameters
--------------------------------------------------------------------------------

function suite:testUse1Skipped()
	local result = suite.runRedirect{'REDIRECT', '', 'PAGE1'}
	self:assertStringContains('"REDIRECT" redirects here. For other uses, see [[PAGE1]].', result, true)
end

function suite:testPage1Skipped()
	local result = suite.runRedirect{'REDIRECT', 'USE1', '', 'USE2'}
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[REDIRECT (disambiguation)]]. For USE2, see [[USE2 (disambiguation)]].', result, true)
end

function suite:testUse2Skipped()
	local result = suite.runRedirect{'REDIRECT', 'USE1', 'PAGE1', '', 'PAGE2'}
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[PAGE1]].', result, true)
end

function suite:testPage2Skipped()
	local result = suite.runRedirect{'REDIRECT', 'USE1', 'PAGE1', 'USE2', '', 'USE3'}
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[PAGE1]]. For USE2, see [[USE2 (disambiguation)]]. For USE3, see [[USE3 (disambiguation)]].', result, true)
end

function suite:testUse3Skipped()
	local result = suite.runRedirect{'REDIRECT', 'USE1', 'PAGE1', 'USE2', 'PAGE2', '', 'PAGE3'}
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[PAGE1]]. For USE2, see [[PAGE2]].', result, true)
end

function suite:testMiddleUseSkipped()
	local result = suite.runRedirect{'REDIRECT', 'USE1', 'PAGE1', '', 'PAGE2', 'USE3', 'PAGE3'}
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[PAGE1]].', result, true)
end

function suite:testMiddlePageSkipped()
	local result = suite.runRedirect{'REDIRECT', 'USE1', 'PAGE1', 'USE2', '', 'USE3', 'PAGE3'}
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[PAGE1]]. For USE2, see [[USE2 (disambiguation)]]. For USE3, see [[PAGE3]].', result, true)
end

--------------------------------------------------------------------------------
-- Test other uses
--------------------------------------------------------------------------------

function suite:testUse2Skipped()
	local result = suite.runRedirect{'REDIRECT', 'USE1', 'PAGE1', '', 'PAGE2'}
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[PAGE1]].', result, true)
end

function suite:testUse2Is1()
	local result = suite.runRedirect{'REDIRECT', 'USE1', 'PAGE1', '1', 'PAGE2'}
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[PAGE1]]. For other uses, see [[PAGE2]].', result, true)
end

function suite:testUse1Is1()
	local result = suite.runRedirect{'REDIRECT', '1', 'PAGE1', 'USE2', 'PAGE2'}
	self:assertStringContains('"REDIRECT" redirects here. For 1, see [[PAGE1]]. For USE2, see [[PAGE2]].', result, true)
end

function suite:testOtherUsesIsNotFinal()
	local result = suite.runRedirect{'REDIRECT', 'USE1', 'PAGE1', '1', 'PAGE2', 'USE3', 'PAGE3'}
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[PAGE1]]. For other uses, see [[PAGE2]]. For USE3, see [[PAGE3]].', result, true)
end

--------------------------------------------------------------------------------
-- Test options
--------------------------------------------------------------------------------

function suite:testSelfRef()
	local result = suite.runRedirect{'REDIRECT', selfref = 'yes'}
	self:assertStringContains('class=".-selfref.-"', result, false)
end

--------------------------------------------------------------------------------
-- Test Lua interface
--------------------------------------------------------------------------------

function suite:assertError(...)
	local success, result = pcall(_redirect, ...)
	self:assertFalse(success)
end

function suite:testInvalidInput()
	self:assertError()
	self:assertError(9)
	self:assertError(true)
	self:assertError('REDIRECT', 'invalid')
	self:assertError('REDIRECT', 'invalid', {})
	self:assertError('REDIRECT', nil, 'invalid')
	self:assertError('REDIRECT', {}, 'invalid')
end

function suite:testLuaRedirectOnly()
	local result = _redirect('REDIRECT')
	self:assertStringContains('"REDIRECT" redirects here. For other uses, see [[REDIRECT (disambiguation)]].', result, true)
end

function suite:testLuaPage1()
	local result = _redirect(
		'REDIRECT',
		{
			{use = 'USE1', pages = {'PAGE1'}}
		}
	)
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[PAGE1]].', result, true)
end

function suite:testLuaPage3()
	local result = _redirect(
		'REDIRECT',
		{
			{use = 'USE1', pages = {'PAGE1'}},
			{use = 'USE2', pages = {'PAGE2'}},
			{use = 'USE3', pages = {'PAGE3'}}
		}
	)
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[PAGE1]]. For USE2, see [[PAGE2]]. For USE3, see [[PAGE3]].', result, true)
end

function suite:testLuaMultiplePages()
	local result = _redirect(
		'REDIRECT',
		{
			{use = 'USE1', pages = {'PAGE1', 'PAGE2', 'PAGE3'}},
			{use = 'USE2', pages = {'PAGE4', 'PAGE5'}},
		}
	)
	self:assertStringContains('"REDIRECT" redirects here. For USE1, see [[PAGE1]], [[PAGE2]] and [[PAGE3]]. For USE2, see [[PAGE4]] and [[PAGE5]].', result, true)
end

function suite:testLuaSelfref()
	local result = _redirect('REDIRECT', nil, {selfref = true})
	self:assertStringContains('class=".-selfref.-"', result, false)
end

--------------------------------------------------------------------------------
-- Test tracking category
--------------------------------------------------------------------------------

local d = {}

-- Categories
d.missingCat = 'Missing redirects'
d.invalidCat = 'Invalid redirects'

-- Pages by namespace
d.mainspacePage = 'Foo'
d.otherNamespacePage = 'Wikipedia:Foo'

-- Pages by namespace and status
d.mainspaceExistingRedirect = 'Foo'
d.mainspaceExistingNonRedirect = 'Example'
d.mainspaceNonExisting = 'This page does not exist - ashdofawdukfgku'
d.nonMainspaceNonExisting = 'Wikipedia:This page does not exist - asjhflwaiebf'
d.nonMainspaceExistingRedirect = 'Wikipedia:AN'
d.nonMainspaceExistingNonRedirect = "Wikipedia:Administrators' noticeboard"
d.invalidPage = 'Foo<>Bar'

function suite:assertContainsTrackingCategory(category, result)
	category = string.format('[[Category:%s]]', category)
	self:assertStringContains(category, result, true)
end

function suite:assertNotContainsTrackingCategory(result)
	self:assertNotStringContains('%[%[Category:[^%]]+%]%]', result)
end

function suite.runRedirectWithTitle(redirect, page)
	local titleObj = mw.title.new(page)
	return _redirect(redirect, nil, nil, titleObj)
end

function suite:testTrackingCategoryNonMainspace()
	local redirects = {
		d.mainspaceNonExisting,
		d.mainspaceExistingNonRedirect,
		d.nonMainspaceNonExisting,
		d.nonMainspaceExistingNonRedirect
	}
	for _, redirect in ipairs(redirects) do
		self:assertNotContainsTrackingCategory(suite.runRedirectWithTitle(
			redirect, d.otherNamespacePage
		))
	end
end

function suite:testTrackingCategoryExceptions()
	for _, s in ipairs{'REDIRECT', 'REDIRECT1', 'REDIRECT1678', 'TERM'} do
		self:assertNotContainsTrackingCategory(suite.runRedirectWithTitle(s, d.mainspacePage))
	end
end

return suite