Module:az-IPA/testcases

52 of 107 tests failed. (refresh)

TextExpectedActual
test_consonant_cluster_division:
Failedaktyorakt-yora(kty)or
PassedAleksandrA-lek-sandrA-lek-sandr
PassedAleksandriyaA-lek-sand-ri-yaA-lek-sand-ri-ya
FailedAlfredAl-fredA(lfr)ed
Failedaltmışalt-mışa(ltm)ış
Failedaltmışıncıalt-mı-şın-cıa(ltm)ı-şın-cı
Passedampluaamp-luaamp-lua
FailedAmsterdamAms-ter-damA(mst)er-dam
PassedAndreyAnd-reyAnd-rey
Passedansamblan-samblan-sambl
PassedAntarktidaAn-tark-ti-daAn-tark-ti-da
Failedartmaqart-maqa(rtm)aq
Passedastrofizikaast-ro-fi-zi-kaast-ro-fi-zi-ka
Failedavqustdaav-qust-daav-qu(std)a
Failedavqustdanav-qustdanav-qu(std)an
Passedavqustlarav-qust-larav-qust-lar
Failedjurnalistdəjur-na-list-dəjur-na-li(std)ə
Failedjurnalistdənjur-na-lis-tdənjur-na-li(std)ən
Passedjurnalistlərjur-na-list-lərjur-na-list-lər
Passedjurnalistlərdəjur-na-list-lər-dəjur-na-list-lər-də
Failedkonstitusiyakons-ti-tu-siyako(nst)i-tu-si-ya
Passedkontrabaskont-ra-baskont-ra-bas
Failedkənddəkənd-dəkə(ndd)ə
Failedkənddənkənd-dənkə(ndd)ən
Passedmitoxondrimi-to-xond-rimi-to-xond-ri
FailedMoskvaMosk-vaMo(skv)a
FailedMəmmədrzaMəm-məd-rzaMəm-mə(drz)a
Failedneftçineft-çine(ftç)i
Passednərdtaxtanərd-tax-tanərd-tax-ta
Failedoktyabrokt-yabro(kty)abr
Failedpanpsixizmpan-psi-xizmpa(nps)i-xizm
Passedpartlamaqpart-la-maqpart-la-maq
Passedpartlatmaqpart-lat-maqpart-lat-maq
Passedpartlayışpart-la-yışpart-la-yış
Passedpolitkorrektlikpo-lit-kor-rekt-likpo-lit-kor-rekt-lik
Failedqalstukqals-tukqa(lst)uk
Failedqalxmaqqalx-maqqa(lxm)aq
Passedqonaqpərəstlikqo-naq-pə-rəst-likqo-naq-pə-rəst-lik
Failedqorxmamaqqorx-ma-maqqo(rxm)a-maq
Failedqorxmaqqorx-maqqo(rxm)aq
Failedqorxmayanqorx-ma-yanqo(rxm)a-yan
FailedQorxmazQorx-mazQo(rxm)az
Failedqorxmazqorx-mazqo(rxm)az
Failedqırxmaqqırx-maqqı(rxm)aq
Passedqəlbdəqəlb-dəqəlb-də
Passedqəlbdənqəlb-dənqəlb-dən
Passedqəlblərqəlb-lərqəlb-lər
Passedqəlblərdəqəlb-lər-dəqəlb-lər-də
Passedqəlblərdənqəlb-lər-dənqəlb-lər-dən
Failedqəlbləriqəlb-lər-iqəlb-lə-ri
Failedqəlblərinqəlb-lər-inqəlb-lə-rin
Passedqəlblərəqəlb-lə-rəqəlb-lə-rə
Passedqərbdəqərb-dəqərb-də
Passedqərbdənqərb-dənqərb-dən
Passedqəşənglikqə-şəng-likqə-şəng-lik
Passedqəşəngləşdirməkqə-şəng-ləş-dir-məkqə-şəng-ləş-dir-mək
Passedqəşəngləşməkqə-şəng-ləş-məkqə-şəng-ləş-mək
Failedreportyorre-port-yorre-po(rty)or
Failedrəhmsizrəhm-sizrə(hms)iz
Failedrəngləməkrəng-ləm-əkrəng-lə-mək
Passedrəngləməməkrəng-lə-mə-məkrəng-lə-mə-mək
Passedrəngləməyənrəng-lə-mə-yənrəng-lə-mə-yən
Passedrənglərrəng-lərrəng-lər
Failedrəngləyənrəng-ləyənrəng-lə-yən
Failedsadəlöhvlüksa-də-löhv-lüksa-də-lö(hvl)ük
Failedsancmaqsanc-maqsa(ncm)aq
FailedSantyaqoSant-ya-qoSa(nty)a-qo
Passedsarplıqsarp-lıqsarp-lıq
Failedsehrbazsehr-bazse(hrb)az
Failedsentyabrsent-yabrse(nty)abr
Passedserbcəserb-cəserb-cə
Passedskripkaskrip-kaskrip-ka
Passedskripkalarskrip-ka-larskrip-ka-lar
Passedskripkanıskrip-ka-nıskrip-ka-nı
FailedTürkmənistanTürk-mə-nis-tanTü(rkm)ə-nis-tan
FailedUinstonU-ins-tonUi(nst)on
Passeduzundrazu-zund-razu-zund-raz
Passedvətənpərəstlikvə-tən-pə-rəst-likvə-tən-pə-rəst-lik
Failedyadplanetliyad-pla-net-liyadp-la-net-li
Passedyurddaşyurd-daşyurd-daş
Failedyönəltməkyö-nəlt-məkyö-nə(ltm)ək
Failedyırtmaqyırt-maqyı(rtm)aq
Passedçirkliçirk-liçirk-li
Failedçıxartmaqçı-xart-maqçı-xa(rtm)aq
Passedçəyirtkəçə-yirt-kəçə-yirt-kə
Failedölçməkölç-məkö(lçm)ək
Failedörtməkört-məkö(rtm)ək
Failedöskürtməkös-kürt-məkös-kü(rtm)ək
Failedşişirtməkşi-şirt-məkşi-şi(rtm)ək
Passedşərqdəşərq-dəşərq-də
Passedşərqdənşərq-dənşərq-dən
TextExpectedActual
test_phonetic:
Passedalmaq[ɑɫˈmɑχ][ɑɫˈmɑχ]
Passedparlaq[pɑˈrːɑχ][pɑˈrːɑχ]
Passedyerli[jeˈrːi][jeˈrːi]
Passeddostlar[dosˈtːɑr][dosˈtːɑr]
Passedadlar[ɑˈdːɑr][ɑˈdːɑr]
Failedgedirlər[ɡeˈdilːær][ɡediˈlːær]
Failedyatırlar[jɑˈtɯɫːɑr][jɑtɯˈɫːɑr]
Failedşəhərlər[ʃæhærːær][ʃæhæˈlːær]
Failedşəhərləri[ʃæhærːæri][ʃæhærːæˈri]
Passedganmaq[ɡɑˈmːɑχ][ɡɑˈmːɑχ]
Passedqazlar[ɡɑzˈdɑr][ɡɑzˈdɑr]
Passedmesajlar[mesɑʒˈdɑr][mesɑʒˈdɑr]
Passedəsaslar[æsɑsˈtɑr][æsɑsˈtɑr]
Passedtanışlar[tɑnɯʃˈtɑr][tɑnɯʃˈtɑr]
Passedbaşlamaq[bɑʃtɑˈmɑχ][bɑʃtɑˈmɑχ]
Faileduzundraz[uzunˈdrɑz][uzundˈrɑz]

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 '<span class="IPA">' .. IPA .. '</span>'
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