Module:az-IPA/testcases

local tests = require "Module:UnitTests"

local full_link = require "Module:links".full_link local az = require "Module:languages".getByCode("az") local function link(term) return full_link({ term = term, lang = az }) end

local function show_IPA(IPA) return ' ' .. IPA .. ' ' end

-- adapted from Module:transliteration module testcases local function examples_string_to_array(examples) examples = examples:gsub("%s*%-%-[^\n]*", "") local array = {} for line in examples:gmatch("[^\n]+") do		line = mw.text.trim(line) if line ~= "" then local original, expected, sc = line:match("^([^\t]+)\t+([^\t]+)$") if not original then error("The following line did not consist of two arguments separated by tabs:\n"					.. line) end table.insert(array, { original, expected }) end end return array end

function tests:test_phonetic -- For now, double consonants written with double letters (makes it easier	-- to write the stress.) local examples = examples_string_to_array 		almaq	ɑɫˈmɑχ		parlaq	pɑˈrːɑχ		yerli	jeˈrːi		dostlar	dosˈtːɑr		adlar	ɑˈdːɑr		gedirlər	ɡeˈdilːær		yatırlar	jɑˈtɯɫːɑr		şəhərlər	ʃæhærːær		şəhərləri	ʃæhærːæri		ganmaq	ɡɑˈmːɑχ		qazlar	ɡɑzˈdɑr		mesajlar	mesɑʒˈdɑr		əsaslar	æsɑsˈtɑr		tanışlar	tɑnɯʃˈtɑr		başlamaq	bɑʃtɑˈmɑχ		uzundraz	uzunˈdrɑz -- Currently ignoring stress! local to_phonetic = require "Module:az-IPA".phonetic self:iterate(examples, function(self, word, expected)		self:equals(link(word), to_phonetic(word), expected, { display = function(IPA) return show_IPA("[" .. IPA .. "]") end, })	end) end

local consonant_cluster_testcases = akt-yor A-lek-sandr A-lek-sand-ri-ya Al-fred alt-mış alt-mı-şın-cı amp-lua Ams-ter-dam And-rey an-sambl An-tark-ti-da antrakt apostrof art-maq ast-ro-fi-zi-ka av-qust-da av-qustdan av-qust-lar avqustlara avqustlarda avqustlardan avqustları avqustların Avstraliya Avstriya avtoportret Banqladeş boşaltmaq böyürtkən bürcdə bürcdən bədbəxtlik bərkdən Ceyms dartmaq diriltmək DNT dongra dostluq DQR DVD düzəltmək eksport ekssentrik elektrik farsca fəhmli fəhmsiz gənclik haqqlar hüznlü həbsxana hərbçi irqçi irqçilik jur-na-list-də jur-na-lis-tdən jur-na-list-lər jur-na-list-lər-də jurnalistlərdən jurnalistləri jurnalistlərin jurnalistlərə knyaz knyazlıq Konstantinopol kons-ti-tu-siya kont-ra-bas kənd-də kənd-dən mi-to-xond-ri Mosk-va Məm-məd-rza neft-çi nərd-tax-ta okt-yabr pan-psi-xizm part-la-maq part-lat-maq part-la-yış po-lit-kor-rekt-lik qals-tuk qalx-maq QHT qo-naq-pə-rəst-lik qorx-ma-maq qorx-maq qorx-ma-yan Qorx-maz qorx-maz qırx-maq qəlb-də qəlb-dən qəlb-lər qəlb-lər-də qəlb-lər-dən qəlb-lər-i qəlb-lər-in qəlb-lə-rə qərb-də qərb-dən qə-şəng-lik qə-şəng-ləş-dir-mək qə-şəng-ləş-mək re-port-yor rəhm-siz rəng-ləm-ək rəng-lə-mə-mək rəng-lə-mə-yən rəng-lər rəng-ləyən sa-də-löhv-lük sanc-maq Sant-ya-qo sarp-lıq sehr-baz sent-yabr serb-cə skrip-ka skrip-ka-lar skrip-ka-nı SSRİ Türk-mə-nis-tan U-ins-ton u-zund-raz və-tən-pə-rəst-lik xoşbəxtlik yad-pla-net-li yurd-daş yö-nəlt-mək yırt-maq Çarlz çirk-li çı-xart-maq çə-yirt-kə ölç-mək ört-mək ös-kürt-mək şi-şirt-mək şərq-də şərq-dən

local function is_stop(letter) -- stop or affricate actually assert(mw.ustring.len(letter) == 1) letter = mw.ustring.lower(letter) return mw.ustring.find(letter, "^[bcçdgkqpt]$") ~= nil end

local function is_fricative(letter) assert(mw.ustring.len(letter) == 1) letter = mw.ustring.lower(letter) return mw.ustring.find(letter, "^[fğhxjsşvz]$") ~= nil end -- local function is_affricate(letter) end

local function is_obstruent(letter) return is_stop(letter) or is_fricative(letter) end

local function is_liquid(letter) assert(mw.ustring.len(letter) == 1) letter = mw.ustring.lower(letter) return mw.ustring.find(letter, "^[rl]$") ~= nil end

local function letter_at(letters, pos) return mw.ustring.sub(letters, pos, pos) end

local syllable_divider = "-" local function divide_syllables(word) word = mw.ustring.gsub(		word,		"([^AaEeİiOoUuIıÖöÜüƏə]+)",		function(start_pos, cluster, end_pos)			if start_pos == 1 or end_pos == mw.ustring.len(word) + 1 then				return cluster			elseif mw.ustring.len(cluster) == 1 then				return syllable_divider .. cluster			elseif mw.ustring.len(cluster) == 2 then				local first, second = mw.ustring.match(cluster, "^(.)(.)$")				return first .. syllable_divider .. second			elseif is_liquid(letter_at(cluster, -1))			and is_stop(letter_at(cluster, -2)) then				-- return mw.ustring.sub(cluster, 1, -3) .. "." .. mw.ustring.sub(cluster, -2)				local rest, last = mw.ustring.match(cluster, "^(.+)(.)$")				return rest .. syllable_divider .. last			elseif is_liquid(letter_at(cluster, -3))			and is_stop(letter_at(cluster, -2))			and is_stop(letter_at(cluster, -1)) then				local rest, last = mw.ustring.match(cluster, "^(.+)(.)$")				return rest .. syllable_divider .. last else return "(" .. cluster .. ")" end end)	return word end

function tests:test_consonant_cluster_division local tests = require "Module:fun".map(		function(x) return {x} end,		mw.text.split(consonant_cluster_testcases, "%s+")) local syllable_divider_pattern = require "Module:string utilities".pattern_escape(syllable_divider) self:iterate(tests, function(self, expected)		local original = expected:gsub(syllable_divider_pattern, "")		if original ~= expected then			self:equals(original, divide_syllables(original), expected)		end	end) end

return tests