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