]>
git.saurik.com Git - apple/icu.git/blob - icuSources/test/intltest/jamotest.cpp
1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
3 /********************************************************************
5 * Copyright (c) 1997-2016, International Business Machines Corporation and
6 * others. All Rights Reserved.
7 ********************************************************************
8 ************************************************************************
9 * Date Name Description
10 * 02/28/2001 aliu Creation
11 * 03/01/2001 George port to HP/UX
12 ************************************************************************/
14 #include "unicode/utypes.h"
16 #if !UCONFIG_NO_TRANSLITERATION
19 #include "unicode/utypes.h"
20 #include "unicode/translit.h"
24 // SEP is the disambiguation separator used by Latin-Jamo and Jamo-Latin
29 UParseError parseError
;
30 UErrorCode status
= U_ZERO_ERROR
;
31 NAME_JAMO
= Transliterator::createFromRules("Name-Jamo",
32 UnicodeString(JAMO_NAMES_RULES
, -1, US_INV
),
33 UTRANS_FORWARD
, parseError
, status
);
35 if (U_FAILURE(status
)) {
39 status
= U_ZERO_ERROR
;
40 JAMO_NAME
= Transliterator::createFromRules("Jamo-Name",
41 UnicodeString(JAMO_NAMES_RULES
, -1, US_INV
),
42 UTRANS_REVERSE
, parseError
, status
);
43 if (U_FAILURE(status
)) {
56 JamoTest::runIndexedTest(int32_t index
, UBool exec
,
57 const char* &name
, char* /*par*/) {
60 TESTCASE(1,TestRealText
);
61 TESTCASE(2,TestPiecemeal
);
62 default: name
= ""; break;
67 JamoTest::TestJamo() {
68 UParseError parseError
;
69 UErrorCode status
= U_ZERO_ERROR
;
70 Transliterator
* latinJamo
= Transliterator::createInstance("Latin-Jamo", UTRANS_FORWARD
, parseError
, status
);
72 if (latinJamo
== 0 || U_FAILURE(status
)) {
73 dataerrln("FAIL: createInstance() returned 0 - %s", u_errorName(status
));
77 Transliterator
* jamoLatin
= latinJamo
->createInverse(status
);
81 errln("FAIL: createInverse() returned 0");
85 static const char* CASE
[] = {
86 // Column 1 is the latin text L1 to be fed to Latin-Jamo
89 // Column 2 is expected value of J. J is fed to
90 // Jamo-Latin to yield output L2.
92 // Column 3 is expected value of L2. If the expected
93 // value of L2 is L1, then L2 is NULL.
95 // add tests for the update to fix problems where it didn't follow the standard
96 // see also http://www.unicode.org/cldr/data/charts/transforms/Latin-Hangul.html
97 "gach", "(Gi)(A)(Cf)", NULL
,
98 "geumhui", "(Gi)(EU)(Mf)(Hi)(YI)", NULL
,
99 "choe", "(Ci)(OE)", NULL
,
100 "wo", "(IEUNG)(WEO)", NULL
,
101 "Wonpil", "(IEUNG)(WEO)(Nf)(Pi)(I)(L)", "wonpil",
102 "GIPPEUM", "(Gi)(I)(BB)(EU)(Mf)", "gippeum",
103 "EUTTEUM", "(IEUNG)(EU)(DD)(EU)(Mf)", "eutteum",
104 "KKOTNAE", "(GGi)(O)(Tf)(Ni)(AE)", "kkotnae",
105 "gaga", "(Gi)(A)(Gi)(A)", NULL
,
106 "gag-a", "(Gi)(A)(Gf)(IEUNG)(A)", NULL
,
107 "gak-ka", "(Gi)(A)(Kf)(Ki)(A)", NULL
,
108 "gakka", "(Gi)(A)(GGi)(A)", NULL
,
109 "gakk-a", "(Gi)(A)(GGf)(IEUNG)(A)", NULL
,
110 "gakkka", "(Gi)(A)(GGf)(Ki)(A)", NULL
,
111 "gak-kka", "(Gi)(A)(Kf)(GGi)(A)", NULL
,
113 "bab", "(Bi)(A)(Bf)", NULL
,
114 "babb", "(Bi)(A)(Bf)(Bi)(EU)", "babbeu",
115 "babbba", "(Bi)(A)(Bf)(Bi)(EU)(Bi)(A)", "babbeuba",
116 "bagg", "(Bi)(A)(Gf)(Gi)(EU)", "baggeu",
117 "baggga", "(Bi)(A)(Gf)(Gi)(EU)(Gi)(A)", "baggeuga",
118 //"bag" SEP "gga", "(Bi)(A)(Gf)" SEP "(Gi)(EU)(Gi)(A)", "bag" SEP "geuga",
119 "kabsa", "(Ki)(A)(Bf)(Si)(A)", NULL
,
120 "kabska", "(Ki)(A)(BS)(Ki)(A)", NULL
,
121 "gabsbka", "(Gi)(A)(BS)(Bi)(EU)(Ki)(A)", "gabsbeuka", // not (Kf)
122 "gga", "(Gi)(EU)(Gi)(A)", "geuga",
123 "bsa", "(Bi)(EU)(Si)(A)", "beusa",
124 "agg", "(IEUNG)(A)(Gf)(Gi)(EU)", "aggeu",
125 "agga", "(IEUNG)(A)(Gf)(Gi)(A)", NULL
,
126 "la", "(R)(A)", NULL
,
127 "bs", "(Bi)(EU)(Sf)", "beus",
128 "kalgga", "(Ki)(A)(L)(Gi)(EU)(Gi)(A)", "kalgeuga",
130 // 'r' in a final position is treated like 'l'
131 "karka", "(Ki)(A)(L)(Ki)(A)", "kalka",
134 enum { CASE_length
= UPRV_LENGTHOF(CASE
) };
137 for (i
=0; i
<CASE_length
; i
+=3) {
138 UnicodeString jamo
= nameToJamo(CASE
[i
+1]);
139 if (CASE
[i
+2] == NULL
) {
140 expect(*latinJamo
, CASE
[i
], jamo
, *jamoLatin
);
142 // Handle case where round-trip is expected to fail
143 expect(*latinJamo
, CASE
[i
], jamo
);
144 expect(*jamoLatin
, jamo
, CASE
[i
+2]);
153 * Test various step-at-a-time transformation of hangul to jamo to
156 void JamoTest::TestPiecemeal(void) {
157 UnicodeString hangul
; hangul
.append((UChar
)0xBC0F);
158 UnicodeString jamo
= nameToJamo("(Mi)(I)(Cf)");
159 UnicodeString
latin("mic");
160 UnicodeString
latin2("mich");
162 Transliterator
*t
= NULL
;
163 UErrorCode status
= U_ZERO_ERROR
;
165 t
= Transliterator::createInstance("NFD", UTRANS_FORWARD
, status
); // was Hangul-Jamo
166 if (U_FAILURE(status
) || t
== 0) {
167 dataerrln("FAIL: createInstance failed");
170 expect(*t
, hangul
, jamo
);
173 t
= Transliterator::createInstance("NFC", UTRANS_FORWARD
, status
); // was Jamo-Hangul
174 if (U_FAILURE(status
) || t
== 0) {
175 errln("FAIL: createInstance failed");
178 expect(*t
, jamo
, hangul
);
181 t
= Transliterator::createInstance("Latin-Jamo", UTRANS_FORWARD
, status
);
182 if (U_FAILURE(status
) || t
== 0) {
183 dataerrln("FAIL: createInstance failed - %s", u_errorName(status
));
186 expect(*t
, latin
, jamo
);
189 t
= Transliterator::createInstance("Jamo-Latin", UTRANS_FORWARD
, status
);
190 if (U_FAILURE(status
) || t
== 0) {
191 errln("FAIL: createInstance failed");
194 expect(*t
, jamo
, latin2
);
197 t
= Transliterator::createInstance("Hangul-Latin", UTRANS_FORWARD
, status
);
198 if (U_FAILURE(status
) || t
== 0) {
199 errln("FAIL: createInstance failed");
202 expect(*t
, hangul
, latin2
);
205 t
= Transliterator::createInstance("Latin-Hangul", UTRANS_FORWARD
, status
);
206 if (U_FAILURE(status
) || t
== 0) {
207 errln("FAIL: createInstance failed");
210 expect(*t
, latin
, hangul
);
213 t
= Transliterator::createInstance("Hangul-Latin; Latin-Jamo", UTRANS_FORWARD
, status
);
214 if (U_FAILURE(status
) || t
== 0) {
215 errln("FAIL: createInstance failed");
218 expect(*t
, hangul
, jamo
);
221 t
= Transliterator::createInstance("Jamo-Latin; Latin-Hangul", UTRANS_FORWARD
, status
);
222 if (U_FAILURE(status
) || t
== 0) {
223 errln("FAIL: createInstance failed");
226 expect(*t
, jamo
, hangul
);
229 t
= Transliterator::createInstance("Hangul-Latin; Latin-Hangul", UTRANS_FORWARD
, status
);
230 if (U_FAILURE(status
) || t
== 0) {
231 errln("FAIL: createInstance failed");
234 expect(*t
, hangul
, hangul
);
239 JamoTest::TestRealText() {
240 // Test text taken from the Unicode web site
241 static const char* const WHAT_IS_UNICODE
[] = {
242 "\\uc720\\ub2c8\\ucf54\\ub4dc\\uc5d0", "\\ub300\\ud574", "?",
244 "\\uc5b4\\ub5a4", "\\ud50c\\ub7ab\\ud3fc,", "\\uc5b4\\ub5a4",
245 "\\ud504\\ub85c\\uadf8\\ub7a8,", "\\uc5b4\\ub5a4", "\\uc5b8\\uc5b4\\uc5d0\\ub3c4",
246 "\\uc0c1\\uad00\\uc5c6\\uc774", "\\uc720\\ub2c8\\ucf54\\ub4dc\\ub294", "\\ubaa8\\ub4e0",
247 "\\ubb38\\uc790\\uc5d0", "\\ub300\\ud574", "\\uace0\\uc720", "\\ubc88\\ud638\\ub97c",
248 "\\uc81c\\uacf5\\ud569\\ub2c8\\ub2e4.",
250 "\\uae30\\ubcf8\\uc801\\uc73c\\ub85c", "\\ucef4\\ud4e8\\ud130\\ub294",
251 "\\uc22b\\uc790\\ub9cc", "\\ucc98\\ub9ac\\ud569\\ub2c8\\ub2e4.", "\\uae00\\uc790\\ub098",
252 "\\ub2e4\\ub978", "\\ubb38\\uc790\\uc5d0\\ub3c4", "\\uc22b\\uc790\\ub97c",
253 "\\uc9c0\\uc815\\ud558\\uc5ec",
254 "\\uc800\\uc7a5\\ud569\\ub2c8\\ub2e4.", "\\uc720\\ub2c8\\ucf54\\ub4dc\\uac00",
255 "\\uac1c\\ubc1c\\ub418\\uae30", "\\uc804\\uc5d0\\ub294", "\\uc774\\ub7ec\\ud55c",
256 "\\uc22b\\uc790\\ub97c", "\\uc9c0\\uc815\\ud558\\uae30", "\\uc704\\ud574", "\\uc218\\ubc31",
257 "\\uac00\\uc9c0\\uc758", "\\ub2e4\\ub978", "\\uae30\\ud638\\ud654",
258 "\\uc2dc\\uc2a4\\ud15c\\uc744",
259 "\\uc0ac\\uc6a9\\ud588\\uc2b5\\ub2c8\\ub2e4.", "\\ub2e8\\uc77c", "\\uae30\\ud638\\ud654",
260 "\\ubc29\\ubc95\\uc73c\\ub85c\\ub294", "\\ubaa8\\ub4e0", "\\ubb38\\uc790\\ub97c",
261 "\\ud3ec\\ud568\\ud560", "\\uc218", "\\uc5c6\\uc5c8\\uc2b5\\ub2c8\\ub2e4.", "\\uc608\\ub97c",
262 "\\ub4e4\\uc5b4", "\\uc720\\ub7fd", "\\uc5f0\\ud569\\uc5d0\\uc11c\\ub9cc",
263 "\\ubcf4\\ub354\\ub77c\\ub3c4", "\\ubaa8\\ub4e0", "\\uac01", "\\ub098\\ub77c\\ubcc4",
264 "\\uc5b8\\uc5b4\\ub97c", "\\ucc98\\ub9ac\\ud558\\ub824\\uba74", "\\uc5ec\\ub7ec",
265 "\\uac1c\\uc758", "\\ub2e4\\ub978", "\\uae30\\ud638\\ud654", "\\ubc29\\ubc95\\uc774",
266 "\\ud544\\uc694\\ud569\\ub2c8\\ub2e4.", "\\uc601\\uc5b4\\uc640", "\\uac19\\uc740",
267 "\\ub2e8\\uc77c", "\\uc5b8\\uc5b4\\uc758", "\\uacbd\\uc6b0\\ub3c4",
268 "\\uacf5\\ud1b5\\uc801\\uc73c\\ub85c", "\\uc0ac\\uc6a9\\ub418\\ub294", "\\ubaa8\\ub4e0",
269 "\\uae00\\uc790,", "\\ubb38\\uc7a5", "\\ubd80\\ud638", "\\ubc0f",
270 "\\ud14c\\ud06c\\ub2c8\\uceec", "\\uae30\\ud638\\uc5d0", "\\ub9de\\ub294", "\\ub2e8\\uc77c",
271 "\\uae30\\ud638\\ud654", "\\ubc29\\ubc95\\uc744", "\\uac16\\uace0", "\\uc788\\uc9c0",
272 "\\ubabb\\ud558\\uc600\\uc2b5\\ub2c8\\ub2e4.",
274 "\\uc774\\ub7ec\\ud55c", "\\uae30\\ud638\\ud654", "\\uc2dc\\uc2a4\\ud15c\\uc740",
275 "\\ub610\\ud55c", "\\ub2e4\\ub978", "\\uae30\\ud638\\ud654", "\\uc2dc\\uc2a4\\ud15c\\uacfc",
276 "\\ucda9\\ub3cc\\ud569\\ub2c8\\ub2e4.", "\\uc989", "\\ub450", "\\uac00\\uc9c0",
277 "\\uae30\\ud638\\ud654", "\\ubc29\\ubc95\\uc774", "\\ub450", "\\uac1c\\uc758", "\\ub2e4\\ub978",
278 "\\ubb38\\uc790\\uc5d0", "\\ub300\\ud574", "\\uac19\\uc740", "\\ubc88\\ud638\\ub97c",
279 "\\uc0ac\\uc6a9\\ud558\\uac70\\ub098", "\\uac19\\uc740", "\\ubb38\\uc790\\uc5d0",
280 "\\ub300\\ud574", "\\ub2e4\\ub978", "\\ubc88\\ud638\\ub97c", "\\uc0ac\\uc6a9\\ud560", "\\uc218",
281 "\\uc788\\uc2b5\\ub2c8\\ub2e4.", "\\uc8fc\\uc5b4\\uc9c4", "\\ubaa8\\ub4e0",
282 "\\ucef4\\ud4e8\\ud130(\\ud2b9\\ud788", "\\uc11c\\ubc84)\\ub294", "\\uc11c\\ub85c",
283 "\\ub2e4\\ub978", "\\uc5ec\\ub7ec", "\\uac00\\uc9c0", "\\uae30\\ud638\\ud654",
284 "\\ubc29\\ubc95\\uc744", "\\uc9c0\\uc6d0\\ud574\\uc57c",
285 "\\ud569\\ub2c8\\ub2e4.", "\\uadf8\\ub7ec\\ub098,", "\\ub370\\uc774\\ud130\\ub97c",
286 "\\uc11c\\ub85c", "\\ub2e4\\ub978", "\\uae30\\ud638\\ud654", "\\ubc29\\ubc95\\uc774\\ub098",
287 "\\ud50c\\ub7ab\\ud3fc", "\\uac04\\uc5d0", "\\uc804\\ub2ec\\ud560", "\\ub54c\\ub9c8\\ub2e4",
288 "\\uadf8", "\\ub370\\uc774\\ud130\\ub294", "\\ud56d\\uc0c1", "\\uc190\\uc0c1\\uc758",
289 "\\uc704\\ud5d8\\uc744", "\\uacaa\\uac8c", "\\ub429\\ub2c8\\ub2e4.",
291 "\\uc720\\ub2c8\\ucf54\\ub4dc\\ub85c", "\\ubaa8\\ub4e0", "\\uac83\\uc744",
292 "\\ud574\\uacb0\\ud560", "\\uc218", "\\uc788\\uc2b5\\ub2c8\\ub2e4!",
293 "\\uc720\\ub2c8\\ucf54\\ub4dc\\ub294", "\\uc0ac\\uc6a9", "\\uc911\\uc778",
294 "\\ud50c\\ub7ab\\ud3fc,", "\\ud504\\ub85c\\uadf8\\ub7a8,", "\\uc5b8\\uc5b4\\uc5d0",
295 "\\uad00\\uacc4\\uc5c6\\uc774", "\\ubb38\\uc790\\ub9c8\\ub2e4", "\\uace0\\uc720\\ud55c",
296 "\\uc22b\\uc790\\ub97c",
297 "\\uc81c\\uacf5\\ud569\\ub2c8\\ub2e4.", "\\uc720\\ub2c8\\ucf54\\ub4dc",
298 "\\ud45c\\uc900\\uc740", // "Apple, HP, IBM, JustSystem, Microsoft, Oracle, SAP, "
299 // "Sun, Sybase, Unisys "
300 "\\ubc0f", "\\uae30\\ud0c0", "\\uc5ec\\ub7ec",
301 "\\ud68c\\uc0ac\\uc640", "\\uac19\\uc740", "\\uc5c5\\uacc4",
302 "\\uc120\\ub450\\uc8fc\\uc790\\uc5d0", "\\uc758\\ud574",
303 "\\ucc44\\ud0dd\\ub418\\uc5c8\\uc2b5\\ub2c8\\ub2e4.", "\\uc720\\ub2c8\\ucf54\\ub4dc\\ub294",
304 // "XML, Java, ECMAScript(JavaScript), LDAP, CORBA 3.0, WML "
306 "\\uac19\\uc774", "\\ud604\\uc7ac", "\\ub110\\ub9ac", "\\uc0ac\\uc6a9\\ub418\\ub294",
307 "\\ud45c\\uc900\\uc5d0\\uc11c", "\\ud544\\uc694\\ud558\\uba70", "\\uc774\\ub294", // "ISO/IEC",
308 "10646\\uc744", "\\uad6c\\ud604\\ud558\\ub294", "\\uacf5\\uc2dd\\uc801\\uc778",
309 "\\ubc29\\ubc95\\uc785\\ub2c8\\ub2e4.", "\\uc774\\ub294", "\\ub9ce\\uc740", "\\uc6b4\\uc601",
310 "\\uccb4\\uc81c,", "\\uc694\\uc998", "\\uc0ac\\uc6a9\\ub418\\ub294", "\\ubaa8\\ub4e0",
311 "\\ube0c\\ub77c\\uc6b0\\uc800", "\\ubc0f", "\\uae30\\ud0c0", "\\ub9ce\\uc740",
312 "\\uc81c\\ud488\\uc5d0\\uc11c",
313 "\\uc9c0\\uc6d0\\ub429\\ub2c8\\ub2e4.", "\\uc720\\ub2c8\\ucf54\\ub4dc",
314 "\\ud45c\\uc900\\uc758", "\\ubd80\\uc0c1\\uacfc", "\\uc774\\ub97c",
315 "\\uc9c0\\uc6d0\\ud558\\ub294", "\\ub3c4\\uad6c\\uc758", "\\uac00\\uc6a9\\uc131\\uc740",
316 "\\ucd5c\\uadfc", "\\uc804", "\\uc138\\uacc4\\uc5d0", "\\ubd88\\uace0", "\\uc788\\ub294",
317 "\\uae30\\uc220", "\\uacbd\\ud5a5\\uc5d0\\uc11c", "\\uac00\\uc7a5", "\\uc911\\uc694\\ud55c",
318 "\\ubd80\\ubd84\\uc744", "\\ucc28\\uc9c0\\ud558\\uace0", "\\uc788\\uc2b5\\ub2c8\\ub2e4.",
320 "\\uc720\\ub2c8\\ucf54\\ub4dc\\ub97c",
321 // Replaced a hyphen with a space to make the test case work with CLDR1.5
322 //"\\ud074\\ub77c\\uc774\\uc5b8\\ud2b8-\\uc11c\\ubc84", "\\ub610\\ub294",
323 "\\ud074\\ub77c\\uc774\\uc5b8\\ud2b8 \\uc11c\\ubc84", "\\ub610\\ub294",
324 // Replaced a hyphen with a space.
325 //"\\ub2e4\\uc911-\\uc5f0\\uacb0", "\\uc751\\uc6a9", "\\ud504\\ub85c\\uadf8\\ub7a8\\uacfc",
326 "\\ub2e4\\uc911 \\uc5f0\\uacb0", "\\uc751\\uc6a9", "\\ud504\\ub85c\\uadf8\\ub7a8\\uacfc",
327 "\\uc6f9", "\\uc0ac\\uc774\\ud2b8\\uc5d0", "\\ud1b5\\ud569\\ud558\\uba74",
328 "\\ub808\\uac70\\uc2dc", "\\ubb38\\uc790", "\\uc138\\ud2b8", "\\uc0ac\\uc6a9\\uc5d0",
329 "\\uc788\\uc5b4\\uc11c", "\\uc0c1\\ub2f9\\ud55c", "\\ube44\\uc6a9", "\\uc808\\uac10",
330 "\\ud6a8\\uacfc\\uac00",
331 "\\ub098\\ud0c0\\ub0a9\\ub2c8\\ub2e4.", "\\uc720\\ub2c8\\ucf54\\ub4dc\\ub97c",
332 "\\ud1b5\\ud574", "\\ub9ac\\uc5d4\\uc9c0\\ub2c8\\uc5b4\\ub9c1", "\\uc5c6\\uc774",
333 "\\ub2e4\\uc911", "\\ud50c\\ub7ab\\ud3fc,", "\\uc5b8\\uc5b4", "\\ubc0f", "\\uad6d\\uac00",
334 "\\uac04\\uc5d0", "\\ub2e8\\uc77c", "\\uc18c\\ud504\\ud2b8\\uc6e8\\uc5b4",
335 "\\ud50c\\ub7ab\\ud3fc", "\\ub610\\ub294", "\\ub2e8\\uc77c", "\\uc6f9",
336 "\\uc0ac\\uc774\\ud2b8\\ub97c", "\\ubaa9\\ud45c\\ub85c", "\\uc0bc\\uc744", "\\uc218",
337 "\\uc788\\uc2b5\\ub2c8\\ub2e4.", "\\uc774\\ub97c", "\\uc0ac\\uc6a9\\ud558\\uba74",
338 "\\ub370\\uc774\\ud130\\ub97c", "\\uc190\\uc0c1", "\\uc5c6\\uc774", "\\uc5ec\\ub7ec",
339 "\\uc2dc\\uc2a4\\ud15c\\uc744", "\\ud1b5\\ud574", "\\uc804\\uc1a1\\ud560", "\\uc218",
340 "\\uc788\\uc2b5\\ub2c8\\ub2e4.",
342 "\\uc720\\ub2c8\\ucf54\\ub4dc", "\\ucf58\\uc18c\\uc2dc\\uc5c4\\uc5d0", "\\ub300\\ud574",
343 "\\uc720\\ub2c8\\ucf54\\ub4dc", "\\ucf58\\uc18c\\uc2dc\\uc5c4\\uc740",
344 "\\ube44\\uc601\\ub9ac", "\\uc870\\uc9c1\\uc73c\\ub85c\\uc11c", "\\ud604\\ub300",
345 "\\uc18c\\ud504\\ud2b8\\uc6e8\\uc5b4", "\\uc81c\\ud488\\uacfc",
346 "\\ud45c\\uc900\\uc5d0\\uc11c", "\\ud14d\\uc2a4\\ud2b8\\uc758", "\\ud45c\\ud604\\uc744",
347 "\\uc9c0\\uc815\\ud558\\ub294", "\\uc720\\ub2c8\\ucf54\\ub4dc", "\\ud45c\\uc900\\uc758",
348 "\\uc0ac\\uc6a9\\uc744", "\\uac1c\\ubc1c\\ud558\\uace0", "\\ud655\\uc7a5\\ud558\\uba70",
349 "\\uc7a5\\ub824\\ud558\\uae30", "\\uc704\\ud574",
350 "\\uc138\\uc6cc\\uc84c\\uc2b5\\ub2c8\\ub2e4.", "\\ucf58\\uc18c\\uc2dc\\uc5c4",
351 "\\uba64\\ubc84\\uc27d\\uc740", "\\ucef4\\ud4e8\\ud130\\uc640", "\\uc815\\ubcf4",
352 "\\ucc98\\ub9ac", "\\uc0b0\\uc5c5\\uc5d0", "\\uc885\\uc0ac\\ud558\\uace0", "\\uc788\\ub294",
353 "\\uad11\\ubc94\\uc704\\ud55c", "\\ud68c\\uc0ac", "\\ubc0f", "\\uc870\\uc9c1\\uc758",
354 "\\ubc94\\uc704\\ub97c",
355 "\\ub098\\ud0c0\\ub0c5\\ub2c8\\ub2e4.", "\\ucf58\\uc18c\\uc2dc\\uc5c4\\uc758",
356 "\\uc7ac\\uc815\\uc740", "\\uc804\\uc801\\uc73c\\ub85c", "\\ud68c\\ube44\\uc5d0",
357 "\\uc758\\ud574", "\\ucda9\\ub2f9\\ub429\\ub2c8\\ub2e4.", "\\uc720\\ub2c8\\ucf54\\ub4dc",
358 "\\ucee8\\uc18c\\uc2dc\\uc5c4\\uc5d0\\uc11c\\uc758", "\\uba64\\ubc84\\uc27d\\uc740",
359 "\\uc804", "\\uc138\\uacc4", "\\uc5b4\\ub290", "\\uacf3\\uc5d0\\uc11c\\ub098",
360 "\\uc720\\ub2c8\\ucf54\\ub4dc", "\\ud45c\\uc900\\uc744", "\\uc9c0\\uc6d0\\ud558\\uace0",
361 "\\uadf8", "\\ud655\\uc7a5\\uacfc", "\\uad6c\\ud604\\uc744",
362 "\\uc9c0\\uc6d0\\ud558\\uace0\\uc790\\ud558\\ub294", "\\uc870\\uc9c1\\uacfc",
363 "\\uac1c\\uc778\\uc5d0\\uac8c", "\\uac1c\\ubc29\\ub418\\uc5b4",
364 "\\uc788\\uc2b5\\ub2c8\\ub2e4.",
366 "\\ub354", "\\uc790\\uc138\\ud55c", "\\ub0b4\\uc6a9\\uc740", "\\uc6a9\\uc5b4\\uc9d1,",
367 "\\uc608\\uc81c", "\\uc720\\ub2c8\\ucf54\\ub4dc", "\\uc0ac\\uc6a9", "\\uac00\\ub2a5",
368 "\\uc81c\\ud488,", "\\uae30\\uc220", "\\uc815\\ubcf4", "\\ubc0f", "\\uae30\\ud0c0",
369 "\\uc720\\uc6a9\\ud55c", "\\uc815\\ubcf4\\ub97c",
370 "\\ucc38\\uc870\\ud558\\uc2ed\\uc2dc\\uc624."
373 enum { WHAT_IS_UNICODE_length
= UPRV_LENGTHOF(WHAT_IS_UNICODE
) };
375 UParseError parseError
;
376 UErrorCode status
= U_ZERO_ERROR
;
377 Transliterator
* latinJamo
= Transliterator::createInstance("Latin-Jamo", UTRANS_FORWARD
, parseError
, status
);
378 Transliterator
* jamoHangul
= Transliterator::createInstance("NFC(NFD)", UTRANS_FORWARD
, parseError
, status
);
379 if (latinJamo
== 0 || jamoHangul
== 0 || U_FAILURE(status
)) {
382 dataerrln("FAIL: createInstance returned NULL - %s", u_errorName(status
));
385 Transliterator
* jamoLatin
= latinJamo
->createInverse(status
);
386 Transliterator
* hangulJamo
= jamoHangul
->createInverse(status
);
387 if (jamoLatin
== 0 || hangulJamo
== 0) {
388 errln("FAIL: createInverse returned NULL");
396 Transliterator
* tarray
[4] =
397 { hangulJamo
, jamoLatin
, latinJamo
, jamoHangul
};
398 CompoundTransliterator
rt(tarray
, 4);
404 for (i
=0; i
< WHAT_IS_UNICODE_length
; ++i
) {
406 UnicodeString hangul
= UnicodeString(WHAT_IS_UNICODE
[i
], -1, US_INV
);
407 hangul
= hangul
.unescape(); // Parse backslash-u escapes
408 UnicodeString hangulX
= hangul
;
409 rt
.transliterate(hangulX
);
410 if (hangul
!= hangulX
) {
412 UnicodeString jamo
= hangul
; hangulJamo
->transliterate(jamo
);
413 UnicodeString latin
= jamo
; jamoLatin
->transliterate(latin
);
414 UnicodeString jamo2
= latin
; latinJamo
->transliterate(jamo2
);
415 UnicodeString hangul2
= jamo2
; jamoHangul
->transliterate(hangul2
);
418 buf
.append("FAIL: ");
419 if (hangul2
!= hangulX
) {
420 buf
.append((UnicodeString
)"(Weird: " + hangulX
+ " != " + hangul2
+ ")");
422 // The Hangul-Jamo conversion is not usually the
423 // bug here, so we hide it from display.
424 // Uncomment lines to see the Hangul.
425 buf
.append(//hangul + " => " +
426 jamoToName(jamo
) + " => " +
427 latin
+ " => " + jamoToName(jamo2
)
430 errln(prettify(buf
));
434 errln((UnicodeString
)"Test word failures: " + errors
+ " out of " + total
);
436 logln((UnicodeString
)"All " + total
+ " test words passed");
445 // Override TransliteratorTest
447 JamoTest::expectAux(const UnicodeString
& tag
,
448 const UnicodeString
& summary
, UBool pass
,
449 const UnicodeString
& expectedResult
) {
450 UnicodeString jsum
= jamoToName(summary
);
451 UnicodeString jexp
= jamoToName(expectedResult
);
452 TransliteratorTest::expectAux(tag
, jsum
, pass
, jexp
);
455 const char* JamoTest::JAMO_NAMES_RULES
=
457 "'(GGi)' <> \\u1101;"
466 "'(SSi)' <> \\u110A;"
467 "'(IEUNG)' <> \\u110B;"
479 "'(YAE)' <> \\u1164;"
482 "'(YEO)' <> \\u1167;"
486 "'(WAE)' <> \\u116B;"
490 "'(WEO)' <> \\u116F;"
499 "'(GGf)' <> \\u11A9;"
517 "'(SSf)' <> \\u11BB;"
524 "'(Hf)' <> \\u11C2;";
527 * Convert short names to actual jamo. E.g., "x(LG)y" returns
528 * "x\u11B0y". See JAMO_NAMES for table of names.
531 JamoTest::nameToJamo(const UnicodeString
& input
) {
532 if (NAME_JAMO
== 0) {
533 errln("Failed to create NAME_JAMO");
534 return input
; /* failure! */
536 UnicodeString
result(input
);
537 NAME_JAMO
->transliterate(result
);
542 * Convert jamo to short names. E.g., "x\u11B0y" returns
543 * "x(LG)y". See JAMO_NAMES for table of names.
546 JamoTest::jamoToName(const UnicodeString
& input
) {
547 if (NAME_JAMO
== 0) {
548 errln("Failed to create NAME_JAMO");
549 return input
; /* failure! */
551 UnicodeString
result(input
);
552 JAMO_NAME
->transliterate(result
);
556 #endif /* #if !UCONFIG_NO_TRANSLITERATION */