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