มอดูล:Redirect hatnote/testcases

local mRedirectHatnote = require('Module:Redirect hatnote/sandbox')
local _redirect = mRedirectHatnote._redirect
local ScribuntoUnit = require('Module:ScribuntoUnit')
local suite = ScribuntoUnit:new()
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
function suite.runRedirect(args, childArgs)
	-- 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{args = childArgs}
	return mRedirectHatnote.redirect(child)
end
--------------------------------------------------------------------------------
-- Test #invoke function basic
--------------------------------------------------------------------------------
function suite:testBlank()
	local result = suite.runRedirect({},{})
	self:assertStringContains('missing redirect parameter', result, true)
	self:assertStringContains('Template:Redirect#Errors', result, true)
end
function suite:testRedirectOnly()
	local result = suite.runRedirect({'REDIRECT'},{1})
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับความหมายอื่น ดูที่ :REDIRECT (แก้ความกำกวม)', result, true)
end
function suite:testUse1()
	local result = suite.runRedirect({'REDIRECT', 'USE1'},{1})
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับUSE1 ดูที่ :REDIRECT (แก้ความกำกวม)', result, true)
end
function suite:testPage1()
	local result = suite.runRedirect({'REDIRECT', 'USE1', 'PAGE1'},{1})
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับUSE1 ดูที่ :PAGE1', result, true)
end
function suite:testUse2()
	local result = suite.runRedirect({'REDIRECT', 'USE1', 'PAGE1', 'USE2'},{1})
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับUSE1 ดูที่ :PAGE1 สำหรับUSE2 ดูที่ :REDIRECT (แก้ความกำกวม)', result, true)
end
function suite:testPage2()
	local result = suite.runRedirect({'REDIRECT', 'USE1', 'PAGE1', 'USE2', 'PAGE2'},{1})
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับUSE1 ดูที่ :PAGE1 สำหรับUSE2 ดูที่ :PAGE2', result, true)
end
function suite:testUse3()
	local result = suite.runRedirect({'REDIRECT', 'USE1', 'PAGE1', 'USE2', 'PAGE2', 'USE3'},{1})
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับUSE1 ดูที่ :PAGE1 สำหรับUSE2 ดูที่ :PAGE2 สำหรับUSE3 ดูที่ :REDIRECT (แก้ความกำกวม)', result, true)
end
function suite:testPage3()
	local result = suite.runRedirect({'REDIRECT', 'USE1', 'PAGE1', 'USE2', 'PAGE2', 'USE3', 'PAGE3'},{1})
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับUSE1 ดูที่ :PAGE1 สำหรับUSE2 ดูที่ :PAGE2 สำหรับUSE3 ดูที่ :PAGE3', result, true)
end
function suite:testUse4()
	local result = suite.runRedirect({'REDIRECT', 'USE1', 'PAGE1', 'USE2', 'PAGE2', 'USE3', 'PAGE3', 'USE4'},{1})
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับUSE1 ดูที่ :PAGE1 สำหรับUSE2 ดูที่ :PAGE2 สำหรับUSE3 ดูที่ :PAGE3 สำหรับUSE4 ดูที่ :REDIRECT (แก้ความกำกวม)', result, true)
end
function suite:testPage4()
	local result = suite.runRedirect({'REDIRECT', 'USE1', 'PAGE1', 'USE2', 'PAGE2', 'USE3', 'PAGE3', 'USE4', 'PAGE4'},{1})
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับUSE1 ดูที่ :PAGE1 สำหรับUSE2 ดูที่ :PAGE2 สำหรับUSE3 ดูที่ :PAGE3 สำหรับUSE4 ดูที่ :PAGE4', result, true)
end
function suite:testPipeInput()
	local result = suite.runRedirect({'REDIRECT', 'USE1', 'PAGE1 (แก้ความกำกวม)|PAGE1', 'USE2', 'PAGE2 (แก้ความกำกวม)|PAGE2', 'USE3', 'PAGE3 (แก้ความกำกวม)|PAGE3', 'USE4', 'PAGE4 (แก้ความกำกวม)|PAGE4'},{1})
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับUSE1 ดูที่ PAGE1 สำหรับUSE2 ดูที่ PAGE2 สำหรับUSE3 ดูที่ PAGE3 สำหรับUSE4 ดูที่ PAGE4', result, true)
end
--------------------------------------------------------------------------------
-- Test "and"
--------------------------------------------------------------------------------
function suite:testPage1AndPage2()
	local result = suite.runRedirect({'REDIRECT', 'USE1', 'PAGE1', 'และ', 'PAGE2'},{1})
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับUSE1 ดูที่ :PAGE1 และ :PAGE2', result, true)
end
function suite:testPage2AndPage3()
	local result = suite.runRedirect({'REDIRECT', 'USE1', 'PAGE1', 'USE2', 'PAGE2', 'และ', 'PAGE3'},{1})
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับUSE1 ดูที่ :PAGE1 สำหรับUSE2 ดูที่ :PAGE2 และ :PAGE3', result, true)
end
function suite:testPage1AndPage2Page3AndPage4()
	local result = suite.runRedirect({'REDIRECT', 'USE1', 'PAGE1', 'และ', 'PAGE2', 'USE2', 'PAGE3', 'และ', 'PAGE4'},{1})
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับUSE1 ดูที่ :PAGE1 และ :PAGE2 สำหรับUSE2 ดูที่ :PAGE3 และ :PAGE4', result, true)
end
function suite:testTwoAnds()
	local result = suite.runRedirect({'REDIRECT', 'USE1', 'PAGE1', 'และ', 'PAGE2', 'และ', 'PAGE3'},{1})
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับUSE1 ดูที่ :PAGE1, :PAGE2, และ :PAGE3', result, true)
end
function suite:testThreeAnds()
	local result = suite.runRedirect({'REDIRECT', 'USE1', 'PAGE1', 'และ', 'PAGE2', 'และ', 'PAGE3', 'และ', 'PAGE4'},{1})
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับUSE1 ดูที่ :PAGE1, :PAGE2, :PAGE3, และ :PAGE4', result, true)
end
function suite:testTwoAndsUse2()
	local result = suite.runRedirect({'REDIRECT', 'USE1', 'PAGE1', 'และ', 'PAGE2', 'และ', 'PAGE3', 'USE2', 'PAGE4'},{1})
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับUSE1 ดูที่ :PAGE1, :PAGE2, และ :PAGE3 สำหรับUSE2 ดูที่ :PAGE4', result, true)
end
--------------------------------------------------------------------------------
-- Test skipping parameters
--------------------------------------------------------------------------------
function suite:testUse1Skipped()
	local result = suite.runRedirect({'REDIRECT', , 'PAGE1'},{1})
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับความหมายอื่น ดูที่ :PAGE1', result, true)
end
function suite:testPage1Skipped()
	local result = suite.runRedirect({'REDIRECT', 'USE1', , 'USE2'},{1})
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับUSE1 ดูที่ :REDIRECT (แก้ความกำกวม) สำหรับUSE2 ดูที่ :REDIRECT (แก้ความกำกวม)', result, true)
end
function suite:testUse2Skipped()
	local result = suite.runRedirect({'REDIRECT', 'USE1', 'PAGE1', , 'PAGE2'},{1})
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับUSE1 ดูที่ :PAGE1', result, true)
end
function suite:testPage2Skipped()
	local result = suite.runRedirect({'REDIRECT', 'USE1', 'PAGE1', 'USE2', , 'USE3'},{1})
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับUSE1 ดูที่ :PAGE1 สำหรับUSE2 ดูที่ :REDIRECT (แก้ความกำกวม) สำหรับUSE3 ดูที่ :REDIRECT (แก้ความกำกวม)', result, true)
end
function suite:testUse3Skipped()
	local result = suite.runRedirect({'REDIRECT', 'USE1', 'PAGE1', 'USE2', 'PAGE2', , 'PAGE3'},{1})
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับUSE1 ดูที่ :PAGE1 สำหรับUSE2 ดูที่ :PAGE2', result, true)
end
function suite:testMiddleUseSkipped()
	local result = suite.runRedirect({'REDIRECT', 'USE1', 'PAGE1', , 'PAGE2', 'USE3', 'PAGE3'},{1})
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับUSE1 ดูที่ :PAGE1', result, true)
end
function suite:testMiddlePageSkipped()
	local result = suite.runRedirect({'REDIRECT', 'USE1', 'PAGE1', 'USE2', , 'USE3', 'PAGE3'},{1})
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับUSE1 ดูที่ :PAGE1 สำหรับUSE2 ดูที่ :REDIRECT (แก้ความกำกวม) สำหรับUSE3 ดูที่ :PAGE3', result, true)
end
--------------------------------------------------------------------------------
-- Test other uses
--------------------------------------------------------------------------------
function suite:testUse2Skipped()
	local result = suite.runRedirect({'REDIRECT', 'USE1', 'PAGE1', , 'PAGE2'},{1})
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับUSE1 ดูที่ :PAGE1', result, true)
end
function suite:testOtherUsesIsNotFinal()
	local result = suite.runRedirect({'REDIRECT', 'USE1', 'PAGE1', 'ความหมายอื่น', 'PAGE2', 'USE3', 'PAGE3'},{1})
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับUSE1 ดูที่ :PAGE1 สำหรับความหมายอื่น ดูที่ :PAGE2 สำหรับUSE3 ดูที่ :PAGE3', result, true)
end
--------------------------------------------------------------------------------
-- Test options
--------------------------------------------------------------------------------
function suite:testSelfRef()
	local result = suite.runRedirect({'REDIRECT', selfref = 'yes'},{1})
	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" เปลี่ยนทางมาที่นี่ สำหรับความหมายอื่น ดูที่ :REDIRECT (แก้ความกำกวม)', result, true)
end
function suite:testLuaPage1()
	local result = _redirect(
		{'REDIRECT', 'USE1', 'PAGE1'},
		1
	)
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับUSE1 ดูที่ :PAGE1', result, true)
end
function suite:testLuaPage3()
	local result = _redirect(
		{'REDIRECT', 'USE1', 'PAGE1', 'USE2', 'PAGE2', 'USE3', 'PAGE3'},
		1
	)
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับUSE1 ดูที่ :PAGE1 สำหรับUSE2 ดูที่ :PAGE2 สำหรับUSE3 ดูที่ :PAGE3', result, true)
end
function suite:testLuaMultiplePages()
	local result = _redirect(
		{'REDIRECT', 'USE1', 'PAGE1', 'และ', 'PAGE2', 'และ', 'PAGE3', 'USE2', 'PAGE4', 'และ', 'PAGE5'},
		1
	)
	self:assertStringContains('"REDIRECT" เปลี่ยนทางมาที่นี่ สำหรับUSE1 ดูที่ :PAGE1, :PAGE2, และ :PAGE3 สำหรับUSE2 ดูที่ :PAGE4 และ :PAGE5', result, true)
end
function suite:testLuaSelfref()
	local result = _redirect({'REDIRECT'}, 1, {selfref = true})
	self:assertStringContains('class=".-selfref.-"', result, false)
end
--------------------------------------------------------------------------------
-- Test tracking category
--------------------------------------------------------------------------------
function suite.makeFakeTitleObject(page, vals)
	local title
	if page then
		title = mw.title.new(page)
	else
		title = mw.title.getCurrentTitle()
	end
	for k, v in pairs(vals or {}) do
		rawset(title, k, v)
	end
	return title
end
local d = {}
-- Categories
d.missingCat = 'Missing redirects'
d.invalidCat = 'Articles with redirect hatnotes needing review'
function suite:assertContainsTrackingCategory(category, result)
	category = string.format(, category)
	self:assertStringContains(category, result, true)
end
function suite:assertNotContainsTrackingCategory(result)
	self:assertNotStringContains('%%Category:^%+%%', result)
end
function suite:testTrackingCategoryNonMainspace()
	local currentTitle = suite.makeFakeTitleObject('Wikipedia:Namespaces')
	suite:assertNotContainsTrackingCategory(_redirect({'Example'}, nil, nil, currentTitle))
end
function suite:testTrackingCategoryExceptions()
	local currentTitle = suite.makeFakeTitleObject('Example')
	for _, s in ipairs{'REDIRECT', 'REDIRECT1', 'REDIRECT1678', 'TERM'} do
		self:assertNotContainsTrackingCategory(_redirect({s}, nil, nil, currentTitle))
	end
end
function suite:testTrackingCategoryInvalidTitle()
	local currentTitle = suite.makeFakeTitleObject('Example')
	self:assertContainsTrackingCategory(d.missingCat, _redirect({'Example 2'}, nil, nil, currentTitle))
end
function suite:testTrackingCategoryNonexistent()
	local currentTitle = suite.makeFakeTitleObject('Example')
	local redirectTitle = suite.makeFakeTitleObject('Example 2', {exists = false, isRedirect = false})
	self:assertContainsTrackingCategory(d.missingCat, _redirect({redirectTitle.prefixedText}, nil, nil, currentTitle, redirectTitle))
end
function suite:testTrackingCategoryNotRedirect()
	local currentTitle = suite.makeFakeTitleObject('Example')
	local redirectTitle = suite.makeFakeTitleObject('Example 2', {exists = true, isRedirect = false, getContent = function ()
		return 'Not a redirect!'
	end})
	self:assertContainsTrackingCategory(d.invalidCat, _redirect({redirectTitle.prefixedText}, nil, nil, currentTitle, redirectTitle))
end
function suite:testTrackingCategoryRfDRedirect()
	local currentTitle = suite.makeFakeTitleObject('Example')
	local redirectTitle = suite.makeFakeTitleObject('Example 2', {exists = true, isRedirect = false, getContent = function ()
		return**
	==== end})
	self:assertNotContainsTrackingCategory(d.invalidCat, _redirect({redirectTitle.prefixedText}, nil, nil, currentTitle, redirectTitle))
end
function suite:testTrackingCategoryWrongTarget()
	local currentTitle = suite.makeFakeTitleObject('Example')
	local redirectTitle = suite.makeFakeTitleObject('Example 2', {exists = true, isRedirect = true, getContent = function ()
		return '#REDIRECT Example 3' -- This is to fool Module:Redirect.
	end})
	local targetTitle = suite.makeFakeTitleObject('Example 3')
	self:assertContainsTrackingCategory(d.invalidCat, _redirect({redirectTitle.prefixedText}, nil, nil, currentTitle, redirectTitle, targetTitle))
end
function suite:testTrackingCategoryCorrectTarget()
	local currentTitle = suite.makeFakeTitleObject('Example')
	local redirectTitle = suite.makeFakeTitleObject('Example 2', {exists = true, isRedirect = true, getContent = function ()
		return '#REDIRECT Example' -- This is to fool Module:Redirect.
	end})
	local targetTitle = suite.makeFakeTitleObject('Example')
	self:assertNotContainsTrackingCategory(_redirect({redirectTitle.prefixedText}, nil, nil, currentTitle, redirectTitle, targetTitle))
end
return suite