@@ -117,3 +117,144 @@ def test_check_aek_too(self):
117117 self .assertTrue (
118118 kv .check_aek_too (["หนม" , "หน่ม" , "หน้ม" ]), [False , "aek" , "too" ]
119119 )
120+
121+
122+ class KhaveeCheckKaruLahuTestCase (unittest .TestCase ):
123+ """Tests for KhaveeVerifier.check_karu_lahu"""
124+
125+ def setUp (self ):
126+ self .kv = KhaveeVerifier ()
127+
128+ def test_dead_syllable_is_karu (self ):
129+ self .assertEqual (self .kv .check_karu_lahu ("กด" ), "karu" )
130+
131+ def test_long_live_syllable_is_karu (self ):
132+ self .assertEqual (self .kv .check_karu_lahu ("กา" ), "karu" )
133+
134+ def test_live_syllable_with_final_consonant_is_karu (self ):
135+ self .assertEqual (self .kv .check_karu_lahu ("กาน" ), "karu" )
136+
137+ def test_bo_mai_ek_is_lahu (self ):
138+ self .assertEqual (self .kv .check_karu_lahu ("บ่" ), "lahu" )
139+
140+ def test_no_short_word_is_lahu (self ):
141+ self .assertEqual (self .kv .check_karu_lahu ("ณ" ), "lahu" )
142+
143+ def test_tho_short_word_is_lahu (self ):
144+ self .assertEqual (self .kv .check_karu_lahu ("ธ" ), "lahu" )
145+
146+ def test_ko_mai_is_lahu (self ):
147+ self .assertEqual (self .kv .check_karu_lahu ("ก็" ), "lahu" )
148+
149+
150+ class KhaveeHandleKarunTestCase (unittest .TestCase ):
151+ """Tests for KhaveeVerifier.handle_karun_sound_silence"""
152+
153+ def setUp (self ):
154+ self .kv = KhaveeVerifier ()
155+
156+ def test_word_without_karun_unchanged (self ):
157+ self .assertEqual (self .kv .handle_karun_sound_silence ("คน" ), "คน" )
158+ self .assertEqual (self .kv .handle_karun_sound_silence ("กา" ), "กา" )
159+
160+ def test_word_ending_with_karun_stripped (self ):
161+ # เกมส์ → drop ์ and the consonant before it (ส) → เกม
162+ self .assertEqual (self .kv .handle_karun_sound_silence ("เกมส์" ), "เกม" )
163+
164+ def test_word_ending_with_karun_stripped_2 (self ):
165+ # รักษ์ → drop ์ + ษ → รัก
166+ self .assertEqual (self .kv .handle_karun_sound_silence ("รักษ์" ), "รัก" )
167+
168+ def test_returns_string (self ):
169+ self .assertIsInstance (self .kv .handle_karun_sound_silence ("สวัสดี" ), str )
170+
171+
172+ class KhaveeCheckAekTooEdgeCasesTestCase (unittest .TestCase ):
173+ """Edge-case tests for KhaveeVerifier.check_aek_too"""
174+
175+ def setUp (self ):
176+ self .kv = KhaveeVerifier ()
177+
178+ def test_non_string_raises_type_error (self ):
179+ with self .assertRaises (TypeError ):
180+ self .kv .check_aek_too (123 )
181+
182+ def test_dead_syllable_as_aek_flag (self ):
183+ self .assertEqual (self .kv .check_aek_too ("บท" , dead_syllable_as_aek = True ), "aek" )
184+
185+ def test_dead_syllable_without_flag_returns_false (self ):
186+ self .assertFalse (self .kv .check_aek_too ("บท" , dead_syllable_as_aek = False ))
187+
188+ def test_list_with_non_string_element_raises (self ):
189+ with self .assertRaises (TypeError ):
190+ self .kv .check_aek_too (["ไก่" , 42 ])
191+
192+ def test_both_tone_marks_returns_false (self ):
193+ # word with both ่ and ้ should return False
194+ self .assertFalse (self .kv .check_aek_too ("ก่้" ))
195+
196+
197+ class KhaveeCheckKlonExtendedTestCase (unittest .TestCase ):
198+ """Tests for check_klon k_type=8 and invalid k_type"""
199+
200+ def setUp (self ):
201+ self .kv = KhaveeVerifier ()
202+
203+ def test_invalid_k_type_returns_error_string (self ):
204+ result = self .kv .check_klon ("บทกวีทดสอบ" , k_type = 99 )
205+ self .assertIsInstance (result , str )
206+ self .assertIn ("Something went wrong" , result )
207+
208+ def test_incomplete_klon4_poem (self ):
209+ result = self .kv .check_klon ("ฉันชื่อหมูกรอบ" , k_type = 4 )
210+ self .assertIsInstance (result , str )
211+ self .assertIn ("does not have 4 complete sentences" , result )
212+
213+ def test_incomplete_klon8_poem (self ):
214+ result = self .kv .check_klon ("ฉันชื่อหมูกรอบ" , k_type = 8 )
215+ self .assertIsInstance (result , str )
216+
217+ def test_check_klon8_correct_poem (self ):
218+ poem = (
219+ "ฉันชื่อหมูกรอบ ฉันชอบกินไก่ แล้วก็วิ่งไล่ หมาชื่อนํ้าทอง "
220+ "ลคคนเก่ง เอ๋งเอ๋งคะนอง มีคนจับจอง เขาชื่อน้องเธียร"
221+ )
222+ self .assertIsNotNone (self .kv .check_klon (poem , k_type = 8 ))
223+
224+
225+ class KhaveeCheckSaraEdgeCasesTestCase (unittest .TestCase ):
226+ """Edge-case tests for KhaveeVerifier.check_sara"""
227+
228+ def setUp (self ):
229+ self .kv = KhaveeVerifier ()
230+
231+ def test_bo_mai_ek_returns_oo (self ):
232+ self .assertEqual (self .kv .check_sara ("บ่" ), "ออ" )
233+
234+ def test_special_word_เออ (self ):
235+ self .assertEqual (self .kv .check_sara ("เออ" ), "เออ" )
236+
237+ def test_special_word_เอ (self ):
238+ self .assertEqual (self .kv .check_sara ("เอ" ), "เอ" )
239+
240+ def test_special_word_เอะ (self ):
241+ self .assertEqual (self .kv .check_sara ("เอะ" ), "เอะ" )
242+
243+ def test_special_word_เอา (self ):
244+ self .assertEqual (self .kv .check_sara ("เอา" ), "เอา" )
245+
246+ def test_special_word_เอาะ (self ):
247+ self .assertEqual (self .kv .check_sara ("เอาะ" ), "เอาะ" )
248+
249+ def test_ru_sara (self ):
250+ self .assertEqual (self .kv .check_sara ("ฤ" ), "อึ" )
251+
252+ def test_ruea_sara (self ):
253+ # ฤา (ฤ + sara aa U+0E32) → อือ; note: ฤๅ uses lakkhangyao, not sara aa
254+ self .assertEqual (self .kv .check_sara ("ฤา" ), "อือ" )
255+
256+ def test_เอือ_sara (self ):
257+ self .assertEqual (self .kv .check_sara ("เรือ" ), "เอือ" )
258+
259+ def test_returns_string (self ):
260+ self .assertIsInstance (self .kv .check_sara ("เริง" ), str )
0 commit comments