2 *******************************************************************************
3 * Copyright (C) 2001-2010, International Business Machines Corporation and *
4 * others. All Rights Reserved. *
5 *******************************************************************************
7 package com.ibm.icu.dev.test.translit;
9 import java.util.HashMap;
12 import com.ibm.icu.impl.Utility;
13 import com.ibm.icu.text.Transliterator;
17 * @summary Test the Latin-Jamo transliterator
19 public class JamoTest extends TransliteratorTest {
21 public static void main(String[] args) throws Exception {
22 new JamoTest().run(args);
25 public void TestJamo() {
26 Transliterator latinJamo = Transliterator.getInstance("Latin-Jamo");
27 Transliterator jamoLatin = latinJamo.getInverse();
30 // Column 1 is the latin text L1 to be fed to Latin-Jamo
33 // Column 2 is expected value of J. J is fed to
34 // Jamo-Latin to yield output L2.
36 // Column 3 is expected value of L2. If the expected
37 // value of L2 is L1, then L2 is null.
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,
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,
71 "bs", "(Bi)(EU)(Sf)", "beus",
72 "kalgga", "(Ki)(A)(L)(Gi)(EU)(Gi)(A)", "kalgeuga",
74 // 'r' in a final position is treated like 'l'
75 "karka", "(Ki)(A)(L)(Ki)(A)", "kalka",
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);
84 // Handle case where round-trip is expected to fail
85 expect(latinJamo, CASE[i], jamo);
86 expect(jamoLatin, jamo, CASE[i+2]);
92 * These are problems turned up by the Hangul-Jamo;Jamo-Latin
95 public void TestRoundTrip() {
96 String HANGUL[] = { "\uAC03\uC2F8",
99 Transliterator latinJamo = Transliterator.getInstance("Latin-Jamo");
100 Transliterator jamoLatin = latinJamo.getInverse();
101 Transliterator jamoHangul = Transliterator.getInstance("NFC");
102 Transliterator hangulJamo = Transliterator.getInstance("NFD");
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);
112 buf.append(hangul + " => " +
113 jamoToName(jamo) + " => " +
114 latin + " => " + jamoToName(jamo2)
117 if (!hangul.equals(hangul2)) {
118 errln("FAIL: " + Utility.escape(buf.toString()));
120 logln(Utility.escape(buf.toString()));
126 * Test various step-at-a-time transformation of hangul to jamo to
129 public void TestPiecemeal() {
130 String hangul = "\uBC0F";
131 String jamo = nameToJamo("(Mi)(I)(Cf)");
132 String latin = "mic";
133 String latin2 = "mich";
135 Transliterator t = null;
137 t = Transliterator.getInstance("NFD"); // was Hangul-Jamo
138 expect(t, hangul, jamo);
140 t = Transliterator.getInstance("NFC"); // was Jamo-Hangul
141 expect(t, jamo, hangul);
143 t = Transliterator.getInstance("Latin-Jamo");
144 expect(t, latin, jamo);
146 t = Transliterator.getInstance("Jamo-Latin");
147 expect(t, jamo, latin2);
149 t = Transliterator.getInstance("Hangul-Latin");
150 expect(t, hangul, latin2);
152 t = Transliterator.getInstance("Latin-Hangul");
153 expect(t, latin, hangul);
155 t = Transliterator.getInstance("Hangul-Latin; Latin-Jamo");
156 expect(t, hangul, jamo);
158 t = Transliterator.getInstance("Jamo-Latin; Latin-Hangul");
159 expect(t, jamo, hangul);
161 t = Transliterator.getInstance("Hangul-Latin; Latin-Hangul");
162 expect(t, hangul, hangul);
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");
175 StringBuffer buf = new StringBuffer();
178 while (pos < WHAT_IS_UNICODE.length()) {
179 int space = WHAT_IS_UNICODE.indexOf(' ', pos+1);
181 space = WHAT_IS_UNICODE.length();
185 String hangul = WHAT_IS_UNICODE.substring(pos, space);
186 String hangulX = rt.transliterate(hangul);
187 if (!hangul.equals(hangulX)) {
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)) {
195 buf.append("FAIL (Compound transliterator problem): ");
196 buf.append(hangul + " => " +
197 jamoToName(jamo) + " => " +
198 latin + " => " + jamoToName(jamo2)
200 "; but " + hangul + " =cpd=> " + jamoToName(hangulX)
202 errln(Utility.escape(buf.toString()));
203 } else if (jamo.equals(jamo2)) {
205 buf.append("FAIL (Jamo<>Hangul problem): ");
206 if (!hangul2.equals(hangulX)) {
207 buf.append("(Weird: " + hangulX + " != " + hangul2 + ")");
209 buf.append(hangul + " => " +
210 jamoToName(jamo) + " => " +
211 latin + " => " + jamoToName(jamo2)
214 errln(Utility.escape(buf.toString()));
217 buf.append("FAIL: ");
218 if (!hangul2.equals(hangulX)) {
219 buf.append("(Weird: " + hangulX + " != " + hangul2 + ")");
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)
229 errln(Utility.escape(buf.toString()));
236 errln("Test word failures: " + errors + " out of " + total);
238 logln("All " + total + " test words passed");
242 // Test text taken from the Unicode web site
243 static final String WHAT_IS_UNICODE =
245 "\uc720\ub2c8\ucf54\ub4dc\uc5d0 \ub300\ud574 ? " +
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. " +
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. " +
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. " +
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 " +
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. " +
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. " +
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. " +
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.";
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));
384 // Note: The following could more easily be done with a transliterator!
385 static final String[] JAMO_NAMES = {
457 static Map<String, String> JAMO_TO_NAME;
458 static Map<String, String> NAME_TO_JAMO;
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]);
470 * Convert short names to actual jamo. E.g., "x(LG)y" returns
471 * "x\u11B0y". See JAMO_NAMES for table of names.
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);
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));
490 return buf.toString();
494 * Convert jamo to short names. E.g., "x\u11B0y" returns
495 * "x(LG)y". See JAMO_NAMES for table of names.
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));
510 return buf.toString();