Module:Infobox television episode/testcases

-- Unit tests for [[Module:Infobox television episode]]. Click talk page to run tests.
local p = require('Module:UnitTests')

local function expandTemplate(template, value)
	local frame = mw.getCurrentFrame()
	return frame:expandTemplate{title = template, args = value}
end

function p:test_01_01_infobox_title_equal_to_article_title()
	self:preprocess_equals_sandbox_many('{{#invoke:Infobox television episode', 'validate_values', {
		{'page_title_test=Long article title|title=' .. expandTemplate("Nowrap", {"Long article title"}), ''},
		{'page_title_test=Long article title|title=Long article <br>title', ''},
		{'page_title_test=Long article title|title=Long article <br >title', ''},
		{'page_title_test=Long article title|title=Long article <br/>title', ''},
		{'page_title_test=Long article title|title=Long article <br />title', ''},
		{'page_title_test=Long article title|title=Long article <br/> title', ''},
		{'page_title_test=Long article title (dab)|title=' .. expandTemplate("Nowrap", {"Long article title"}) .. '|series=[[dab]]', ''},
		{'page_title_test=Long article title (dab)|title=Long article <br>title|series=[[dab]]', ''},
		{'page_title_test=title|rtitle=Title', ''},
		{'page_title_test=Agents of S.H.I.E.L.D. series finale|rtitle="The End Is at Hand" and "{{nowrap|What We\'re Fighting For}}"|series=[[Agents of S.H.I.E.L.D.]]', ''},
		{'page_title_test=A Game of Pool (The Twilight Zone, 1959)|title=A Game of Pool|series=[[The Twilight Zone (1985 TV series)|The Twilight Zone]]', '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_title_test=Just for the Record (Randall and Hopkirk (Deceased))|title=Just for the Record|series=[[Randall and Hopkirk (Deceased)]]', '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_title_test=Cassie (Skins series 1)|title=Cassie|series=[[Skins (British TV series)|Skins]]', '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_title_test=Debbie (Brooklyn Nine-Nine)|title=Debbie|series=[[Brooklyn Nine-Nine]]', '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_title_test=Debbie (Brooklyn Nine-Nine episode)|title=Debbie|series=[[Brooklyn Nine-Nine]]', '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_title_test=Title (dab)|title=Title (dab)', '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_title_test=Title (not a dab)|title=Title (not a dab)|series=[[Lost]]', '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_title_test=Test|title=Test', '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_title_test=Test (dab)|title=Test|series=[[dab]]', '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_title_test=Test (dab episode)|title=Test|series=[[dab]]', '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_title_test=Test|title=test', '[[Category:Pages using infobox television episode with non-matching title]]'},
		{'page_title_test=Long article title|title=' .. expandTemplate("Nowrap", {"Long article Title"}), '[[Category:Pages using infobox television episode with non-matching title]]'},
		{'page_title_test=Long article title|title=Long article <br/> Title', '[[Category:Pages using infobox television episode with non-matching title]]'},
		{'page_title_test=Premiere (The Tonight Show Starring Jimmy Fallon)|title=Premiere|series=[[The Tonight Show Starring Jimmy Fallon|The Tonight Show Starring<br/> Jimmy Fallon]]', '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_title_test=Premiere (The Tonight Show Starring Jimmy Fallon episode)|title=Premiere|series=[[The Tonight Show Starring Jimmy Fallon|The Tonight Show Starring<br/> Jimmy Fallon]]', '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
    }, {nowiki=1})
end

function p:test_01_02_infobox_title_equal_to_article_title_special_cases()
	self:preprocess_equals_sandbox_many('{{#invoke:Infobox television episode', 'validate_values', {
		{'page_test=HappyHolograms|title=#HappyHolograms', '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_test=HappyHolograms|title=#HappyHolograms2', '[[Category:Pages using infobox television episode with non-matching title]]'},
		{'page_test=Rehash (South Park)|title=#REHASH', ''},
		{'page_test=Rehash (South Park)|title=#REHASH|series=[[South Park]]', '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_test=Rehash (South Park)|title=#REHASH2|series=[[South Park]]', '[[Category:Pages using infobox television episode with non-matching title]]'},
		{'page_test=Rick Potion No. 9|title=Rick Potion #9|series=[[Rick and Morty]]', '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_test=All things|page_title_test=All things|title=all things', '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_test=All things|page_title_test=All things|title=All Things', '[[Category:Pages using infobox television episode with non-matching title]]'},
		{'page_test=ISpy (Modern Family)|page_title_test=ISpy (Modern Family)|title=iSpy|series=[[Modern Family]]', '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_test=ISpy (Modern Family)|page_title_test=ISpy (Modern Family)|title=ISpy|series=[[Modern Family]]', '[[Category:Pages using infobox television episode with non-matching title]]'},
		{'page_test=ISpy (Modern Family)|page_title_test=ISpy (Modern Family)|title=I Spy|series=[[Modern Family]]', '[[Category:Pages using infobox television episode with non-matching title]]'},
		{'page_test=Google Behind the Screen|page_title_test=Google Behind the Screen|title=Google: Behind the Screen', '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_test=Google Behind the Screen|page_title_test=Google Behind the Screen|title=Google Behind the Screen', '[[Category:Pages using infobox television episode with non-matching title]]'},
		{'page_test=Eps1.0 hellofriend.mov|page_title_test=Eps1.0 hellofriend.mov|title=eps1.0_hellofriend.mov|italic_title=no', '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_test=Eps1.0 hellofriend.mov|page_title_test=Eps1.0 hellofriend.mov|title=eps1.0 hellofriend.mov|italic_title=no', '[[Category:Pages using infobox television episode with non-matching title]]'},
		{'page_test=Wvrdr error 100 oest-of-th3-gs.gid30n not found|page_title_test=Wvrdr error 100 oest-of-th3-gs.gid30n not found|title=wvrdr_error_100<oest-of-th3-gs.gid30n> not found|italic_title=no', '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_test=Wvrdr error 100 oest-of-th3-gs.gid30n not found|page_title_test=Wvrdr error 100 oest-of-th3-gs.gid30n not found|title=wvrdr error 100<oest-of-th3-gs.gid30n> not found|italic_title=no', '[[Category:Pages using infobox television episode with non-matching title]]'},
		{'page_test=30 Rock: A One-Time Special|page_title_test=30 Rock: A One-Time Special|title=\'\'30 Rock\'\': A One-Time Special|italic_title=no', '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_test=30 Rock: A One-Time Special|page_title_test=30 Rock: A One-Time Special|title=30 Rock: A One-Time Special|italic_title=no', '[[Category:Pages using infobox television episode with non-matching title]]'},
    }, {nowiki=1})
end

function p:test_01_03_infobox_title_equal_to_article_title_quotes()
	self:preprocess_equals_sandbox_many('{{#invoke:Infobox television episode', 'validate_values', {
		{'page_title_test=\'Test|title=' .. expandTemplate("Space+single", {}) .. "Test", '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_title_test=Test\'|title=Test' .. expandTemplate("Single+space", {}), '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_title_test=\'Test (dab)|title=' .. expandTemplate("Space+single", {}) .. "Test|series=[[dab]]", '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_title_test=\'Test\'|title=' .. expandTemplate("Space+single", {}) .. "Test" .. expandTemplate("Single+space", {}), '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_title_test=\'Test|title=' .. expandTemplate("Space+single", {}) .. "test", '[[Category:Pages using infobox television episode with non-matching title]]'},
		{'page_title_test="A" in a title|title=' .. expandTemplate("Space+single", {}) .. "A' in a title", '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_title_test=Bart Gets an "F"|title=Bart Gets an \'F' .. expandTemplate("Single+space", {}), '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_title_test="A" in a title (dab)|title=' .. expandTemplate("Space+single", {}) .. "A' in a title|series=[[dab]]", '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_title_test="A" in a title is an "F"|title=' .. expandTemplate("Space+single", {}) .. "A' in a title is an 'F" .. expandTemplate("Single+space", {}), '[[Category:Pages using infobox television episode with unnecessary title parameter]]'},
		{'page_title_test="A" in a title|title=' .. expandTemplate("Space+single", {}) .. '"a" in a title', '[[Category:Pages using infobox television episode with non-matching title]]'},		
    }, {nowiki=1})
end

function p:test_02_image_auxiliary_values()
	self:preprocess_equals_sandbox_many('{{#invoke:Infobox television episode', 'validate_values', {
		{'image=test|image_size=1', ''},
		--{'image=<!-- Deleted -->', '[[Category:Pages using infobox television episode with image-related values without an image]]'},
		{'image_size=1', '[[Category:Pages using infobox television episode with image-related values without an image]]'},
		{'image_upright=1', '[[Category:Pages using infobox television episode with image-related values without an image]]'},
		{'image_alt=test', '[[Category:Pages using infobox television episode with image-related values without an image]]'},
		{'alt=test', '[[Category:Pages using infobox television episode with image-related values without an image]]'},
		{'caption=test', '[[Category:Pages using infobox television episode with image-related values without an image]]'},
    }, {nowiki=1})
end

function p:test_03_is_image_formatted_correctly()
	self:preprocess_equals_sandbox_many('{{#invoke:Infobox television episode', 'validate_values', {
		{'image=image.jpg', ''},
		{'image=File:image.jpg', '[[Category:Pages using infobox television episode with incorrectly formatted values|image]]'},
		{'image=[[File:image.jpg]]', '[[Category:Pages using infobox television episode with incorrectly formatted values|image]]'},
		{'image=Image:image.jpg', '[[Category:Pages using infobox television episode with incorrectly formatted values|image]]'},
		{'image=[[Image:image.jpg]]', '[[Category:Pages using infobox television episode with incorrectly formatted values|image]]'},
    }, {nowiki=1})
end

function p:test_04_is_image_size_using_px()
	self:preprocess_equals_sandbox_many('{{#invoke:Infobox television episode', 'validate_values', {
		{'image=test|image_size=100', ''},
		{'image=test|image_size=100px', '[[Category:Pages using infobox television episode with incorrectly formatted values|image_size]]'},
    }, {nowiki=1})
end

function p:test_05_links_only()
	self:preprocess_equals_sandbox_many('{{#invoke:Infobox television episode', 'validate_values|', {
		{'series=[[Lost]]', ''},
		{'prev=[[? (Lost)]]', ''},
		{'next=[[? (Lost)]]', ''},
		{'series=Lost', '[[Category:Pages using infobox television episode with unlinked values|series]]'},
		{'prev=? (Lost)', '[[Category:Pages using infobox television episode with unlinked values|prev]]'},
		{'next=? (Lost)', '[[Category:Pages using infobox television episode with unlinked values|next]]'},
		{"series=''Lost''", '[[Category:Pages using infobox television episode with unlinked values|series]]'},
		{"series=''[[Lost]]''", '[[Category:Pages using infobox television episode with incorrectly formatted values|series]]'},
		{"prev=''[[? (Lost)]]''", '[[Category:Pages using infobox television episode with incorrectly formatted values|prev]]'},
		{"next=''[[? (Lost)]]''", '[[Category:Pages using infobox television episode with incorrectly formatted values|next]]'},
    }, {nowiki=1})
end

function p:test_06_using_overall()
	self:preprocess_equals_sandbox_many('{{#invoke:Infobox television episode', 'validate_values', {
		{'episode=1', ''},
		{'season=1', ''},
		{'series_no=1', ''},
		{'episode=1 (1 overall)', '[[Category:Pages using infobox television episode with incorrectly formatted values|episode]]'},
		{'season=1 (1 overall)', '[[Category:Pages using infobox television episode with incorrectly formatted values|season]]'},
		{'series_no=1 (1 overall)', '[[Category:Pages using infobox television episode with incorrectly formatted values|series_no]]'},
    }, {nowiki=1})
end

function p:test_07_formatted()
	self:preprocess_equals_sandbox_many('{{#invoke:Infobox television episode', 'validate_values', {
		{"rtitle=''rtitle''", ''},
		{"rprev=''rprev''", ''},
		{"rnext=''rnext''", ''},
		{"image=image|image_alt=''image_alt''", ''},
		{"image=image|alt=''alt''", ''},
		{"image=image|caption=''caption''", ''},
		{"based_on=''based_on''", ''},
		{"music=''music''", ''},
		{"guests=''guests''", ''},
		{"series=[[American Horror Story]]|season_article=\'\'[[American Horror Story: Apocalypse]]\'\'", ''},
		{"series=''[[Lost (TV series)]]''", '[[Category:Pages using infobox television episode with incorrectly formatted values|series]]'},
		{"prev=''[[prev]]''", '[[Category:Pages using infobox television episode with incorrectly formatted values|prev]]'},
		{"next=''[[next]]''", '[[Category:Pages using infobox television episode with incorrectly formatted values|next]]'},
		{"episode=''1''", '[[Category:Pages using infobox television episode with incorrectly formatted values|episode]]'},
		{"season=''1''", '[[Category:Pages using infobox television episode with incorrectly formatted values|season]]'},
		{"series_no=''1''", '[[Category:Pages using infobox television episode with incorrectly formatted values|series_no]]'},
		{"episode_list=[[List of ''Lost'' episodes]]", '[[Category:Pages using infobox television episode with incorrectly formatted values|episode_list]][[Category:Pages using infobox television episode with incorrectly formatted values|episode_list]]'},
		{"producer=''Executive producer'': John", '[[Category:Pages using infobox television episode with incorrectly formatted values|producer]]'},
    }, {nowiki=1})
end

function p:test_08_linked()
	self:preprocess_equals_sandbox_many('{{#invoke:Infobox television episode', 'validate_values', {
		{'episode=1', ''},
		{'season=1', ''},
		{'series_no=1', ''},
		{'episode_list=List of Lost episodes', ''},
		{'episode=[[1]]', '[[Category:Pages using infobox television episode with incorrectly formatted values|episode]]'},
		{'season=[[1]]', '[[Category:Pages using infobox television episode with incorrectly formatted values|season]]'},
		{'series_no=[[1]]', '[[Category:Pages using infobox television episode with incorrectly formatted values|series_no]]'},
		{'episode_list=[[List of Lost episodes]]', '[[Category:Pages using infobox television episode with incorrectly formatted values|episode_list]]'},
    }, {nowiki=1})
end

function p:test_09_has_icons()
	self:preprocess_equals_sandbox_many('{{#invoke:Infobox television episode', 'validate_values', {
		{'director=' .. expandTemplate("USA", {}) .. 'test', '[[Category:Pages using infobox television with flag icon]]'},
	}, {nowiki=1})
end

-- function p:test_10_invalid_tags()
-- 	self:preprocess_equals_sandbox_many('{{#invoke:Infobox television episode', 'validate_values', {
-- 		{'guests={{center|Name}}', '[[Category:Pages using infobox television episode with incorrectly formatted values|guests]]'},
-- 		{'episode=<small>Name</small>', '[[Category:Pages using infobox television episode with incorrectly formatted values|episode]]'},
-- 		{'episode=' .. expandTemplate("Small", {"Name"}), '[[Category:Pages using infobox television episode with incorrectly formatted values|episode]]'},
-- 	}, {nowiki=1})
-- end

		-- {'director=First name<br>Second name', '[[Category:Pages using infobox television episode with incorrectly formatted values|director]]'},
		-- {'director=First name<br/>Second name', '[[Category:Pages using infobox television episode with incorrectly formatted values|director]]'},
		-- {'director=First name<br />Second name', '[[Category:Pages using infobox television episode with incorrectly formatted values|director]]'},

function p:test_10_are_dates_formatted_correctly()
	self:preprocess_equals_sandbox_many('{{#invoke:Infobox television episode', 'validate_values', {
		{'airdate=' .. expandTemplate("Start date", {"1999", "3", "4"}), ''},
		{'released=' .. expandTemplate("Start date", {"1999", "3", "4"}), ''},
		{'airdate=' .. expandTemplate("Start date and age", {"1999", "3", "4"}), '[[Category:Pages using infobox television episode with nonstandard dates]]'},
		{'airdate=' .. expandTemplate("Start and end dates", {"1939", "9", "1", "1945", "9", "2"}), '[[Category:Pages using infobox television episode with nonstandard dates]]'},
		{'airdate=' .. expandTemplate("Film date/sandbox", {"1999", "3", "4"}), '[[Category:Pages using infobox television episode with unnecessary list markup]][[Category:Pages using infobox television episode with nonstandard dates]]'},
		{'airdate=4/3/1999', '[[Category:Pages using infobox television episode with nonstandard dates]]'},
		{'airdate=March 4, 1999', '[[Category:Pages using infobox television episode with nonstandard dates]]'},
		{'released=4/3/1999', '[[Category:Pages using infobox television episode with nonstandard dates]]'},
		{'released=March 4, 1999', '[[Category:Pages using infobox television episode with nonstandard dates]]'},
		{'airdate=Unaired', ''},
		{'released=Unaired', ''},
	}, {nowiki=1})
end

function p:test_11_is_italic_title_valid_value()
	self:preprocess_equals_sandbox_many('{{#invoke:Infobox television episode', 'validate_values', {
		{'', ''},
		{'italic_title=no', ''},
		{'italic_title=n', '[[Category:Pages using infobox television episode with incorrectly formatted values|italic_title]]'},
		{'italic_title=y', '[[Category:Pages using infobox television episode with incorrectly formatted values|italic_title]]'},
    }, {nowiki=1})
end

function p:test_12_list_markup()
	self:preprocess_equals_sandbox_many('{{#invoke:Infobox television episode', 'validate_values', {
		{'director=* First director', ''},
		{'director=* First director * Second director', ''},
		{'episode=1 <br> 2', ''},
		{'director=' .. expandTemplate("Plainlist", {"|* First director * Second director"}), '[[Category:Pages using infobox television episode with unnecessary list markup]]'},
		{'director=' .. expandTemplate("Indented plainlist", {"|* First director * Second director"}), '[[Category:Pages using infobox television episode with unnecessary list markup]]'},
		{'director=' .. expandTemplate("Flatlist", {"|* First director * Second director"}), '[[Category:Pages using infobox television episode with unnecessary list markup]]'},
		{'director=' .. expandTemplate("Hlist", {"|First director|Second director"}), '[[Category:Pages using infobox television episode with unnecessary list markup]]'},
		{'director=' .. expandTemplate("Unbulleted list", {"|First director|Second director"}), '[[Category:Pages using infobox television episode with unnecessary list markup]]'},
		{'director=' .. expandTemplate("Bulleted list", {"|First director|Second director"}), '[[Category:Pages using infobox television episode with unnecessary list markup]]'},
		{'director=' .. expandTemplate("Ordered list", {"|First director|Second director"}), '[[Category:Pages using infobox television episode with unnecessary list markup]]'},
		{'director=' .. expandTemplate("Horizontal ordered list", {"|First director|Second director"}), '[[Category:Pages using infobox television episode with unnecessary list markup]]'},
		{'director=First director <br> Second director', '[[Category:Pages using infobox television episode with unnecessary list markup]]'},
		{'director=First director <br > Second director', '[[Category:Pages using infobox television episode with unnecessary list markup]]'},
		{'director=First director <br/> Second director', '[[Category:Pages using infobox television episode with unnecessary list markup]]'},
		{'director=First director <br /> Second director', '[[Category:Pages using infobox television episode with unnecessary list markup]]'},
		{'director=First director <BR> Second director', '[[Category:Pages using infobox television episode with unnecessary list markup]]'},
		{'commentary=' .. expandTemplate("Plainlist", {"* First person * Second person"}), '[[Category:Pages using infobox television episode with unnecessary list markup]]'},
    }, {nowiki=1})
end

-- function p:test_13_are_refs_in_infobox()
-- 	self:preprocess_equals_sandbox_many('{{#invoke:Infobox television episode', 'validate_values', {
-- 		{'airdate=' .. expandTemplate("Start date", {"1999", "3", "4"}) .. '<ref>test</ref>', '[[Category:Pages using infobox television episode with references in the infobox]]'},
-- 		{'director=First director<ref>test</ref>', '[[Category:Pages using infobox television episode with references in the infobox]]'},
-- 		{'caption=image caption<ref>test</ref>', ''},
-- 		{'production=1234<ref>test</ref>', ''},
--     }, {nowiki=1})
-- end

function p:test_16_all_errors()
	self:preprocess_equals_sandbox_many('{{#invoke:Infobox television episode', 'validate_values', {
		{'page_title_test=Test|title=Test|episode=[[1]]|image_size=1|series=Lost|director=' .. expandTemplate("USA", {}) .. 'test|airdate=4/3/1999', '[[Category:Pages using infobox television episode with unnecessary title parameter]][[Category:Pages using infobox television episode with image-related values without an image]][[Category:Pages using infobox television episode with unlinked values|series]][[Category:Pages using infobox television episode with incorrectly formatted values|episode]][[Category:Pages using infobox television with flag icon]][[Category:Pages using infobox television episode with nonstandard dates]]'},
    }, {nowiki=1})
end

function p:test_17_italic_title()
	self:preprocess_equals_sandbox_many('{{#invoke:Infobox television episode', 'italic_title', {
		{'', ''},
		{'page_title_test=', ''},
		{'page_title_test=title', ''},
		{'page_title_test=title (dab)', ''},
		{'page_title_test=title|series=Lost', ''},
		{'page_title_test=title (dab)|series=Lost', ''},
		{'page_title_test=title (Lost)|series=Lost|italic_title=no', ''},
		{'page_title_test=Agents of S.H.I.E.L.D. series finale|page_test=Agents of S.H.I.E.L.D. series finale|italic_title=no', ''},
		{'page_title_test=title (Lost)|series=Lost', 'italic_dab'},
		{'page_title_test=title (Lost episode)|series=Lost', 'italic_dab'},
		{'page_title_test=title (Lost episode)|series=Lost', 'italic_dab'},
		{'page_title_test=The End (The X-Files)|series=The X-Files', 'italic_dab'},
		{'page_title_test=The End (The X-Files episode)|series=The X-Files', 'italic_dab'},
		{'page_title_test=A Game of Pool (The Twilight Zone, 1959)|series=[[The Twilight Zone (1985 TV series)|The Twilight Zone]]', 'italic_dab'},
		{'page_title_test=Just for the Record (Randall and Hopkirk (Deceased))|series=Randall and Hopkirk (Deceased)', 'italic_dab'},
		{'page_title_test=Premiere (The Tonight Show Starring Jimmy Fallon)|series=[[The Tonight Show Starring Jimmy Fallon|The Tonight Show Starring<br/> Jimmy Fallon]]', 'italic_dab'},
		{'page_title_test=Agents of S.H.I.E.L.D. series finale|page_test=Agents of S.H.I.E.L.D. series finale|series=Agents of S.H.I.E.L.D.', '[[Category:Pages using infobox television episode with unnecessary manual displaytitle]]'},
		{'page_title_test=The End (Lost)|page_test=Agents of S.H.I.E.L.D. series finale|series=Lost', 'italic_dab[[Category:Pages using infobox television episode with unnecessary manual displaytitle]]'},
	}, {nowiki=1})
end

local function handle_title(text)
	return "\"'''" .. text .. "'''\""
end

local function handle_marks(text, side)
	local left_template = "Space+single"
	local right_template = "Single+space"

	if side == "left" then
		return  handle_title(expandTemplate(left_template, {}) .. text)
	elseif
		side == "right" then
		return  handle_title(text .. expandTemplate(right_template, {}))
	else
		return  handle_title(expandTemplate(left_template, {}) .. text .. expandTemplate(right_template, {}))
	end
end

function p:test_18_above_title()
	self:preprocess_equals_sandbox_many('{{#invoke:Infobox television episode', 'above_title', {
		{'rtitle=title', "'''title'''"},
		{'rtitle="title1" and "title2"', handle_title("title1") .. " and " .. handle_title("title2")},
		{'rtitle="whoami" and "Hello, Elliot"', handle_title("whoami") .. " and " .. handle_title("Hello, Elliot")},
		{'rtitle="The End Is at Hand" and "' .. expandTemplate('nowrap', {"What We\'re Fighting For"}) .. '"', handle_title("The End Is at Hand") .. " and " .. handle_title(expandTemplate('nowrap', {'What We\'re Fighting For'}))},
		{'rtitle="The Ed-touchables" and<br/> "Nagged to Ed"', handle_title("The Ed-touchables") .. " and<br/> " .. handle_title("Nagged to Ed")},
		{'title=title', handle_title("title")},
		{'title=title (dab)', handle_title("title (dab)")},
		{'title=title (dab)|series=dab', handle_title("title (dab)")},
		{'title=title (dab)|series=[[dab]]', handle_title("title (dab)")},
		{'title=title (Randall and Hopkirk (Deceased))|series=Randall and Hopkirk (Deceased)', handle_title("title (Randall and Hopkirk (Deceased))")},
		{'title=title (Randall and Hopkirk (Deceased))|series=[[Randall and Hopkirk (Deceased)]]', handle_title("title (Randall and Hopkirk (Deceased))")},
		{'title=#title', handle_title("#title")},
		{'page_title_test=title', handle_title("title")},
		{'page_title_test=title|series=dab', handle_title("title")},
		{'page_title_test=title (another title)', handle_title("title (another title)")},
		{'page_title_test=title (another title)|series=dab', handle_title("title (another title)")},
		{'page_title_test=title (dab)|series=dab', handle_title("title")},
		{'page_title_test=title (dab)|series=[[dab]]', handle_title("title")},
		{'page_title_test=title (Randall and Hopkirk (Deceased))|series=Randall and Hopkirk (Deceased)', handle_title("title")},
		{'page_title_test=title (Randall and Hopkirk (Deceased))|series=[[Randall and Hopkirk (Deceased)]]', handle_title("title")},
		{'page_title_test=A Game of Pool (The Twilight Zone, 1959)|series=[[The Twilight Zone (1985 TV series)|The Twilight Zone]]', handle_title("A Game of Pool")},
		{'page_title_test=\'title', handle_marks("title", "left", "'")},
		{'page_title_test=title\'', handle_marks("title", "right", "'")},
		{'page_title_test=\'title (dab)|series=[[dab]]', handle_marks("title", "left")},
		{'page_title_test=\'title (another title)', handle_marks("title (another title)", "left")},
		{'page_title_test=\'title (another title)|series=[[dab]]', handle_marks("title (another title)", "left")},
		{'page_title_test=\'title\'', handle_marks("title", "both")},
		{'page_title_test="A" in a title', handle_marks("A' in a title", "left")},
		{'page_title_test=Bart Gets an "F"', handle_marks("Bart Gets an 'F", "right")},
		{'page_title_test="A" in a title (dab)|series=[[dab]]', handle_marks("A' in a title", "left")},
		{'page_title_test="A" in a title (another title)', handle_marks("A' in a title (another title)", "left")},
		{'page_title_test="A" in a title (another title)|series=[[dab]]', handle_marks("A' in a title (another title)", "left")},
		{'page_title_test="A" in a title is an "F"', handle_marks("A' in a title is an 'F", "both")},
		{'page_title_test=The Old Man and the "C" Student', handle_title("The Old Man and the 'C' Student")},
		{'page_test=HappyHolograms', handle_title("#HappyHolograms")},
		{'page_test=Rick Potion No. 9', handle_title("Rick Potion #9")},
		{'page_test=Rehash (South Park)|series=South Park', handle_title("#REHASH")},
		{'page_test=All things', handle_title("all things")},
		{'page_test=ISpy (Modern Family)|series=[[Modern Family]]', handle_title("iSpy")},
		{'page_test=Google Behind the Screen|series=[[Backlight (TV program)]]', handle_title("Google: Behind the Screen")},
		{'page_test=Eps1.0 hellofriend.mov|series=[[Mr. Robot]]|italic_title=no', handle_title("eps1.0_hellofriend.mov")},
		{'page_test=Wvrdr error 100 oest-of-th3-gs.gid30n not found|series=[[Legends of Tomorrow]]|italic_title=no', handle_title("wvrdr_error_100<oest-of-th3-gs.gid30n> not found")},
		{'page_test=30 Rock: A One-Time Special|series=[[30 Rock]]|italic_title=no', handle_title("''30 Rock'': A One-Time Special")},
		{'page_test=Advanced Dungeons & Dragons (Community)|series=[[Community (TV series)|Community]]|italic_title=no', handle_title("Advanced ''Dungeons & Dragons''")},
	}, {nowiki=1})
end

function p:test_19_episode_list()
	self:preprocess_equals_sandbox_many('{{#invoke:Infobox television episode', 'episode_list', {
		{'episode_list=List of Lost episodes', '[[List of Lost episodes|List of episodes]]'},
		{'episode_list=EastEnders#Storylines', '[[EastEnders#Storylines|Storylines]]'},
		{'episode_list=[[List of Lost episodes]]', '[[List of Lost episodes]]'},
		{"episode_list=List of ''Lost'' episodes", "List of ''Lost'' episodes"},
		{'series=[[Lost (TV series)]]', '[[List of Lost (TV series) episodes|List of episodes]]'},
		{'series=[[Lost (TV series)|Lost]]', '[[List of Lost (TV series) episodes|List of episodes]]'},
		{'series=Agents of S.H.I.E.L.D.', '[[List of Agents of S.H.I.E.L.D. episodes|List of episodes]]'},
		{'series=[[Agents of S.H.I.E.L.D.]]', '[[List of Agents of S.H.I.E.L.D. episodes|List of episodes]]'},
		{'series=[[Agents of S.H.I.E.L.D.|Agents of S.H.I.E.L.D.]]', '[[List of Agents of S.H.I.E.L.D. episodes|List of episodes]]'},
		{'series=The X-Files', '[[List of The X-Files episodes|List of episodes]]'},
		{'series=[[The X-Files]]', '[[List of The X-Files episodes|List of episodes]]'},
		{'series=[[The X-Files|The X-Files]]', '[[List of The X-Files episodes|List of episodes]]'},
		{'series=[[no page exists like this]]', ''},
	}, {nowiki=1})
end

function p:test_20_validate_values_crossover_images()
	self:preprocess_equals_sandbox_many('{{#invoke:Infobox television episode', 'validate_values_crossover', {
		{'image=test|image_size=1', ''},
		{'image_size=1', '[[Category:Pages using infobox television episode with image-related values without an image]]'},
		{'image_upright=1', '[[Category:Pages using infobox television episode with image-related values without an image]]'},
		{'image_alt=test', '[[Category:Pages using infobox television episode with image-related values without an image]]'},
		{'alt=test', '[[Category:Pages using infobox television episode with image-related values without an image]]'},
		{'caption=test', '[[Category:Pages using infobox television episode with image-related values without an image]]'},
	}, {nowiki=1})
end

function p:test_21_validate_values_crossover_has_icons()
	self:preprocess_equals_sandbox_many('{{#invoke:Infobox television episode', 'validate_values_crossover', {
		{'director1=' .. expandTemplate("USA", {}) .. 'test', '[[Category:Pages using infobox television with flag icon]]'},
	}, {nowiki=1})
end

function p:test_22_validate_values_crossover_airdates()
	self:preprocess_equals_sandbox_many('{{#invoke:Infobox television episode', 'validate_values_crossover', {
		{'airdate_overall=' .. expandTemplate("Start date", {"1999", "3", "4"}), ''},
		{'series1=[[series1]]|airdate1=' .. expandTemplate("Start date", {"1999", "3", "4"}), ''},
		{'series1=[[series1]]|airdate1=' .. expandTemplate("Start date", {"1999", "3", "4"}) .. '|series2=[[series2]]|airdate2=' .. expandTemplate("Start date", {"1999", "3", "4"}), ''},
		{'series1=[[series1]]|airdate1=' .. expandTemplate("Start date", {"1999", "3", "4"}) .. '|series2=[[series2]]|airdate2=' .. expandTemplate("Start date", {"1999", "3", "4"})
			.. '|series3=[[series3]]|airdate3=' .. expandTemplate("Start date", {"1999", "3", "4"}), ''},
		{'series1=[[series1]]|airdate1=' .. expandTemplate("Start date", {"1999", "3", "4"}) .. '|series2=[[series2]]|airdate2=' .. expandTemplate("Start date", {"1999", "3", "4"})
			.. '|series3=[[series3]]|airdate3=' .. expandTemplate("Start date", {"1999", "3", "4"}) .. '|series4=[[series4]]|airdate4=' .. expandTemplate("Start date", {"1999", "3", "4"}), ''},
		{'series1=[[series1]]|airdate1=' .. expandTemplate("Start date", {"1999", "3", "4"}) .. '|series2=[[series2]]|airdate2=' .. expandTemplate("Start date", {"1999", "3", "4"})
			.. '|series3=[[series3]]|airdate3=' .. expandTemplate("Start date", {"1999", "3", "4"}) .. '|series4=[[series4]]|airdate4=' .. expandTemplate("Start date", {"1999", "3", "4"})
			.. '|series5=[[series5]]|airdate5=' .. expandTemplate("Start date", {"1999", "3", "4"}), ''},
		{'airdate_overall=4/3/1999', '[[Category:Pages using infobox television episode with nonstandard dates]]'},
		{'series1=[[series1]]|airdate1=4/3/1999', '[[Category:Pages using infobox television episode with nonstandard dates]]'},
		{'series1=[[series1]]|airdate1=' .. expandTemplate("Start date", {"1999", "3", "4"}) .. '|series2=[[series2]]|airdate2=4/3/1999',
			'[[Category:Pages using infobox television episode with nonstandard dates]]'},
		{'series1=[[series1]]|airdate1=' .. expandTemplate("Start date", {"1999", "3", "4"}) .. '|series2=[[series2]]|airdate2=' .. expandTemplate("Start date", {"1999", "3", "4"})
			.. '|series3=[[series3]]|airdate3=4/3/1999', '[[Category:Pages using infobox television episode with nonstandard dates]]'},
		{'series1=[[series1]]|airdate1=' .. expandTemplate("Start date", {"1999", "3", "4"}) .. '|series2=[[series2]]|airdate2=' .. expandTemplate("Start date", {"1999", "3", "4"})
			.. '|series3=[[series3]]|airdate3=' .. expandTemplate("Start date", {"1999", "3", "4"}) .. '|series4=[[series4]]|airdate4=4/3/1999',
			'[[Category:Pages using infobox television episode with nonstandard dates]]'},
		{'series1=[[series1]]|airdate1=' .. expandTemplate("Start date", {"1999", "3", "4"}) .. '|series2=[[series2]]|airdate2=' .. expandTemplate("Start date", {"1999", "3", "4"})
			.. '|series3=[[series3]]|airdate3=' .. expandTemplate("Start date", {"1999", "3", "4"}) .. '|series4=[[series4]]|airdate4=' .. expandTemplate("Start date", {"1999", "3", "4"})
			.. '|series5=[[series5]]|airdate5=4/3/1999', '[[Category:Pages using infobox television episode with nonstandard dates]]'},
	}, {nowiki=1})
end

function p:test_23_validate_values_crossover_links_only()
	self:preprocess_equals_sandbox_many('{{#invoke:Infobox television episode', 'validate_values_crossover', {
		{'series1=[[Lost]]', ''},
		{'series1=[[Lost]]|prev1=[[? (Lost)]]', ''},
		{'series1=[[Lost]]|next1=[[? (Lost)]]', ''},
		{'series1=[[Lost]]|series2=Lost', '[[Category:Pages using infobox television episode with unlinked values|series]]'},
		{'series1=[[Lost]]|prev1=? (Lost)', '[[Category:Pages using infobox television episode with unlinked values|prev]]'},
		{'series1=[[Lost]]|next1=? (Lost)', '[[Category:Pages using infobox television episode with unlinked values|next]]'},
		{"series1=''[[Lost]]''", '[[Category:Pages using infobox television episode with incorrectly formatted values|series]]'},
		{"series1=[[Lost]]|prev1=''[[? (Lost)]]''", '[[Category:Pages using infobox television episode with incorrectly formatted values|prev]]'},
		{"series1=[[Lost]]|next1=''[[? (Lost)]]''", '[[Category:Pages using infobox television episode with incorrectly formatted values|next]]'},
		{'series1=[[Lost]]|series2=Lost', '[[Category:Pages using infobox television episode with unlinked values|series]]'},
		{'series1=[[Lost]]|prev1=[[? (Lost)]]|series2=[[Lost]]|prev2=? (Lost)', '[[Category:Pages using infobox television episode with unlinked values|prev]]'},
		{'series1=[[Lost]]|next1=[[? (Lost)]]|series2=[[Lost]]|next2=? (Lost)', '[[Category:Pages using infobox television episode with unlinked values|next]]'},
		{"series1=[[Lost]]|series2=''[[Lost]]''", '[[Category:Pages using infobox television episode with incorrectly formatted values|series]]'},
		{"series1=[[Lost]]|prev1=[[? (Lost)]]|series2=[[Lost]]|prev2=''[[? (Lost)]]''", '[[Category:Pages using infobox television episode with incorrectly formatted values|prev]]'},
		{"series1=[[Lost]]|next1=[[? (Lost)]]|series2=[[Lost]]|next2=''[[? (Lost)]]''", '[[Category:Pages using infobox television episode with incorrectly formatted values|next]]'},
    }, {nowiki=1})
end

function p:test_24_validate_values_crossover_using_overall()
	self:preprocess_equals_sandbox_many('{{#invoke:Infobox television episode', 'validate_values_crossover', {
		{'series1=[[Lost]]|episode_no1=1', ''},
		{'series1=[[Lost]]|season1=1', ''},
		{'series1=[[Lost]]|episode_no1=1 (1 overall)', '[[Category:Pages using infobox television episode with incorrectly formatted values|episode]]'},
		{'series1=[[Lost]]|season1=1 (1 overall)', '[[Category:Pages using infobox television episode with incorrectly formatted values|season]]'},
    }, {nowiki=1})
end

function p:test_25_validate_values_crossover_linked_or_formatted()
	self:preprocess_equals_sandbox_many('{{#invoke:Infobox television episode', 'validate_values_crossover', {
		{'series1=[[Lost]]|episode_no1=1', ''},
		{'series1=[[Lost]]|season1=1', ''},
		{'series1=[[Lost]]|episode_list1=List of Lost episodes', ''},
		{'series1=[[Lost]]|episode_no1=[[1]]', '[[Category:Pages using infobox television episode with incorrectly formatted values|episode]]'},
		{'series1=[[Lost]]|season1=[[1]]', '[[Category:Pages using infobox television episode with incorrectly formatted values|season]]'},
		{'series1=[[Lost]]|episode_list1=[[List of Lost episodes]]', '[[Category:Pages using infobox television episode with incorrectly formatted values|episode_list]]'},
		{"series1=[[Lost]]|episode_no1=''1''", '[[Category:Pages using infobox television episode with incorrectly formatted values|episode]]'},
		{"series1=[[Lost]]|season1=''1''", '[[Category:Pages using infobox television episode with incorrectly formatted values|season]]'},
		{"series1=[[Lost]]|episode_list1=List of ''Lost'' episodes]]", '[[Category:Pages using infobox television episode with incorrectly formatted values|episode_list]][[Category:Pages using infobox television episode with incorrectly formatted values|episode_list]]'},
    }, {nowiki=1})
end

return p