local tests = require('Module:UnitTests')
local m_typing = require('Module:typing-aids')
local get_by_code = require('Module:languages').getByCode
local find_best_script = require('Module:scripts').findBestScript
local decompose = mw.ustring.toNFD
local langs = {}
local tag_funcs = {}
-- Assumes one script per language.
local function tag_gen(test_text, langCode)
local func = tag_funcs[langCode]
if func then
return func
else
if not langs[langCode] then
langs[langCode] = get_by_code(langCode) or error('The language code ' .. langCode .. ' is invalid.')
end
local scCode = find_best_script(test_text, langs[langCode]):getCode() or
error('No script could be found for the text ' .. test_text .. ' and the language code ' .. langCode .. '.')
local before, after = '<span class="' .. scCode .. '" lang="' .. langCode .. '">', '</span>'
function func(text)
return before .. text .. after
end
tag_funcs[langCode] = func
return func
end
end
local options_cache = {}
function tests:check_output(code, expected, lang, transliteration)
local result
if lang then
result = m_typing.replace{ lang, code }
else
result = m_typing.replace{code}
end
result = decompose(result)
expected = decompose(expected)
local options = options_cache[lang]
if not options and lang and not transliteration then
options = { display = tag_gen(result, lang) }
options_cache[lang] = options
end
self:equals(
code,
result,
expected,
options
)
end
function tests:do_tests(examples, lang)
local transliteration = lang ~= nil and lang:find("%-tr$") ~= nil
for _, example in ipairs(examples) do
if #example == 3 and not transliteration then
self:check_output(example[1], example[3], lang)
if example[2] ~= example[1] then
self:check_output(example[2], example[3], lang)
end
else
self:check_output(example[1], example[2], lang, transliteration)
end
end
end
function tests:test_all()
local examples = {
{ "*dye_'ws", "*dyḗws" },
{ "*n0mr0to's", "*n̥mr̥tós" },
{ "*tk'e'yti", "*tḱéyti" },
{ "*h1es-", "*h₁es-" },
{ "*t_ep-e'h1(ye)-ti", "*tₔp-éh₁(ye)-ti" },
{ "*h1e'k'wos", "*h₁éḱwos" },
{ "*bhebho'ydhe", "*bʰebʰóydʰe" },
{ "*dh3to's", "*dh₃tós" },
{ "*t'a_ko^`", "*þākǫ̂" },
{ "*T'eudo_balt'az", "*Þeudōbalþaz" },
{ "*bo_kijo_`", "*bōkijǭ" },
{ "*tat^t^o_", "*taťťō" },
{ "*d^o_'yyon", "*ďṓyyon" },
}
self:do_tests(examples)
end
local ae_examples = {
{ "ap", "ap", "𐬀𐬞" },
{ "xs.^uuas^", "xṣ̌uuaš", "𐬑𐬴𐬎𐬎𐬀𐬱" },
{ "v@hrka_na", "vəhrkāna", "𐬬𐬆𐬵𐬭𐬐𐬁𐬥𐬀" },
{ "nae_za", "naēza", "𐬥𐬀𐬉𐬰𐬀" },
{ "zaaO", "zā̊", "𐬰𐬃"},
{ "hizwaO", "hizuuå", "𐬵𐬌𐬰𐬎𐬎𐬂"},
}
function tests:test_Avestan()
self:do_tests(ae_examples, "ae")
end
function tests:test_Avestan_tr()
self:do_tests(ae_examples, "ae-tr")
end
function tests:test_Akkadian()
local examples = {
{ "ša", "𒊭" },
-- { "transliteration", "result" },
}
self:do_tests(examples, "akk")
end
local hy_examples = {
{ "azgaynac`um", "azgaynacʿum", "ազգայնացում" },
{ "terew", "terew", "տերև" },
{ "burz^uazia", "buržuazia", "բուրժուազիա" },
{ "kol_mnaki", "kołmnaki", "կողմնակի" },
}
function tests:test_Armenian()
self:do_tests(hy_examples, "hy")
end
function tests:test_Armenian_tr()
self:do_tests(hy_examples, "hy-tr")
end
function tests:test_Arabic()
local examples = {
{ "al-Huruuf al-qamariyyat'", "الْحُرُوف الْقَمَرِيَّة" },
{ "al-Huruuf al-xamsiyyat'", "الْحُرُوف الشَّمْسِيَّة" },
{ "ealifu WlwaSli", "أَلِفُ ٱلْوَصْلِ" },
{ "maae", "مَاء" },
{ "muemin", "مُؤْمِن" },
{ "eiDaafat'", "إِضَافَة" },
{ "eaab", "آب" },
{ "qureaan", "قُرْآن" },
{ "qiTTat'", "قِطَّة" },
{ "faEEaal", "فَعَّال" },
{ "xayeu", "شَيْءُ" },
{ "xayeaN", "شَيْءً" },
{ "daaeimaN", "دَائِمًا" },
{ "mabduueat'", "مَبْدُوءَة" },
{ "mabduu'at'", "مَبْدُوءَة" },
{ "badaaeiyyuN", "بَدَائِيٌّ" },
{ "badaaeat'", "بَدَاءَة" },
{ "maktuub", "مَكْتُوب" },
{ "taHriir", "تَحْرِير" },
{ "EuZmaaa", "عُظْمَى" },
{ "ean0", "أَنْ" },
{ "law0", "لَوْ" },
{ "xay'aN", "شَيْءً" },
{ "ta7riir", "تَحْرِير" },
{ "3axarat'", "عَشَرَة" },
}
self:do_tests(examples, "ar")
end
function tests:test_Persian()
local examples = {
{ "brAdr", "برادر" },
}
self:do_tests(examples, "fa")
end
function tests:test_PIE()
local examples = {
{ "*dye_'ws", "*dyḗws" },
{ "*n0mr0to's", "*n̥mr̥tós" },
{ "*tk'e'yti", "*tḱéyti" },
{ "*h1es-", "*h₁es-" },
{ "*t_ep-e'h1(ye)-ti", "*tₔp-éh₁(ye)-ti" },
{ "*h1e'k'wos", "*h₁éḱwos" },
{ "*bhebho'ydhe", "*bʰebʰóydʰe" },
{ "*dh3to's", "*dh₃tós" },
{ "*dhewg'h-", "*dʰewǵʰ-" },
}
self:do_tests(examples, "ine-pro")
end
function tests:test_Germanic()
local examples = {
{ "*t'a_ko^`", "*þākǫ̂" },
{ "*T'eudo_balt'az", "*Þeudōbalþaz" },
{ "*bo_kijo_`", "*bōkijǭ" },
}
self:do_tests(examples, "gem-pro")
end
function tests:test_Gothic()
local examples = {
{ "ƕaiwa", "𐍈𐌰𐌹𐍅𐌰" },
{ "anþar", "𐌰𐌽𐌸𐌰𐍂" },
{ "fidwōr", "𐍆𐌹𐌳𐍅𐍉𐍂" },
{ "fidwor", "𐍆𐌹𐌳𐍅𐍉𐍂" },
{ "mikils", "𐌼𐌹𐌺𐌹𐌻𐍃" },
{ "hēr", "𐌷𐌴𐍂" },
{ "her", "𐌷𐌴𐍂" },
{ "vac", "𐍈𐌰𐌸" },
-- { "", "" },
}
self:do_tests(examples, "got")
end
function tests:test_Hellenic()
local examples = {
{ "*tat^t^o_", "*taťťō" },
{ "*d^o_'yyon", "*ďṓyyon" },
{ "*gw@n'n'o_", "*gʷəňňō" },
{ "*gw@n^n^o_", "*gʷəňňō" },
{ "*kwhe_r", "*kʷʰēr" },
{ "*khwe_r", "*kʷʰēr" },
}
self:do_tests(examples, "grk-pro")
end
function tests:test_Greek()
local examples = {
{ "a__i", "ᾱͅ" },
{ "a)lhqh/s", "ἀληθής" },
{ "a)lhqhs*", "ἀληθησ" },
{ "a)lhqhs-", "ἀληθησ-" },
{ "a^)nh/r", "ᾰ̓νήρ" },
{ "Phlhi+a/dhs", "Πηληϊάδης" },
{ "Phlhi^+a^/dhs", "Πηληῐ̈ᾰ́δης" },
{ "Πηληϊ^ά^δης", "Πηληῐ̈ᾰ́δης" },
{ "e)a_/n", "ἐᾱ́ν" },
{ "ἐά_ν", "ἐᾱ́ν" },
{ "pa=sa^", "πᾶσᾰ" },
{ "u_(mei=s", "ῡ̔μεῖς" },
{ "a/)^ner", "ᾰ̓́νερ" },
{ "a/^)ner", "ᾰ̓́νερ" },
{ "a)/^ner", "ᾰ̓́νερ" },
{ "a)^/ner", "ᾰ̓́νερ" },
{ "dai+/frwn", "δαΐφρων" },
{ "dai/+frwn", "δαΐφρων" },
}
self:do_tests(examples, "grc")
end
function tests:test_Hittite()
local examples = {
{ "a-ku", "𒀀𒆪" },
{ "an-tu-wa-ah-ha-as", "𒀭𒌅𒉿𒄴𒄩𒀸" },
{ "an-tu-wa-aḫ-ḫa-aš", "𒀭𒌅𒉿𒄴𒄩𒀸" },
{ "<sup>DINGIR</sup>IŠKUR", "𒀭𒅎" }, -- Akkadian actually?
}
self:do_tests(examples, "hit")
end
local sa_examples = {
{ "saMskRta/", "saṃskṛtá", "संस्कृत" },
{ "kSatri/ya", "kṣatríya", "क्षत्रिय" },
{ "rAja suprabuddha", "rāja suprabuddha", "राज सुप्रबुद्ध"},
{ "zAkyamuni", "śākyamuni", "शाक्यमुनि"},
{ "siMha", "siṃha", "सिंह"},
{ "nAman", "nāman", "नामन्"},
{ "anA/", "anā́", "अना" },
{ "ayuSmAn", "ayuṣmān", "अयुष्मान्"},
{ "ghatsyati", "ghatsyati", "घत्स्यति"},
}
function tests:test_Sanskrit()
self:do_tests(sa_examples, "sa")
end
function tests:test_Sanskrit_tr()
self:do_tests(sa_examples, "sa-tr")
end
function tests:test_Old_Persian()
local examples = {
{ "aitiiy", "𐎠𐎡𐎫𐎡𐎹" },
{ "raucah", "𐎼𐎢𐎨𐏃" },
{ "ham", "𐏃𐎶" },
{ "jiva", "𐎪𐎺"},
{ "daraniyakara", "𐎭𐎼𐎴𐎹𐎣𐎼" },
{ "daragama", "𐎭𐎼𐎥𐎶" },
}
self:do_tests(examples, "peo")
end
function tests:test_Parthian()
local examples = {
{ "tšynd", "𐫤𐫢𐫏𐫗𐫅" },
{ "xʾrtʾg", "𐫟𐫀𐫡𐫤𐫀𐫃" },
{ "hʾmhyrz", "𐫍𐫀𐫖𐫍𐫏𐫡𐫉" },
{ "ʿšnwhr", "𐫙𐫢𐫗𐫇𐫍𐫡"},
{ "hʾwsʾr", "𐫍𐫀𐫇𐫘𐫀𐫡" },
}
self:do_tests(examples, "xpr")
end
function tests:test_Japanese()
local examples = {
{ "iro ha nihoheto", "いろ は にほへと" },
{ "uwyi no okuyama", "うゐ の おくやま" },
{ "FAMIRI-MA-TO", "ファミリーマート" },
{ "altu", "あっ" },
{ "hi/mi/tu", "ひ・み・つ" },
{ "han'i", "はんい" },
{ "hanni", "はんい" },
{ "mannnaka", "まんなか" },
{ "attiike", "あっちいけ" },
{ "acchiike", "あっちいけ" },
{ "upnusi", "うpぬし" },
}
self:do_tests(examples, "ja")
end
function tests:test_Old_Church_Slavonic()
local examples = {
{ "ljudije", "людиѥ" },
{ "azuh", "азъ" },
{ "buky", "боукꙑ" },
{ "mŭčati", "мъчати" },
{ "Iosija", "Иосиꙗ" },
}
self:do_tests(examples, "cu")
end
function tests:test_Ossetian()
local examples = {
{ "fynʒ", "фындз" },
{ "æxsæv", "ӕхсӕв" },
{ "c’æx", "цъӕх" },
{ "biræǧ", "бирӕгъ" },
{ "Ræstʒinad", "Рӕстдзинад" },
}
self:do_tests(examples, "os")
end
--[[
To add another example, place the following code
within the braces of an "examples" table:
{ "shortcut", "expected result" },
{ "", "" },
or for Sanskrit,
{ "Harvard-Kyoto", "IAST", "Devanagari" },
{ "", "", "" },
]]
return tests