xref: /aosp_15_r20/external/icu/icu4c/source/test/intltest/jamotest.cpp (revision 0e209d3975ff4a8c132096b14b0e9364a753506e)
1*0e209d39SAndroid Build Coastguard Worker // © 2016 and later: Unicode, Inc. and others.
2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html
3*0e209d39SAndroid Build Coastguard Worker /********************************************************************
4*0e209d39SAndroid Build Coastguard Worker  * COPYRIGHT:
5*0e209d39SAndroid Build Coastguard Worker  * Copyright (c) 1997-2016, International Business Machines Corporation and
6*0e209d39SAndroid Build Coastguard Worker  * others. All Rights Reserved.
7*0e209d39SAndroid Build Coastguard Worker  ********************************************************************
8*0e209d39SAndroid Build Coastguard Worker ************************************************************************
9*0e209d39SAndroid Build Coastguard Worker *   Date        Name        Description
10*0e209d39SAndroid Build Coastguard Worker *   02/28/2001  aliu        Creation
11*0e209d39SAndroid Build Coastguard Worker *   03/01/2001  George      port to HP/UX
12*0e209d39SAndroid Build Coastguard Worker ************************************************************************/
13*0e209d39SAndroid Build Coastguard Worker 
14*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h"
15*0e209d39SAndroid Build Coastguard Worker 
16*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_TRANSLITERATION
17*0e209d39SAndroid Build Coastguard Worker 
18*0e209d39SAndroid Build Coastguard Worker #include "jamotest.h"
19*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h"
20*0e209d39SAndroid Build Coastguard Worker #include "unicode/translit.h"
21*0e209d39SAndroid Build Coastguard Worker #include "cmemory.h"
22*0e209d39SAndroid Build Coastguard Worker #include "cpdtrans.h"
23*0e209d39SAndroid Build Coastguard Worker 
24*0e209d39SAndroid Build Coastguard Worker // SEP is the disambiguation separator used by Latin-Jamo and Jamo-Latin
25*0e209d39SAndroid Build Coastguard Worker #define SEP "-"
26*0e209d39SAndroid Build Coastguard Worker 
JamoTest()27*0e209d39SAndroid Build Coastguard Worker JamoTest::JamoTest()
28*0e209d39SAndroid Build Coastguard Worker {
29*0e209d39SAndroid Build Coastguard Worker     UParseError parseError;
30*0e209d39SAndroid Build Coastguard Worker     UErrorCode status = U_ZERO_ERROR;
31*0e209d39SAndroid Build Coastguard Worker     NAME_JAMO = Transliterator::createFromRules("Name-Jamo",
32*0e209d39SAndroid Build Coastguard Worker                                             UnicodeString(JAMO_NAMES_RULES, -1, US_INV),
33*0e209d39SAndroid Build Coastguard Worker                                             UTRANS_FORWARD, parseError, status);
34*0e209d39SAndroid Build Coastguard Worker 
35*0e209d39SAndroid Build Coastguard Worker     if (U_FAILURE(status)) {
36*0e209d39SAndroid Build Coastguard Worker         delete NAME_JAMO;
37*0e209d39SAndroid Build Coastguard Worker         NAME_JAMO = nullptr;
38*0e209d39SAndroid Build Coastguard Worker     }
39*0e209d39SAndroid Build Coastguard Worker     status = U_ZERO_ERROR;
40*0e209d39SAndroid Build Coastguard Worker     JAMO_NAME = Transliterator::createFromRules("Jamo-Name",
41*0e209d39SAndroid Build Coastguard Worker                                             UnicodeString(JAMO_NAMES_RULES, -1, US_INV),
42*0e209d39SAndroid Build Coastguard Worker                                             UTRANS_REVERSE, parseError, status);
43*0e209d39SAndroid Build Coastguard Worker     if (U_FAILURE(status)) {
44*0e209d39SAndroid Build Coastguard Worker         delete JAMO_NAME;
45*0e209d39SAndroid Build Coastguard Worker         JAMO_NAME = nullptr;
46*0e209d39SAndroid Build Coastguard Worker     }
47*0e209d39SAndroid Build Coastguard Worker }
48*0e209d39SAndroid Build Coastguard Worker 
~JamoTest()49*0e209d39SAndroid Build Coastguard Worker JamoTest::~JamoTest()
50*0e209d39SAndroid Build Coastguard Worker {
51*0e209d39SAndroid Build Coastguard Worker     delete NAME_JAMO;
52*0e209d39SAndroid Build Coastguard Worker     delete JAMO_NAME;
53*0e209d39SAndroid Build Coastguard Worker }
54*0e209d39SAndroid Build Coastguard Worker 
55*0e209d39SAndroid Build Coastguard Worker void
runIndexedTest(int32_t index,UBool exec,const char * & name,char *)56*0e209d39SAndroid Build Coastguard Worker JamoTest::runIndexedTest(int32_t index, UBool exec,
57*0e209d39SAndroid Build Coastguard Worker                          const char* &name, char* /*par*/) {
58*0e209d39SAndroid Build Coastguard Worker     switch (index) {
59*0e209d39SAndroid Build Coastguard Worker         TESTCASE(0,TestJamo);
60*0e209d39SAndroid Build Coastguard Worker         TESTCASE(1,TestRealText);
61*0e209d39SAndroid Build Coastguard Worker         TESTCASE(2,TestPiecemeal);
62*0e209d39SAndroid Build Coastguard Worker         default: name = ""; break;
63*0e209d39SAndroid Build Coastguard Worker     }
64*0e209d39SAndroid Build Coastguard Worker }
65*0e209d39SAndroid Build Coastguard Worker 
66*0e209d39SAndroid Build Coastguard Worker void
TestJamo()67*0e209d39SAndroid Build Coastguard Worker JamoTest::TestJamo() {
68*0e209d39SAndroid Build Coastguard Worker     UParseError parseError;
69*0e209d39SAndroid Build Coastguard Worker     UErrorCode status = U_ZERO_ERROR;
70*0e209d39SAndroid Build Coastguard Worker     Transliterator* latinJamo = Transliterator::createInstance("Latin-Jamo", UTRANS_FORWARD, parseError, status);
71*0e209d39SAndroid Build Coastguard Worker 
72*0e209d39SAndroid Build Coastguard Worker     if (latinJamo == nullptr || U_FAILURE(status)) {
73*0e209d39SAndroid Build Coastguard Worker         dataerrln("FAIL: createInstance() returned 0 - %s", u_errorName(status));
74*0e209d39SAndroid Build Coastguard Worker         return;
75*0e209d39SAndroid Build Coastguard Worker     }
76*0e209d39SAndroid Build Coastguard Worker 
77*0e209d39SAndroid Build Coastguard Worker     Transliterator* jamoLatin = latinJamo->createInverse(status);
78*0e209d39SAndroid Build Coastguard Worker 
79*0e209d39SAndroid Build Coastguard Worker     if (jamoLatin == nullptr) {
80*0e209d39SAndroid Build Coastguard Worker         delete latinJamo;
81*0e209d39SAndroid Build Coastguard Worker         errln("FAIL: createInverse() returned 0");
82*0e209d39SAndroid Build Coastguard Worker         return;
83*0e209d39SAndroid Build Coastguard Worker     }
84*0e209d39SAndroid Build Coastguard Worker 
85*0e209d39SAndroid Build Coastguard Worker     static const char* CASE[] = {
86*0e209d39SAndroid Build Coastguard Worker         // Column 1 is the latin text L1 to be fed to Latin-Jamo
87*0e209d39SAndroid Build Coastguard Worker         // to yield output J.
88*0e209d39SAndroid Build Coastguard Worker 
89*0e209d39SAndroid Build Coastguard Worker         // Column 2 is expected value of J.  J is fed to
90*0e209d39SAndroid Build Coastguard Worker         // Jamo-Latin to yield output L2.
91*0e209d39SAndroid Build Coastguard Worker 
92*0e209d39SAndroid Build Coastguard Worker         // Column 3 is expected value of L2.  If the expected
93*0e209d39SAndroid Build Coastguard Worker         // value of L2 is L1, then L2 is nullptr.
94*0e209d39SAndroid Build Coastguard Worker 
95*0e209d39SAndroid Build Coastguard Worker                 // add tests for the update to fix problems where it didn't follow the standard
96*0e209d39SAndroid Build Coastguard Worker                 // see also http://www.unicode.org/cldr/data/charts/transforms/Latin-Hangul.html
97*0e209d39SAndroid Build Coastguard Worker                 "gach", "(Gi)(A)(Cf)", nullptr,
98*0e209d39SAndroid Build Coastguard Worker                 "geumhui", "(Gi)(EU)(Mf)(Hi)(YI)", nullptr,
99*0e209d39SAndroid Build Coastguard Worker                 "choe", "(Ci)(OE)", nullptr,
100*0e209d39SAndroid Build Coastguard Worker                 "wo", "(IEUNG)(WEO)", nullptr,
101*0e209d39SAndroid Build Coastguard Worker                 "Wonpil", "(IEUNG)(WEO)(Nf)(Pi)(I)(L)", "wonpil",
102*0e209d39SAndroid Build Coastguard Worker                 "GIPPEUM", "(Gi)(I)(BB)(EU)(Mf)", "gippeum",
103*0e209d39SAndroid Build Coastguard Worker                 "EUTTEUM", "(IEUNG)(EU)(DD)(EU)(Mf)", "eutteum",
104*0e209d39SAndroid Build Coastguard Worker                 "KKOTNAE", "(GGi)(O)(Tf)(Ni)(AE)", "kkotnae",
105*0e209d39SAndroid Build Coastguard Worker                 "gaga", "(Gi)(A)(Gi)(A)", nullptr,
106*0e209d39SAndroid Build Coastguard Worker                 "gag-a", "(Gi)(A)(Gf)(IEUNG)(A)", nullptr,
107*0e209d39SAndroid Build Coastguard Worker                 "gak-ka", "(Gi)(A)(Kf)(Ki)(A)", nullptr,
108*0e209d39SAndroid Build Coastguard Worker                 "gakka", "(Gi)(A)(GGi)(A)", nullptr,
109*0e209d39SAndroid Build Coastguard Worker                 "gakk-a", "(Gi)(A)(GGf)(IEUNG)(A)", nullptr,
110*0e209d39SAndroid Build Coastguard Worker                 "gakkka", "(Gi)(A)(GGf)(Ki)(A)", nullptr,
111*0e209d39SAndroid Build Coastguard Worker                 "gak-kka", "(Gi)(A)(Kf)(GGi)(A)", nullptr,
112*0e209d39SAndroid Build Coastguard Worker 
113*0e209d39SAndroid Build Coastguard Worker         "bab", "(Bi)(A)(Bf)", nullptr,
114*0e209d39SAndroid Build Coastguard Worker         "babb", "(Bi)(A)(Bf)(Bi)(EU)", "babbeu",
115*0e209d39SAndroid Build Coastguard Worker         "babbba", "(Bi)(A)(Bf)(Bi)(EU)(Bi)(A)", "babbeuba",
116*0e209d39SAndroid Build Coastguard Worker         "bagg", "(Bi)(A)(Gf)(Gi)(EU)", "baggeu",
117*0e209d39SAndroid Build Coastguard Worker         "baggga", "(Bi)(A)(Gf)(Gi)(EU)(Gi)(A)", "baggeuga",
118*0e209d39SAndroid Build Coastguard Worker         //"bag" SEP "gga", "(Bi)(A)(Gf)" SEP "(Gi)(EU)(Gi)(A)", "bag" SEP "geuga",
119*0e209d39SAndroid Build Coastguard Worker         "kabsa", "(Ki)(A)(Bf)(Si)(A)", nullptr,
120*0e209d39SAndroid Build Coastguard Worker         "kabska", "(Ki)(A)(BS)(Ki)(A)", nullptr,
121*0e209d39SAndroid Build Coastguard Worker         "gabsbka", "(Gi)(A)(BS)(Bi)(EU)(Ki)(A)", "gabsbeuka", // not (Kf)
122*0e209d39SAndroid Build Coastguard Worker         "gga", "(Gi)(EU)(Gi)(A)", "geuga",
123*0e209d39SAndroid Build Coastguard Worker         "bsa", "(Bi)(EU)(Si)(A)", "beusa",
124*0e209d39SAndroid Build Coastguard Worker         "agg", "(IEUNG)(A)(Gf)(Gi)(EU)", "aggeu",
125*0e209d39SAndroid Build Coastguard Worker         "agga", "(IEUNG)(A)(Gf)(Gi)(A)", nullptr,
126*0e209d39SAndroid Build Coastguard Worker         "la", "(R)(A)", nullptr,
127*0e209d39SAndroid Build Coastguard Worker         "bs", "(Bi)(EU)(Sf)", "beus",
128*0e209d39SAndroid Build Coastguard Worker         "kalgga", "(Ki)(A)(L)(Gi)(EU)(Gi)(A)", "kalgeuga",
129*0e209d39SAndroid Build Coastguard Worker 
130*0e209d39SAndroid Build Coastguard Worker         // 'r' in a final position is treated like 'l'
131*0e209d39SAndroid Build Coastguard Worker         "karka", "(Ki)(A)(L)(Ki)(A)", "kalka",
132*0e209d39SAndroid Build Coastguard Worker     };
133*0e209d39SAndroid Build Coastguard Worker 
134*0e209d39SAndroid Build Coastguard Worker     enum { CASE_length = UPRV_LENGTHOF(CASE) };
135*0e209d39SAndroid Build Coastguard Worker 
136*0e209d39SAndroid Build Coastguard Worker     int32_t i;
137*0e209d39SAndroid Build Coastguard Worker     for (i=0; i<CASE_length; i+=3) {
138*0e209d39SAndroid Build Coastguard Worker         UnicodeString jamo = nameToJamo(CASE[i+1]);
139*0e209d39SAndroid Build Coastguard Worker         if (CASE[i+2] == nullptr) {
140*0e209d39SAndroid Build Coastguard Worker             expect(*latinJamo, CASE[i], jamo, *jamoLatin);
141*0e209d39SAndroid Build Coastguard Worker         } else {
142*0e209d39SAndroid Build Coastguard Worker             // Handle case where round-trip is expected to fail
143*0e209d39SAndroid Build Coastguard Worker             expect(*latinJamo, CASE[i], jamo);
144*0e209d39SAndroid Build Coastguard Worker             expect(*jamoLatin, jamo, CASE[i+2]);
145*0e209d39SAndroid Build Coastguard Worker         }
146*0e209d39SAndroid Build Coastguard Worker     }
147*0e209d39SAndroid Build Coastguard Worker 
148*0e209d39SAndroid Build Coastguard Worker     delete latinJamo;
149*0e209d39SAndroid Build Coastguard Worker     delete jamoLatin;
150*0e209d39SAndroid Build Coastguard Worker }
151*0e209d39SAndroid Build Coastguard Worker 
152*0e209d39SAndroid Build Coastguard Worker /**
153*0e209d39SAndroid Build Coastguard Worker  * Test various step-at-a-time transformation of hangul to jamo to
154*0e209d39SAndroid Build Coastguard Worker  * latin and back.
155*0e209d39SAndroid Build Coastguard Worker  */
TestPiecemeal()156*0e209d39SAndroid Build Coastguard Worker void JamoTest::TestPiecemeal() {
157*0e209d39SAndroid Build Coastguard Worker     UnicodeString hangul; hangul.append((char16_t)0xBC0F);
158*0e209d39SAndroid Build Coastguard Worker     UnicodeString jamo = nameToJamo("(Mi)(I)(Cf)");
159*0e209d39SAndroid Build Coastguard Worker     UnicodeString latin("mic");
160*0e209d39SAndroid Build Coastguard Worker     UnicodeString latin2("mich");
161*0e209d39SAndroid Build Coastguard Worker 
162*0e209d39SAndroid Build Coastguard Worker     Transliterator *t = nullptr;
163*0e209d39SAndroid Build Coastguard Worker     UErrorCode status = U_ZERO_ERROR;
164*0e209d39SAndroid Build Coastguard Worker 
165*0e209d39SAndroid Build Coastguard Worker     t = Transliterator::createInstance("NFD", UTRANS_FORWARD, status); // was Hangul-Jamo
166*0e209d39SAndroid Build Coastguard Worker     if (U_FAILURE(status) || t == nullptr) {
167*0e209d39SAndroid Build Coastguard Worker         dataerrln("FAIL: createInstance failed");
168*0e209d39SAndroid Build Coastguard Worker         return;
169*0e209d39SAndroid Build Coastguard Worker     }
170*0e209d39SAndroid Build Coastguard Worker     expect(*t, hangul, jamo);
171*0e209d39SAndroid Build Coastguard Worker     delete t;
172*0e209d39SAndroid Build Coastguard Worker 
173*0e209d39SAndroid Build Coastguard Worker     t = Transliterator::createInstance("NFC", UTRANS_FORWARD, status); // was Jamo-Hangul
174*0e209d39SAndroid Build Coastguard Worker     if (U_FAILURE(status) || t == nullptr) {
175*0e209d39SAndroid Build Coastguard Worker         errln("FAIL: createInstance failed");
176*0e209d39SAndroid Build Coastguard Worker         return;
177*0e209d39SAndroid Build Coastguard Worker     }
178*0e209d39SAndroid Build Coastguard Worker     expect(*t, jamo, hangul);
179*0e209d39SAndroid Build Coastguard Worker     delete t;
180*0e209d39SAndroid Build Coastguard Worker 
181*0e209d39SAndroid Build Coastguard Worker     t = Transliterator::createInstance("Latin-Jamo", UTRANS_FORWARD, status);
182*0e209d39SAndroid Build Coastguard Worker     if (U_FAILURE(status) || t == nullptr) {
183*0e209d39SAndroid Build Coastguard Worker         dataerrln("FAIL: createInstance failed - %s", u_errorName(status));
184*0e209d39SAndroid Build Coastguard Worker         return;
185*0e209d39SAndroid Build Coastguard Worker     }
186*0e209d39SAndroid Build Coastguard Worker     expect(*t, latin, jamo);
187*0e209d39SAndroid Build Coastguard Worker     delete t;
188*0e209d39SAndroid Build Coastguard Worker 
189*0e209d39SAndroid Build Coastguard Worker     t = Transliterator::createInstance("Jamo-Latin", UTRANS_FORWARD, status);
190*0e209d39SAndroid Build Coastguard Worker     if (U_FAILURE(status) || t == nullptr) {
191*0e209d39SAndroid Build Coastguard Worker         errln("FAIL: createInstance failed");
192*0e209d39SAndroid Build Coastguard Worker         return;
193*0e209d39SAndroid Build Coastguard Worker     }
194*0e209d39SAndroid Build Coastguard Worker     expect(*t, jamo, latin2);
195*0e209d39SAndroid Build Coastguard Worker     delete t;
196*0e209d39SAndroid Build Coastguard Worker 
197*0e209d39SAndroid Build Coastguard Worker     t = Transliterator::createInstance("Hangul-Latin", UTRANS_FORWARD, status);
198*0e209d39SAndroid Build Coastguard Worker     if (U_FAILURE(status) || t == nullptr) {
199*0e209d39SAndroid Build Coastguard Worker         errln("FAIL: createInstance failed");
200*0e209d39SAndroid Build Coastguard Worker         return;
201*0e209d39SAndroid Build Coastguard Worker     }
202*0e209d39SAndroid Build Coastguard Worker     expect(*t, hangul, latin2);
203*0e209d39SAndroid Build Coastguard Worker     delete t;
204*0e209d39SAndroid Build Coastguard Worker 
205*0e209d39SAndroid Build Coastguard Worker     t = Transliterator::createInstance("Latin-Hangul", UTRANS_FORWARD, status);
206*0e209d39SAndroid Build Coastguard Worker     if (U_FAILURE(status) || t == nullptr) {
207*0e209d39SAndroid Build Coastguard Worker         errln("FAIL: createInstance failed");
208*0e209d39SAndroid Build Coastguard Worker         return;
209*0e209d39SAndroid Build Coastguard Worker     }
210*0e209d39SAndroid Build Coastguard Worker     expect(*t, latin, hangul);
211*0e209d39SAndroid Build Coastguard Worker     delete t;
212*0e209d39SAndroid Build Coastguard Worker 
213*0e209d39SAndroid Build Coastguard Worker     t = Transliterator::createInstance("Hangul-Latin; Latin-Jamo", UTRANS_FORWARD, status);
214*0e209d39SAndroid Build Coastguard Worker     if (U_FAILURE(status) || t == nullptr) {
215*0e209d39SAndroid Build Coastguard Worker         errln("FAIL: createInstance failed");
216*0e209d39SAndroid Build Coastguard Worker         return;
217*0e209d39SAndroid Build Coastguard Worker     }
218*0e209d39SAndroid Build Coastguard Worker     expect(*t, hangul, jamo);
219*0e209d39SAndroid Build Coastguard Worker     delete t;
220*0e209d39SAndroid Build Coastguard Worker 
221*0e209d39SAndroid Build Coastguard Worker     t = Transliterator::createInstance("Jamo-Latin; Latin-Hangul", UTRANS_FORWARD, status);
222*0e209d39SAndroid Build Coastguard Worker     if (U_FAILURE(status) || t == nullptr) {
223*0e209d39SAndroid Build Coastguard Worker         errln("FAIL: createInstance failed");
224*0e209d39SAndroid Build Coastguard Worker         return;
225*0e209d39SAndroid Build Coastguard Worker     }
226*0e209d39SAndroid Build Coastguard Worker     expect(*t, jamo, hangul);
227*0e209d39SAndroid Build Coastguard Worker     delete t;
228*0e209d39SAndroid Build Coastguard Worker 
229*0e209d39SAndroid Build Coastguard Worker     t = Transliterator::createInstance("Hangul-Latin; Latin-Hangul", UTRANS_FORWARD, status);
230*0e209d39SAndroid Build Coastguard Worker     if (U_FAILURE(status) || t == nullptr) {
231*0e209d39SAndroid Build Coastguard Worker         errln("FAIL: createInstance failed");
232*0e209d39SAndroid Build Coastguard Worker         return;
233*0e209d39SAndroid Build Coastguard Worker     }
234*0e209d39SAndroid Build Coastguard Worker     expect(*t, hangul, hangul);
235*0e209d39SAndroid Build Coastguard Worker     delete t;
236*0e209d39SAndroid Build Coastguard Worker }
237*0e209d39SAndroid Build Coastguard Worker 
238*0e209d39SAndroid Build Coastguard Worker void
TestRealText()239*0e209d39SAndroid Build Coastguard Worker JamoTest::TestRealText() {
240*0e209d39SAndroid Build Coastguard Worker     // Test text taken from the Unicode web site
241*0e209d39SAndroid Build Coastguard Worker      static const char* const WHAT_IS_UNICODE[] = {
242*0e209d39SAndroid Build Coastguard Worker       "\\uc720\\ub2c8\\ucf54\\ub4dc\\uc5d0", "\\ub300\\ud574", "?",
243*0e209d39SAndroid Build Coastguard Worker 
244*0e209d39SAndroid Build Coastguard Worker       "\\uc5b4\\ub5a4", "\\ud50c\\ub7ab\\ud3fc,", "\\uc5b4\\ub5a4",
245*0e209d39SAndroid Build Coastguard Worker       "\\ud504\\ub85c\\uadf8\\ub7a8,", "\\uc5b4\\ub5a4", "\\uc5b8\\uc5b4\\uc5d0\\ub3c4",
246*0e209d39SAndroid Build Coastguard Worker       "\\uc0c1\\uad00\\uc5c6\\uc774", "\\uc720\\ub2c8\\ucf54\\ub4dc\\ub294", "\\ubaa8\\ub4e0",
247*0e209d39SAndroid Build Coastguard Worker       "\\ubb38\\uc790\\uc5d0", "\\ub300\\ud574", "\\uace0\\uc720", "\\ubc88\\ud638\\ub97c",
248*0e209d39SAndroid Build Coastguard Worker       "\\uc81c\\uacf5\\ud569\\ub2c8\\ub2e4.",
249*0e209d39SAndroid Build Coastguard Worker 
250*0e209d39SAndroid Build Coastguard Worker       "\\uae30\\ubcf8\\uc801\\uc73c\\ub85c", "\\ucef4\\ud4e8\\ud130\\ub294",
251*0e209d39SAndroid Build Coastguard Worker       "\\uc22b\\uc790\\ub9cc", "\\ucc98\\ub9ac\\ud569\\ub2c8\\ub2e4.", "\\uae00\\uc790\\ub098",
252*0e209d39SAndroid Build Coastguard Worker       "\\ub2e4\\ub978", "\\ubb38\\uc790\\uc5d0\\ub3c4", "\\uc22b\\uc790\\ub97c",
253*0e209d39SAndroid Build Coastguard Worker       "\\uc9c0\\uc815\\ud558\\uc5ec",
254*0e209d39SAndroid Build Coastguard Worker       "\\uc800\\uc7a5\\ud569\\ub2c8\\ub2e4.", "\\uc720\\ub2c8\\ucf54\\ub4dc\\uac00",
255*0e209d39SAndroid Build Coastguard Worker       "\\uac1c\\ubc1c\\ub418\\uae30", "\\uc804\\uc5d0\\ub294", "\\uc774\\ub7ec\\ud55c",
256*0e209d39SAndroid Build Coastguard Worker       "\\uc22b\\uc790\\ub97c", "\\uc9c0\\uc815\\ud558\\uae30", "\\uc704\\ud574", "\\uc218\\ubc31",
257*0e209d39SAndroid Build Coastguard Worker       "\\uac00\\uc9c0\\uc758", "\\ub2e4\\ub978", "\\uae30\\ud638\\ud654",
258*0e209d39SAndroid Build Coastguard Worker       "\\uc2dc\\uc2a4\\ud15c\\uc744",
259*0e209d39SAndroid Build Coastguard Worker       "\\uc0ac\\uc6a9\\ud588\\uc2b5\\ub2c8\\ub2e4.", "\\ub2e8\\uc77c", "\\uae30\\ud638\\ud654",
260*0e209d39SAndroid Build Coastguard Worker       "\\ubc29\\ubc95\\uc73c\\ub85c\\ub294", "\\ubaa8\\ub4e0", "\\ubb38\\uc790\\ub97c",
261*0e209d39SAndroid Build Coastguard Worker       "\\ud3ec\\ud568\\ud560", "\\uc218", "\\uc5c6\\uc5c8\\uc2b5\\ub2c8\\ub2e4.", "\\uc608\\ub97c",
262*0e209d39SAndroid Build Coastguard Worker       "\\ub4e4\\uc5b4", "\\uc720\\ub7fd", "\\uc5f0\\ud569\\uc5d0\\uc11c\\ub9cc",
263*0e209d39SAndroid Build Coastguard Worker       "\\ubcf4\\ub354\\ub77c\\ub3c4", "\\ubaa8\\ub4e0", "\\uac01", "\\ub098\\ub77c\\ubcc4",
264*0e209d39SAndroid Build Coastguard Worker       "\\uc5b8\\uc5b4\\ub97c", "\\ucc98\\ub9ac\\ud558\\ub824\\uba74", "\\uc5ec\\ub7ec",
265*0e209d39SAndroid Build Coastguard Worker       "\\uac1c\\uc758", "\\ub2e4\\ub978", "\\uae30\\ud638\\ud654", "\\ubc29\\ubc95\\uc774",
266*0e209d39SAndroid Build Coastguard Worker       "\\ud544\\uc694\\ud569\\ub2c8\\ub2e4.", "\\uc601\\uc5b4\\uc640", "\\uac19\\uc740",
267*0e209d39SAndroid Build Coastguard Worker       "\\ub2e8\\uc77c", "\\uc5b8\\uc5b4\\uc758", "\\uacbd\\uc6b0\\ub3c4",
268*0e209d39SAndroid Build Coastguard Worker       "\\uacf5\\ud1b5\\uc801\\uc73c\\ub85c", "\\uc0ac\\uc6a9\\ub418\\ub294", "\\ubaa8\\ub4e0",
269*0e209d39SAndroid Build Coastguard Worker       "\\uae00\\uc790,", "\\ubb38\\uc7a5", "\\ubd80\\ud638", "\\ubc0f",
270*0e209d39SAndroid Build Coastguard Worker       "\\ud14c\\ud06c\\ub2c8\\uceec", "\\uae30\\ud638\\uc5d0", "\\ub9de\\ub294", "\\ub2e8\\uc77c",
271*0e209d39SAndroid Build Coastguard Worker       "\\uae30\\ud638\\ud654", "\\ubc29\\ubc95\\uc744", "\\uac16\\uace0", "\\uc788\\uc9c0",
272*0e209d39SAndroid Build Coastguard Worker       "\\ubabb\\ud558\\uc600\\uc2b5\\ub2c8\\ub2e4.",
273*0e209d39SAndroid Build Coastguard Worker 
274*0e209d39SAndroid Build Coastguard Worker       "\\uc774\\ub7ec\\ud55c", "\\uae30\\ud638\\ud654", "\\uc2dc\\uc2a4\\ud15c\\uc740",
275*0e209d39SAndroid Build Coastguard Worker       "\\ub610\\ud55c", "\\ub2e4\\ub978", "\\uae30\\ud638\\ud654", "\\uc2dc\\uc2a4\\ud15c\\uacfc",
276*0e209d39SAndroid Build Coastguard Worker       "\\ucda9\\ub3cc\\ud569\\ub2c8\\ub2e4.", "\\uc989", "\\ub450", "\\uac00\\uc9c0",
277*0e209d39SAndroid Build Coastguard Worker       "\\uae30\\ud638\\ud654", "\\ubc29\\ubc95\\uc774", "\\ub450", "\\uac1c\\uc758", "\\ub2e4\\ub978",
278*0e209d39SAndroid Build Coastguard Worker       "\\ubb38\\uc790\\uc5d0", "\\ub300\\ud574", "\\uac19\\uc740", "\\ubc88\\ud638\\ub97c",
279*0e209d39SAndroid Build Coastguard Worker       "\\uc0ac\\uc6a9\\ud558\\uac70\\ub098", "\\uac19\\uc740", "\\ubb38\\uc790\\uc5d0",
280*0e209d39SAndroid Build Coastguard Worker       "\\ub300\\ud574", "\\ub2e4\\ub978", "\\ubc88\\ud638\\ub97c", "\\uc0ac\\uc6a9\\ud560", "\\uc218",
281*0e209d39SAndroid Build Coastguard Worker       "\\uc788\\uc2b5\\ub2c8\\ub2e4.", "\\uc8fc\\uc5b4\\uc9c4", "\\ubaa8\\ub4e0",
282*0e209d39SAndroid Build Coastguard Worker       "\\ucef4\\ud4e8\\ud130(\\ud2b9\\ud788", "\\uc11c\\ubc84)\\ub294", "\\uc11c\\ub85c",
283*0e209d39SAndroid Build Coastguard Worker       "\\ub2e4\\ub978", "\\uc5ec\\ub7ec", "\\uac00\\uc9c0", "\\uae30\\ud638\\ud654",
284*0e209d39SAndroid Build Coastguard Worker       "\\ubc29\\ubc95\\uc744", "\\uc9c0\\uc6d0\\ud574\\uc57c",
285*0e209d39SAndroid Build Coastguard Worker       "\\ud569\\ub2c8\\ub2e4.", "\\uadf8\\ub7ec\\ub098,", "\\ub370\\uc774\\ud130\\ub97c",
286*0e209d39SAndroid Build Coastguard Worker       "\\uc11c\\ub85c", "\\ub2e4\\ub978", "\\uae30\\ud638\\ud654", "\\ubc29\\ubc95\\uc774\\ub098",
287*0e209d39SAndroid Build Coastguard Worker       "\\ud50c\\ub7ab\\ud3fc", "\\uac04\\uc5d0", "\\uc804\\ub2ec\\ud560", "\\ub54c\\ub9c8\\ub2e4",
288*0e209d39SAndroid Build Coastguard Worker       "\\uadf8", "\\ub370\\uc774\\ud130\\ub294", "\\ud56d\\uc0c1", "\\uc190\\uc0c1\\uc758",
289*0e209d39SAndroid Build Coastguard Worker       "\\uc704\\ud5d8\\uc744", "\\uacaa\\uac8c", "\\ub429\\ub2c8\\ub2e4.",
290*0e209d39SAndroid Build Coastguard Worker 
291*0e209d39SAndroid Build Coastguard Worker       "\\uc720\\ub2c8\\ucf54\\ub4dc\\ub85c", "\\ubaa8\\ub4e0", "\\uac83\\uc744",
292*0e209d39SAndroid Build Coastguard Worker       "\\ud574\\uacb0\\ud560", "\\uc218", "\\uc788\\uc2b5\\ub2c8\\ub2e4!",
293*0e209d39SAndroid Build Coastguard Worker       "\\uc720\\ub2c8\\ucf54\\ub4dc\\ub294", "\\uc0ac\\uc6a9", "\\uc911\\uc778",
294*0e209d39SAndroid Build Coastguard Worker       "\\ud50c\\ub7ab\\ud3fc,", "\\ud504\\ub85c\\uadf8\\ub7a8,", "\\uc5b8\\uc5b4\\uc5d0",
295*0e209d39SAndroid Build Coastguard Worker       "\\uad00\\uacc4\\uc5c6\\uc774", "\\ubb38\\uc790\\ub9c8\\ub2e4", "\\uace0\\uc720\\ud55c",
296*0e209d39SAndroid Build Coastguard Worker       "\\uc22b\\uc790\\ub97c",
297*0e209d39SAndroid Build Coastguard Worker       "\\uc81c\\uacf5\\ud569\\ub2c8\\ub2e4.", "\\uc720\\ub2c8\\ucf54\\ub4dc",
298*0e209d39SAndroid Build Coastguard Worker       "\\ud45c\\uc900\\uc740", // "Apple, HP, IBM, JustSystem, Microsoft, Oracle, SAP, "
299*0e209d39SAndroid Build Coastguard Worker       // "Sun, Sybase, Unisys "
300*0e209d39SAndroid Build Coastguard Worker       "\\ubc0f", "\\uae30\\ud0c0", "\\uc5ec\\ub7ec",
301*0e209d39SAndroid Build Coastguard Worker       "\\ud68c\\uc0ac\\uc640", "\\uac19\\uc740", "\\uc5c5\\uacc4",
302*0e209d39SAndroid Build Coastguard Worker       "\\uc120\\ub450\\uc8fc\\uc790\\uc5d0", "\\uc758\\ud574",
303*0e209d39SAndroid Build Coastguard Worker       "\\ucc44\\ud0dd\\ub418\\uc5c8\\uc2b5\\ub2c8\\ub2e4.", "\\uc720\\ub2c8\\ucf54\\ub4dc\\ub294",
304*0e209d39SAndroid Build Coastguard Worker       // "XML, Java, ECMAScript(JavaScript), LDAP, CORBA 3.0, WML "
305*0e209d39SAndroid Build Coastguard Worker       "\\ub4f1\\uacfc",
306*0e209d39SAndroid Build Coastguard Worker       "\\uac19\\uc774", "\\ud604\\uc7ac", "\\ub110\\ub9ac", "\\uc0ac\\uc6a9\\ub418\\ub294",
307*0e209d39SAndroid Build Coastguard Worker       "\\ud45c\\uc900\\uc5d0\\uc11c", "\\ud544\\uc694\\ud558\\uba70", "\\uc774\\ub294", // "ISO/IEC",
308*0e209d39SAndroid Build Coastguard Worker       "10646\\uc744", "\\uad6c\\ud604\\ud558\\ub294", "\\uacf5\\uc2dd\\uc801\\uc778",
309*0e209d39SAndroid Build Coastguard Worker       "\\ubc29\\ubc95\\uc785\\ub2c8\\ub2e4.", "\\uc774\\ub294", "\\ub9ce\\uc740", "\\uc6b4\\uc601",
310*0e209d39SAndroid Build Coastguard Worker       "\\uccb4\\uc81c,", "\\uc694\\uc998", "\\uc0ac\\uc6a9\\ub418\\ub294", "\\ubaa8\\ub4e0",
311*0e209d39SAndroid Build Coastguard Worker       "\\ube0c\\ub77c\\uc6b0\\uc800", "\\ubc0f", "\\uae30\\ud0c0", "\\ub9ce\\uc740",
312*0e209d39SAndroid Build Coastguard Worker       "\\uc81c\\ud488\\uc5d0\\uc11c",
313*0e209d39SAndroid Build Coastguard Worker       "\\uc9c0\\uc6d0\\ub429\\ub2c8\\ub2e4.", "\\uc720\\ub2c8\\ucf54\\ub4dc",
314*0e209d39SAndroid Build Coastguard Worker       "\\ud45c\\uc900\\uc758", "\\ubd80\\uc0c1\\uacfc", "\\uc774\\ub97c",
315*0e209d39SAndroid Build Coastguard Worker       "\\uc9c0\\uc6d0\\ud558\\ub294", "\\ub3c4\\uad6c\\uc758", "\\uac00\\uc6a9\\uc131\\uc740",
316*0e209d39SAndroid Build Coastguard Worker       "\\ucd5c\\uadfc", "\\uc804", "\\uc138\\uacc4\\uc5d0", "\\ubd88\\uace0", "\\uc788\\ub294",
317*0e209d39SAndroid Build Coastguard Worker       "\\uae30\\uc220", "\\uacbd\\ud5a5\\uc5d0\\uc11c", "\\uac00\\uc7a5", "\\uc911\\uc694\\ud55c",
318*0e209d39SAndroid Build Coastguard Worker       "\\ubd80\\ubd84\\uc744", "\\ucc28\\uc9c0\\ud558\\uace0", "\\uc788\\uc2b5\\ub2c8\\ub2e4.",
319*0e209d39SAndroid Build Coastguard Worker 
320*0e209d39SAndroid Build Coastguard Worker       "\\uc720\\ub2c8\\ucf54\\ub4dc\\ub97c",
321*0e209d39SAndroid Build Coastguard Worker       // Replaced a hyphen with a space to make the test case work with CLDR1.5
322*0e209d39SAndroid Build Coastguard Worker       //"\\ud074\\ub77c\\uc774\\uc5b8\\ud2b8-\\uc11c\\ubc84", "\\ub610\\ub294",
323*0e209d39SAndroid Build Coastguard Worker       "\\ud074\\ub77c\\uc774\\uc5b8\\ud2b8 \\uc11c\\ubc84", "\\ub610\\ub294",
324*0e209d39SAndroid Build Coastguard Worker       // Replaced a hyphen with a space.
325*0e209d39SAndroid Build Coastguard Worker       //"\\ub2e4\\uc911-\\uc5f0\\uacb0", "\\uc751\\uc6a9", "\\ud504\\ub85c\\uadf8\\ub7a8\\uacfc",
326*0e209d39SAndroid Build Coastguard Worker       "\\ub2e4\\uc911 \\uc5f0\\uacb0", "\\uc751\\uc6a9", "\\ud504\\ub85c\\uadf8\\ub7a8\\uacfc",
327*0e209d39SAndroid Build Coastguard Worker       "\\uc6f9", "\\uc0ac\\uc774\\ud2b8\\uc5d0", "\\ud1b5\\ud569\\ud558\\uba74",
328*0e209d39SAndroid Build Coastguard Worker       "\\ub808\\uac70\\uc2dc", "\\ubb38\\uc790", "\\uc138\\ud2b8", "\\uc0ac\\uc6a9\\uc5d0",
329*0e209d39SAndroid Build Coastguard Worker       "\\uc788\\uc5b4\\uc11c", "\\uc0c1\\ub2f9\\ud55c", "\\ube44\\uc6a9", "\\uc808\\uac10",
330*0e209d39SAndroid Build Coastguard Worker       "\\ud6a8\\uacfc\\uac00",
331*0e209d39SAndroid Build Coastguard Worker       "\\ub098\\ud0c0\\ub0a9\\ub2c8\\ub2e4.", "\\uc720\\ub2c8\\ucf54\\ub4dc\\ub97c",
332*0e209d39SAndroid Build Coastguard Worker       "\\ud1b5\\ud574", "\\ub9ac\\uc5d4\\uc9c0\\ub2c8\\uc5b4\\ub9c1", "\\uc5c6\\uc774",
333*0e209d39SAndroid Build Coastguard Worker       "\\ub2e4\\uc911", "\\ud50c\\ub7ab\\ud3fc,", "\\uc5b8\\uc5b4", "\\ubc0f", "\\uad6d\\uac00",
334*0e209d39SAndroid Build Coastguard Worker       "\\uac04\\uc5d0", "\\ub2e8\\uc77c", "\\uc18c\\ud504\\ud2b8\\uc6e8\\uc5b4",
335*0e209d39SAndroid Build Coastguard Worker       "\\ud50c\\ub7ab\\ud3fc", "\\ub610\\ub294", "\\ub2e8\\uc77c", "\\uc6f9",
336*0e209d39SAndroid Build Coastguard Worker       "\\uc0ac\\uc774\\ud2b8\\ub97c", "\\ubaa9\\ud45c\\ub85c", "\\uc0bc\\uc744", "\\uc218",
337*0e209d39SAndroid Build Coastguard Worker       "\\uc788\\uc2b5\\ub2c8\\ub2e4.", "\\uc774\\ub97c", "\\uc0ac\\uc6a9\\ud558\\uba74",
338*0e209d39SAndroid Build Coastguard Worker       "\\ub370\\uc774\\ud130\\ub97c", "\\uc190\\uc0c1", "\\uc5c6\\uc774", "\\uc5ec\\ub7ec",
339*0e209d39SAndroid Build Coastguard Worker       "\\uc2dc\\uc2a4\\ud15c\\uc744", "\\ud1b5\\ud574", "\\uc804\\uc1a1\\ud560", "\\uc218",
340*0e209d39SAndroid Build Coastguard Worker       "\\uc788\\uc2b5\\ub2c8\\ub2e4.",
341*0e209d39SAndroid Build Coastguard Worker 
342*0e209d39SAndroid Build Coastguard Worker       "\\uc720\\ub2c8\\ucf54\\ub4dc", "\\ucf58\\uc18c\\uc2dc\\uc5c4\\uc5d0", "\\ub300\\ud574",
343*0e209d39SAndroid Build Coastguard Worker       "\\uc720\\ub2c8\\ucf54\\ub4dc", "\\ucf58\\uc18c\\uc2dc\\uc5c4\\uc740",
344*0e209d39SAndroid Build Coastguard Worker       "\\ube44\\uc601\\ub9ac", "\\uc870\\uc9c1\\uc73c\\ub85c\\uc11c", "\\ud604\\ub300",
345*0e209d39SAndroid Build Coastguard Worker       "\\uc18c\\ud504\\ud2b8\\uc6e8\\uc5b4", "\\uc81c\\ud488\\uacfc",
346*0e209d39SAndroid Build Coastguard Worker       "\\ud45c\\uc900\\uc5d0\\uc11c", "\\ud14d\\uc2a4\\ud2b8\\uc758", "\\ud45c\\ud604\\uc744",
347*0e209d39SAndroid Build Coastguard Worker       "\\uc9c0\\uc815\\ud558\\ub294", "\\uc720\\ub2c8\\ucf54\\ub4dc", "\\ud45c\\uc900\\uc758",
348*0e209d39SAndroid Build Coastguard Worker       "\\uc0ac\\uc6a9\\uc744", "\\uac1c\\ubc1c\\ud558\\uace0", "\\ud655\\uc7a5\\ud558\\uba70",
349*0e209d39SAndroid Build Coastguard Worker       "\\uc7a5\\ub824\\ud558\\uae30", "\\uc704\\ud574",
350*0e209d39SAndroid Build Coastguard Worker       "\\uc138\\uc6cc\\uc84c\\uc2b5\\ub2c8\\ub2e4.", "\\ucf58\\uc18c\\uc2dc\\uc5c4",
351*0e209d39SAndroid Build Coastguard Worker       "\\uba64\\ubc84\\uc27d\\uc740", "\\ucef4\\ud4e8\\ud130\\uc640", "\\uc815\\ubcf4",
352*0e209d39SAndroid Build Coastguard Worker       "\\ucc98\\ub9ac", "\\uc0b0\\uc5c5\\uc5d0", "\\uc885\\uc0ac\\ud558\\uace0", "\\uc788\\ub294",
353*0e209d39SAndroid Build Coastguard Worker       "\\uad11\\ubc94\\uc704\\ud55c", "\\ud68c\\uc0ac", "\\ubc0f", "\\uc870\\uc9c1\\uc758",
354*0e209d39SAndroid Build Coastguard Worker       "\\ubc94\\uc704\\ub97c",
355*0e209d39SAndroid Build Coastguard Worker       "\\ub098\\ud0c0\\ub0c5\\ub2c8\\ub2e4.", "\\ucf58\\uc18c\\uc2dc\\uc5c4\\uc758",
356*0e209d39SAndroid Build Coastguard Worker       "\\uc7ac\\uc815\\uc740", "\\uc804\\uc801\\uc73c\\ub85c", "\\ud68c\\ube44\\uc5d0",
357*0e209d39SAndroid Build Coastguard Worker       "\\uc758\\ud574", "\\ucda9\\ub2f9\\ub429\\ub2c8\\ub2e4.", "\\uc720\\ub2c8\\ucf54\\ub4dc",
358*0e209d39SAndroid Build Coastguard Worker       "\\ucee8\\uc18c\\uc2dc\\uc5c4\\uc5d0\\uc11c\\uc758", "\\uba64\\ubc84\\uc27d\\uc740",
359*0e209d39SAndroid Build Coastguard Worker       "\\uc804", "\\uc138\\uacc4", "\\uc5b4\\ub290", "\\uacf3\\uc5d0\\uc11c\\ub098",
360*0e209d39SAndroid Build Coastguard Worker       "\\uc720\\ub2c8\\ucf54\\ub4dc", "\\ud45c\\uc900\\uc744", "\\uc9c0\\uc6d0\\ud558\\uace0",
361*0e209d39SAndroid Build Coastguard Worker       "\\uadf8", "\\ud655\\uc7a5\\uacfc", "\\uad6c\\ud604\\uc744",
362*0e209d39SAndroid Build Coastguard Worker       "\\uc9c0\\uc6d0\\ud558\\uace0\\uc790\\ud558\\ub294", "\\uc870\\uc9c1\\uacfc",
363*0e209d39SAndroid Build Coastguard Worker       "\\uac1c\\uc778\\uc5d0\\uac8c", "\\uac1c\\ubc29\\ub418\\uc5b4",
364*0e209d39SAndroid Build Coastguard Worker       "\\uc788\\uc2b5\\ub2c8\\ub2e4.",
365*0e209d39SAndroid Build Coastguard Worker 
366*0e209d39SAndroid Build Coastguard Worker       "\\ub354", "\\uc790\\uc138\\ud55c", "\\ub0b4\\uc6a9\\uc740", "\\uc6a9\\uc5b4\\uc9d1,",
367*0e209d39SAndroid Build Coastguard Worker       "\\uc608\\uc81c", "\\uc720\\ub2c8\\ucf54\\ub4dc", "\\uc0ac\\uc6a9", "\\uac00\\ub2a5",
368*0e209d39SAndroid Build Coastguard Worker       "\\uc81c\\ud488,", "\\uae30\\uc220", "\\uc815\\ubcf4", "\\ubc0f", "\\uae30\\ud0c0",
369*0e209d39SAndroid Build Coastguard Worker       "\\uc720\\uc6a9\\ud55c", "\\uc815\\ubcf4\\ub97c",
370*0e209d39SAndroid Build Coastguard Worker       "\\ucc38\\uc870\\ud558\\uc2ed\\uc2dc\\uc624."
371*0e209d39SAndroid Build Coastguard Worker     };
372*0e209d39SAndroid Build Coastguard Worker 
373*0e209d39SAndroid Build Coastguard Worker     enum { WHAT_IS_UNICODE_length = UPRV_LENGTHOF(WHAT_IS_UNICODE) };
374*0e209d39SAndroid Build Coastguard Worker 
375*0e209d39SAndroid Build Coastguard Worker     UParseError parseError;
376*0e209d39SAndroid Build Coastguard Worker     UErrorCode status = U_ZERO_ERROR;
377*0e209d39SAndroid Build Coastguard Worker     Transliterator* latinJamo = Transliterator::createInstance("Latin-Jamo", UTRANS_FORWARD, parseError, status);
378*0e209d39SAndroid Build Coastguard Worker     Transliterator* jamoHangul = Transliterator::createInstance("NFC(NFD)", UTRANS_FORWARD, parseError, status);
379*0e209d39SAndroid Build Coastguard Worker     if (latinJamo == nullptr || jamoHangul == nullptr || U_FAILURE(status)) {
380*0e209d39SAndroid Build Coastguard Worker         delete latinJamo;
381*0e209d39SAndroid Build Coastguard Worker         delete jamoHangul;
382*0e209d39SAndroid Build Coastguard Worker         dataerrln("FAIL: createInstance returned nullptr - %s", u_errorName(status));
383*0e209d39SAndroid Build Coastguard Worker         return;
384*0e209d39SAndroid Build Coastguard Worker     }
385*0e209d39SAndroid Build Coastguard Worker     Transliterator* jamoLatin = latinJamo->createInverse(status);
386*0e209d39SAndroid Build Coastguard Worker     Transliterator* hangulJamo = jamoHangul->createInverse(status);
387*0e209d39SAndroid Build Coastguard Worker     if (jamoLatin == nullptr || hangulJamo == nullptr) {
388*0e209d39SAndroid Build Coastguard Worker         errln("FAIL: createInverse returned nullptr");
389*0e209d39SAndroid Build Coastguard Worker         delete latinJamo;
390*0e209d39SAndroid Build Coastguard Worker         delete jamoLatin;
391*0e209d39SAndroid Build Coastguard Worker         delete jamoHangul;
392*0e209d39SAndroid Build Coastguard Worker         delete hangulJamo;
393*0e209d39SAndroid Build Coastguard Worker         return;
394*0e209d39SAndroid Build Coastguard Worker     }
395*0e209d39SAndroid Build Coastguard Worker 
396*0e209d39SAndroid Build Coastguard Worker     Transliterator* tarray[4] =
397*0e209d39SAndroid Build Coastguard Worker         { hangulJamo, jamoLatin, latinJamo, jamoHangul };
398*0e209d39SAndroid Build Coastguard Worker     CompoundTransliterator rt(tarray, 4);
399*0e209d39SAndroid Build Coastguard Worker 
400*0e209d39SAndroid Build Coastguard Worker     UnicodeString buf;
401*0e209d39SAndroid Build Coastguard Worker     int32_t total = 0;
402*0e209d39SAndroid Build Coastguard Worker     int32_t errors = 0;
403*0e209d39SAndroid Build Coastguard Worker     int32_t i;
404*0e209d39SAndroid Build Coastguard Worker     for (i=0; i < WHAT_IS_UNICODE_length; ++i) {
405*0e209d39SAndroid Build Coastguard Worker         ++total;
406*0e209d39SAndroid Build Coastguard Worker         UnicodeString hangul = UnicodeString(WHAT_IS_UNICODE[i], -1, US_INV);
407*0e209d39SAndroid Build Coastguard Worker         hangul = hangul.unescape(); // Parse backslash-u escapes
408*0e209d39SAndroid Build Coastguard Worker         UnicodeString hangulX = hangul;
409*0e209d39SAndroid Build Coastguard Worker         rt.transliterate(hangulX);
410*0e209d39SAndroid Build Coastguard Worker         if (hangul != hangulX) {
411*0e209d39SAndroid Build Coastguard Worker             ++errors;
412*0e209d39SAndroid Build Coastguard Worker             UnicodeString jamo = hangul; hangulJamo->transliterate(jamo);
413*0e209d39SAndroid Build Coastguard Worker             UnicodeString latin = jamo; jamoLatin->transliterate(latin);
414*0e209d39SAndroid Build Coastguard Worker             UnicodeString jamo2 = latin; latinJamo->transliterate(jamo2);
415*0e209d39SAndroid Build Coastguard Worker             UnicodeString hangul2 = jamo2; jamoHangul->transliterate(hangul2);
416*0e209d39SAndroid Build Coastguard Worker 
417*0e209d39SAndroid Build Coastguard Worker             buf.remove(0);
418*0e209d39SAndroid Build Coastguard Worker             buf.append("FAIL: ");
419*0e209d39SAndroid Build Coastguard Worker             if (hangul2 != hangulX) {
420*0e209d39SAndroid Build Coastguard Worker                 buf.append((UnicodeString)"(Weird: " + hangulX + " != " + hangul2 + ")");
421*0e209d39SAndroid Build Coastguard Worker             }
422*0e209d39SAndroid Build Coastguard Worker             // The Hangul-Jamo conversion is not usually the
423*0e209d39SAndroid Build Coastguard Worker             // bug here, so we hide it from display.
424*0e209d39SAndroid Build Coastguard Worker             // Uncomment lines to see the Hangul.
425*0e209d39SAndroid Build Coastguard Worker             buf.append(//hangul + " => " +
426*0e209d39SAndroid Build Coastguard Worker                        jamoToName(jamo) + " => " +
427*0e209d39SAndroid Build Coastguard Worker                        latin + " => " + jamoToName(jamo2)
428*0e209d39SAndroid Build Coastguard Worker                        //+ " => " + hangul2
429*0e209d39SAndroid Build Coastguard Worker                        );
430*0e209d39SAndroid Build Coastguard Worker             errln(prettify(buf));
431*0e209d39SAndroid Build Coastguard Worker         }
432*0e209d39SAndroid Build Coastguard Worker     }
433*0e209d39SAndroid Build Coastguard Worker     if (errors != 0) {
434*0e209d39SAndroid Build Coastguard Worker         errln((UnicodeString)"Test word failures: " + errors + " out of " + total);
435*0e209d39SAndroid Build Coastguard Worker     } else {
436*0e209d39SAndroid Build Coastguard Worker         logln((UnicodeString)"All " + total + " test words passed");
437*0e209d39SAndroid Build Coastguard Worker     }
438*0e209d39SAndroid Build Coastguard Worker 
439*0e209d39SAndroid Build Coastguard Worker     delete latinJamo;
440*0e209d39SAndroid Build Coastguard Worker     delete jamoLatin;
441*0e209d39SAndroid Build Coastguard Worker     delete jamoHangul;
442*0e209d39SAndroid Build Coastguard Worker     delete hangulJamo;
443*0e209d39SAndroid Build Coastguard Worker }
444*0e209d39SAndroid Build Coastguard Worker 
445*0e209d39SAndroid Build Coastguard Worker // Override TransliteratorTest
446*0e209d39SAndroid Build Coastguard Worker void
expectAux(const UnicodeString & tag,const UnicodeString & summary,UBool pass,const UnicodeString & expectedResult)447*0e209d39SAndroid Build Coastguard Worker JamoTest::expectAux(const UnicodeString& tag,
448*0e209d39SAndroid Build Coastguard Worker                     const UnicodeString& summary, UBool pass,
449*0e209d39SAndroid Build Coastguard Worker                     const UnicodeString& expectedResult) {
450*0e209d39SAndroid Build Coastguard Worker     UnicodeString jsum = jamoToName(summary);
451*0e209d39SAndroid Build Coastguard Worker     UnicodeString jexp = jamoToName(expectedResult);
452*0e209d39SAndroid Build Coastguard Worker     TransliteratorTest::expectAux(tag, jsum, pass, jexp);
453*0e209d39SAndroid Build Coastguard Worker }
454*0e209d39SAndroid Build Coastguard Worker 
455*0e209d39SAndroid Build Coastguard Worker const char* JamoTest::JAMO_NAMES_RULES =
456*0e209d39SAndroid Build Coastguard Worker         "'(Gi)' <> \\u1100;"
457*0e209d39SAndroid Build Coastguard Worker         "'(GGi)' <> \\u1101;"
458*0e209d39SAndroid Build Coastguard Worker         "'(Ni)' <> \\u1102;"
459*0e209d39SAndroid Build Coastguard Worker         "'(Di)' <> \\u1103;"
460*0e209d39SAndroid Build Coastguard Worker         "'(DD)' <> \\u1104;"
461*0e209d39SAndroid Build Coastguard Worker         "'(R)' <> \\u1105;"
462*0e209d39SAndroid Build Coastguard Worker         "'(Mi)' <> \\u1106;"
463*0e209d39SAndroid Build Coastguard Worker         "'(Bi)' <> \\u1107;"
464*0e209d39SAndroid Build Coastguard Worker         "'(BB)' <> \\u1108;"
465*0e209d39SAndroid Build Coastguard Worker         "'(Si)' <> \\u1109;"
466*0e209d39SAndroid Build Coastguard Worker         "'(SSi)' <> \\u110A;"
467*0e209d39SAndroid Build Coastguard Worker         "'(IEUNG)' <> \\u110B;"
468*0e209d39SAndroid Build Coastguard Worker         "'(Ji)' <> \\u110C;"
469*0e209d39SAndroid Build Coastguard Worker         "'(JJ)' <> \\u110D;"
470*0e209d39SAndroid Build Coastguard Worker         "'(Ci)' <> \\u110E;"
471*0e209d39SAndroid Build Coastguard Worker         "'(Ki)' <> \\u110F;"
472*0e209d39SAndroid Build Coastguard Worker         "'(Ti)' <> \\u1110;"
473*0e209d39SAndroid Build Coastguard Worker         "'(Pi)' <> \\u1111;"
474*0e209d39SAndroid Build Coastguard Worker         "'(Hi)' <> \\u1112;"
475*0e209d39SAndroid Build Coastguard Worker 
476*0e209d39SAndroid Build Coastguard Worker         "'(A)' <> \\u1161;"
477*0e209d39SAndroid Build Coastguard Worker         "'(AE)' <> \\u1162;"
478*0e209d39SAndroid Build Coastguard Worker         "'(YA)' <> \\u1163;"
479*0e209d39SAndroid Build Coastguard Worker         "'(YAE)' <> \\u1164;"
480*0e209d39SAndroid Build Coastguard Worker         "'(EO)' <> \\u1165;"
481*0e209d39SAndroid Build Coastguard Worker         "'(E)' <> \\u1166;"
482*0e209d39SAndroid Build Coastguard Worker         "'(YEO)' <> \\u1167;"
483*0e209d39SAndroid Build Coastguard Worker         "'(YE)' <> \\u1168;"
484*0e209d39SAndroid Build Coastguard Worker         "'(O)' <> \\u1169;"
485*0e209d39SAndroid Build Coastguard Worker         "'(WA)' <> \\u116A;"
486*0e209d39SAndroid Build Coastguard Worker         "'(WAE)' <> \\u116B;"
487*0e209d39SAndroid Build Coastguard Worker         "'(OE)' <> \\u116C;"
488*0e209d39SAndroid Build Coastguard Worker         "'(YO)' <> \\u116D;"
489*0e209d39SAndroid Build Coastguard Worker         "'(U)' <> \\u116E;"
490*0e209d39SAndroid Build Coastguard Worker         "'(WEO)' <> \\u116F;"
491*0e209d39SAndroid Build Coastguard Worker         "'(WE)' <> \\u1170;"
492*0e209d39SAndroid Build Coastguard Worker         "'(WI)' <> \\u1171;"
493*0e209d39SAndroid Build Coastguard Worker         "'(YU)' <> \\u1172;"
494*0e209d39SAndroid Build Coastguard Worker         "'(EU)' <> \\u1173;"
495*0e209d39SAndroid Build Coastguard Worker         "'(YI)' <> \\u1174;"
496*0e209d39SAndroid Build Coastguard Worker         "'(I)' <> \\u1175;"
497*0e209d39SAndroid Build Coastguard Worker 
498*0e209d39SAndroid Build Coastguard Worker         "'(Gf)' <> \\u11A8;"
499*0e209d39SAndroid Build Coastguard Worker         "'(GGf)' <> \\u11A9;"
500*0e209d39SAndroid Build Coastguard Worker         "'(GS)' <> \\u11AA;"
501*0e209d39SAndroid Build Coastguard Worker         "'(Nf)' <> \\u11AB;"
502*0e209d39SAndroid Build Coastguard Worker         "'(NJ)' <> \\u11AC;"
503*0e209d39SAndroid Build Coastguard Worker         "'(NH)' <> \\u11AD;"
504*0e209d39SAndroid Build Coastguard Worker         "'(Df)' <> \\u11AE;"
505*0e209d39SAndroid Build Coastguard Worker         "'(L)' <> \\u11AF;"
506*0e209d39SAndroid Build Coastguard Worker         "'(LG)' <> \\u11B0;"
507*0e209d39SAndroid Build Coastguard Worker         "'(LM)' <> \\u11B1;"
508*0e209d39SAndroid Build Coastguard Worker         "'(LB)' <> \\u11B2;"
509*0e209d39SAndroid Build Coastguard Worker         "'(LS)' <> \\u11B3;"
510*0e209d39SAndroid Build Coastguard Worker         "'(LT)' <> \\u11B4;"
511*0e209d39SAndroid Build Coastguard Worker         "'(LP)' <> \\u11B5;"
512*0e209d39SAndroid Build Coastguard Worker         "'(LH)' <> \\u11B6;"
513*0e209d39SAndroid Build Coastguard Worker         "'(Mf)' <> \\u11B7;"
514*0e209d39SAndroid Build Coastguard Worker         "'(Bf)' <> \\u11B8;"
515*0e209d39SAndroid Build Coastguard Worker         "'(BS)' <> \\u11B9;"
516*0e209d39SAndroid Build Coastguard Worker         "'(Sf)' <> \\u11BA;"
517*0e209d39SAndroid Build Coastguard Worker         "'(SSf)' <> \\u11BB;"
518*0e209d39SAndroid Build Coastguard Worker         "'(NG)' <> \\u11BC;"
519*0e209d39SAndroid Build Coastguard Worker         "'(Jf)' <> \\u11BD;"
520*0e209d39SAndroid Build Coastguard Worker         "'(Cf)' <> \\u11BE;"
521*0e209d39SAndroid Build Coastguard Worker         "'(Kf)' <> \\u11BF;"
522*0e209d39SAndroid Build Coastguard Worker         "'(Tf)' <> \\u11C0;"
523*0e209d39SAndroid Build Coastguard Worker         "'(Pf)' <> \\u11C1;"
524*0e209d39SAndroid Build Coastguard Worker         "'(Hf)' <> \\u11C2;";
525*0e209d39SAndroid Build Coastguard Worker 
526*0e209d39SAndroid Build Coastguard Worker /**
527*0e209d39SAndroid Build Coastguard Worker  * Convert short names to actual jamo.  E.g., "x(LG)y" returns
528*0e209d39SAndroid Build Coastguard Worker  * "x\u11B0y".  See JAMO_NAMES for table of names.
529*0e209d39SAndroid Build Coastguard Worker  */
530*0e209d39SAndroid Build Coastguard Worker UnicodeString
nameToJamo(const UnicodeString & input)531*0e209d39SAndroid Build Coastguard Worker JamoTest::nameToJamo(const UnicodeString& input) {
532*0e209d39SAndroid Build Coastguard Worker     if (NAME_JAMO == nullptr) {
533*0e209d39SAndroid Build Coastguard Worker         errln("Failed to create NAME_JAMO");
534*0e209d39SAndroid Build Coastguard Worker         return input;   /* failure! */
535*0e209d39SAndroid Build Coastguard Worker     }
536*0e209d39SAndroid Build Coastguard Worker     UnicodeString result(input);
537*0e209d39SAndroid Build Coastguard Worker     NAME_JAMO->transliterate(result);
538*0e209d39SAndroid Build Coastguard Worker     return result;
539*0e209d39SAndroid Build Coastguard Worker }
540*0e209d39SAndroid Build Coastguard Worker 
541*0e209d39SAndroid Build Coastguard Worker /**
542*0e209d39SAndroid Build Coastguard Worker  * Convert jamo to short names.  E.g., "x\u11B0y" returns
543*0e209d39SAndroid Build Coastguard Worker  * "x(LG)y".  See JAMO_NAMES for table of names.
544*0e209d39SAndroid Build Coastguard Worker  */
545*0e209d39SAndroid Build Coastguard Worker UnicodeString
jamoToName(const UnicodeString & input)546*0e209d39SAndroid Build Coastguard Worker JamoTest::jamoToName(const UnicodeString& input) {
547*0e209d39SAndroid Build Coastguard Worker     if (NAME_JAMO == nullptr) {
548*0e209d39SAndroid Build Coastguard Worker         errln("Failed to create NAME_JAMO");
549*0e209d39SAndroid Build Coastguard Worker         return input;   /* failure! */
550*0e209d39SAndroid Build Coastguard Worker     }
551*0e209d39SAndroid Build Coastguard Worker     UnicodeString result(input);
552*0e209d39SAndroid Build Coastguard Worker     JAMO_NAME->transliterate(result);
553*0e209d39SAndroid Build Coastguard Worker     return result;
554*0e209d39SAndroid Build Coastguard Worker }
555*0e209d39SAndroid Build Coastguard Worker 
556*0e209d39SAndroid Build Coastguard Worker #endif /* #if !UCONFIG_NO_TRANSLITERATION */
557