Module:bg-pronunciation/testcases

local tests = require("Module:UnitTests") local m_pron = require("Module:bg-pronunciation")

local Bulgarian = require("Module:languages").getByCode("bg") local Cyrillic = require("Module:scripts").getByCode("Cyrl")

local function link(term) return require("Module:links").full_link{ term = term, lang = Bulgarian, sc = Cyrillic } end

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

local function identity(x) return x end

local display_hyphenation = identity local display_rhymes = identity local display_syllabification = identity

function tests:check_output_ipa(term, expected, endschwa) local normalized_term = m_pron.remove_pron_notations(term) tests:equals(		link(normalized_term) ..		(term ~= normalized_term and " (respelled " .. term .. ")" or "") ..		(endschwa and ", endschwa=true" or ""),		m_pron.toIPA(term, endschwa),		expected,		{ display = tag_IPA }	) end

function tests:check_output_hyphenation(term, expected) tests:equals(		link(term),		m_pron.hyphenate_total(term),		mw.ustring.gsub(expected, "[.]", "‧"),		{ display = display_hyphenation }	) end

function tests:check_output_syllabification(term, expected) tests:equals(		link(term),		m_pron.syllabify(term),		mw.ustring.gsub(expected, "[.]", "‧"),		{ display = display_syllabification }	) end

function tests:test_ipa local list = { { "къ́ща", "ˈkɤʃtɐ" }, { "сгъстя́ се", "zɡɐˈstʲɤ̟ sɛ", true }, { "сгъстя̣́ се", "zɡɐˈstʲɤ̟ sɛ"}, { "а̀бдики́ращ", "ˌabdiˈkirɐʃt" }, { "безшу́мен", "bɛʃˈʃu̟mɛn" }, { "щастли́в", "ʃtɐˈslif" }, { "народността́", "nɐrodnoˈsta" }, { "я", "ja̟" }, { "юг", "ju̟k" }, { "яйце́", "jɐjˈt͡sɛ" }, { "учи́лище", "oˈt͡ʃiliʃtɛ" }, { "чорбаджи́я", "t͡ʃo̟rbɐˈdʒijɐ" }, { "уби́йца", "oˈbijt͡sɐ" }, { "безбра́чие", "bɛzˈbrat͡ʃiɛ" }, { "из.мра́", "izˈmra" }, { "сала́та", "sɐˈɫatɐ" }, { "шега́", "ʃɛˈɡa" }, { "жена́", "ʒɛˈna" }, { "инти́мен", "inˈtimɛn" }, { "посо́лство", "poˈsɔɫstvo" }, { "ъ́гъл", "ˈɤɡɐɫ"}, { "усу́квам", "oˈsukvɐm"}, { "ле́ща", "ˈlɛʃtɐ" }, { "липа́", "liˈpa" }, { "океа́н", "okɛˈan" }, { "меки́ца", "mɛˈkit͡sɐ" }, { "ла́гер", "ˈɫaɡɛr" }, { "маги́я", "mɐˈɡijɐ" }, { "хем", "xɛm" }, { "химн", "ximn"}, { "тулу́п", "toˈɫup"}, { "жа̀р-пти́ца", "ˌʒa̟r-pˈtit͡sɐ" }, { "в о́фис", "f ˈɔfis" }, { "във Фра́нция", "vɐf ˈfrant͡sijɐ" }, { "ня́колко", "ˈnʲa̟koɫko" }, { "в Япо́ния", "f jɐˈpɔnijɐ" }, { "автоплу́г", "ɐftoˈpɫuk" }, --ʊ in previous module { "ўе́бса́йт", "ˈwɛpˈsajt" }, { "ўе́лски", "ˈwɛɫski" }, { "ўе́стърн", "ˈwɛstɐrn" }, { "О́ўен", "ˈɔwɛn" }, { "но́ўхаў", "ˈnɔwxɐw" }, { "Джо́ўзеф", "ˈdʒɔwzɛf" }, { "бо́ўлинг", "ˈbɔwliŋk" }, { "даўнло́ўд", "dɐwnˈɫɔwt" }, { "ўи́ски", "ˈwiski" }, { "ўи́кенд", "ˈwikɛnt" }, { "Ўо́рўик", "ˈwɔrwik" }, { "Хе́лоўин", "ˈxɛɫowin" }, } --	Additions take this form –		{ "word with acutes", "IPA" },		{ "", "" },	Make sure to include the comma, or the module will return an error. self:iterate(list, "check_output_ipa") end

function tests:test_hyphenation local list = { { "височина", "ви.со.чи.на" }, { "сестра", "сес.тра" }, { "пленник", "плен.ник" }, { "преодолея", "пре.одо.лея" }, { "маоизъм", "мао.изъм" }, { "майка", "май.ка" }, { "айс.берг", "айс.берг" }, { "майор", "ма.йор" }, { "фризьор", "фри.зьор" }, { "суджук", "су.джук" }, { "над.живея", "над.жи.вея" }, { "сестра", "сес.тра" }, { "потури", "по.ту.ри"}, { "сланина", "сла.ни.на"}, { "пража", "пра.жа"}, { "спринцовка", "сприн.цов.ка"}, { "пържа", "пър.жа"}, { "яркост", "яр.кост"}, { "рало", "ра.ло"}, { "белило", "бе.ли.ло"}, { "шевица", "ше.ви.ца"}, { "доило", "до.ило"}, { "начало", "на.ча.ло"}, { "хитрост", "хит.рост"}, { "хитър", "хи.тър"}, { "шевица", "ше.ви.ца"}, { "вдлъбна", "вдлъб.на"}, { "размахам", "раз.ма.хам"}, { "укор", "укор"}, { "упорит", "упо.рит"}, { "осем", "осем"}, { "оценка", "оцен.ка"}, { "лея", "лея"}, { "аз", "аз"}, { "тя", "тя"}, { "е", "е"}, { "мен", "мен"}, { "страст", "страст"}, { "пръст", "пръст"}, { "шофьор", "шо.фьор" }, { "фотьойл", "фо.тьойл" }, { "бельо", "бе.льо" }, { "шедьовър", "ше.дьо.вър" }, { "мениджър", "ме.ни.джър" }, { "джудже", "джу.дже" }, { "жар-птица", "жар-пти.ца"}, { "морално-нравствен", "мо.рал.но-нрав.ствен" }, { "кандидат-студент", "кан.ди.дат-сту.дент" }, { "министър-председател", "ми.нис.тър-пред.се.да.тел" }, { "член-кореспондент", "член-ко.рес.пон.дент" }, { "бизнес администрация", "биз.нес ад.ми.нис.тра‧ция" }, { "екшън герой", "ек.шън ге.рой" }, { "тенис корт", "те.нис корт" }, { "заместник министър-председател", "за.мес.тник ми.нис.тър-пред.се.да.тел" }, { "заместник началник-управление", "за.мес.тник на.чал.ник-уп.рав.ле.ние" }, { "SIM карта", "SIM кар.та" }, { "VIP зона", "VIP зо.на" } } --	Additions take this form –		{ "word (with no accent required)", "expected hyphenation" },		{ "", "" },	Make sure to include the comma, or the module will return an error. self:iterate(list, "check_output_hyphenation") end

function tests:test_syllabification -- Left side of elements: input to the function, which may include dots (.) for manual syllable division -- Right side of elements: expected output, with syllable breaks indicated with a dot local list = { -- 1. Single.letter words { "а", "а" }, { "в", "в" }, { "е", "е" }, { "и", "и" }, { "ѝ", "ѝ" }, { "о", "о" }, { "с", "с" }, { "у", "у" },

-- 2. Simple monosyllabic words { "аз", "аз" }, { "ти", "ти" }, { "той", "той" }, { "тя", "тя" }, { "във", "във" }, { "със", "със" },

-- 3. More complex monosyllabic words { "принц", "принц" }, { "спринт", "спринт" }, { "глист", "глист" }, { "скункс", "скункс" },

-- 4. Single consonant between two vowels: 3-letter words { "ами", "а.ми" }, { "ала", "а.ла" }, { "ако", "а.ко" }, { "уви", "у.ви" }, { "или", "и.ли" },

-- 5. Single consonant between two vowels: stops and fricatives { "саламура", "са.ла.му.ра" }, { "барабан", "ба.ра.бан" }, { "сполука", "спо.лу.ка" }, { "щавя", "ща.вя" }, { "стрина", "стри.на" }, { "когато", "ко.га.то" },

-- 6. Single consonant between two vowels: щ, and single-letter affricates { "старицата", "ста.ри.ца.та" }, { "получените", "по.лу.че.ни.те" }, { "подобаващите", "по.до.ба.ва.щи.те" }, { "обучаващите", "о.бу.ча.ва.щи.те" },

-- 7. Single consonant between two vowels: дж { "джудже", "джу.дже" }, { "суджук", "су.джук" }, { "дамаджана", "да.ма.джа.на" }, { "джаджите", "джа.джи.те" },

-- 8. Single consonant between two vowels: й { "койот", "ко.йот" }, { "майонеза", "ма.йо.не.за" }, { "пейоративен", "пе.йо.ра.ти.вен" }, { "майор", "ма.йор" },

-- 9. Single consonant between two vowels: morphological prefixes get split { "безименен", "бе.зи.ме.нен" }, { "изопачавам", "и.зо.па.ча.вам" }, { "отивам", "о.ти.вам" }, { "разоран", "ра.зо.ран" },

-- 10. Single consonant between two vowels: palatalized by ь { "бульон", "бу.льон" }, { "фризьор", "фри.зьор" }, { "шедьовър", "ше.дьо.вър" }, { "гьозум", "гьо.зум" }, { "ликьор", "ли.кьор" },

-- 11. Zero consonants between two vowels: at most one elsewhere in word { "воал", "во.ал" }, { "маоизъм", "ма.о.и.зъм" }, { "феерия", "фе.е.ри.я" }, { "воайор", "во.а.йор" }, { "миокард", "ми.о.кард" }, { "кьопоолу", "кьо.по.о.лу" }, { "аятолах", "а.я.то.лах" }, { "авария", "а.ва.ри.я" }, { "позиции", "по.зи.ци.и" }, { "хазяи", "ха.зя.и" }, { "дерибеи", "де.ри.бе.и" }, { "преодолея", "пре.о.до.ле.я" },

-- 12. Two or more consonants between two vowels: щр { "нащрек", "на.щрек" }, { "поощрявам", "по.о.щря.вам" }, { "защриховам", "за.щри.хо.вам" }, { "поощрителен", "по.о.щри.те.лен" }, { "изщракване", "из.щрак.ва.не" }, { "Вайерщрас", "Ва.йер.щрас" }, { "Кьонигщрасе", "Кьо.ниг.щра.се" },

-- 13. Two or more consonants between two vowels: щ + other sonorant before vowel { "общност", "общ.ност" }, { "всъщност", "всъщ.ност" }, { "помощник", "по.мощ.ник" }, { "чорапогащник", "чо.ра.по.гащ.ник" }, { "нощница", "нощ.ни.ца" }, { "чудовищност", "чу.до.вищ.ност" }, { "немощливо", "не.мощ.ли.во" }, { "съобщавам", "съ.об.ща.вам" }, { "въобще", "въ.об.ще" },

-- 14. Two or more consonants between two vowels: дж affricate present { "манджа", "ман.джа" }, { "калайджия", "ка.лай.джи.я" }, { "авджия", "ав.джи.я" }, { "изджвака", "из.джва.ка" },

-- 15. Two or more consonants between two vowels: adjacent sonorants or stops { "пленник", "плен.ник" }, { "майка", "май.ка" }, { "профашистки", "про.фа.шист.ки" }, { "гледка", "глед.ка" }, { "крачка", "крач.ка" }, { "цедка", "цед.ка" },

-- 16a. Two consonants between two vowels: other { "звезда", "звез.да" }, { "спринцовка", "сприн.цов.ка" }, { "бързо", "бър.зо" }, { "малко", "мал.ко" }, { "после", "по.сле" }, { "партия", "пар.ти.я" }, { "гланцов", "глан.цов" }, { "пепелник", "пе.пел.ник" }, { "пилци", "пил.ци" }, { "аншоа", "ан.шо.а" }, { "ядро", "я.дро" }, -- 16b. As above, testing clusters чн, цм, цн, чм { "ироничност", "и.ро.нич.ност"}, { "профилактична", "про.фи.лак.тич.на"}, { "боцна", "боц.на"}, { "спецна", "спец.на"}, { "бичме", "бич.ме"}, { "кръчма", "кръч.ма"}, { "боцман", "боц.ман"}, { "сачма", "сач.ма"}, { "Ричмънд", "Рич.мънд"}, { "мичман", "мич.ман"}, { "разчеша", "раз.че.ша"}, { "пецма", "пец.ма"}, -- Probably not a real word

-- 17. Complex consonant clusters: general { "сестра", "се.стра" }, { "царство", "цар.ство" }, { "нравствен", "нрав.ствен" }, { "мандраджия", "ман.дра.джи.я" }, { "мизансцен", "ми.зан.сцен" }, { "странство", "стран.ство" }, { "пространство", "про.стран.ство" }, { "робство", "роб.ство" }, { "транспорт", "тран.спорт" },

-- 18. Consonant cluster not split: св { "посвикна", "по.свик.на" },

-- 19. Forced syllable breaks: when absent { "скръндза", "скрън.дза" }, { "годзила", "год.зи.ла" }, { "камикадзе", "ка.ми.кад.зе" }, { "надживея", "на.джи.ве.я" },

-- 20. Forced syllable breaks: when present { "скрън.дза", "скрън.дза" }, { "го.дзила", "го.дзи.ла" }, { "камика.дзе", "ка.ми.ка.дзе" }, { "над.живея", "над.жи.ве.я" },

-- 21. Morphological prefix handling: без- + equal sonority { "безсилен", "без.си.лен" }, { "безшумен", "без.шу.мен" }, { "безвъзвратен", "без.въз.вра.тен" }, { "безхаберен", "без.ха.бе.рен" }, { "безстрашен", "без.стра.шен" }, { "безхлебна", "без.хле.бна" }, { "безвремие", "без.вре.ми.е" },

-- 22. Morphological prefix handling: без- + higher sonority { "безмерен", "без.ме.рен" }, { "безличен", "без.ли.чен" }, { "безнаказан", "без.на.ка.зан" }, { "безразборен", "без.раз.бо.рен" }, { "бездетен", "без.де.тен" }, { "безпардонен", "без.пар.до.нен" }, { "безтелесен", "без.те.ле.сен" }, { "безглав", "без.глав" }, { "безчестен", "без.че.стен" }, { "безпризорен", "без.при.зо.рен" }, { "безгрешен", "без.гре.шен" }, { "безкраен", "без.кра.ен" }, { "безбрежен", "без.бре.жен" }, { "бездна", "безд.на" },

-- 23. Morphological prefix handling: из- + equal sonority { "изхвърлям", "из.хвър.лям" }, { "изстена", "из.сте.на" }, { "извор", "из.вор" }, { "извозвам", "из.воз.вам" }, { "извлача", "из.вла.ча" }, { "изхрачване", "из.храч.ва.не" }, { "изшмугна", "из.шмуг.на" }, { "изживяното", "из.жи.вя.но.то" },

-- 24. Morphological prefix handling: из- + higher sonority { "изненада", "из.не.на.да" }, { "излъгах", "из.лъ.гах" }, { "измяна", "из.мя.на" }, { "изрод", "из.род" }, { "изтрезвително", "из.трез.ви.тел.но" }, { "изпроставял", "из.про.ста.вял" }, { "изключвам", "из.ключ.вам" }, { "изблиза", "из.бли.за" },

-- 25. Morphological prefix handling: над- + equal/lower sonority { "надслов", "над.слов" }, { "надхвърлен", "над.хвър.лен" }, { "надвиквам", "над.вик.вам" }, { "надве", "над.ве" }, { "надгробен", "над.гро.бен" }, { "надпис", "над.пис" }, { "надценявам", "над.це.ня.вам" }, { "надделея", "над.де.ле.я" },

-- 26. Morphological prefix handling: над- + higher sonority { "над.раствам", "над.ра.ствам" }, { "надмощие", "над.мо.щи.е" }, { "ненадминат", "не.над.ми.нат" }, { "безнадзорен", "без.над.зо.рен" }, { "надница", "над.ни.ца" }, { "надменност", "над.мен.ност" }, { "на.длъж", "на.длъж" }, { "надробен", "на.дро.бен" }, { "надрънкам", "на.дрън.кам" }, { "надраскам", "на.дра.скам" }, { "надрусам", "на.дру.сам" }, { "надран", "на.дран" }, -- 27. Morphological prefix handling: под. + equal/lower sonority { "подстрекател", "под.стре.ка.тел" }, { "подход", "под.ход" }, { "подвижен", "под.ви.жен" }, { "подзаглавие", "под.за.гла.ви.е" }, { "подклаждам", "под.клаж.дам" }, { "подбор", "под.бор" }, { "подпирам", "под.пи.рам" }, { "подценявам", "под.це.ня.вам" },

-- 28. Morphological prefix handling: под. + higher sonority { "подновявам", "под.но.вя.вам" }, { "подмамвам", "под.мам.вам" }, { "подлост", "под.лост" }, { "под.разделение", "под.раз.де.ле.ни.е" }, { "подробен", "по.дро.бен" }, { "подражавам", "по.дра.жа.вам" }, { "подремя", "по.дре.мя" }, { "подрусам", "по.дру.сам" }, -- 29. Multiple prefixes { "безизразен", "бе.зиз.ра.зен" }, { "безизразност", "бе.зиз.ра.зност" }, { "безвъзмезден", "без.въз.мез.ден" }, { "безвъздушен", "без.въз.ду.шен" }, { "безразличен", "без.раз.ли.чен" }, { "безразборност", "без.раз.бор.ност" }, { "безпредметен", "без.пред.ме.тен" }, { "поизправя", "по.из.пра.вя" }, { "поизмъча", "по.из.мъ.ча" }, { "поизгладя", "по.из.гла.дя" }, { "произношение", "про.из.но.ше.ни.е" }, { "произтича", "про.из.ти.ча" }, { "наизмислил", "на.из.ми.слил" }, { "наизлезлите", "на.из.ле.зли.те" }, { "предразположение", "пред.раз.по.ло.же.ни.е" }, { "преразглеждане", "пре.раз.глеж.да.не" }, { "преразпределение", "пре.раз.пре.де.ле.ни.е" }, { "преразказ", "пре.раз.каз" }, { "превъзмогна", "пре.въз.мог.на" }, { "превъзпитание", "пре.въз.пи.та.ни.е" }, { "преиздавам", "пре.из.да.вам" }, { "преизбирам", "пре.из.би.рам" }, { "невъзможен", "не.въз.мо.жен" }, { "невъзпитан", "не.въз.пи.тан" }, { "неизбежен", "не.из.бе.жен" }, { "неизменност", "не.из.мен.ност" }, { "неразделен", "не.раз.де.лен" }, { "неразположение", "не.раз.по.ло.же.ни.е" }, { "поразмисля", "по.раз.ми.сля" }, { "пораздрусам", "по.раз.дру.сам" }, { "наразказах", "на.раз.ка.зах" }, { "наразлепил", "на.раз.ле.пил" }, { "неотложен", "не.от.ло.жен" }, { "неотменим", "не.от.ме.ним" }, { "поотложа", "по.от.ло.жа" }, { "поотмина", "по.от.ми.на" },

-- 30. Loanwords with /w/ as a consonant: default spelling with 'у' { "уелски", "у.ел.ски" }, { "уебсайт", "у.еб.сайт" }, { "уестърн", "у.е.стърн" }, { "Оуен", "О.у.ен" }, { "ноухау", "но.у.ха.у" }, { "Джоузеф", "Джо.у.зеф" }, { "боулинг", "бо.у.линг" }, { "даунлоуд", "да.ун.ло.уд" }, { "уиски", "у.и.ски" }, { "уикенд", "у.и.кенд" }, { "Уоруик", "У.о.ру.ик" }, { "Хелоуин", "Хе.ло.у.ин" },

-- 31. Loanwords with /w/ as a consonant: alternative spelling with 'ў' { "ўелски", "уел.ски" }, { "ўебсайт", "уеб.сайт" }, { "ўестърн", "уе.стърн" }, { "Оўен", "О.уен" }, { "ноўхаў", "ноу.хау" }, { "Джоўзеф", "Джоу.зеф" }, { "боўлинг", "боу.линг" }, { "даўн.лоўд", "даун.лоуд" }, { "ўиски", "уи.ски" }, { "ўикенд", "уи.кенд" }, { "Ўорўик", "Уор.уик" }, { "Хелоўин", "Хе.ло.уин" }, -- 32. Multiple-word terms with hyphens or spaces { "разни хора-разни вкусове", "раз.ни хо.ра-раз.ни вку.со.ве", }, { "акушер-гинеколог", "а.ку.шер-ги.не.ко.лог" }, { "най-напред", "най-на.пред" }, { "ампер-час", "ам.пер-час" }, { "га-га", "га-га" }, -- no-op { "пи-пи", "пи-пи" }, { "Гвинея-Бисау", "Гви.не.я-Би.са.у" }, { "шам-фъстък", "шам-фъ.стък" }, { "вълна-убиец", "въл.на-у.би.ец" }, { "акушер-гинеколог", "а.ку.шер-ги.не.ко.лог" }, { "по-добре късно, отколкото никога", "по-до.бре къ.сно, от.кол.ко.то ни.ко.га" }, { "зенитно-ракетен", "зе.нит.но-ра.ке.тен" }, { "горе-долу", "го.ре-до.лу" }, { "най-после", "най-по.сле" }, { "чик-чирик", "чик-чи.рик" }, { "среден род", "сре.ден род" }, { "божа кравичка", "бо.жа кра.вич.ка" }, { "Съединени американски щати", "Съ.е.ди.не.ни а.ме.ри.кан.ски ща.ти" }, { "от младих до старих", "от мла.дих до ста.рих" }, { "со кротце, со благо и со малко кютек", "со крот.це, со бла.го и со мал.ко кю.тек" } } --	Additions take this form –		{ "word (with no accent required)", "expected syllabification" },		{ "", "" },	Make sure to include the comma, or the module will return an error. self:iterate(list, "check_output_syllabification") end

return tests