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