Aller au contenu

Module:Country data/Bac à sable/Test

Une page de Wikipédia, l'encyclopédie libre.

 Documentation[voir] [modifier] [historique] [purger]

Ce module contient des informations utilisées par le système country.

-- Test unitaire pour [[Module:Country data/Bac à sable]]. Cliquer sur « Discussion » pour voir le résultat du test.
local p = require('Module:UnitTests')

-- TODO Déplacer dans Module:Country data/test et gérer à la fois l'original et le bac à sable
local modulename = mw.title.getCurrentTitle().baseText
local Countrydata = require( 'Module:' .. modulename )
local TestWikicode = require('Module:Test wikicode')
local frame

--[[
	Retourne une table contenant uniquement les clés keys de la table tbl
]]--
local function intersectKeys(tbl, keys)
	local newTbl = {}
	for k, v in pairs(tbl) do
		for i, key in ipairs(keys) do
			if k == key then
				newTbl[k] = v
				break
			end
		end
	end
	return newTbl
end

local function identity(...) return ... end

local function preprocessModuleAndTemplate(moduleFunction, templateName, args, useData)
	if not frame then frame = mw.getCurrentFrame() end
	useData = useData and (' |usedata=' .. useData) or ''
	if mw.text.trim(args):sub(0, 1) ~= '|' then args = ' |' .. args end
	local moduleCode = '{{#invoke:' .. modulename .. ' |' .. moduleFunction .. args .. useData .. '}}'
	local templateCode = '{{' .. templateName .. args .. '}}'
	return moduleCode, templateCode, frame:preprocess(moduleCode), frame:preprocess(templateCode)
end

local function getTestPrefix(args, moduleCode, templateCode, moduleRes, templateRes, useData, addIntro)
	local testPrefix = ''
	if addIntro then
		testPrefix =
			'!colspan=4 style="border-top-width:4px;padding-top:1em;padding-bottom:1em;"|<big>Paramètres : ' .. '<code>' .. mw.text.nowiki(args) .. '</code></big>\n|-\n' ..
			'|colspan=2|Code\n' ..
			'|style="vertical-align:top;"|<pre>' .. mw.text.nowiki(templateCode) .. '</pre>\n' ..
			'|style="vertical-align:top;"|<pre>' .. mw.text.nowiki(moduleCode) .. '</pre>\n|-\n'
	end
	if not useData then
		testPrefix = testPrefix .. '!colspan=4 style="text-align:left;"|En utilisant les données prioritaires\n|-\n'
	elseif useData == 'template' then
		testPrefix = testPrefix .. '!colspan=4 style="text-align:left;"|En utilisant les données des modèles\n|-\n'
	elseif useData == 'module' then
		testPrefix = testPrefix .. '!colspan=4 style="text-align:left;"|En utilisant les données des modules\n|-\n'
	end
	testPrefix = testPrefix ..
		'|colspan=2|Résultat\n' ..
		'|style="vertical-align:top;"|' .. templateCode .. '<br /><pre>' .. mw.text.nowiki(templateRes) .. '</pre>\n' ..
		'|style="vertical-align:top;"|' .. moduleCode .. '<br /><pre>' .. mw.text.nowiki(moduleRes) .. '</pre>\n|-\n'
	return testPrefix
end

--[[
	Compare une fonction du module avec un template.
	La comparaison se fait sur la structure du wikicode (via TestWikicode.extract).
]]--
function p:compareModuleToTemplateWikicode(moduleFunction, templateName)
	local function test(args, items, transformers, useData, addIntro)
		local moduleCode, templateCode, moduleRes, templateRes = preprocessModuleAndTemplate(moduleFunction, templateName, args, useData)
		local testPrefix = getTestPrefix(args, moduleCode, templateCode, moduleRes, templateRes, useData, addIntro)
		
		local moduleExtracts = TestWikicode.extract(moduleRes, items)
		local templateExtracts = TestWikicode.extract(templateRes, items)
		p:equals('Structure (<code>' .. table.concat(items, ', ') .. '</code>)', moduleExtracts ~= nil, templateExtracts ~= nil, {
			before = testPrefix
		})
		for k, transformer in ipairs(transformers or {}) do
			if transformer then
				local index, label, fun = unpack(transformer)
				p:equals_deep(
					label,
					moduleExtracts ~= nil and fun(moduleExtracts[index]) or nil,
					templateExtracts ~= nil and fun(templateExtracts[index]) or nil,
					{nowiki = true}
				)
			end
		end
	end
	
	--[[
		items est une sequence passée à TestWikicode.extract.
		transformers est une sequence de sequences du type {index, label, fonction} permettant
		de comparer certains items parmi les résultats extraits :
		* index est l'index de l'item à comparer ;
		* label est un intitulé pour cet item ;
		* fonction permet de transformer l'item avant la comparaison.
	]]--
	return function (args, items, transformers)
		test(args, items, transformers, nil, true)
		test(args, items, transformers, 'template')
		test(args, items, transformers, 'module')
	end
end

--[[
	Compare une fonction du module avec un template.
	La comparaison se fait sur le résultat brut.
]]--
function p:compareModuleToTemplateSimple(moduleFunction, templateName)
	local function test(args, useData, addIntro)
		local moduleCode, templateCode, moduleRes, templateRes = preprocessModuleAndTemplate(moduleFunction, templateName, args, useData)
		local testPrefix = getTestPrefix(args, moduleCode, templateCode, moduleRes, templateRes, useData, addIntro)
		
		p:equals('Valeur', moduleRes, templateRes, {
			before = testPrefix
		})
	end
	return function (args, items, transformers)
		test(args, nil, true)
		test(args, 'template')
		test(args, 'module')
	end
end

-- Test pays() vs {{pays}}
function p:test01_pays()
	local validate = p:compareModuleToTemplateWikicode('pays', 'pays')
	local function test(args)
		local items = {'image', '-', 'link'}
		local validators = {
			{1, 'Image', function (image)
				return intersectKeys(image, {'src', 'size', 'format'})
			end},
			{3, 'Lien', identity},
		}
		validate(args, items, validators)
	end
	test('France')
	test('Népal')
	test('Sint Maarten')
	test('Commonwealth d\'Angleterre')
	test('Nouvelle-Calédonie')
	test('France|taille=10')
	test('France|nom=Test')
	test('France|libre')
	test('FRA')
end

-- Test pays_lien_seul() vs {{pays/lien seul}}
function p:test02_pays_lien_seul()
	local validate = p:compareModuleToTemplateWikicode('pays_lien_seul', 'pays/lien seul')
	local function test(args)
		local items = {'^', 'link', '$'}
		local validators = {
			{1, 'Lien', identity},
		}
		validate(args, items, validators)
	end
	test('France')
	test('Commonwealth d\'Angleterre')
	test('Sint Maarten')
	test('FRA')
end

-- Test marine_de_guerre() vs {{marine de guerre}}
function p:test03_marine_de_guerre()
	local validate = p:compareModuleToTemplateWikicode('marine_de_guerre', 'marine de guerre')
	local function test(args)
		local items = {'image', '-', 'link'}
		local validators = {
			{1, 'Image', function (image)
				return intersectKeys(image, {'src', 'size', 'format'})
			end},
			{3, 'Lien', identity},
		}
		validate(args, items, validators)
	end
	test('Afrique du Sud')
	test('Népal')
	test('Nouvelle-Calédonie')
	test('France|size=10px')
	test('Afrique du Sud|name=Test')
	test('France|name=Test')
	test('Afrique du Sud|1922')
	test('FRA')
end

-- Test armee_de_terre() vs {{armée de terre}}
function p:test04_armee_de_terre()
	local validate = p:compareModuleToTemplateWikicode('armee_de_terre', 'armée de terre')
	local function test(args)
		local items = {'image', '-', 'link'}
		local validators = {
			{1, 'Image', function (image)
				return intersectKeys(image, {'src', 'size', 'format'})
			end},
			{3, 'Lien', identity},
		}
		validate(args, items, validators)
	end
	test('Afrique du Sud')
	test('Népal')
	test('Nouvelle-Calédonie')
	test('France|size=10px')
	test('France|name=Test')
	test('Royaume d\'Italie|name=Test')
	test('Afrique du Sud|1951')
	test('FRA')
end

-- Test armee_de_l_air() vs {{armée de l\'air}}
function p:test05_armee_de_l_air()
	local validate = p:compareModuleToTemplateWikicode('armee_de_l_air', 'armée de l\'air')
	local function test(args)
		local items = {'image', '-', 'link'}
		local validators = {
			{1, 'Image', function (image)
				return intersectKeys(image, {'src', 'size', 'format'})
			end},
			{3, 'Lien', identity},
		}
		validate(args, items, validators)
	end
	test('Canada')
	test('Népal')
	test('Nouvelle-Calédonie')
	test('France|size=10px')
	test('France|name=Test')
	test('Royaume d\'Italie|name=Test')
	test('Canada|1924')
	test('FRA')
end

-- Test drapeau() vs {{drapeau}}
function p:test06_drapeau()
	local validate = p:compareModuleToTemplateWikicode('drapeau', 'drapeau')
	local function test(args)
		local items = {'image'}
		local validators = {
			{1, 'Image', function (image)
				return intersectKeys(image, {'src', 'size', 'format'})
			end},
		}
		validate(args, items, validators)
	end
	test('France')
	test('Népal')
	test('Nouvelle-Calédonie')
	test('France|taille=10')
	test('France|libre')
	test('FRA')
end

-- Test getalias() vs {{getalias}}
function p:test07_getalias()
	local test = p:compareModuleToTemplateSimple('getalias', 'getalias')
	test('France')
	test('Commonwealth d\'Angleterre')
	test('Commonwealth d\'Angleterre|shortname')
	test('France|flag')
	test('France|link')
	test('France|flag|libre')
	test('France|link|army')
	test('FRA')
end

return p