Module:Technique/testcases

From Wikimedia Commons, the free media repository
Jump to navigation Jump to search
Lua
CodeDiscussionEditHistoryLinksLink count Subpages:DocumentationTestsResultsSandboxLive code All modules

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

Code

local p = {}

function p.unitTestsCompare(frame)
	local template = frame.args.template
	local cuthead = '{{#invoke:String |replace |'
	local cutend = '|%s+| ||false}}'
	if frame.args.whitespacecut == 'no' then
		cuthead = ''
		cutend = ''
	end
	local q = require('Module:UnitTests')

	function q:test_1_tested_template_against_old_template_many()
		self:preprocess_equals_preprocess_many(
			'({{' .. template .. ' |compat=yes |','}})',
			'(' .. cuthead .. '{{Technique |','}}' .. cutend .. ')',
			{
				{'foonoun|on=barnoun|adjon=bazadj'},
				{'{{size|cm|123|456}} |lenient=1'},
				{'oil|canvas'},
				{'oil |canvas'},
				{'oil|wood'},
				{'oil|wood|lang=pl'},
				{'unknown'},
				{'unknown|paper'},
				{'oil'},
				{'|canvas'},
				{'oil|beech wood'},
				{'oil|and=beech wood'},
				{'oil|beech wood|lang=fr'},
				{'oil|beech wood|lang=pl'},
				{'oil|and=tempera|canvas'},
				{'oil|over=graphite|paper'},
				{'ink|paper|color=black|coloron=cream'},
				{'oil|canvas|mounted=mahogany'},
				{'color=dark |1=oil |coloron=white |on=canvas |colormounted=brown |mounted=mahogany'},
				{'1=indian ink |and=gold |on=vellum |over=pencil drawing |color=light |coloron=white'},
				{'color=polished |1=pebble |colorand=reddish |and=glass paste |colorand2=cream ' ..
					'|and2=moulded glass |colorand3=color |and3=dry plate collodion ' ..
					'|colorand4=polychrome |and4=antique laid paper |colorand5=hand colored ' ..
					'|and5=rose granite |over=silver albumen photograph |coloron=black |2=gofun ' ..
					'|coloron2=purple |on2=hippopotamus ivory |colormounted=glazed |mounted=frescocanvas'},
				{'lang=pl|oil|adj=blue'}, -- irregular adjective in Polish
				{'lang=pl|bismuth|adj=blue'}, -- irregular adjective in Polish with no agreement available
				{'lang=it|bismuth|adj=black'}, -- irregular adjective in Italian with no agreement available
				{'lang=mk |bismuth |adj=black'}, -- default ending available in mk that should be used
				{'oil|and=tempera|on=beech wood|on2=oak wood|adjon2=blue;red'},
				{'Q942|and=Q111772915|on=Q865564|adjon=Q2631989'}, -- QIDs as terms input, some supported, some not
			},
			{nowiki=nil})
		local testLang = {'en', 'cs', 'pl','ru'}
		for _,lang in ipairs(testLang) do
			self:preprocess_equals_preprocess_many(
				'({{' .. template .. ' |compat=yes |lang=' .. lang .. ' |', '}})',
				'(' .. cuthead .. '{{Technique |lang=' .. lang .. ' |', '}}' .. cutend .. ')',
				{
					{'oil|wood'},
					{'tempera|wood'},
					{'oil|and=tempera|canvas'},
					{'oil|over=graphite|paper'},
					{'oil|canvas|mounted=mahogany'},
					{'color=dark |1=oil |coloron=white |on=canvas |colormounted=brown |mounted=mahogany'},
					{'1=indian ink |and=gold |on=vellum |over=pencil drawing |color=light |coloron=white'},
					{'color=polished |1=pebble |colorand=reddish |and=glass paste |colorand2=cream ' ..
						'|and2=moulded glass |colorand3=color |and3=dry plate collodion ' ..
						'|colorand4=polychrome |and4=antique laid paper |colorand5=hand colored ' ..
						'|and5=rose granite |over=silver albumen photograph |coloron=black |2=gofun ' ..
						'|coloron2=purple |on2=hippopotamus ivory |colormounted=glazed |mounted=frescocanvas'},
				})
		end
		
		self:preprocess_equals_preprocess_many(
			'({{' .. template .. ' |', '}})',
			'(' .. cuthead .. '{{Technique |', '}}' .. cutend .. ')',
			{
				{'oil|wood|lang=fr'},
				{'oil|wood|adjon=black|lang=de'},
			},
			{nowiki=1})
		self:preprocess_equals_preprocess_many(
			'{{' .. template .. ' |', '}}',
			'{{Technique |', '}}',
			{
				{' oil|canvas'},
				{'oil |canvas'},
				{'oil| canvas'},
				{'oil|canvas '},
			},
			{nowiki=nil})
	end
	
	function q:test_3_tested_template_against_hardcoded()
	    self:preprocess_equals_many('{{' .. template .. ' |', '}}',
			{
				{'lang=en |chromolithograph', '[[:en:Chromolithography|chromolithograph]]<div style="display: none;">medium QS:P2079,Q1121337</div>'},
				{'lang=en |marble |adj=green;red', 'green and red [[:en:Marble|marble]][[Category:Pages with complex technique templates]]'},
				{'lang=en |compat=yes |marble |adj=green;red', 'green and red [[:en:Marble|marble]][[Category:Pages with complex technique templates]]'},
				{'lang=el |aluminum', '[[:el:Αργίλιο|αλουμίνιο]]<div style="display: none;">medium QS:P186,Q663</div>'},
				-- synonym not in language subtemplate, but in [[Module:Technique/synonyms]]
				{'lang=en |alder wood', '[[:en:Alder|alder]]<div style="display: none;">medium QS:P186,Q1355553</div>'},
				-- need to get data from [[Module:Technique/WikidataLUT]]
				{'lang=en |coconut', '[[:en:Coconut|coconut]]<div style="display: none;">medium QS:P186,Q3342808</div>'},
				-- (soon) get label from Wikidata, link from [[Module:Technique/en]]
				{'lang=mk |bismuth |adj=black', 'црна [[:mk:Бизмут|бизмут]][[Category:Pages with complex technique templates]]'},
				-- noun with unknown gender where mk, ru should take default adjective
				{'lang=ru |bismuth |adj=black', 'чёрного цвета [[:ru:Висмут|висмут]][[Category:Pages with complex technique templates]]'},
				-- noun with unknown gender where mk, ru should take default adjective
			},
			{nowiki=1})
	end
	
	local runFrame = mw.getCurrentFrame()
	runFrame.args['differs_at'] = frame.args['differs_at'] and (frame.args['differs_at'] ~= '0') or '1'
	return q:run(runFrame)
end

function p.unitTestsCompareTemplateTechnique(frame)
	local q = require('Module:UnitTests')
	function q:test_1_wikidataLinkFallback()
		self:preprocess_equals_preprocess_many('{{Technique/fallback_to_WD_link| ', '}}', '', '', {
			{'lang=en |term=zincograph |query=', '[[:en:Zincography|zincograph]]'},
			{'lang=en |term=watercolor |query=', '[[:en:Watercolor painting|watercolor]]'}, -- tricky case, twice in [[Template:Technique/en]]
			{'lang=en |term=yoko-e |query=', '[[:en:List of ukiyo-e terms|yoko-e]]'},
			{'lang=en |term=worsted |query=', '[[:en:Worsted|worsted]]'},
			{'lang=en |term=wove paper |query=', '[[:en:Wove paper|wove paper]]'},
			{'lang=en |term=newsprint |query=', '[[:en:Newsprint|newsprint]]'},
			{'lang=en |term=muschelkalk |query=', '[[:en:Muschelkalk|Muschelkalk]]'},
			{'lang=en |term=charcoal |query=', '[[:en:Charcoal (art)|charcoal]]'},
			{'lang=en |term=fiber |query=', '[[:en:Fiber|fiber]]'},
			{'lang=en |term=oil |query=', '[[:en:Oil paint|oil]]'},
			{'lang=en |term=newsprint |query=over', '[[:en:Newsprint|newsprint]]'},
			{'lang=en |term=newsprint |query=mounted', '[[:en:Newsprint|newsprint]]'},
			{'lang=en |term=newsprint |query=on', '[[:en:Newsprint|newsprint]]'},
			
			{'lang=pl |term=yoko-e |query=', '[[d:Q68681885|yoko-e]]'},
			{'lang=pl |term=yew wood |query=', '[[:pl:Cis (roślina)|drewno cisowe]]'},
			{'lang=pl |term=zincograph |query=', '[[:pl:Cynkografia|cynkografia]]'},
			{'lang=pl |term=zincograph |query=mounted', '[[:pl:Cynkografia|cynkografia]]'},
			{'lang=pl |term=zincograph |query=on', '[[:pl:Cynkografia|cynkografii]]'},
			{'lang=pl |term=zincograph |query=over', '[[:pl:Cynkografia|cynkografii]]'},
			{'lang=pl |term=tempera |query=', '[[:pl:Malarstwo temperowe|tempera]]'},
			{'lang=pl |term=zinc |query=', '[[:pl:Cynk|cynk]]'},
			{'lang=pl |term=wood |query=', '[[:pl:Drewno (technika)|drewno]]'},
			{'lang=pl |term=velvet |query=', '[[:pl:Aksamit|welwet]]'},
			{'lang=pl |term=velvet |query=mounted', '[[:pl:Aksamit|welwet]]'},
			{'lang=pl |term=velvet |query=over', '[[:pl:Aksamit|welwecie]]'},
			{'lang=pl |term=velvet |query=on', '[[:pl:Aksamit|welwecie]]'},
			{'lang=pl |term=jadeite |query=', '[[:pl:Jadeit|jadeit]]'},
			{'lang=pl |term=jadeite |query=on', '[[:pl:Jadeit|jadeicie]]'},
			{'lang=pl |term=color pencil |query=', '[[:pl:Kredka|kredka ołówkowa]]'},
			{'lang=pl |term=colour pencil |query=', '[[:pl:Kredka|kredka ołówkowa]]'},
			{'lang=pl |term=terra cotta |query=', '[[:pl:Terakota|terakota]]'},
			
			{'lang=fr |term=wax |query=', '[[:fr:Cire|cire]]'},
			
			{'lang=ru |term=wood |query=', '[[:ru:Древесина|дерево]]'},
			{'lang=ru |term=wood |query=over', '[[:ru:Древесина|дереву]]'},
			{'lang=ru |term=wood |query=mounted', '[[:ru:Древесина|дерево]]'},
			{'lang=ru |term=wood |query=on', '[[:ru:Древесина|дереве]]'},
			{'lang=ru |term=wood |query=foo', '[[:ru:Древесина|дерево]]'},
			
			{'lang=ru |term=mahogany |query=', '[[:ru:Махагони|махагон (красное дерево)]]'},
			{'lang=ru |term=mahogany |query=over', '[[:ru:Махагони|махагону (красное дерево)]]'},
			
			
			{'lang=sk |term=satin |query=', '[[:Category:Satin|satén]]'},
			{'lang=sk |term=wool |query=', '[[:sk:Vlna (pokryv tela)|vlna]]'},
			{'lang=sk |term=bronze |query=', '[[:sk:Bronz|bronz]]'},
			
			{'lang=en |term=diamonds |query=', '[[:en:Diamond|diamonds]]'},
		},
		{nowiki=1})
	end
	local runFrame = mw.getCurrentFrame()
	runFrame.args['differs_at'] = frame.args['differs_at'] and (frame.args['differs_at'] ~= '0') or '1'
	return q:run(runFrame)
end

function p.unitTestsTemplateTechniqueLinksAndLabels(frame)
	local q = require('Module:UnitTests')
	function q:test_2_term_labels_and_links()
		self:preprocess_equals_preprocess_many('{{#invoke:String|replace|{{Technique | ', '}}|<div .*>.*</div>|||false}}', '', '', {
			-- language subtemplate:yes, link:yes:
			{'lang=en |soapstone', '[[:en:Soapstone|soapstone]]'},
			-- sub:yes, link:no, linkfallback:yes:
			{'lang=en |stained glass', '[[:en:Stained glass|stained glass]]'},
			-- sub:y, link:n, linkfallback:n, altqid:y, altqidmatch:y:
			
			-- sub:y, link:n, linkfallback:n, altqid:n:
			{'lang=en |zincograph', '[[:en:Zincography|zincograph]]'},
			-- sub:y, link:n, linkfallback:n, altqid:y, altqidmatch:n:
			{'lang=hu |antique laid paper', '[[d:Q66433004|antik bordázott papír]]'},
			-- sub:n, qid:y, labelfallback:y, linkfallback:y:
			{'lang=en |actinolite', '[[:en:Actinolite|actinolite]]'},
			-- sub:y, qid:y, labelfallback:n, linkfallback:n
			{'lang=ar |cloth', '<span dir="rtl">[[d:Q5849500|قماش]]</span>'},
			{'lang=el |cloth', [==[[[d:Q5849500|<span lang="en">''cloth''</span>]]]==]},
			-- sub:n, qid:y, labelfallback:y, linkfallback:n, altqid:y:
			{'lang=en |antique laid paper', '[[:en:Laid paper|antique laid paper]]'},
			-- sub:n, qid:n:
			{'lang=en |some unsupported term', '<span class="plainlinks">[//commons.wikimedia.org/w/index.php?title=Template:Technique/en&action=edit <span style="color:red">some unsupported term</span>]</span>[[Category:Unsupported technique|some unsupported term]]'},
			{'lang=el |some unsupported term', '<span class="plainlinks">[//commons.wikimedia.org/w/index.php?title=Template:Technique/el&action=edit <span style="color:red">some unsupported term</span>]</span>'},
			-- stuff for unsupported languages, e.g. 'bar'
			
			{'lang=el |aluminum', '[[:el:Αργίλιο|αλουμίνιο]]'},
			-- synonym not in language subtemplate, but in [[Module:Technique/synonyms]]
		},
		{nowiki=1})
	end
	
	local runFrame = mw.getCurrentFrame()
	runFrame.args['differs_at'] = frame.args['differs_at'] and (frame.args['differs_at'] ~= '0') or '1'
	return q:run(runFrame)
end


-- @tparam string prefix
-- @tparam string suffix
-- @tparam table cases
-- @tparam string title
local function renderSimpleTests(prefix, suffix, cases, title)
	local rows = ''
	for _,paramString in ipairs(cases) do
		local case = prefix .. paramString .. suffix
		rows = rows .. '|-\n| <code>' .. mw.text.nowiki(case) .. '</code> || ' .. mw.getCurrentFrame():preprocess(case) .. '\n'
	end
	local wikitable = '{| class="wikitable"\n|+ ' .. (title or '') .. '\n! Text !! Output\n' .. rows .. '\n|}'
	return wikitable
end

function p.try_template_page(frame)
	local template = frame.args.template
	local cases = {
		'porcelain|lang=hu',
		'alloy|lang=pl',
		'alloy|lang=nl',
		'alloy|lang=hu',
		'foobar',
		'|foobar',
		'1=foo|adj=bar',
		'foobar|canvas',
		'oil|foobar',
		'oil|adj=foobar',
		'adj=blue|lang=en',
		'adj=blue|lang=nl',
		'accumulator|on=aogai|adj=gilt|lang=en',
		'accumulator|on=aogai|adj=gilt|lang=nl',
		'diamonds|lang=en',
		'cable|lang=en', -- deprecated term
		'lang=bn |wood |color=black |and=gold |on=accumulator |coloron=glazed', -- conjunction and unsupported language
		}
	local prefix = '{{' .. template .. ' |'
	local suffix = '}}'
	local title = 'Testing [[Template:' .. template .. ']]'
	return renderSimpleTests(prefix, suffix, cases, title)
end

function p.try_live()
	local cases = {
		'canvas |lang=de',
		'birch |lang=de',
		'antique laid paper |lang=en',
		'antique laid paper |lang=de',
		'antique laid paper |lang=pl',
		'antique laid paper |lang=ru',
		}
	local prefix = '{{Technique |'
	local suffix = '}}'
	local title = 'Testing [[Template:Technique]]'
	return renderSimpleTests(prefix, suffix, cases, title)
end


local function testsWikiText(intro, compare, simple)
	local languageSelector = mw.getCurrentFrame():preprocess(
		[[<small>{{LanguageSelector |icons=anything else
		|ar|ca|cs|da|de|el|en|en-ca|es|et|fi|fr|gl|he|hu|it|ja|mk|nds|nl|no|pl|pt
		|ro|ru|scn|sk|sl|sr|sv|sw|vec|vi|zh-hans|zh-hant}}</small>]])
	return languageSelector .. '\n\n' .. intro .. '\n\n' .. compare
		.. (simple ~= nil and '\n\n=== Simple Tests ===\n' .. simple or '')
end

function p.allTests(frame)
	local intro = 'Testing [[Template:' .. frame.args.template .. ']]:'
	local compare = p.unitTestsCompare(frame)
	local simple = p.try_template_page(frame)
	return testsWikiText(intro, compare, simple)
end

function p.templateTechniqueTests(frame)
	local intro = 'Testing functions of live [[Template:Technique]]:'
	local compare = p.unitTestsCompareTemplateTechnique(frame)
	local simple = p.try_live()
	return testsWikiText(intro, compare, simple)
end

function p.templateTechniqueLinksAndLabels(frame)
	local intro = 'Testing label and link generation for terms of live [[Template:Technique]]:'
	local compare = p.unitTestsTemplateTechniqueLinksAndLabels(frame)
	return testsWikiText(intro, compare)
end

return p