<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://70.231.62.181/index.php?action=history&amp;feed=atom&amp;title=Module%3ARedirect_hatnote%2Ftestcases</id>
	<title>Module:Redirect hatnote/testcases - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://70.231.62.181/index.php?action=history&amp;feed=atom&amp;title=Module%3ARedirect_hatnote%2Ftestcases"/>
	<link rel="alternate" type="text/html" href="http://70.231.62.181/index.php?title=Module:Redirect_hatnote/testcases&amp;action=history"/>
	<updated>2026-04-23T04:45:29Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>http://70.231.62.181/index.php?title=Module:Redirect_hatnote/testcases&amp;diff=19428086&amp;oldid=prev</id>
		<title>imported&gt;Tamzin: Reverted edits by Tamzin (talk) to last version by Nihiltres.</title>
		<link rel="alternate" type="text/html" href="http://70.231.62.181/index.php?title=Module:Redirect_hatnote/testcases&amp;diff=19428086&amp;oldid=prev"/>
		<updated>2022-05-09T09:19:20Z</updated>

		<summary type="html">&lt;p&gt;Reverted edits by &lt;a href=&quot;/index.php/Special:Contributions/Tamzin&quot; title=&quot;Special:Contributions/Tamzin&quot;&gt;Tamzin&lt;/a&gt; (&lt;a href=&quot;/index.php/User_talk:Tamzin&quot; title=&quot;User talk:Tamzin&quot;&gt;talk&lt;/a&gt;) to last version by Nihiltres.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local mRedirectHatnote = require(&amp;#039;Module:Redirect hatnote/sandbox&amp;#039;)&lt;br /&gt;
local _redirect = mRedirectHatnote._redirect&lt;br /&gt;
local ScribuntoUnit = require(&amp;#039;Module:ScribuntoUnit&amp;#039;)&lt;br /&gt;
local suite = ScribuntoUnit:new()&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite.runRedirect(args, childArgs)&lt;br /&gt;
	-- Runs the &amp;quot;redirect&amp;quot; function with an args table passed from a&lt;br /&gt;
	-- parent frame.&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	local parent = frame:newChild{args = args}&lt;br /&gt;
	local child = parent:newChild{args = childArgs}&lt;br /&gt;
	return mRedirectHatnote.redirect(child)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Test #invoke function basic&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testBlank()&lt;br /&gt;
	local result = suite.runRedirect({},{})&lt;br /&gt;
	self:assertStringContains(&amp;#039;missing redirect parameter&amp;#039;, result, true)&lt;br /&gt;
	self:assertStringContains(&amp;#039;Template:Redirect#Errors&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testRedirectOnly()&lt;br /&gt;
	local result = suite.runRedirect({&amp;#039;REDIRECT&amp;#039;},{1})&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For other uses, see [[:REDIRECT (disambiguation)]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testUse1()&lt;br /&gt;
	local result = suite.runRedirect({&amp;#039;REDIRECT&amp;#039;, &amp;#039;USE1&amp;#039;},{1})&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For USE1, see [[:REDIRECT (disambiguation)]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testPage1()&lt;br /&gt;
	local result = suite.runRedirect({&amp;#039;REDIRECT&amp;#039;, &amp;#039;USE1&amp;#039;, &amp;#039;PAGE1&amp;#039;},{1})&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For USE1, see [[:PAGE1]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testUse2()&lt;br /&gt;
	local result = suite.runRedirect({&amp;#039;REDIRECT&amp;#039;, &amp;#039;USE1&amp;#039;, &amp;#039;PAGE1&amp;#039;, &amp;#039;USE2&amp;#039;},{1})&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For USE1, see [[:PAGE1]]. For USE2, see [[:REDIRECT (disambiguation)]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testPage2()&lt;br /&gt;
	local result = suite.runRedirect({&amp;#039;REDIRECT&amp;#039;, &amp;#039;USE1&amp;#039;, &amp;#039;PAGE1&amp;#039;, &amp;#039;USE2&amp;#039;, &amp;#039;PAGE2&amp;#039;},{1})&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For USE1, see [[:PAGE1]]. For USE2, see [[:PAGE2]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testUse3()&lt;br /&gt;
	local result = suite.runRedirect({&amp;#039;REDIRECT&amp;#039;, &amp;#039;USE1&amp;#039;, &amp;#039;PAGE1&amp;#039;, &amp;#039;USE2&amp;#039;, &amp;#039;PAGE2&amp;#039;, &amp;#039;USE3&amp;#039;},{1})&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For USE1, see [[:PAGE1]]. For USE2, see [[:PAGE2]]. For USE3, see [[:REDIRECT (disambiguation)]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testPage3()&lt;br /&gt;
	local result = suite.runRedirect({&amp;#039;REDIRECT&amp;#039;, &amp;#039;USE1&amp;#039;, &amp;#039;PAGE1&amp;#039;, &amp;#039;USE2&amp;#039;, &amp;#039;PAGE2&amp;#039;, &amp;#039;USE3&amp;#039;, &amp;#039;PAGE3&amp;#039;},{1})&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For USE1, see [[:PAGE1]]. For USE2, see [[:PAGE2]]. For USE3, see [[:PAGE3]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testUse4()&lt;br /&gt;
	local result = suite.runRedirect({&amp;#039;REDIRECT&amp;#039;, &amp;#039;USE1&amp;#039;, &amp;#039;PAGE1&amp;#039;, &amp;#039;USE2&amp;#039;, &amp;#039;PAGE2&amp;#039;, &amp;#039;USE3&amp;#039;, &amp;#039;PAGE3&amp;#039;, &amp;#039;USE4&amp;#039;},{1})&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For USE1, see [[:PAGE1]]. For USE2, see [[:PAGE2]]. For USE3, see [[:PAGE3]]. For USE4, see [[:REDIRECT (disambiguation)]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testPage4()&lt;br /&gt;
	local result = suite.runRedirect({&amp;#039;REDIRECT&amp;#039;, &amp;#039;USE1&amp;#039;, &amp;#039;PAGE1&amp;#039;, &amp;#039;USE2&amp;#039;, &amp;#039;PAGE2&amp;#039;, &amp;#039;USE3&amp;#039;, &amp;#039;PAGE3&amp;#039;, &amp;#039;USE4&amp;#039;, &amp;#039;PAGE4&amp;#039;},{1})&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For USE1, see [[:PAGE1]]. For USE2, see [[:PAGE2]]. For USE3, see [[:PAGE3]]. For USE4, see [[:PAGE4]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testPipeInput()&lt;br /&gt;
	local result = suite.runRedirect({&amp;#039;REDIRECT&amp;#039;, &amp;#039;USE1&amp;#039;, &amp;#039;PAGE1 (disambiguation)|PAGE1&amp;#039;, &amp;#039;USE2&amp;#039;, &amp;#039;PAGE2 (disambiguation)|PAGE2&amp;#039;, &amp;#039;USE3&amp;#039;, &amp;#039;PAGE3 (disambiguation)|PAGE3&amp;#039;, &amp;#039;USE4&amp;#039;, &amp;#039;PAGE4 (disambiguation)|PAGE4&amp;#039;},{1})&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; 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]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Test &amp;quot;and&amp;quot;&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testPage1AndPage2()&lt;br /&gt;
	local result = suite.runRedirect({&amp;#039;REDIRECT&amp;#039;, &amp;#039;USE1&amp;#039;, &amp;#039;PAGE1&amp;#039;, &amp;#039;and&amp;#039;, &amp;#039;PAGE2&amp;#039;},{1})&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For USE1, see [[:PAGE1]] and [[:PAGE2]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testPage2AndPage3()&lt;br /&gt;
	local result = suite.runRedirect({&amp;#039;REDIRECT&amp;#039;, &amp;#039;USE1&amp;#039;, &amp;#039;PAGE1&amp;#039;, &amp;#039;USE2&amp;#039;, &amp;#039;PAGE2&amp;#039;, &amp;#039;and&amp;#039;, &amp;#039;PAGE3&amp;#039;},{1})&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For USE1, see [[:PAGE1]]. For USE2, see [[:PAGE2]] and [[:PAGE3]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testPage1AndPage2Page3AndPage4()&lt;br /&gt;
	local result = suite.runRedirect({&amp;#039;REDIRECT&amp;#039;, &amp;#039;USE1&amp;#039;, &amp;#039;PAGE1&amp;#039;, &amp;#039;and&amp;#039;, &amp;#039;PAGE2&amp;#039;, &amp;#039;USE2&amp;#039;, &amp;#039;PAGE3&amp;#039;, &amp;#039;and&amp;#039;, &amp;#039;PAGE4&amp;#039;},{1})&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For USE1, see [[:PAGE1]] and [[:PAGE2]]. For USE2, see [[:PAGE3]] and [[:PAGE4]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testTwoAnds()&lt;br /&gt;
	local result = suite.runRedirect({&amp;#039;REDIRECT&amp;#039;, &amp;#039;USE1&amp;#039;, &amp;#039;PAGE1&amp;#039;, &amp;#039;and&amp;#039;, &amp;#039;PAGE2&amp;#039;, &amp;#039;and&amp;#039;, &amp;#039;PAGE3&amp;#039;},{1})&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For USE1, see [[:PAGE1]], [[:PAGE2]], and [[:PAGE3]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testThreeAnds()&lt;br /&gt;
	local result = suite.runRedirect({&amp;#039;REDIRECT&amp;#039;, &amp;#039;USE1&amp;#039;, &amp;#039;PAGE1&amp;#039;, &amp;#039;and&amp;#039;, &amp;#039;PAGE2&amp;#039;, &amp;#039;and&amp;#039;, &amp;#039;PAGE3&amp;#039;, &amp;#039;and&amp;#039;, &amp;#039;PAGE4&amp;#039;},{1})&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For USE1, see [[:PAGE1]], [[:PAGE2]], [[:PAGE3]], and [[:PAGE4]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testTwoAndsUse2()&lt;br /&gt;
	local result = suite.runRedirect({&amp;#039;REDIRECT&amp;#039;, &amp;#039;USE1&amp;#039;, &amp;#039;PAGE1&amp;#039;, &amp;#039;and&amp;#039;, &amp;#039;PAGE2&amp;#039;, &amp;#039;and&amp;#039;, &amp;#039;PAGE3&amp;#039;, &amp;#039;USE2&amp;#039;, &amp;#039;PAGE4&amp;#039;},{1})&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For USE1, see [[:PAGE1]], [[:PAGE2]], and [[:PAGE3]]. For USE2, see [[:PAGE4]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Test skipping parameters&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testUse1Skipped()&lt;br /&gt;
	local result = suite.runRedirect({&amp;#039;REDIRECT&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;PAGE1&amp;#039;},{1})&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For other uses, see [[:PAGE1]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testPage1Skipped()&lt;br /&gt;
	local result = suite.runRedirect({&amp;#039;REDIRECT&amp;#039;, &amp;#039;USE1&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;USE2&amp;#039;},{1})&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For USE1, see [[:REDIRECT (disambiguation)]]. For USE2, see [[:REDIRECT (disambiguation)]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testUse2Skipped()&lt;br /&gt;
	local result = suite.runRedirect({&amp;#039;REDIRECT&amp;#039;, &amp;#039;USE1&amp;#039;, &amp;#039;PAGE1&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;PAGE2&amp;#039;},{1})&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For USE1, see [[:PAGE1]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testPage2Skipped()&lt;br /&gt;
	local result = suite.runRedirect({&amp;#039;REDIRECT&amp;#039;, &amp;#039;USE1&amp;#039;, &amp;#039;PAGE1&amp;#039;, &amp;#039;USE2&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;USE3&amp;#039;},{1})&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For USE1, see [[:PAGE1]]. For USE2, see [[:REDIRECT (disambiguation)]]. For USE3, see [[:REDIRECT (disambiguation)]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testUse3Skipped()&lt;br /&gt;
	local result = suite.runRedirect({&amp;#039;REDIRECT&amp;#039;, &amp;#039;USE1&amp;#039;, &amp;#039;PAGE1&amp;#039;, &amp;#039;USE2&amp;#039;, &amp;#039;PAGE2&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;PAGE3&amp;#039;},{1})&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For USE1, see [[:PAGE1]]. For USE2, see [[:PAGE2]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testMiddleUseSkipped()&lt;br /&gt;
	local result = suite.runRedirect({&amp;#039;REDIRECT&amp;#039;, &amp;#039;USE1&amp;#039;, &amp;#039;PAGE1&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;PAGE2&amp;#039;, &amp;#039;USE3&amp;#039;, &amp;#039;PAGE3&amp;#039;},{1})&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For USE1, see [[:PAGE1]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testMiddlePageSkipped()&lt;br /&gt;
	local result = suite.runRedirect({&amp;#039;REDIRECT&amp;#039;, &amp;#039;USE1&amp;#039;, &amp;#039;PAGE1&amp;#039;, &amp;#039;USE2&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;USE3&amp;#039;, &amp;#039;PAGE3&amp;#039;},{1})&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For USE1, see [[:PAGE1]]. For USE2, see [[:REDIRECT (disambiguation)]]. For USE3, see [[:PAGE3]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Test other uses&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testUse2Skipped()&lt;br /&gt;
	local result = suite.runRedirect({&amp;#039;REDIRECT&amp;#039;, &amp;#039;USE1&amp;#039;, &amp;#039;PAGE1&amp;#039;, &amp;#039;&amp;#039;, &amp;#039;PAGE2&amp;#039;},{1})&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For USE1, see [[:PAGE1]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testOtherUsesIsNotFinal()&lt;br /&gt;
	local result = suite.runRedirect({&amp;#039;REDIRECT&amp;#039;, &amp;#039;USE1&amp;#039;, &amp;#039;PAGE1&amp;#039;, &amp;#039;other uses&amp;#039;, &amp;#039;PAGE2&amp;#039;, &amp;#039;USE3&amp;#039;, &amp;#039;PAGE3&amp;#039;},{1})&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For USE1, see [[:PAGE1]]. For other uses, see [[:PAGE2]]. For USE3, see [[:PAGE3]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Test options&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:testSelfRef()&lt;br /&gt;
	local result = suite.runRedirect({&amp;#039;REDIRECT&amp;#039;, selfref = &amp;#039;yes&amp;#039;},{1})&lt;br /&gt;
	self:assertStringContains(&amp;#039;class=&amp;quot;.-selfref.-&amp;quot;&amp;#039;, result, false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Test Lua interface&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite:assertError(...)&lt;br /&gt;
	local success, result = pcall(_redirect, ...)&lt;br /&gt;
	self:assertFalse(success)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testInvalidInput()&lt;br /&gt;
	self:assertError()&lt;br /&gt;
	self:assertError(9)&lt;br /&gt;
	self:assertError(true)&lt;br /&gt;
	self:assertError(&amp;#039;REDIRECT&amp;#039;, &amp;#039;invalid&amp;#039;)&lt;br /&gt;
	self:assertError(&amp;#039;REDIRECT&amp;#039;, &amp;#039;invalid&amp;#039;, {})&lt;br /&gt;
	self:assertError(&amp;#039;REDIRECT&amp;#039;, nil, &amp;#039;invalid&amp;#039;)&lt;br /&gt;
	self:assertError(&amp;#039;REDIRECT&amp;#039;, {}, &amp;#039;invalid&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testLuaRedirectOnly()&lt;br /&gt;
	local result = _redirect({&amp;#039;REDIRECT&amp;#039;})&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For other uses, see [[:REDIRECT (disambiguation)]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testLuaPage1()&lt;br /&gt;
	local result = _redirect(&lt;br /&gt;
		{&amp;#039;REDIRECT&amp;#039;, &amp;#039;USE1&amp;#039;, &amp;#039;PAGE1&amp;#039;},&lt;br /&gt;
		1&lt;br /&gt;
	)&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For USE1, see [[:PAGE1]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testLuaPage3()&lt;br /&gt;
	local result = _redirect(&lt;br /&gt;
		{&amp;#039;REDIRECT&amp;#039;, &amp;#039;USE1&amp;#039;, &amp;#039;PAGE1&amp;#039;, &amp;#039;USE2&amp;#039;, &amp;#039;PAGE2&amp;#039;, &amp;#039;USE3&amp;#039;, &amp;#039;PAGE3&amp;#039;},&lt;br /&gt;
		1&lt;br /&gt;
	)&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For USE1, see [[:PAGE1]]. For USE2, see [[:PAGE2]]. For USE3, see [[:PAGE3]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testLuaMultiplePages()&lt;br /&gt;
	local result = _redirect(&lt;br /&gt;
		{&amp;#039;REDIRECT&amp;#039;, &amp;#039;USE1&amp;#039;, &amp;#039;PAGE1&amp;#039;, &amp;#039;and&amp;#039;, &amp;#039;PAGE2&amp;#039;, &amp;#039;and&amp;#039;, &amp;#039;PAGE3&amp;#039;, &amp;#039;USE2&amp;#039;, &amp;#039;PAGE4&amp;#039;, &amp;#039;and&amp;#039;, &amp;#039;PAGE5&amp;#039;},&lt;br /&gt;
		1&lt;br /&gt;
	)&lt;br /&gt;
	self:assertStringContains(&amp;#039;&amp;quot;REDIRECT&amp;quot; redirects here. For USE1, see [[:PAGE1]], [[:PAGE2]], and [[:PAGE3]]. For USE2, see [[:PAGE4]] and [[:PAGE5]].&amp;#039;, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testLuaSelfref()&lt;br /&gt;
	local result = _redirect({&amp;#039;REDIRECT&amp;#039;}, 1, {selfref = true})&lt;br /&gt;
	self:assertStringContains(&amp;#039;class=&amp;quot;.-selfref.-&amp;quot;&amp;#039;, result, false)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Test tracking category&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function suite.makeFakeTitleObject(page, vals)&lt;br /&gt;
	local title&lt;br /&gt;
	if page then&lt;br /&gt;
		title = mw.title.new(page)&lt;br /&gt;
	else&lt;br /&gt;
		title = mw.title.getCurrentTitle()&lt;br /&gt;
	end&lt;br /&gt;
	for k, v in pairs(vals or {}) do&lt;br /&gt;
		rawset(title, k, v)&lt;br /&gt;
	end&lt;br /&gt;
	return title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local d = {}&lt;br /&gt;
&lt;br /&gt;
-- Categories&lt;br /&gt;
d.missingCat = &amp;#039;Missing redirects&amp;#039;&lt;br /&gt;
d.invalidCat = &amp;#039;Articles with redirect hatnotes needing review&amp;#039;&lt;br /&gt;
&lt;br /&gt;
function suite:assertContainsTrackingCategory(category, result)&lt;br /&gt;
	category = string.format(&amp;#039;[[Category:%s]]&amp;#039;, category)&lt;br /&gt;
	self:assertStringContains(category, result, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:assertNotContainsTrackingCategory(result)&lt;br /&gt;
	self:assertNotStringContains(&amp;#039;%[%[Category:[^%]]+%]%]&amp;#039;, result)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testTrackingCategoryNonMainspace()&lt;br /&gt;
	local currentTitle = suite.makeFakeTitleObject(&amp;#039;Wikipedia:Namespaces&amp;#039;)&lt;br /&gt;
	suite:assertNotContainsTrackingCategory(_redirect({&amp;#039;Example&amp;#039;}, nil, nil, currentTitle))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testTrackingCategoryExceptions()&lt;br /&gt;
	local currentTitle = suite.makeFakeTitleObject(&amp;#039;Example&amp;#039;)&lt;br /&gt;
	for _, s in ipairs{&amp;#039;REDIRECT&amp;#039;, &amp;#039;REDIRECT1&amp;#039;, &amp;#039;REDIRECT1678&amp;#039;, &amp;#039;TERM&amp;#039;} do&lt;br /&gt;
		self:assertNotContainsTrackingCategory(_redirect({s}, nil, nil, currentTitle))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testTrackingCategoryInvalidTitle()&lt;br /&gt;
	local currentTitle = suite.makeFakeTitleObject(&amp;#039;Example&amp;#039;)&lt;br /&gt;
	self:assertContainsTrackingCategory(d.missingCat, _redirect({&amp;#039;Exam&amp;lt;&amp;gt;ple 2&amp;#039;}, nil, nil, currentTitle))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testTrackingCategoryNonexistent()&lt;br /&gt;
	local currentTitle = suite.makeFakeTitleObject(&amp;#039;Example&amp;#039;)&lt;br /&gt;
	local redirectTitle = suite.makeFakeTitleObject(&amp;#039;Example 2&amp;#039;, {exists = false, isRedirect = false})&lt;br /&gt;
	self:assertContainsTrackingCategory(d.missingCat, _redirect({redirectTitle.prefixedText}, nil, nil, currentTitle, redirectTitle))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testTrackingCategoryNotRedirect()&lt;br /&gt;
	local currentTitle = suite.makeFakeTitleObject(&amp;#039;Example&amp;#039;)&lt;br /&gt;
	local redirectTitle = suite.makeFakeTitleObject(&amp;#039;Example 2&amp;#039;, {exists = true, isRedirect = false, getContent = function ()&lt;br /&gt;
		return &amp;#039;Not a redirect!&amp;#039;&lt;br /&gt;
	end})&lt;br /&gt;
	self:assertContainsTrackingCategory(d.invalidCat, _redirect({redirectTitle.prefixedText}, nil, nil, currentTitle, redirectTitle))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testTrackingCategoryRfDRedirect()&lt;br /&gt;
	local currentTitle = suite.makeFakeTitleObject(&amp;#039;Example&amp;#039;)&lt;br /&gt;
	local redirectTitle = suite.makeFakeTitleObject(&amp;#039;Example 2&amp;#039;, {exists = true, isRedirect = false, getContent = function ()&lt;br /&gt;
		return [====[&lt;br /&gt;
{{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;#invoke:RfD||&lt;br /&gt;
|month = April&lt;br /&gt;
|day = 14&lt;br /&gt;
|year = 2021&lt;br /&gt;
|time = 15:27&lt;br /&gt;
|timestamp = 20210414152704&lt;br /&gt;
&amp;lt;!-- The above content is generated by {{subst:rfd}}. --&amp;gt;&lt;br /&gt;
&amp;lt;!-- End of RFD message. Don&amp;#039;t edit anything above here, but feel free to edit below here. --&amp;gt;|content=&lt;br /&gt;
#REDIRECT [[Example]]&lt;br /&gt;
&amp;lt;!-- Don&amp;#039;t add anything after this line unless you&amp;#039;re drafting a disambiguation page or article to replace the redirect. --&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
	]====] end})&lt;br /&gt;
	self:assertNotContainsTrackingCategory(d.invalidCat, _redirect({redirectTitle.prefixedText}, nil, nil, currentTitle, redirectTitle))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testTrackingCategoryWrongTarget()&lt;br /&gt;
	local currentTitle = suite.makeFakeTitleObject(&amp;#039;Example&amp;#039;)&lt;br /&gt;
	local redirectTitle = suite.makeFakeTitleObject(&amp;#039;Example 2&amp;#039;, {exists = true, isRedirect = true, getContent = function ()&lt;br /&gt;
		return &amp;#039;#REDIRECT [[Example 3]]&amp;#039; -- This is to fool Module:Redirect.&lt;br /&gt;
	end})&lt;br /&gt;
	local targetTitle = suite.makeFakeTitleObject(&amp;#039;Example 3&amp;#039;)&lt;br /&gt;
	self:assertContainsTrackingCategory(d.invalidCat, _redirect({redirectTitle.prefixedText}, nil, nil, currentTitle, redirectTitle, targetTitle))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function suite:testTrackingCategoryCorrectTarget()&lt;br /&gt;
	local currentTitle = suite.makeFakeTitleObject(&amp;#039;Example&amp;#039;)&lt;br /&gt;
	local redirectTitle = suite.makeFakeTitleObject(&amp;#039;Example 2&amp;#039;, {exists = true, isRedirect = true, getContent = function ()&lt;br /&gt;
		return &amp;#039;#REDIRECT [[Example]]&amp;#039; -- This is to fool Module:Redirect.&lt;br /&gt;
	end})&lt;br /&gt;
	local targetTitle = suite.makeFakeTitleObject(&amp;#039;Example&amp;#039;)&lt;br /&gt;
	self:assertNotContainsTrackingCategory(_redirect({redirectTitle.prefixedText}, nil, nil, currentTitle, redirectTitle, targetTitle))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return suite&lt;/div&gt;</summary>
		<author><name>imported&gt;Tamzin</name></author>
	</entry>
</feed>