local tests = require('Module:UnitTests')
local m_conj_verb = require('Module:pi-conj/verb')
local m_str_utils = require("Module:string utilities")
local to_script = require("Module:pi-Latn-translit").tr
local insert = table.insert
local match = m_str_utils.match
local u = m_str_utils.char
-- tests.sc="Lana"
tests.sc = "Latn"
tests.option = {impl="yes"}
local spaceJoin = function(vals)
output = ""
for i, v in ipairs(vals) do
if output == "" then
output = v
else
output = output.." "..v
end
end
return output
end
local empty6 = {{}, {}, {}, {}, {}, {}}
local num = {[1] = 1, [3] = 2, [5] = 3}
local comp_lists = function(vref, vgot, label, tablet1, tablet2)
local exp, got
if tablet2 then
exp = spaceJoin(vref[tablet1] or {})..' ; '..
spaceJoin(vref[tablet2] or {})
got = spaceJoin(vgot[tablet1] or {})..' ; '..
spaceJoin(vgot[tablet2] or {})
else
exp = spaceJoin(vref[tablet1] or {})
got = spaceJoin(vgot[tablet1] or {})
end
tests:equals(label, got, to_script(exp, tests.sc, tests.option))
end
local pass_through = function(x) return x end
local knockout = function(forms)
retval = {}
for _, v in pairs(forms) do
if not match(v, "[โเໂເ][มวມວ]["..u(0x0e3a)..u(0x0eba)..']') then
insert(retval, v)
end
end
return retval
end
local compare = function(vref, vgot, label, tablet1, tablet2)
local exp, got
local r1 = vref[tablet1] or empty6
local g1 = vgot[tablet1] or empty6
local r2, g2
if tablet2 then
r2 = vref[tablet2] or empty6
g2 = vgot[tablet2] or empty6
end
local f
if (tests.sc == "Thai" or tests.sc == "Laoo") and
tests.option.impl ~= "no" then
f = knockout
else
f = pass_through
end
for i = 1, 5, 2 do
if tablet2 then
exp = spaceJoin(r1[i])..' ; '..spaceJoin(r1[i+1])
..' ; '..spaceJoin(r2[i])..' ; '..spaceJoin(r2[i+1])
got = spaceJoin(f(g1[i]))..' ; '..spaceJoin(f(g1[i+1]))
..' ; '..spaceJoin(f(g2[i]))..' ; '..spaceJoin(f(g2[i+1]))
else
exp = spaceJoin(r1[i])..' ; '..spaceJoin(r1[i+1])
got = spaceJoin(f(g1[i]))..' ; '..spaceJoin(f(g1[i+1]))
end
tests:equals(label..num[i], got, to_script(exp, tests.sc, tests.option))
end
end
local pacati_ref = {
presa = {
{"pacāmi"}, {"pacāma"}, {"pacasi"}, {"pacatha"},
{"pacati"}, {"pacanti"}
},
presm = {
{"pace"}, {"pacāmhe"}, {"pacase"}, {"pacavhe"},
{"pacate"}, {"pacante", "pacare"}
},
impfa = {
{"apaca", "apacaṃ"}, {"apacamhā"},
{"apaco"}, {"apacattha"},
{"apaca", "apacā"}, {"apacu", "apacū"}
},
impfm = {
{"apaciṃ"}, {"apacāmhase", "apacamhase"},
{"apacase"}, {"apacavhaṃ"},
{"apacattha"}, {"apacatthuṃ"}
},
impra = {
{"pacāmi"}, {"pacāma"}, {"paca", "pacāhi"}, {"pacatha"},
{"pacatu"}, {"pacantu"}
},
imprm = {
{"pace"}, {"pacāmase"}, {"pacassu"}, {"pacavho"},
{"pacataṃ"}, {"pacantaṃ"}
},
optaa = {
{"paceyyāmi", "paceyyaṃ", "pace"}, {"paceyyāma"},
{"paceyyāsi", "pace"}, {"paceyyātha"},
{"paceyya", "pace"}, {"paceyyuṃ"}
},
optaa_irr = {
{"paceyyāmi", "paceyyaṃ"}, {"paceyyāma"},
{"paceyyāsi"}, {"paceyyātha"},
{"paceyya"}, {"paceyyuṃ"}
},
optam = {
{"paceyyaṃ"}, {"paceyyāmhe"}, {"pacetho"}, {"paceyyavho"},
{"pacetha"}, {"paceraṃ"}
},
pap = {"pacant"},
pmp = {"pacamāna"},
}
local corayati_ref = {
presa = {
{"corayāmi"}, {"corayāma"}, {"corayasi"}, {"corayatha"},
{"corayati"}, {"corayanti"}
},
presm = {
{"coraye"}, {"corayāmhe"}, {"corayase"}, {"corayavhe"},
{"corayate"}, {"corayante", "corayare"}
},
impfa = {
{"coraya", "corayaṃ"}, {"corayamhā"},
{"corayo"}, {"corayattha"},
{"coraya", "corayā"}, {"corayu", "corayū"}
},
impfm = {
{"corayiṃ"}, {"corayāmhase", "corayamhase"},
{"corayase"}, {"corayavhaṃ"},
{"corayattha"}, {"corayatthuṃ"}
},
impra = {
{"corayāmi"}, {"corayāma"}, {"corayāhi"}, {"corayatha"},
{"corayatu"}, {"corayantu"}
},
imprm = {
{"coraye"}, {"corayāmase"}, {"corayassu"}, {"corayavho"},
{}, {"corayantaṃ"} -- 3s deleted pending review!
},
optaa = {
{"corayeyyāmi", "corayeyyaṃ"}, {"corayeyyāma"}, --aye 1s & 2s needs
{"corayeyyāsi"}, {"corayeyyātha"}, -- attestation.
{"corayeyya", "coraye"}, {"corayeyyuṃ"}
},
optam = {
{"corayeyyaṃ"}, {"corayeyyāmhe"}, {"corayetho"}, {"corayeyyavho"},
{"corayetha"}, {"corayeraṃ"}
},
pap = {"corayant"},
pmp = {"corayamāna"},
}
local coreti_ref = {
presa = {
{"coremi"}, {"corema"}, {"coresi"}, {"coretha"},
{"coreti"}, {"corenti"}
},
impra = {
{"coremi"}, {"corema"}, {"corehi"}, {"coretha"},
{"coretu"}, {"corentu"}
},
optaa = {
{"coreyyāmi", "coreyyaṃ"}, {"coreyyāma"}, --aye 1s & 2s needs
{"coreyyāsi"}, {"coreyyātha"}, -- attestation.
{"coreyya"}, {"coreyyuṃ"}
},
optam = {
{"coreyyaṃ"}, {"coreyyāmhe"}, {"coretho"}, {"coreyyavho"},
{"coretha"}, {"coreraṃ"}
},
pap = {"corent"},
}
local corete_ref = {
presm = {
{"coraye"}, {"corayāmhe"}, {"corayase"}, {"corayavhe"},
{"corayate"}, {"corayante", "corayare"}
},
imprm = {
{"coraye"}, {"corayāmase"}, {"corayassu"}, {"corayavho"},
{}, {"corayantaṃ"} -- 3s deleted pending review!
},
optaa = coreti_ref.optaa,
optam = coreti_ref.optam,
pmp = {"corayamāna"},
}
local tanoti_ref = { -- Middle forms
presa = {
{"tanomi"}, {"tanoma"}, {"tanosi"}, {"tanotha"},
{"tanoti"}, {"tanonti"}
},
presm = {
{"tanve"}, {"tanumhe"}, {"tanuse"}, {"tanuvhe"},
{"tanute"}, {"tanunte", "tanure"}
},
impra = {
{"tanomi"}, {"tanoma"}, {"tanohi"}, {"tanotha"},
{"tanotu"}, {"tanontu"}
},
imprm = {
{"tanve"}, {"tanvāmase"}, {"tanussu"}, {"tanuvho"},
{"tanutaṃ"}, {"tanuntaṃ"}
},
optaa = {
{"taneyyāmi", "taneyyaṃ"}, {"taneyyāma"},
{"taneyyāsi"}, {"taneyyātha"},
{"taneyya"}, {"taneyyuṃ"}
},
optam = {
{"taneyyaṃ"}, {"taneyyāmhe"}, {"tanetho"}, {"taneyyavho"},
{"tanetha"}, {"taneraṃ"}
},
pap = {"tanont"},
}
local dadati_ref = {
presa = {
{"dadāmi"}, {"dadāma"}, {"dadāsi"}, {"dadātha"},
{"dadāti"}, {"dadanti"}
},
presm = {
{"dade"}, {"dadāmhe"}, {"dadāse"}, {"dadavhe"},
{"dadāte"}, {"dadante", "dadāre"}
},
impfa = {
{"adada", "adadaṃ"}, {"adadamhā"},
{"adado"}, {"adadattha"},
{"adada", "adadā"}, {"adadu", "adadū"}
},
impfm_disabled = {
{"adadiṃ"}, {"adadāmhase", "adadamhase"},
{"adadase"}, {"adadavhaṃ"},
{"adadattha"}, {"adadatthuṃ"}
},
impra = {
{"dadāmi"}, {"dadāma"}, {"dadā", "dadāhi"}, {"dadātha"},
{"dadātu"}, {"dadantu"}
},
optaa = {
{"dadeyyāmi", "dadeyyaṃ"}, {"dadeyyāma"}, -- "dade" is exceptional.
{"dadeyyāsi"}, {"dadeyyātha"}, -- "dade" is exceptional.
{"dadeyya", "dade"}, {"dadeyyuṃ"}
},
optam = {
{"dadeyyaṃ"}, {"dadeyyāmhe"}, {"dadetho"}, {"dadeyyavho"},
{"dadetha"}, {"daderaṃ"}
},
pap = {"dadant"},
pmp = {"dadamāna"},
}
local dajja_ref = {
optaa = {
{"dajjāmi"}, {"dajjāma"}, {"dajjāsi"}, {"dajjātha"},
{"dajjā"}, {"dajjuṃ"}},
}
local pacissati_ref = {
futua = {
{"pacissāmi"}, {"pacissāma"}, {"pacissasi"}, {"pacissatha"},
{"pacissati"}, {"pacissanti"},
},
futum = {
{"pacissaṃ"}, {"pacissāmhe"}, {"pacissase"}, {"pacissavhe"},
{"pacissate"}, {"pacissante"},
},
conda = {
{"apacissaṃ"}, {}, {"apacissa", "apacissi"}, {"apacissatha"},
{"apacissā", "apacissa"}, {"apacissaṃsu"},
},
condm = {
{"apacissaṃ"}, {"apacissāmhase"},
{"apacisse", "apacissase"}, {"apacissavhe"},
{"apacissatha"}, {"apacissiṃsu"},
},
fap = {"pacissant"},
}
gamissati_ref = {
conda = { {"agamissaṃ"}, {}, {"agamissa", "agamissi"}, {"agamissatha"},
{"agamissā", "agamissa"}, {"agamissaṃsu"},
},
condm = {
{"agamissaṃ"}, {"agamissāmhase"},
{"agamisse", "agamissase"}, {"agamissavhe"},
{"agamissatha"}, {"agamissiṃsu"},
},
}
dakkhiti_ref = {
futua = {{"dakkhāmi"}, {"dakkhāma"}, {"dakkhisi"}, {"dakkhitha"}, {"dakkhiti"}, {"dakkhinti"}}
}
heti_ref = {
futua = {{"hemi"}, {"hema"}, {"hesi"}, {"hetha"}, {"heti"}, {"henti"}}
}
kahiti_ref = {
futua = {{"kāhāmi"}, {"kāhāma"}, {"kāhisi"}, {}, {"kāhiti"}, {"kāhinti"}}
}
-- function tests:test_basic_tables()
function tests:test_ati()
local impl = tests.option.impl or "yes"
local pacati = to_script("pacati", tests.sc, tests.option)
local pacati_got = m_conj_verb.special_forms(pacati,
{augment="with_made", impf_voice="both", impl = impl})
compare(pacati_ref, pacati_got, "pacati pres ", "presa", "presm")
compare(pacati_ref, pacati_got, "pacati impf ", "impfa", "impfm")
compare(pacati_ref, pacati_got, "pacati impr ", "impra", "imprm")
compare(pacati_ref, pacati_got, "pacati opt ", "optaa", "optam")
comp_lists(pacati_ref, pacati_got, "pacati part ", "pap", "pmp")
local pacate = to_script("pacate", tests.sc, tests.option)
local pacate_got = m_conj_verb.special_forms(pacate,
{ augment="with_made", impf_voice="both", opta_voice = "both",
impl = impl })
compare(pacati_ref, pacate_got, "pacate pres ", "presm")
compare(pacati_ref, pacate_got, "pacate impf ", "impfm")
compare(pacati_ref, pacate_got, "pacate impr ", "imprm")
compare(pacati_ref, pacate_got, "pacate opt ", "optaa", "optam")
comp_lists(pacati_ref, pacate_got, "pacate part ", "pmp")
local namati = to_script("namati", tests.sc, tests.option)
local apaca = to_script("apaca", tests.sc, tests.option)
local apaca_got = m_conj_verb.special_forms(namati,
{ impf_voice="both", impf=apaca, impf2=apaca, augment="with_given",
impl = impl })
compare(pacati_ref, apaca_got, "apaca impf ", "impfa", "impfm")
local namate = to_script("namate", tests.sc, tests.option)
local nama = to_script("nama", tests.sc, tests.option)
local apacattha = to_script("apacattha", tests.sc, tests.option)
local apacattha_got = m_conj_verb.special_forms(namati,
{midl=namate, impf_voice="midl", impl = impl,
impf=nama, impf_midl=apacattha, augment="with_given"})
compare(pacati_ref, apacattha_got, "apacattha impf m", "impfm")
-- if nil then -- Unusability is a deliberate, documented feature, not a bug.
-- local pace = to_script("pace", tests.sc, tests.option)
-- local pace_got = m_conj_verb.special_forms("namati", {
-- opta_mod="replace", opta=pace})
-- compare(pacati_ref, pace_got, "pace opt ", "optaa", "optam")
-- end
local paceyya = to_script("paceyya", tests.sc, tests.option)
local paceyya_got = m_conj_verb.special_forms(namati, {
opta_mod="replace", opta=paceyya, impl = impl})
local paceyya_ref = { optaa = pacati_ref.optaa_irr,
optam = pacati_ref.optam }
compare(paceyya_ref, paceyya_got, "paceyya opt ", "optaa", "optam")
local pacetha = to_script("pacetha", tests.sc, tests.option)
local pacetha_got = m_conj_verb.special_forms(namati, {
opta_midl=pacetha, impl = impl})
if nil then -- This is useful as a selectional test.
compare(pacati_ref, pacetha_got, "pacetha opt ", "optaa", "optam")
end
compare(pacati_ref, pacetha_got, "pacetha opt m", "optam")
end
-- Stems in -ayati have differences from -ati that aren't captured by -eti.
function tests:test_ayati()
local impl = tests.option.impl or "yes"
local corayati = to_script("corayati", tests.sc, tests.option)
local corayati_got = m_conj_verb.special_forms(corayati,
{impf_voice="both", augment="without", impl = impl})
compare(corayati_ref, corayati_got, "corayati pres ", "presa", "presm")
compare(corayati_ref, corayati_got, "corayati impf ", "impfa", "impfm")
compare(corayati_ref, corayati_got, "corayati impr ", "impra", "imprm")
compare(corayati_ref, corayati_got, "corayati opt ", "optaa", "optam")
comp_lists(corayati_ref, corayati_got, "corayati part ", "pap", "pmp")
corayate = to_script("corayate", tests.sc, tests.option)
local corayate_got = m_conj_verb.special_forms(corayate,
{impf_voice="both", augment="without", opta_voice = "both", impl = impl})
compare(corayati_ref, corayate_got, "corayate pres ", "presm")
compare(corayati_ref, corayate_got, "corayate impf ", "impfm")
compare(corayati_ref, corayate_got, "corayate impr ", "imprm")
compare(corayati_ref, corayate_got, "corayate opt ", "optaa", "optam")
comp_lists(corayati_ref, corayate_got, "corayate part ", "pmp")
namati = to_script("namati", tests.sc, tests.option)
coraya = to_script("coraya", tests.sc, tests.option)
local coraya_got = m_conj_verb.special_forms(namati,
{impf_voice="both", impf=coraya, augment="with_given", impl = impl})
compare(corayati_ref, coraya_got, "coraya impf ", "impfa", "impfm")
nama = to_script("nama", tests.sc, tests.option)
namate = to_script("namate", tests.sc, tests.option)
corayattha = to_script("corayattha", tests.sc, tests.option)
local corayattha_got = m_conj_verb.special_forms(namati,
{midl=namate, impf_voice="midl",
impf=nama, impf_midl=corayattha, augment="with_given"})
compare(corayati_ref, corayattha_got, "corayattha impf m", "impfm")
end
function tests:test_eti()
local impl = tests.option.impl or "yes"
local coreti = to_script("coreti", tests.sc, tests.option)
local coreti_got = m_conj_verb.special_forms(coreti,
{augment="without", impf_voice="both", impl = impl})
compare(coreti_ref, coreti_got, "coreti pres ", "presa", "presm")
compare(coreti_ref, coreti_got, "coreti impf ", "impfa", "impfm")
compare(coreti_ref, coreti_got, "coreti impr ", "impra", "imprm")
compare(coreti_ref, coreti_got, "coreti opt ", "optaa", "optam")
comp_lists(coreti_ref, coreti_got, "coreti part ", "pap", "pmp")
local corete = to_script("corete", tests.sc, tests.option)
local corete_got = m_conj_verb.special_forms(corete,
{ augment="without", impf_voice="both", opta_voice="both",
impl=impl })
compare(corete_ref, corete_got, "corete pres ", "presm")
compare(corete_ref, corete_got, "corete impf ", "impfm")
compare(corete_ref, corete_got, "corete impr ", "imprm")
compare(corete_ref, corete_got, "corete opt ", "optaa", "optam")
comp_lists(corete_ref, corete_got, "corete part ", "pmp")
end
function tests:test_oti()
local impl = tests.option.impl or "yes"
local tanoti = to_script("tanoti", tests.sc, tests.option)
local tanoti_got = m_conj_verb.special_forms(tanoti,
{augment="without", impf_voice="both", impl=impl})
compare(tanoti_ref, tanoti_got, "tanoti pres ", "presa", "presm")
compare(tanoti_ref, tanoti_got, "tanoti impf ", "impfa", "impfm")
compare(tanoti_ref, tanoti_got, "tanoti impr ", "impra", "imprm")
compare(tanoti_ref, tanoti_got, "tanoti opt ", "optaa", "optam")
comp_lists(tanoti_ref, tanoti_got, "tanoti part ", "pap", "pmp")
local tanute = to_script("tanute", tests.sc, tests.option)
local tanute_got = m_conj_verb.special_forms(tanute,
{ augment="without", impf_voice="both", opta_voice = "both",
impl=impl })
compare(tanoti_ref, tanute_got, "tanute pres ", "presm")
compare(tanoti_ref, tanute_got, "tanute impf ", "impfm")
compare(tanoti_ref, tanute_got, "tanute impr ", "imprm")
compare(tanoti_ref, tanute_got, "tanute opt ", "optaa", "optam")
comp_lists(tanoti_ref, tanute_got, "tanute part ", "pmp")
end
function tests:test_aati()
local impl = tests.option.impl or "yes"
local dadati = to_script("dadāti", tests.sc, tests.option)
local dadati_got = m_conj_verb.special_forms(dadati,
{augment="with_made", impf_voice="both", impl=impl})
compare(dadati_ref, dadati_got, "dadāti pres ", "presa", "presm")
compare(dadati_ref, dadati_got, "dadāti impf ", "impfa", "impfm")
compare(dadati_ref, dadati_got, "dadāti impr ", "impra", "imprm")
compare(dadati_ref, dadati_got, "dadāti opt ", "optaa", "optam")
comp_lists(dadati_ref, dadati_got, "dadāti part ", "pap", "pmp")
local dadate = to_script("dadāte", tests.sc, tests.option)
local dadate_got = m_conj_verb.special_forms(dadate,
{ augment="without", impf_voice="both", opta_voice="both",
impl = impl })
compare(dadati_ref, dadate_got, "dadāte pres ", "presm")
compare(dadati_ref, dadate_got, "dadāte impf ", "impfm")
compare(dadati_ref, dadate_got, "dadāte impr ", "imprm")
compare(dadati_ref, dadate_got, "dadāte opt ", "optaa", "optam")
comp_lists(dadati_ref, dadate_got, "dadāte part ", "pmp")
local dajja = to_script("dajjā", tests.sc, tests.option)
local dajja_got = m_conj_verb.special_forms(dadati,
{ voice="none", opta_voice="act", opta_mod="replace", opta=dajja,
impl=impl})
compare(dajja_ref, dajja_got, "dadāti alt opt a", "optaa")
end
function tests:test_issati()
local impl = tests.option.impl or "yes"
local pacissati = to_script("pacissati", tests.sc, tests.option)
local pacissate = to_script("pacissate", tests.sc, tests.option)
local pacissati_got = m_conj_verb.future_forms(pacissati,
{voice = "none", futu=pacissati, futu_voice = "both", cond_voice = "both",
impl = impl, cond_augment = "with_made"}, true)
compare(pacissati_ref, pacissati_got, "pacissati fut", "futua", "futum")
compare(pacissati_ref, pacissati_got, "pacissati cond", "conda", "condm")
-- comp_lists(dadati_ref, dadate_got, "pacissati part", "fap", "fmp")
local pacissate_got = m_conj_verb.future_forms(pacissate,
{voice = "none", futu=pacissate, cond_voice = "midl",
impl = impl, cond_augment = "with_made"}, true)
compare(pacissati_ref, pacissate_got, "pacissate fut", "futum")
compare(pacissati_ref, pacissate_got, "pacissate cond", "condm")
end
function tests:test_issa()
local impl = tests.option.impl or "yes"
local agamissa = to_script("agamissa", tests.sc, tests.option)
local agamissaa = to_script("agamissā", tests.sc, tests.option)
local agamissatha = to_script("agamissatha", tests.sc, tests.option)
local pacissati = to_script("pacissati", tests.sc, tests.option)
local pacissate = to_script("pacissate", tests.sc, tests.option)
local agamissa_got = m_conj_verb.future_forms(pacissati,
{cond=agamissa, futu=pacissati, impl = impl, cond_augment="with_given"}, true)
compare(gamissati_ref, agamissa_got, "agamissa cond", "conda", "condm")
local agamissaa_got = m_conj_verb.future_forms(pacissati,
{cond=agamissaa, futu=pacissati, impl = impl, cond_augment="with_given"}, true)
compare(gamissati_ref, agamissaa_got, "agamissā cond", "conda", "condm")
local agamissatha_got = m_conj_verb.future_forms(pacissate,
{cond=agamissatha, futu=pacissate, impl = impl, cond_augment="with_given"}, true)
compare(gamissati_ref, agamissatha_got, "agamissatha cond", "condm")
end
function tests:test_iti()
local impl = tests.option.impl or "yes"
local dakkhiti = to_script("dakkhiti", tests.sc, tests.option)
local dakkhiti_got = m_conj_verb.future_forms(dakkhiti, {futu=dakkhiti, impl=impl}, true)
compare(dakkhiti_ref, dakkhiti_got, "dakkhiti futu", "futua", "futum")
end
function tests:test_heti()
local impl = tests.option.impl or "yes"
local heti = to_script("heti", tests.sc, tests.option)
local heti_got = m_conj_verb.future_forms(heti, {futu=heti, impl=impl}, true)
compare(heti_ref, heti_got, "heti futu", "futua", "futum")
end
function tests:test_kahiti()
local impl = tests.option.impl or "yes"
local kahiti = to_script("kāhiti", tests.sc, tests.option)
local kahiti_got = m_conj_verb.future_forms(kahiti, {futu=kahiti, impl=impl}, true)
compare(kahiti_ref, kahiti_got, "kāhati futu", "futua", "futum")
end
return tests