public void TestIncrementalProgress(string lang, string text) { var targets = Transliterator.GetAvailableTargets(lang); foreach (string target in targets) { var variants = Transliterator.GetAvailableVariants(lang, target); foreach (var variant in variants) { String id = lang + "-" + target + "/" + variant; Logln("id: " + id); Transliterator t = Transliterator.GetInstance(id); CheckIncrementalAux(t, text); String rev = t.Transliterate(text); // Special treatment: This transliterator has no registered inverse, skip for now. if (id.Equals("Devanagari-Arabic/")) { continue; } Transliterator inv = t.GetInverse(); CheckIncrementalAux(inv, rev); } } }
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.Length = (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())); } } }
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) { TransliteratorTest.Expect(latinJamo, CASE[i], jamo, jamoLatin); } else { // Handle case where round-trip is expected to fail TransliteratorTest.Expect(latinJamo, CASE[i], jamo); TransliteratorTest.Expect(jamoLatin, jamo, CASE[i + 2]); } } }
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 - pos); // ICU4N: Corrected 2nd parameter 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.Length = (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.Length = (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.Length = (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"); } }
public void TestTransliteratorErrors() { String trans = "Latin-Greek"; String bogusID = "LATINGREEK-GREEKLATIN"; String newID = "Bogus-Latin"; String newIDRules = "zzz > Z; f <> ph"; String bogusRules = "a } [b-g m-p "; ReplaceableString testString = new ReplaceableString("A quick fox jumped over the lazy dog."); String insertString = "cats and dogs"; int stoppedAt = 0, len; Transliterator.Position pos = new Transliterator.Position(); Transliterator t = Transliterator.GetInstance(trans, Transliterator.FORWARD); if (t == null) { Errln("FAIL: construction of Latin-Greek"); return; } len = testString.Length; stoppedAt = t.Transliterate(testString, 0, 100); if (stoppedAt != -1) { Errln("FAIL: Out of bounds check failed (1)."); } else if (testString.Length != len) { testString = new ReplaceableString("A quick fox jumped over the lazy dog."); Errln("FAIL: Transliterate fails and the target string was modified."); } stoppedAt = t.Transliterate(testString, 100, testString.Length - 1); if (stoppedAt != -1) { Errln("FAIL: Out of bounds check failed (2)."); } else if (testString.Length != len) { testString = new ReplaceableString("A quick fox jumped over the lazy dog."); Errln("FAIL: Transliterate fails and the target string was modified."); } pos.Start = 100; pos.Limit = testString.Length; try { t.Transliterate(testString, pos); Errln("FAIL: Start offset is out of bounds, error not reported."); } catch (ArgumentException e) { Logln("Start offset is out of bounds and detected."); } pos.Limit = 100; pos.Start = 0; try { t.Transliterate(testString, pos); Errln("FAIL: Limit offset is out of bounds, error not reported.\n"); } catch (ArgumentException e) { Logln("Start offset is out of bounds and detected."); } len = pos.ContextLimit = testString.Length; pos.ContextStart = 0; pos.Limit = len - 1; pos.Start = 5; try { t.Transliterate(testString, pos, insertString); if (len == pos.Limit) { Errln("FAIL: Test insertion with string: the transliteration position limit didn't change as expected."); } } catch (ArgumentException e) { Errln("Insertion test with string failed for some reason."); } pos.ContextStart = 0; pos.ContextLimit = testString.Length; pos.Limit = testString.Length - 1; pos.Start = 5; try { t.Transliterate(testString, pos, 0x0061); if (len == pos.Limit) { Errln("FAIL: Test insertion with character: the transliteration position limit didn't change as expected."); } } catch (ArgumentException e) { Errln("FAIL: Insertion test with UTF-16 code point failed for some reason."); } len = pos.Limit = testString.Length; pos.ContextStart = 0; pos.ContextLimit = testString.Length - 1; pos.Start = 5; try { t.Transliterate(testString, pos, insertString); Errln("FAIL: Out of bounds check failed (3)."); if (testString.Length != len) { Errln("FAIL: The input string was modified though the offsets were out of bounds."); } } catch (ArgumentException e) { Logln("Insertion test with out of bounds indexes."); } Transliterator t1 = null; try { t1 = Transliterator.GetInstance(bogusID, Transliterator.FORWARD); if (t1 != null) { Errln("FAIL: construction of bogus ID \"LATINGREEK-GREEKLATIN\""); } } catch (ArgumentException e) { } //try { // unneeded - Exception cannot be thrown Transliterator t2 = Transliterator.CreateFromRules( newID, newIDRules, Transliterator.FORWARD); try { Transliterator t3 = t2.GetInverse(); Errln("FAIL: The newID transliterator was not registered so createInverse should fail."); if (t3 != null) { Errln("FAIL: The newID transliterator was not registered so createInverse should fail."); } } catch (Exception e) { } //} catch (Exception e) { } try { Transliterator t4 = Transliterator.CreateFromRules( newID, bogusRules, Transliterator.FORWARD); if (t4 != null) { Errln("FAIL: The rules is malformed but error was not reported."); } } catch (Exception e) { } }