blob: 0012e92b5650d47429e497c67b0ed123e811edf7 [file] [log] [blame]
/**
*******************************************************************************
* Copyright (C) 2001-2007, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*/
package com.ibm.icu.dev.test.translit;
import com.ibm.icu.text.*;
import com.ibm.icu.impl.Utility;
import java.util.*;
/**
* @test
* @summary Test the Latin-Jamo transliterator
*/
public class JamoTest extends TransliteratorTest {
private static final char SEP = '-';
public static void main(String[] args) throws Exception {
new JamoTest().run(args);
}
public void TestJamo() {
Transliterator latinJamo = Transliterator.getInstance("Latin-Jamo");
Transliterator jamoLatin = latinJamo.getInverse();
String[] CASE = {
// Column 1 is the latin text L1 to be fed to Latin-Jamo
// to yield output J.
// Column 2 is expected value of J. J is fed to
// Jamo-Latin to yield output L2.
// Column 3 is expected value of L2. If the expected
// value of L2 is L1, then L2 is null.
// add tests for the update to fix problems where it didn't follow the standard
// see also http://www.unicode.org/cldr/data/charts/transforms/Latin-Hangul.html
"gach", "(Gi)(A)(Ci)", "gach",
"geumhui", "(Gi)(EU)(Mf)(Hi)(YI)", "geumhui",
"choe", "(Ci)(OE)", "choe",
"wo", "(IEUNG)(WEO)", "wo",
"Wonpil", "(IEUNG)(WEO)(Nf)(Pi)(I)(L)", "wonpil",
"GIPPEUM", "(Gi)(I)(BB)(EU)(Mf)", "gippeum",
"EUTTEUM", "(IEUNG)(EU)(DD)(EU)(Mf)", "eutteum",
"KKOTNAE", "(GGi)(O)(Tf)(Ni)(AE)", "kkotnae",
"gaga", "(Gi)(A)(Gi)(A)", "gaga",
"gag-a", "(Gi)(A)(Gf)(IEUNG)(A)", "gag-a",
"gak-ka", "(Gi)(A)(Kf)(Ki)(A)", "gak-ka",
"gakka", "(Gi)(A)(GGi)(A)", "gakka",
"gakk-a", "(Gi)(A)(GGf)(IEUNG)(A)", "gakk-a",
"gakkka", "(Gi)(A)(GGf)(Ki)(A)", "gakkka",
"gak-kka", "(Gi)(A)(Kf)(GGi)(A)", "gak-kka",
"bab", "(Bi)(A)(Bf)", null,
"babb", "(Bi)(A)(Bf)(Bi)(EU)", "babbeu",
"babbba", "(Bi)(A)(Bf)(Bi)(EU)(Bi)(A)", "babbeuba",
"bagg", "(Bi)(A)(Gf)(Gi)(EU)", "baggeu",
"baggga", "(Bi)(A)(Gf)(Gi)(EU)(Gi)(A)", "baggeuga",
//"bag"+SEP+"gga", "(Bi)(A)(Gf)"+SEP+"(Gi)(EU)(Gi)(A)", "bag"+SEP+"geuga",
"kabsa", "(Ki)(A)(Bf)(Si)(A)", null,
"kabska", "(Ki)(A)(BS)(Ki)(A)", null,
"gabsbka", "(Gi)(A)(BS)(Bi)(EU)(Ki)(A)", "gabsbeuka", // not (Kf)
"gga", "(Gi)(EU)(Gi)(A)", "geuga",
"bsa", "(Bi)(EU)(Si)(A)", "beusa",
"agg", "(IEUNG)(A)(Gf)(Gi)(EU)", "aggeu",
"agga", "(IEUNG)(A)(Gf)(Gi)(A)", null,
"la", "(R)(A)", null,
"bs", "(Bi)(EU)(Sf)", "beus",
"kalgga", "(Ki)(A)(L)(Gi)(EU)(Gi)(A)", "kalgeuga",
// 'r' in a final position is treated like 'l'
"karka", "(Ki)(A)(L)(Ki)(A)", "kalka",
};
for (int i=0; i<CASE.length; i+=3) {
if (skipIfBeforeICU(3,8,0) && i == 0) {
// Disable the test case only for 3.8d01.
// After d01, Latin-Jamo transliterator data must be fixed #5820
continue;
}
String jamo = nameToJamo(CASE[i+1]);
if (CASE[i+2] == null) {
expect(latinJamo, CASE[i], jamo, jamoLatin);
} else {
// Handle case where round-trip is expected to fail
expect(latinJamo, CASE[i], jamo);
expect(jamoLatin, jamo, CASE[i+2]);
}
}
}
/**
* These are problems turned up by the Hangul-Jamo;Jamo-Latin
* round trip test.
*/
public void TestRoundTrip() {
String HANGUL[] = { "\uAC03\uC2F8",
"\uC544\uC5B4"};
Transliterator latinJamo = Transliterator.getInstance("Latin-Jamo");
Transliterator jamoLatin = latinJamo.getInverse();
Transliterator jamoHangul = Transliterator.getInstance("NFC");
Transliterator hangulJamo = Transliterator.getInstance("NFD");
StringBuffer buf = new StringBuffer();
for (int i=0; i<HANGUL.length; ++i) {
String hangul = HANGUL[i];
String jamo = hangulJamo.transliterate(hangul);
String latin = jamoLatin.transliterate(jamo);
String jamo2 = latinJamo.transliterate(latin);
String hangul2 = jamoHangul.transliterate(jamo2);
buf.setLength(0);
buf.append(hangul + " => " +
jamoToName(jamo) + " => " +
latin + " => " + jamoToName(jamo2)
+ " => " + hangul2
);
if (!hangul.equals(hangul2)) {
errln("FAIL: " + Utility.escape(buf.toString()));
} else {
logln(Utility.escape(buf.toString()));
}
}
}
/**
* Test various step-at-a-time transformation of hangul to jamo to
* latin and back.
*/
public void TestPiecemeal() {
String hangul = "\uBC0F";
String jamo = nameToJamo("(Mi)(I)(Cf)");
String latin = "mic";
Transliterator t = null;
t = Transliterator.getInstance("NFD"); // was Hangul-Jamo
expect(t, hangul, jamo);
t = Transliterator.getInstance("NFC"); // was Jamo-Hangul
expect(t, jamo, hangul);
t = Transliterator.getInstance("Latin-Jamo");
expect(t, latin, jamo);
t = Transliterator.getInstance("Jamo-Latin");
expect(t, jamo, latin);
t = Transliterator.getInstance("Hangul-Latin");
expect(t, hangul, latin);
t = Transliterator.getInstance("Latin-Hangul");
expect(t, latin, hangul);
t = Transliterator.getInstance("Hangul-Latin; Latin-Jamo");
expect(t, hangul, jamo);
t = Transliterator.getInstance("Jamo-Latin; Latin-Hangul");
expect(t, jamo, hangul);
t = Transliterator.getInstance("Hangul-Latin; Latin-Hangul");
expect(t, hangul, hangul);
}
public void TestRealText() {
Transliterator latinJamo = Transliterator.getInstance("Latin-Jamo");
Transliterator jamoLatin = latinJamo.getInverse();
Transliterator jamoHangul = Transliterator.getInstance("NFC");
Transliterator hangulJamo = Transliterator.getInstance("NFD");
//Transliterator rt = new CompoundTransliterator(new Transliterator[] {
// hangulJamo, jamoLatin, latinJamo, jamoHangul });
Transliterator rt = Transliterator.getInstance("NFD;Jamo-Latin;Latin-Jamo;NFC");
int pos = 0;
StringBuffer buf = new StringBuffer();
int total = 0;
int errors = 0;
while (pos < WHAT_IS_UNICODE.length()) {
int space = WHAT_IS_UNICODE.indexOf(' ', pos+1);
if (space < 0) {
space = WHAT_IS_UNICODE.length();
}
if (pos < space) {
++total;
String hangul = WHAT_IS_UNICODE.substring(pos, space);
String hangulX = rt.transliterate(hangul);
if (!hangul.equals(hangulX)) {
++errors;
String jamo = hangulJamo.transliterate(hangul);
String latin = jamoLatin.transliterate(jamo);
String jamo2 = latinJamo.transliterate(latin);
String hangul2 = jamoHangul.transliterate(jamo2);
if (hangul.equals(hangul2)) {
buf.setLength(0);
buf.append("FAIL (Compound transliterator problem): ");
buf.append(hangul + " => " +
jamoToName(jamo) + " => " +
latin + " => " + jamoToName(jamo2)
+ " => " + hangul2 +
"; but " + hangul + " =cpd=> " + jamoToName(hangulX)
);
errln(Utility.escape(buf.toString()));
} else if (jamo.equals(jamo2)) {
buf.setLength(0);
buf.append("FAIL (Jamo<>Hangul problem): ");
if (!hangul2.equals(hangulX)) {
buf.append("(Weird: " + hangulX + " != " + hangul2 + ")");
}
buf.append(hangul + " => " +
jamoToName(jamo) + " => " +
latin + " => " + jamoToName(jamo2)
+ " => " + hangul2
);
errln(Utility.escape(buf.toString()));
} else {
buf.setLength(0);
buf.append("FAIL: ");
if (!hangul2.equals(hangulX)) {
buf.append("(Weird: " + hangulX + " != " + hangul2 + ")");
}
// The Hangul-Jamo conversion is not usually the
// bug here, so we hide it from display.
// Uncomment lines to see the Hangul.
buf.append(//hangul + " => " +
jamoToName(jamo) + " => " +
latin + " => " + jamoToName(jamo2)
//+ " => " + hangul2
);
errln(Utility.escape(buf.toString()));
}
}
}
pos = space+1;
}
if (errors != 0) {
errln("Test word failures: " + errors + " out of " + total);
} else {
logln("All " + total + " test words passed");
}
}
// Test text taken from the Unicode web site
static final String WHAT_IS_UNICODE =
"\uc720\ub2c8\ucf54\ub4dc\uc5d0 \ub300\ud574 ? " +
"\uc5b4\ub5a4 \ud50c\ub7ab\ud3fc, \uc5b4\ub5a4 " +
"\ud504\ub85c\uadf8\ub7a8, \uc5b4\ub5a4 \uc5b8\uc5b4\uc5d0\ub3c4 " +
"\uc0c1\uad00\uc5c6\uc774 \uc720\ub2c8\ucf54\ub4dc\ub294 \ubaa8\ub4e0 " +
"\ubb38\uc790\uc5d0 \ub300\ud574 \uace0\uc720 \ubc88\ud638\ub97c " +
"\uc81c\uacf5\ud569\ub2c8\ub2e4. " +
"\uae30\ubcf8\uc801\uc73c\ub85c \ucef4\ud4e8\ud130\ub294 " +
"\uc22b\uc790\ub9cc \ucc98\ub9ac\ud569\ub2c8\ub2e4. \uae00\uc790\ub098 " +
"\ub2e4\ub978 \ubb38\uc790\uc5d0\ub3c4 \uc22b\uc790\ub97c " +
"\uc9c0\uc815\ud558\uc5ec " +
"\uc800\uc7a5\ud569\ub2c8\ub2e4. \uc720\ub2c8\ucf54\ub4dc\uac00 " +
"\uac1c\ubc1c\ub418\uae30 \uc804\uc5d0\ub294 \uc774\ub7ec\ud55c " +
"\uc22b\uc790\ub97c \uc9c0\uc815\ud558\uae30 \uc704\ud574 \uc218\ubc31 " +
"\uac00\uc9c0\uc758 \ub2e4\ub978 \uae30\ud638\ud654 " +
"\uc2dc\uc2a4\ud15c\uc744 " +
"\uc0ac\uc6a9\ud588\uc2b5\ub2c8\ub2e4. \ub2e8\uc77c \uae30\ud638\ud654 " +
"\ubc29\ubc95\uc73c\ub85c\ub294 \ubaa8\ub4e0 \ubb38\uc790\ub97c " +
"\ud3ec\ud568\ud560 \uc218 \uc5c6\uc5c8\uc2b5\ub2c8\ub2e4. \uc608\ub97c " +
"\ub4e4\uc5b4 \uc720\ub7fd \uc5f0\ud569\uc5d0\uc11c\ub9cc " +
"\ubcf4\ub354\ub77c\ub3c4 \ubaa8\ub4e0 \uac01 \ub098\ub77c\ubcc4 " +
"\uc5b8\uc5b4\ub97c \ucc98\ub9ac\ud558\ub824\uba74 \uc5ec\ub7ec " +
"\uac1c\uc758 \ub2e4\ub978 \uae30\ud638\ud654 \ubc29\ubc95\uc774 " +
"\ud544\uc694\ud569\ub2c8\ub2e4. \uc601\uc5b4\uc640 \uac19\uc740 " +
"\ub2e8\uc77c \uc5b8\uc5b4\uc758 \uacbd\uc6b0\ub3c4 " +
"\uacf5\ud1b5\uc801\uc73c\ub85c \uc0ac\uc6a9\ub418\ub294 \ubaa8\ub4e0 " +
"\uae00\uc790, \ubb38\uc7a5 \ubd80\ud638 \ubc0f " +
"\ud14c\ud06c\ub2c8\uceec \uae30\ud638\uc5d0 \ub9de\ub294 \ub2e8\uc77c " +
"\uae30\ud638\ud654 \ubc29\ubc95\uc744 \uac16\uace0 \uc788\uc9c0 " +
"\ubabb\ud558\uc600\uc2b5\ub2c8\ub2e4. " +
"\uc774\ub7ec\ud55c \uae30\ud638\ud654 \uc2dc\uc2a4\ud15c\uc740 " +
"\ub610\ud55c \ub2e4\ub978 \uae30\ud638\ud654 \uc2dc\uc2a4\ud15c\uacfc " +
"\ucda9\ub3cc\ud569\ub2c8\ub2e4. \uc989 \ub450 \uac00\uc9c0 " +
"\uae30\ud638\ud654 \ubc29\ubc95\uc774 \ub450 \uac1c\uc758 \ub2e4\ub978 " +
"\ubb38\uc790\uc5d0 \ub300\ud574 \uac19\uc740 \ubc88\ud638\ub97c " +
"\uc0ac\uc6a9\ud558\uac70\ub098 \uac19\uc740 \ubb38\uc790\uc5d0 " +
"\ub300\ud574 \ub2e4\ub978 \ubc88\ud638\ub97c \uc0ac\uc6a9\ud560 \uc218 " +
"\uc788\uc2b5\ub2c8\ub2e4. \uc8fc\uc5b4\uc9c4 \ubaa8\ub4e0 " +
"\ucef4\ud4e8\ud130(\ud2b9\ud788 \uc11c\ubc84)\ub294 \uc11c\ub85c " +
"\ub2e4\ub978 \uc5ec\ub7ec \uac00\uc9c0 \uae30\ud638\ud654 " +
"\ubc29\ubc95\uc744 \uc9c0\uc6d0\ud574\uc57c " +
"\ud569\ub2c8\ub2e4. \uadf8\ub7ec\ub098, \ub370\uc774\ud130\ub97c " +
"\uc11c\ub85c \ub2e4\ub978 \uae30\ud638\ud654 \ubc29\ubc95\uc774\ub098 " +
"\ud50c\ub7ab\ud3fc \uac04\uc5d0 \uc804\ub2ec\ud560 \ub54c\ub9c8\ub2e4 " +
"\uadf8 \ub370\uc774\ud130\ub294 \ud56d\uc0c1 \uc190\uc0c1\uc758 " +
"\uc704\ud5d8\uc744 \uacaa\uac8c \ub429\ub2c8\ub2e4. " +
"\uc720\ub2c8\ucf54\ub4dc\ub85c \ubaa8\ub4e0 \uac83\uc744 " +
"\ud574\uacb0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4! " +
"\uc720\ub2c8\ucf54\ub4dc\ub294 \uc0ac\uc6a9 \uc911\uc778 " +
"\ud50c\ub7ab\ud3fc, \ud504\ub85c\uadf8\ub7a8, \uc5b8\uc5b4\uc5d0 " +
"\uad00\uacc4\uc5c6\uc774 \ubb38\uc790\ub9c8\ub2e4 \uace0\uc720\ud55c " +
"\uc22b\uc790\ub97c " +
"\uc81c\uacf5\ud569\ub2c8\ub2e4. \uc720\ub2c8\ucf54\ub4dc " +
"\ud45c\uc900\uc740 " + // "Apple, HP, IBM, JustSystem, Microsoft, Oracle, SAP, " +
// "Sun, Sybase, Unisys " +
"\ubc0f \uae30\ud0c0 \uc5ec\ub7ec " +
"\ud68c\uc0ac\uc640 \uac19\uc740 \uc5c5\uacc4 " +
"\uc120\ub450\uc8fc\uc790\uc5d0 \uc758\ud574 " +
"\ucc44\ud0dd\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc720\ub2c8\ucf54\ub4dc\ub294 " +
// "XML, Java, ECMAScript(JavaScript), LDAP, CORBA 3.0, WML " +
"\ub4f1\uacfc " +
"\uac19\uc774 \ud604\uc7ac \ub110\ub9ac \uc0ac\uc6a9\ub418\ub294 " +
"\ud45c\uc900\uc5d0\uc11c \ud544\uc694\ud558\uba70 \uc774\ub294 " + //ISO/IEC " +
"10646\uc744 \uad6c\ud604\ud558\ub294 \uacf5\uc2dd\uc801\uc778 " +
"\ubc29\ubc95\uc785\ub2c8\ub2e4. \uc774\ub294 \ub9ce\uc740 \uc6b4\uc601 " +
"\uccb4\uc81c, \uc694\uc998 \uc0ac\uc6a9\ub418\ub294 \ubaa8\ub4e0 " +
"\ube0c\ub77c\uc6b0\uc800 \ubc0f \uae30\ud0c0 \ub9ce\uc740 " +
"\uc81c\ud488\uc5d0\uc11c " +
"\uc9c0\uc6d0\ub429\ub2c8\ub2e4. \uc720\ub2c8\ucf54\ub4dc " +
"\ud45c\uc900\uc758 \ubd80\uc0c1\uacfc \uc774\ub97c " +
"\uc9c0\uc6d0\ud558\ub294 \ub3c4\uad6c\uc758 \uac00\uc6a9\uc131\uc740 " +
"\ucd5c\uadfc \uc804 \uc138\uacc4\uc5d0 \ubd88\uace0 \uc788\ub294 " +
"\uae30\uc220 \uacbd\ud5a5\uc5d0\uc11c \uac00\uc7a5 \uc911\uc694\ud55c " +
"\ubd80\ubd84\uc744 \ucc28\uc9c0\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. " +
"\uc720\ub2c8\ucf54\ub4dc\ub97c " +
// Replaced a hyphen with a space to make the test case work with CLDR1.5
// "\ud074\ub77c\uc774\uc5b8\ud2b8-\uc11c\ubc84 \ub610\ub294 " +
"\ud074\ub77c\uc774\uc5b8\ud2b8 \uc11c\ubc84 \ub610\ub294 " +
// Replaced a hyphen with a space.
// "\ub2e4\uc911-\uc5f0\uacb0 \uc751\uc6a9 \ud504\ub85c\uadf8\ub7a8\uacfc " +
"\ub2e4\uc911 \uc5f0\uacb0 \uc751\uc6a9 \ud504\ub85c\uadf8\ub7a8\uacfc " +
"\uc6f9 \uc0ac\uc774\ud2b8\uc5d0 \ud1b5\ud569\ud558\uba74 " +
"\ub808\uac70\uc2dc \ubb38\uc790 \uc138\ud2b8 \uc0ac\uc6a9\uc5d0 " +
"\uc788\uc5b4\uc11c \uc0c1\ub2f9\ud55c \ube44\uc6a9 \uc808\uac10 " +
"\ud6a8\uacfc\uac00 " +
"\ub098\ud0c0\ub0a9\ub2c8\ub2e4. \uc720\ub2c8\ucf54\ub4dc\ub97c " +
"\ud1b5\ud574 \ub9ac\uc5d4\uc9c0\ub2c8\uc5b4\ub9c1 \uc5c6\uc774 " +
"\ub2e4\uc911 \ud50c\ub7ab\ud3fc, \uc5b8\uc5b4 \ubc0f \uad6d\uac00 " +
"\uac04\uc5d0 \ub2e8\uc77c \uc18c\ud504\ud2b8\uc6e8\uc5b4 " +
"\ud50c\ub7ab\ud3fc \ub610\ub294 \ub2e8\uc77c \uc6f9 " +
"\uc0ac\uc774\ud2b8\ub97c \ubaa9\ud45c\ub85c \uc0bc\uc744 \uc218 " +
"\uc788\uc2b5\ub2c8\ub2e4. \uc774\ub97c \uc0ac\uc6a9\ud558\uba74 " +
"\ub370\uc774\ud130\ub97c \uc190\uc0c1 \uc5c6\uc774 \uc5ec\ub7ec " +
"\uc2dc\uc2a4\ud15c\uc744 \ud1b5\ud574 \uc804\uc1a1\ud560 \uc218 " +
"\uc788\uc2b5\ub2c8\ub2e4. " +
"\uc720\ub2c8\ucf54\ub4dc \ucf58\uc18c\uc2dc\uc5c4\uc5d0 \ub300\ud574 " +
"\uc720\ub2c8\ucf54\ub4dc \ucf58\uc18c\uc2dc\uc5c4\uc740 " +
"\ube44\uc601\ub9ac \uc870\uc9c1\uc73c\ub85c\uc11c \ud604\ub300 " +
"\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc81c\ud488\uacfc " +
"\ud45c\uc900\uc5d0\uc11c \ud14d\uc2a4\ud2b8\uc758 \ud45c\ud604\uc744 " +
"\uc9c0\uc815\ud558\ub294 \uc720\ub2c8\ucf54\ub4dc \ud45c\uc900\uc758 " +
"\uc0ac\uc6a9\uc744 \uac1c\ubc1c\ud558\uace0 \ud655\uc7a5\ud558\uba70 " +
"\uc7a5\ub824\ud558\uae30 \uc704\ud574 " +
"\uc138\uc6cc\uc84c\uc2b5\ub2c8\ub2e4. \ucf58\uc18c\uc2dc\uc5c4 " +
"\uba64\ubc84\uc27d\uc740 \ucef4\ud4e8\ud130\uc640 \uc815\ubcf4 " +
"\ucc98\ub9ac \uc0b0\uc5c5\uc5d0 \uc885\uc0ac\ud558\uace0 \uc788\ub294 " +
"\uad11\ubc94\uc704\ud55c \ud68c\uc0ac \ubc0f \uc870\uc9c1\uc758 " +
"\ubc94\uc704\ub97c " +
"\ub098\ud0c0\ub0c5\ub2c8\ub2e4. \ucf58\uc18c\uc2dc\uc5c4\uc758 " +
"\uc7ac\uc815\uc740 \uc804\uc801\uc73c\ub85c \ud68c\ube44\uc5d0 " +
"\uc758\ud574 \ucda9\ub2f9\ub429\ub2c8\ub2e4. \uc720\ub2c8\ucf54\ub4dc " +
"\ucee8\uc18c\uc2dc\uc5c4\uc5d0\uc11c\uc758 \uba64\ubc84\uc27d\uc740 " +
"\uc804 \uc138\uacc4 \uc5b4\ub290 \uacf3\uc5d0\uc11c\ub098 " +
"\uc720\ub2c8\ucf54\ub4dc \ud45c\uc900\uc744 \uc9c0\uc6d0\ud558\uace0 " +
"\uadf8 \ud655\uc7a5\uacfc \uad6c\ud604\uc744 " +
"\uc9c0\uc6d0\ud558\uace0\uc790\ud558\ub294 \uc870\uc9c1\uacfc " +
"\uac1c\uc778\uc5d0\uac8c \uac1c\ubc29\ub418\uc5b4 " +
"\uc788\uc2b5\ub2c8\ub2e4. " +
"\ub354 \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 \uc6a9\uc5b4\uc9d1, " +
"\uc608\uc81c \uc720\ub2c8\ucf54\ub4dc \uc0ac\uc6a9 \uac00\ub2a5 " +
"\uc81c\ud488, \uae30\uc220 \uc815\ubcf4 \ubc0f \uae30\ud0c0 " +
"\uc720\uc6a9\ud55c \uc815\ubcf4\ub97c " +
"\ucc38\uc870\ud558\uc2ed\uc2dc\uc624.";
// TransliteratorTest override
boolean expectAux(String tag, String summary, boolean pass,
String expectedResult) {
return super.expectAux(tag, jamoToName(summary),
pass, jamoToName(expectedResult));
}
// UTILITIES
// Note: The following could more easily be done with a transliterator!
static final String[] JAMO_NAMES = {
"(Gi)", "\u1100",
"(GGi)", "\u1101",
"(Ni)", "\u1102",
"(Di)", "\u1103",
"(DD)", "\u1104",
"(R)", "\u1105",
"(Mi)", "\u1106",
"(Bi)", "\u1107",
"(BB)", "\u1108",
"(Si)", "\u1109",
"(SSi)", "\u110A",
"(IEUNG)", "\u110B",
"(Ji)", "\u110C",
"(JJ)", "\u110D",
"(Ci)", "\u110E",
"(Ki)", "\u110F",
"(Ti)", "\u1110",
"(Pi)", "\u1111",
"(Hi)", "\u1112",
"(A)", "\u1161",
"(AE)", "\u1162",
"(YA)", "\u1163",
"(YAE)", "\u1164",
"(EO)", "\u1165",
"(E)", "\u1166",
"(YEO)", "\u1167",
"(YE)", "\u1168",
"(O)", "\u1169",
"(WA)", "\u116A",
"(WAE)", "\u116B",
"(OE)", "\u116C",
"(YO)", "\u116D",
"(U)", "\u116E",
"(WEO)", "\u116F",
"(WE)", "\u1170",
"(WI)", "\u1171",
"(YU)", "\u1172",
"(EU)", "\u1173",
"(YI)", "\u1174",
"(I)", "\u1175",
"(Gf)", "\u11A8",
"(GGf)", "\u11A9",
"(GS)", "\u11AA",
"(Nf)", "\u11AB",
"(NJ)", "\u11AC",
"(NH)", "\u11AD",
"(Df)", "\u11AE",
"(L)", "\u11AF",
"(LG)", "\u11B0",
"(LM)", "\u11B1",
"(LB)", "\u11B2",
"(LS)", "\u11B3",
"(LT)", "\u11B4",
"(LP)", "\u11B5",
"(LH)", "\u11B6",
"(Mf)", "\u11B7",
"(Bf)", "\u11B8",
"(BS)", "\u11B9",
"(Sf)", "\u11BA",
"(SSf)", "\u11BB",
"(NG)", "\u11BC",
"(Jf)", "\u11BD",
"(Cf)", "\u11BE",
"(Kf)", "\u11BF",
"(Tf)", "\u11C0",
"(Pf)", "\u11C1",
"(Hf)", "\u11C2",
};
static Hashtable JAMO_TO_NAME;
static Hashtable NAME_TO_JAMO;
static {
JAMO_TO_NAME = new Hashtable();
NAME_TO_JAMO = new Hashtable();
for (int i=0; i<JAMO_NAMES.length; i+=2) {
JAMO_TO_NAME.put(JAMO_NAMES[i+1], JAMO_NAMES[i]);
NAME_TO_JAMO.put(JAMO_NAMES[i], JAMO_NAMES[i+1]);
}
}
/**
* Convert short names to actual jamo. E.g., "x(LG)y" returns
* "x\u11B0y". See JAMO_NAMES for table of names.
*/
static String nameToJamo(String input) {
StringBuffer buf = new StringBuffer();
for (int i=0; i<input.length(); ++i) {
char c = input.charAt(i);
if (c == '(') {
int j = input.indexOf(')', i+1);
if ((j-i) >= 2 && (j-i) <= 6) { // "(A)", "(IEUNG)"
String jamo = (String) NAME_TO_JAMO.get(input.substring(i, j+1));
if (jamo != null) {
buf.append(jamo);
i = j;
continue;
}
}
}
buf.append(c);
}
return buf.toString();
}
/**
* Convert jamo to short names. E.g., "x\u11B0y" returns
* "x(LG)y". See JAMO_NAMES for table of names.
*/
static String jamoToName(String input) {
StringBuffer buf = new StringBuffer();
for (int i=0; i<input.length(); ++i) {
char c = input.charAt(i);
if (c >= 0x1100 && c <= 0x11C2) {
String name = (String) JAMO_TO_NAME.get(input.substring(i, i+1));
if (name != null) {
buf.append(name);
continue;
}
}
buf.append(c);
}
return buf.toString();
}
}