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