/**
 *******************************************************************************
 * Copyright (C) 2001-2008, 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 {

    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)(Cf)", null,
                "geumhui", "(Gi)(EU)(Mf)(Hi)(YI)", null,
                "choe", "(Ci)(OE)", null,
                "wo", "(IEUNG)(WEO)", null,
                "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)", null,
                "gag-a", "(Gi)(A)(Gf)(IEUNG)(A)", null,
                "gak-ka", "(Gi)(A)(Kf)(Ki)(A)", null,
                "gakka", "(Gi)(A)(GGi)(A)", null,
                "gakk-a", "(Gi)(A)(GGf)(IEUNG)(A)", null,
                "gakkka", "(Gi)(A)(GGf)(Ki)(A)", null,
                "gak-kka", "(Gi)(A)(Kf)(GGi)(A)", null,

            "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) {
            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";
        String latin2 = "mich";

        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, latin2);

        t = Transliterator.getInstance("Hangul-Latin");
        expect(t, hangul, latin2);

        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();
    }
}
