local tests = require("Module:UnitTests")
local m_languages = require("Module:languages")
local tag = require("Module:script utilities").tag_text
-- Auto-create language objects: langs.en -> language object for English.
local langs = require ("Module:languages/cache")
function tests:check(funcName)
-- Use English language object to test for existence of function.
local func = langs.en[funcName] or error("No function named " .. funcName .. " in language object.")
local options = {}
return function(self, lang, example, expected, ...)
function options.display(text)
return tag(text, lang)
end
self:equals(tag(example, lang) .. " (" .. lang:getCanonicalName() .. ", <code>" .. lang:getCode() .. "</code>)",
func(lang, example, ...),
expected,
options)
end
end
function tests:test_makeEntryName()
local examples = {
{ langs.la, "hūmānitās", "humanitas" },
{ langs.la, "coëō", "coeo" },
{ langs.ha, "àzàhàr̃iyyā̀", "azahariyya" },
{ langs.en, "alas!", "alas" },
{ langs.es, "¿cómo te llamas?", "cómo te llamas" },
{ langs.ru, "ӓ ё", "а ё" },
{ langs.es, "¿ ?", "¿ ?" },
{ langs.es, "¡ !", "¡ !" },
{ langs.fr, "mais bien sûr !", "mais bien sûr" },
{ langs.mul, "¡", "¡" },
{ langs.grc, "Πηληῐ̈ᾰ́δης", "Πηληϊάδης" },
{ langs.ar, "العَرَبِيَّة", "العربية" },
{ langs.ar, "ٱ", "ٱ" }, -- special case: alif waṣla
{ langs.ar, "ـُ", "ـُ" }, -- special case: taṭwīl with vowel diacritic
{ langs.okm, "치〯", "치" },
}
self:iterate(examples, self:check("makeEntryName"))
end
function tests:test_makeDisplayText()
local examples = {
{ langs.ta, "ஸ்ரீகாகுளம்", "ஶ்ரீகாகுளம்" },
}
self:iterate(examples, self:check("makeDisplayText"))
end
function tests:test_makeSortKey()
local examples = {
"diacritic removal",
{ langs.grc, "Πηληϊάδης Αἶνος", "ΠΗΛΗΙΑΔΗΣ ΑΙΝΟΣ" },
{ langs.nv, "shį́į́dą́ą́ʼ", "SHIIDAA" },
"dedicated sortkey modules",
{ langs.vi, "Tuyên ngôn toàn thế giới về nhân quyền của Liên Hợp Quốc", "TUYE₂N NGO₂N TOAN1 THE₂4 GIO₃I4 VE₂1 NHA₂N QUYE₂N1 CUA2 LIE₂N HO₃P5 QUO₂C4" },
{ langs.zh, "命裡有時終須有,命裡無時莫強求", "口05衣07月02日06糸05頁03月02,口05衣07火08日06艸07弓08水02" },
{ langs.zh, "⿺辶⿳穴⿲月⿱⿲幺言幺⿲長馬長刂心⿺辶⿳穴⿲月⿱⿲幺言幺⿲長馬長刂心麵", "辵54辵54麥09" },
"dotted and dotless i",
{ langs.tr, "İzmir", "İZMİR" },
{ langs.tr, "ışık", "IŞIK" }
}
self:iterate(examples, self:check("makeSortKey"))
end
function tests:test_getWikipediaArticle()
local examples = {
{"en", "English language"},
{"af", "Afrikaans"},
{"ae", "Avestan"},
{"ht", "Haitian Creole"},
{"ase", "American Sign Language"},
{"dv", "Maldivian language"},
{"eo", "Esperanto"},
{"goh", "Old High German"},
}
self:iterate(examples, function(self, lang, expected)
self:equals(lang, langs[lang]:getWikipediaArticle(), expected)
end)
end
function tests:test_makeWikipediaLink()
local examples = {
{"en", "[[w:English language|English]]"},
{"af", "[[w:Afrikaans|Afrikaans]]"},
{"ae", "[[w:Avestan|Avestan]]"},
}
self:iterate(examples, function(self, lang, expected)
self:equals(lang, langs[lang]:makeWikipediaLink(), expected, {nowiki=1})
end)
end
function tests:test_getFamily()
local examples = {
{"en", "gmw"},
{"ht", "crp"},
{"ase", "sgn"}
}
self:iterate(examples, function(self, lang, expected)
self:equals(lang, langs[lang]:getFamily():getCode(), expected)
end)
end
function tests:test_getScriptCodes()
local examples = {
{"en", {"Latn", "Brai", "Shaw", "Dsrt"}},
{"ht", {"Latn"}},
{"ase", {"Sgnw"}}
}
self:iterate(examples, function(self, lang, expected)
self:equals_deep(lang, langs[lang]:getScriptCodes(), expected, {})
end)
end
function tests:test_getOtherNames()
local examples = {
{"ht", {"Creole", "Haitian", "Kreyòl"}},
{"ase", {"Ameslan", "ASL"}}
}
self:iterate(examples, function(self, lang, expected)
self:equals_deep(lang, langs[lang]:getOtherNames(), expected, {})
end)
end
function tests:test_getCategoryName()
local examples = {
{"en", "English language"},
{"af", "Afrikaans language"},
{"av", "Avar language"},
{"ht", "Haitian Creole language"},
{"ase", "American Sign Language"}
}
self:iterate(examples, function(self, lang, expected)
self:equals(lang, langs[lang]:getCategoryName(), expected)
end)
end
function tests:test_getWikidataItem()
local examples = {
{"en", "Q1860"},
{"eo", "Q143"},
{"aql-pro", "Q18389588"},
{"mkh-ban-pro", nil},
}
self:iterate(examples, function(self, lang, expected)
self:equals(lang, langs[lang]:getWikidataItem(), expected)
end)
end
function tests:test_toJSON()
self:equals('en-toJSON', langs.en:toJSON(), [[{"ancestors" : ["enm"], "code" : "en", "canonicalName" : "English", "wikimediaLanguages" : ["en", "simple"], "wikidataItem" : "Q1860", "scripts" : ["Latn", "Brai", "Shaw", "Dsrt"], "family" : "gmw", "otherNames" : ["Modern English", "New English", "Hawaiian Creole English", "Hawai'ian Creole English", "Hawaiian Creole", "Hawai'ian Creole", "Polari", "Yinglish"], "categoryName" : "English language", "type" : "regular"}]])
end
function tests:test_getNonEtymological()
local examples = {
{ "de", "de" },
{ "de-AT", "de" },
{ "de-AT-vie", "de" },
{ "gem", "gem" },
}
self:iterate(examples, function(self, lang, expected)
self:equals(lang, langs[lang]:getNonEtymological():getCode(), expected)
end)
end
for k, v in require "Module:table".sortedPairs(tests) do
if type(k) == "string" and k:sub(1, 5) == "test_" then
local new_key = k:gsub('^test_(.+)$', 'testcases for <code>%1</code>')
tests[new_key], tests[k] = v, nil
end
end
return tests