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")
local get_script = require("Module:scripts").getByCode
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 = {}
local function show_remaining_arguments(...)
if select("#", ...) > 0 then
local output = require "Module:array"()
for _, arg in ipairs {...} do
output:insert(", ")
output:insert(tostring(arg))
end
return output:concat()
else
return ""
end
end
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>)" .. show_remaining_arguments(...),
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, "치〯", "치" },
"script-specific (no change when wrong script code is provided)",
{ langs.az, "ایشؽق", "ایشیق" },
{ langs.az, "ایشؽق", "ایشؽق", get_script("Cyrl") }, -- no change with wrong script code
}
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ą́ą́ʼ", "SIIDAAZ" },
"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", "TUYEN NGON TOAN! THE% GIOI% VE! NHAN QUYEN! CUA# LIEN HOP& QUOC%" },
{ langs.zh, "命裡有時終須有,命裡無時莫強求", "口05衣07月02日06糸05頁03月02,口05衣07火08日06艸07弓08水02" },
{ langs.zh, "⿱𡩧⿺進⿰貝招", "宀37" },
"dotted and dotless i",
{ langs.tr, "İzmir", "IZMIR" },
{ langs.tr, "ışık", "ISIK" }
}
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-ang"},
{"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" : [ "en-ear" ], "code" : "en", "canonicalName" : "English", "wikimediaLanguages" : [ "en", "simple" ], "aliases" : [ "Modern English", "New English" ], "type" : [ "language", "full", "regular" ], "wikidataItem" : "Q1860", "varieties" : [ "Polari", "Yinglish" ], "scripts" : [ "Latn", "Brai", "Shaw", "Dsrt" ], "family" : "gmw-ang", "otherNames" : [], "categoryName" : "English language", "nonEtymological" : "en"}]])
end
function tests:test_getFull()
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]:getFull():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