@@ -39,6 +39,48 @@ TEST_CASE("width.single_codepoint", "[width]")
3939 CHECK (unicode::width (U' \U0001F480 ' ) == 2 ); // 💀 :skull:
4040}
4141
42+ TEST_CASE (" width.hangul_jamo" , " [width]" )
43+ {
44+ // Leading Jamo (Choseong) — EAW=Wide → width 2
45+ CHECK (unicode::width (U' \u1100 ' ) == 2 ); // HANGUL CHOSEONG KIYEOK
46+ CHECK (unicode::width (U' \u115F ' ) == 2 ); // HANGUL CHOSEONG FILLER
47+ CHECK (unicode::width (U' \uA960 ' ) == 2 ); // HANGUL CHOSEONG TIKEUT-MIEUM (Extended-A)
48+ CHECK (unicode::width (U' \uA97C ' ) == 2 ); // HANGUL CHOSEONG SSANGYEORINHIEUH (Extended-A)
49+
50+ // Vowel Jamo (Jungseong) — conjoining → width 0
51+ CHECK (unicode::width (U' \u1160 ' ) == 0 ); // HANGUL JUNGSEONG FILLER
52+ CHECK (unicode::width (U' \u1161 ' ) == 0 ); // HANGUL JUNGSEONG A
53+ CHECK (unicode::width (U' \u11A7 ' ) == 0 ); // HANGUL JUNGSEONG O-YAE
54+ CHECK (unicode::width (U' \uD7B0 ' ) == 0 ); // HANGUL JUNGSEONG O-YEO (Extended-B)
55+ CHECK (unicode::width (U' \uD7C6 ' ) == 0 ); // HANGUL JUNGSEONG ARAEA-E (Extended-B)
56+
57+ // Trailing Jamo (Jongseong) — conjoining → width 0
58+ CHECK (unicode::width (U' \u11A8 ' ) == 0 ); // HANGUL JONGSEONG KIYEOK
59+ CHECK (unicode::width (U' \u11FF ' ) == 0 ); // HANGUL JONGSEONG SSANGNIEUN
60+ CHECK (unicode::width (U' \uD7CB ' ) == 0 ); // HANGUL JONGSEONG NIEUN-RIEUL (Extended-B)
61+ CHECK (unicode::width (U' \uD7FB ' ) == 0 ); // HANGUL JONGSEONG PHIEUPH-THIEUTH (Extended-B)
62+
63+ // Precomposed syllables — EAW=Wide → width 2
64+ CHECK (unicode::width (U' \uAC00 ' ) == 2 ); // HANGUL SYLLABLE GA (first)
65+ CHECK (unicode::width (U' \uD7A3 ' ) == 2 ); // HANGUL SYLLABLE HIH (last)
66+
67+ // Compatibility Jamo — EAW=Wide → width 2
68+ CHECK (unicode::width (U' \u3131 ' ) == 2 ); // HANGUL LETTER KIYEOK
69+
70+ // Halfwidth Jamo — no conjoining → width 1
71+ CHECK (unicode::width (U' \uFFA0 ' ) == 1 ); // HALFWIDTH HANGUL FILLER
72+ CHECK (unicode::width (U' \uFFBE ' ) == 1 ); // HALFWIDTH HANGUL LETTER KIYEOK
73+ }
74+
75+ TEST_CASE (" width.hangul_decomposed_syllable" , " [width]" )
76+ {
77+ // L + V = grapheme cluster of width 2
78+ CHECK (unicode::grapheme_cluster_width (U" \u1100\u1161 " sv) == 2 );
79+
80+ // L + V + T = grapheme cluster of width 2
81+ CHECK (unicode::grapheme_cluster_width (U" \u1100\u1161\u11A8 " sv) == 2 );
82+ }
83+
4284TEST_CASE (" grapheme_cluster_width.empty" , " [width]" )
4385{
4486 CHECK (unicode::grapheme_cluster_width (std::u32string_view {}) == 0 );
0 commit comments