local tests = require("Module:UnitTests")

local m_scripts = require("Module:scripts")
local m_script_utils = require("Module:script utilities")
local getLangByCode = require("Module:languages").getByCode

local function tag(text, lang, scCode)
	return m_script_utils.tag_text(text, lang, m_scripts.getByCode(scCode))
end

local function tagScript(char, sc)
	return string.format('<span class="%s">%s</span>', sc, char)
end

function tests:checkFindBestScript(example, langCode, expected)
	local lang = getLangByCode(langCode)
	self:equals(tag(example, lang, expected) .. " (" .. lang:getCanonicalName() .. ")",
		lang:findBestScript(example):getCode(),
		expected)
end

function tests:testFindbestScript()
	local examples = {
		{ "word", "en", "Latn" },
		{ "العربية", "ar", "Arab" },
		{ "عرب", "fa", "fa-Arab" },
		{ "большо́й", "ru", "Cyrl" },
		{ "ругала се шерпа лонцу широка му уста", "sh", "Cyrl" },
		"Scripts with overlapping characters",
		{ "Русь", "orv", "Cyrs" },
		{ "Русь", "ru", "Cyrl" },
		{ "λόγος", "grc", "Polyt" },
		{ "λόγος", "el", "Grek" },
	}
	
	tests:iterate(examples, "checkFindBestScript")
end

function tests:testCharToScript()
	local U = mw.ustring.char
	local examples = {
		{ "A", "Latn" },
		{ "一", "Hani" },
		{ "ώ", "Grek" },
		{ "ὦ", "Polyt" },
		{ "Ж", "Cyrl" },
		{ "Ѹ", "Cyrs" },
		{ "ꙑ", "Cyrs" },
		{ "ა", "Geor" },
		{ "Ⴀ", "Geok" },
		{ "ⴀ", "Geok" },
		{ "!", "None" },
		{ U(0x2F82B), "None" },
	}
	
	self:iterate(
		examples,
		function (self, char, expected)
			local sc = m_scripts.charToScript(char)
			self:equals(
				tagScript(char, sc),
				sc,
				expected
			)
		end)
end

return tests