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