বিষয়বস্তুতে চলুন

মডিউল:pi-decl/noun/testcases

উইকিঅভিধান, মুক্ত অভিধান থেকে

এই মডিউলের জন্য মডিউল:pi-decl/noun/testcases/নথি-এ নথিপত্র তৈরি করা হয়ে থাকতে পারে

local tests = require('Module:UnitTests')

local links = require("Module:links")
local lang = require("Module:languages").getByCode("pi")
local m_scripts = require("Module:scripts")
local m_decl_noun = require('Module:pi-decl/noun')

local gsub = mw.ustring.gsub
local match = mw.ustring.match
local sub = mw.ustring.sub
local u = mw.ustring.char

local genders = {
	["m"] = "masculine", ["f"] = "feminine", ["n"] = "neuter",
}
local rows = {
	"Nominative (first)", "Accusative (second)", "Instrumental (third)", "Dative (fourth)",
	"Ablative (fifth)", "Genitive (sixth)", "Locative (seventh)", "Vocative (calling)",
}

local endings = {
	["one"] = {
		-- key     Latn  Thai Deva       Beng       Mymr       Lana     Laoo       Khmr            Sinh     Brah
		["ā"]  = { "ā",  "า", "ा", "आ", "া", "আ", "ါ", "ာ", "ᩣ", "ᩤ", "າ",       "ា", u(0x17A4), "ා", "ආ", "𑀸", "𑀆" },
		["i"]  = { "i",  "ิ",  "ि", "इ",  "ি", "ই", "ိ", "ဣ",  "ᩥ", "ᩍ", "ິ",        "ិ", "ឥ",       "ි", "ඉ", "𑀺", "𑀇" },
		["ī"]  = { "ī",  "ี",  "ी", "ई",  "ী", "ঈ", "ီ", "ဤ", "ᩦ", "ᩎ", "ີ",        "ី", "ឦ",       "ී", "ඊ", "𑀻", "𑀈" },
		["u"]  = { "u",  "ุ",  "ु", "उ",  "ু", "উ", "ု", "ဥ",  "ᩩ", "ᩏ",  "ຸ",        "ុ", "ឧ",        "ු", "උ", "𑀼", "𑀉" },
		["ū"]  = { "ū",  "ู",  "ू", "ऊ",  "ূ", "ঊ", "ူ", "ဦ",  "ᩪ", "ᩐ",  "ູ",        "ូ", "ឨ", "ឩ",  "ූ", "ඌ", "𑀽", "𑀊" },
	},
	["two"] = {
		-- key     Latn  Thai Deva       Beng       Mymr       Lana     Laoo       Khmr            Sinh     Brah
		["ar"] = { "ar", "รฺ", "र्",       "র্",      "ရ်",       "ᩁ᩺", "ᩁ᩼", "ຣ໌", "ຣ຺", "រ៑",             "ර්",     "𑀭𑁆"     },
		["as"] = { "as", "สฺ", "स्",      "স্",      "သ်",      "ᩈ᩺", "ᩈ᩼", "ສ໌", "ສ຺", "ស៑",           "ස්",     "𑀲𑁆"    },
		["an"] = { "an", "นฺ", "न्",      "ন্",      "န်",       "ᨶ᩺", "ᨶ᩼",  "ນ໌", "ນ຺", "ន៑",           "න්",     "𑀦𑁆"     },
		["in"] = { "in", } -- Only simple for Roman script.
	},
}

function tests.detectEnding(stem)

	local oneLetter = sub(stem, -1)
	for key, arr in pairs(endings.one) do
		for _, val in ipairs(arr) do
			if oneLetter == val then
				return key
			end
		end
	end
	local twoLetters = sub(stem, -2)
	for key, arr in pairs(endings.two) do
		for _, val in ipairs(arr) do
			if twoLetters == val then
				return key
			end
		end
	end

	return "a"

end

function tests.joinSuffix(stem, suffixes)

	local output = ""
	local term

	for _,suffix in ipairs(suffixes) do
		if match(suffix, "^⌫⌫") then --backspace
			term = sub(stem, 1, -3) .. sub(suffix, 3, -1)
		elseif match(suffix, "^⌫") then --backspace
			term = sub(stem, 1, -2) .. sub(suffix, 2, -1)
		else
			term = stem .. suffix
		end
		if scriptCode == "Thai" then
			term = gsub(term, "(.)↶([เโ])", "%2%1") --swap
			--term = gsub(term, "[ญฐ]", "%1" .. u(0xFE00)) *currently no font supports
		end
		if scriptCode == "Mymr" then
			term = gsub(term, "င္", "င်္")
			term = gsub(term, "(င်္)([ဝခဂငဒပ])(ေ?)ာ", "%1%2%3ါ")
			term = gsub(term, "္[ယရ]", { ["္ယ"] = "ျ", ["္ရ"] = "ြ" }) --these not need tall aa
			term = gsub(term, "^([ဝခဂငဒပ])(ေ?)ာ", "%1%2ါ")
			term = gsub(term, "([^္])([ဝခဂငဒပ])(ေ?)ာ", "%1%2%3ါ")
			term = gsub(term, "([ဝခဂငဒပ])(္[က-အဿ])(ေ?)ာ", "%1%2%3ါ")
			term = gsub(term, "္[ဝဟ]", { ["္ဝ"] = "ွ", ["္ဟ"] = "ှ" })
			term = gsub(term, "ဉ္ဉ", "ည")
			term = gsub(term, "သ္သ", "ဿ")
			--term = gsub(term, "[ကဂငတထပမယလဝေ]", "%1" .. u(0xFE00)) *currently no font supports
		end
		if scriptCode == "Lana" then
			term = gsub(term, "ᨦ᩠", "ᩘ")
			term = gsub(term, "^([ᩅᨣᨵᨷᨻ])(ᩮ?)ᩣ", "%1%2ᩤ")
			term = gsub(term, "([^᩠])([ᩅᨣᨵᨷᨻ])(ᩮ?)ᩣ", "%1%2%3ᩤ")
			term = gsub(term, "([ᩅᨣᨵᨷᨻ])(᩠[ᨠ-ᩌᩔ])(ᩮ?)ᩣ", "%1%2%3ᩤ")
			term = gsub(term, "᩠[ᩁᩃ]", { ["᩠ᩁ"] = "ᩕ", ["᩠ᩃ"] = "ᩖ" })
			term = gsub(term, "([ᨭ-ᨱ])᩠ᨮ", "%1ᩛ")
			term = gsub(term, "([ᨷ-ᨾ])᩠ᨻ", "%1ᩛ")
			term = gsub(term, "ᩈ᩠ᩈ", "ᩔ")
		end
		if output ~= "" then
			output = output .. " <small style=\"color:888\">or</small> "
		end
		output = output .. links.full_link({lang = lang, sc = currentScript, term = term, tr='-'})
	end

	return output

end

function tests.show(frame)

	local args = frame:getParent().args
	local PAGENAME = mw.title.getCurrentTitle().text
	local stem = args[1] or args["stem"] or PAGENAME
	currentScript = lang:findBestScript(stem)
	scriptCode = currentScript:getCode()
	local ending = args[2] or args["ending"] or tests.detectEnding(stem)
	local g = args[3] or args["g"] or args["gender"] -- for each gender only

	if not g then
		error("A gender is required to display proper declensions.")
	end

	local pattern = require("Module:pi-decl/noun/" .. scriptCode) or nil
	local selectedPattern = pattern[ending][g]

	local output = '<div class="NavFrame" style="min-width:30%"><div class="NavHead" style="background:#d9ebff">Declension table of "' .. stem .. '" (' .. genders[g] .. ')</div><div class="NavContent">'
	output = output .. '<table class="inflection-table" style="background:#F9F9F9;text-align:center;width:100%"><tr><th style="background:#eff7ff">Case \\ Number</th><th style="background:#eff7ff">Singular</th><th style="background:#eff7ff">Plural</th></tr>'

	for i,v in ipairs(rows) do
		output = output .. "<tr><td style=\"background-color:#eff7ff;\">" .. v .. "</td>"
		output = output .. "<td>" .. tests.joinSuffix(stem, selectedPattern[2 * i - 1]) .. "</td>"
		output = output .. "<td>" .. tests.joinSuffix(stem, selectedPattern[2 * i]) .. "</td>"
		output = output .. "</tr>"
	end

	output = output .. "</table></div></div>"
	return output

end

function tests:test_big_bang()
	--[[ here be the tests ]]
--preprocess_equals(text, expected, options)

    tests:preprocess_equals_preprocess('{{pi-decl-noun|assa|a|g=m}}', '{{pi-decl-noun/test1|assa|a|g=m}}') -- , {["nowiki"]=1})
    tests:preprocess_equals_preprocess('{{pi-decl-noun|showtr=none|অঙ্গ|a|g=n}}', '{{pi-decl-noun/test1|অঙ্গ|a|g=n}}') -- , {["nowiki"]=1})
    tests:preprocess_equals_preprocess('{{pi-decl-noun|showtr=none|චන්දිමා|ā|g=m}}', '{{pi-decl-noun/test1|චන්දිමා|ā|g=m}}') -- , {["nowiki"]=1})
    tests:preprocess_equals_preprocess('{{pi-decl-noun|showtr=none|अम्मा|ā|g=f}}', '{{pi-decl-noun/test1|अम्मा|ā|g=f}}') -- , {["nowiki"]=1})
    tests:preprocess_equals_preprocess('{{pi-decl-noun|showtr=none|ဣသိ|i|g=m}}', '{{pi-decl-noun/test1|ဣသိ|i|g=m}}') -- , {["nowiki"]=1})
    tests:preprocess_equals_preprocess('{{pi-decl-noun|showtr=none|ชาติ|i|g=f}}', '{{pi-decl-noun/test1|ชาติ|i|g=f}}') -- , {["nowiki"]=1})
    tests:preprocess_equals_preprocess('{{pi-decl-noun|showtr=none|ᩋᨠ᩠ᨡᩥ|i|g=n}}', '{{pi-decl-noun/test1|ᩋᨠ᩠ᨡᩥ|i|g=n}}') -- , {["nowiki"]=1})
    tests:preprocess_equals_preprocess('{{pi-decl-noun|showtr=none|មានី|ī|g=m}}', '{{pi-decl-noun/test1|មានី|ī|g=m}}') -- , {["nowiki"]=1})
    tests:preprocess_equals_preprocess('{{pi-decl-noun|nadī|ī|g=f}}', '{{pi-decl-noun/test1|nadī|ī|g=f}}') -- , {["nowiki"]=1})
    tests:preprocess_equals_preprocess('{{pi-decl-noun|showtr=none|𑀧𑀁𑀲𑀼|u|g=m}}', '{{pi-decl-noun/test1|𑀧𑀁𑀲𑀼|u|g=m}}') -- , {["nowiki"]=1})
    tests:preprocess_equals_preprocess('{{pi-decl-noun|showtr=none|जम्बु|u|g=f}}', '{{pi-decl-noun/test1|जम्बु|u|g=f}}') -- , {["nowiki"]=1})
    tests:preprocess_equals_preprocess('{{pi-decl-noun|showtr=none|জত্তু|u|g=n}}', '{{pi-decl-noun/test1|জত্তু|u|g=n}}') -- , {["nowiki"]=1})
    tests:preprocess_equals_preprocess('{{pi-decl-noun|sayambhū|ū|g=m}}', '{{pi-decl-noun/test1|sayambhū|ū|g=m}}') -- , {["nowiki"]=1})
    tests:preprocess_equals_preprocess('{{pi-decl-noun|vadhū|ū|g=f}}', '{{pi-decl-noun/test1|vadhū|ū|g=f}}') -- , {["nowiki"]=1})
    tests:preprocess_equals_preprocess('{{pi-decl-noun|kattar|ar|g=m}}', '{{pi-decl-noun/test1|kattar|ar|g=m}}') -- , {["nowiki"]=1})
    tests:preprocess_equals_preprocess('{{pi-decl-noun|kathin|in|g=m}}', '{{pi-decl-noun/test1|kathin|in|g=m}}') -- , {["nowiki"]=1})
-- Check masculine -in and -ī are equivalent, and neuter -in and -i
    tests:preprocess_equals_preprocess('{{pi-decl-noun|kathin|in|g=m}}',
'{{pi-decl-noun|kathī|ī|g=m|label=kathin}}') -- , {["nowiki"]=1})
    tests:preprocess_equals_preprocess('{{pi-decl-noun|kathin|in|g=n}}',
'{{pi-decl-noun|kathi|i|g=n|label=kathin}}') -- , {["nowiki"]=1})
end

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

-- Argument is either a list of script codes or a single script code.
function tests:script_consistency_test(script_list, option)
	local scripts
	if type(script_list) == 'table' then
		scripts = script_list
	else -- Assume string
		scripts = {script_list}
	end
-- The words must not have exercised options in spellings.
	local words = {{"buddha", "m"}, {"kaññā", "f"}, {"aṅga", "n"}, -- buddha and aṅga will need replacing.
		{"aggi", "m"}, {"bodhi", "f"}, {"aṭṭhi", "n"},
		{"bandhu", "m"}, {"dhenu", "f"}, {"cakkhu", "n"},
		{"balī", "m"}, {"yakkhī", "f"}, {"viññū", "m"}, {"sassū", "f"},
		{"candimā", "m"}, {"kattar", "m"}, {"sotas", "n"}, {"attan", "m"}, {"kathin", "m"},
		{"pacant", "m"}, {"gacchant", "n"}, {"desent", "m"}, {"desent", "n"},
		{"karont", "m"}, {"karont", "n"},
		{"bhagavant", "m"}, {"saravant", "n"}, {"āyasmant", "m"}, {"āyasmant", "n"}, 
	}
	local caseFormList, mergedList = {}, {}
	local scrCaseFormList, scrMergedList = {}, {}
	local xCaseFormList, xMergedList = {}, {}
	local m_xlit = require("Module:pi-Latn-translit")
	local latEnd, latPat
	local script, sword, scrEnd, scrPat
	local errcnt = 0
	local analysis = ""
	for wi, wv in ipairs(words) do
		latEnd = m_decl_noun.detectEnding(wv[1], nil)
		latPat = m_decl_noun.getSuffixes("Latn", latEnd, wv[2])
		for i = 1, 16 do
			caseFormList[i] = m_decl_noun.joinSuffix("Latn", wv[1], latPat[i])
			mergedList[i] = m_decl_noun.orJoin(m_scripts.getByCode("Latn"), caseFormList[i])
		end
		for _, sv in ipairs(scripts) do
			script = m_scripts.getByCode(sv)
			sword = m_xlit.tr(wv[1], sv, option)
			scrEnd = m_decl_noun.detectEnding(sword, option)
			scrPat = m_decl_noun.getSuffixes(sv, scrEnd, wv[2], option)
			if scrPat then
				for i = 1, 16 do
					scrCaseFormList[i] = m_decl_noun.joinSuffix(sv, sword, scrPat[i])
					scrMergedList[i] = m_decl_noun.orJoin(script, scrCaseFormList[i], option)
					xCaseFormList[i] = {}
					for ai, av in ipairs(caseFormList[i]) do
						xCaseFormList[i][ai] = m_xlit.tr(av, sv, option)
					end
					xMergedList[i] = m_decl_noun.orJoin(script, xCaseFormList[i], option)
--				equals(name, actual, expected, options)
					local ic, ino
					ic, ino = math.modf((i+1)/2)
					local number
					if ino == 0 then
						number = " s."
					else
						number = " pl."
					end
					if scrMergedList[i] == xMergedList[i] then
						tests:equals(sword.." "..rows[ic]..number, scrMergedList[i], xMergedList[i])
					else -- comment doesn't work easily.
						tests:equals(sword.." "..rows[ic]..number, 
							scrMergedList[i].."<br>Roman script: "..mergedList[i],
							xMergedList[i])
					end
				end
			else
				tests:equals(sword, "No paradigm for "..wv[1], "")
			end
		end
	end
	tests:heading("'Expected' is Roman script with inflexions converted to other script.")
end

-- To reinstate the following as a test, remove 'dont_' from the name!  The testing has been delegated to the
-- individual scripts' test cases.
function tests:dont_test_consistency() -- Check that different scripts have the same endings.
	local scripts = {"Beng", "Brah", "Deva", "Khmr", "Lana", "Laoo", "Mymr", "Sinh", "Thai"}
	tests:script_consistency_test(scripts)
	local dual = {"Laoo", "Thai"}
	tests:script_consistency_test(dual)
end

function tests.remove_noun_tests()
	tests.test_big_bang = nil
	tests.test_consistency = nil
end

return tests