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 = {
{"ms", "Bahasa Melayu"},
{"af", "Afrikaans"},
{"ae", "Avestan"},
{"ht", "Kreol Haitian"},
{"ase", "Bahasa Isyarat Amerika"},
{"dv", "Bahasa Maldives"},
{"eo", "Esperanto"},
{"goh", "Jerman Tinggi Kuno"},
}
self:iterate(examples, function(self, lang, expected)
self:equals(lang, langs[lang]:getWikipediaArticle(), expected)
end)
end
function tests:test_makeWikipediaLink()
local examples = {
{"ms", "[[w:Bahasa Melayu|Melayu]]"},
}
self:iterate(examples, function(self, lang, expected)
self:equals(lang, langs[lang]:makeWikipediaLink(), expected, {nowiki=1})
end)
end
function tests:test_getFamily()
local examples = {
{"ms", "poz-mly"},
{"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 = {
{"ms", {"Latn", "ms-Arab"}},
{"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 = {
{"ms", "Bahasa Melayu"},
{"af", "Bahasa Afrikaans"},
{"av", "Bahasa Avar"},
{"ht", "Bahasa Kreol Haiti"},
{"ase", "Bahasa Isyarat Amerika"}
}
self:iterate(examples, function(self, lang, expected)
self:equals(lang, langs[lang]:getCategoryName(), expected)
end)
end
function tests:test_getWikidataItem()
local examples = {
{"ms", "Q9237"},
{"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('ms-toJSON', langs.ms:toJSON(), [[{"ancestors" : ["ms-cla"], "code" : "ms", "canonicalName" : "Melayu", "wikimediaLanguages" : ["ms"], "wikidataItem" : "Q9237", "scripts" : ["Latn", "ms-Arab"], "family" : "poz-mly", "aliases" : ["Malaysian", "Standard Malay"], "categoryName" : "Bahasa Melayu", "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