--Go to the talk page to see the results of the tests
--Consider making sure that other modules that rely heavily on this module (E.g. [[Module:Template parameter value]]) also pass their testcases
local p = require('Module:UnitTests')

local frame = mw.getCurrentFrame()
local function preprocess(text, IsPrepared)
	local content = mw.text.unstrip(frame:preprocess(text))
	if IsPrepared then
		content = mw.text.decode(content)
	end
	return content
end

function p:_internal_test(module, name)
	--All PrepareText runs have keepComments set to true for testing convenience
	--Test conditions:
	--1) The escaped text should match our expectation for escaped text
	--2) The escaped text should always preprocess to the same as the original text (we only nowiki nowiki'd content)
	local PrepareTextTestN = 1
	local function TestPrepareText(...)
		local OriginalString = ""
		local ExpectedEscapedString = ""
		local args = {...}
		for i = 1, #args do
			OriginalString = OriginalString .. args[i]
			ExpectedEscapedString = ExpectedEscapedString .. (i%2 == 1 and args[i] or mw.text.nowiki(args[i]))
		end
		local ModuleEscapedString = module.PrepareText(OriginalString, true)
		self:equals(name.."PrepareText Escape Test "..PrepareTextTestN, ExpectedEscapedString, ModuleEscapedString, {nowiki=1})
		self:equals(name.."PrepareText Preprocess Test "..PrepareTextTestN, preprocess(OriginalString), preprocess(ModuleEscapedString, true), {nowiki=1})
		PrepareTextTestN = PrepareTextTestN + 1
	end
	
	--== PrepareText ==--
	--Standard comment escape
	TestPrepareText(
	--	R------, NW------, R-----
		"B<!--", "\nHey!", "-->A"
	)

	--Even when there's no end, the content inside is escaped
	TestPrepareText(
	--	R----------, NW----------, R------
		"{{Text|A<", "nowiki |}}", ">|B}}"
	)

	--A decently complex case
	TestPrepareText(
	--	R-------------, NW-----------, R--, NW------------, R---, NW------,
		"Hey!{{Text|<", "nowiki | ||", ">", "\nHey! }}\nA", "</", "nowiki",
	--	R-------, NW---------, R------------------------------
		">|<!--", "AAAAA|AAA", "-->Should see|Shouldn't see}}"
	)

	--Another decently complex case
	TestPrepareText(
	--	R---------------------------------------------------------------,
		"{{User:Aidan9382/templates/dummy\n|A|B|C {{{A|B}}} { } } {\n|<",
	--	NW------, R--, NW-, R---, NW------, R------, NW---, R--, NW-----, R---,
		"nowiki", ">", "D", "</", "nowiki", ">\n|<", "pre", ">", "E\n|F", "</",
	--	NW---, R-------------------------------------------------, NW------,
		"pre", ">\n|G|=|a=|A  =  [[{{PAGENAME}}|A=B]]{{Text|1==<", "nowiki",
	--	R--, NW--, R---, NW------, R------------------
		">", "}}", "</", "nowiki", ">}}|A B=Success}}"
	)
end

function p:test_live()
	p:_internal_test(require("Module:Wikitext Parsing"), "Live ")
end

function p:test_sandbox()
	p:_internal_test(require("Module:Wikitext Parsing/sandbox"), "Sandbox ")
end

-- Code for testing ParseTemplates that doesn't exactly work (not a primary feature so not a huge concern)
--[====[
	--Test conditions:
	--1) The parsed information matches the expected information
	local ParseTemplatesTestN = 1
	local function TestParseTemplates(OriginalString, ExpectedInformation)
		local ModuleInformation = module.ParseTemplates(OriginalString)[1]
		ModuleInformation.Children = nil --This isn't gonna be tested properly rn due to reasons
		mw.logObject(ModuleInformation)
		self:equals_deep(name.."ParseTemplates Test "..ParseTemplatesTestN, ExpectedInformation, ModuleInformation, {nowiki=1})
		ParseTemplatesTestN = ParseTemplatesTestN + 1
	end

	--== ParseTemplates ==--
	-- Just the one test since this feature isn't entirely developed
	local TestString = "{{User:Aidan9382/templates/dummy\n|A|B|C {{{A|B}}} { } "
		.. "} {\n|<nowiki>D</nowiki>\n|<pre>E\n|F</pre>\n|G|=|a=|A  =  [[{{PAGE"
		.. "NAME}}|A=B]]{{Text|1==<nowiki>}}</nowiki>}}|A B=Success}}"
	TestParseTemplates(
		"\nA"..TestString.."B\n",
		{
			Text = TestString, Name = "User:Aidan9382.templates/dummy",
			ArgOrder = {"1", "2", "3", "4", "5", "6", "", "a", "A", "A B"},
			Args = {
				["1"]="A", ["2"]="B", ["3"]="C {{{A|B}}} { } } {",
				["4"]="<nowiki>D</nowiki>", ["5"]="<pre>E\n|F</pre>",
				["6"]="G", [""]="", a="",
				A="[[{{PAGENAME}}|A=B]]{{Text|1==<nowiki>}}</nowiki>}}",
				["A B"]="Success"
			}
		}
	)
]====]

return p