from copy import deepcopy from unittest import TestCase from pydantic import ValidationError from voicevox_engine.kana_parser import parse_kana from voicevox_engine.model import UserDictWord class TestUserDictWords(TestCase): def setUp(self): self.test_model = { "surface": "テスト", "priority": 0, "part_of_speech": "名詞", "part_of_speech_detail_1": "固有名詞", "part_of_speech_detail_2": "一般", "part_of_speech_detail_3": "*", "inflectional_type": "*", "inflectional_form": "*", "stem": "*", "yomi": "テスト", "pronunciation": "テスト", "accent_type": 0, "accent_associative_rule": "*", } def test_valid_word(self): test_value = deepcopy(self.test_model) try: UserDictWord(**test_value) except ValidationError as e: self.fail(f"Unexpected Validation Error\n{str(e)}") def test_convert_to_zenkaku(self): test_value = deepcopy(self.test_model) test_value["surface"] = "test" self.assertEqual(UserDictWord(**test_value).surface, "test") def test_count_mora(self): test_value = deepcopy(self.test_model) self.assertEqual(UserDictWord(**test_value).mora_count, 3) def test_count_mora_x(self): test_value = deepcopy(self.test_model) for s in [chr(i) for i in range(12449, 12533)]: if s in ["ァ", "ィ", "ゥ", "ェ", "ォ", "ッ", "ャ", "ュ", "ョ", "ヮ"]: continue for x in "ァィゥェォャュョ": expected_count = 0 test_value["pronunciation"] = s + x for accent_phrase in parse_kana( test_value["pronunciation"] + "'", ): expected_count += len(accent_phrase.moras) with self.subTest(s=s, x=x): self.assertEqual( UserDictWord(**test_value).mora_count, expected_count, ) def test_count_mora_xwa(self): test_value = deepcopy(self.test_model) test_value["pronunciation"] = "クヮンセイ" expected_count = 0 for accent_phrase in parse_kana( test_value["pronunciation"] + "'", ): expected_count += len(accent_phrase.moras) self.assertEqual( UserDictWord(**test_value).mora_count, expected_count, ) def test_invalid_pronunciation_not_katakana(self): test_value = deepcopy(self.test_model) test_value["pronunciation"] = "ぼいぼ" with self.assertRaises(ValidationError): UserDictWord(**test_value) def test_invalid_pronunciation_invalid_sutegana(self): test_value = deepcopy(self.test_model) test_value["pronunciation"] = "アィウェォ" with self.assertRaises(ValidationError): UserDictWord(**test_value) def test_invalid_pronunciation_invalid_xwa(self): test_value = deepcopy(self.test_model) test_value["pronunciation"] = "アヮ" with self.assertRaises(ValidationError): UserDictWord(**test_value) def test_count_mora_voiced_sound(self): test_value = deepcopy(self.test_model) test_value["pronunciation"] = "ボイボ" self.assertEqual(UserDictWord(**test_value).mora_count, 3) def test_invalid_accent_type(self): test_value = deepcopy(self.test_model) test_value["accent_type"] = 4 with self.assertRaises(ValidationError): UserDictWord(**test_value) def test_invalid_accent_type_2(self): test_value = deepcopy(self.test_model) test_value["accent_type"] = -1 with self.assertRaises(ValidationError): UserDictWord(**test_value)