/** ******************************************************************************* * Copyright (C) 2001-2010, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* */ package com.ibm.icu.dev.test.translit; import com.ibm.icu.dev.test.TestFmwk; import com.ibm.icu.text.ReplaceableString; import com.ibm.icu.text.Transliterator; import com.ibm.icu.text.UnicodeSet; /** * @test * @summary Error condition test of Transliterator */ public class ErrorTest extends TestFmwk { public static void main(String[] args) throws Exception { new ErrorTest().run(args); } 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 (IllegalArgumentException 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 (IllegalArgumentException 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 (IllegalArgumentException 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 (IllegalArgumentException 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 (IllegalArgumentException 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 (IllegalArgumentException 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) { } } public void TestUnicodeSetErrors() { String badPattern = "[[:L:]-[0x0300-0x0400]"; UnicodeSet set = new UnicodeSet(); //String result; if (!set.isEmpty()) { errln("FAIL: The default ctor of UnicodeSet created a non-empty object."); } try { set.applyPattern(badPattern); errln("FAIL: Applied a bad pattern to the UnicodeSet object okay."); } catch (IllegalArgumentException e) { logln("Test applying with the bad pattern."); } try { new UnicodeSet(badPattern); errln("FAIL: Created a UnicodeSet based on bad patterns."); } catch (IllegalArgumentException e) { logln("Test constructing with the bad pattern."); } } // public void TestUniToHexErrors() { // Transliterator t = null; // try { // t = new UnicodeToHexTransliterator("", true, null); // if (t != null) { // errln("FAIL: Created a UnicodeToHexTransliterator with an empty pattern."); // } // } catch (IllegalArgumentException e) { // } // try { // t = new UnicodeToHexTransliterator("\\x", true, null); // if (t != null) { // errln("FAIL: Created a UnicodeToHexTransliterator with a bad pattern."); // } // } catch (IllegalArgumentException e) { // } // t = new UnicodeToHexTransliterator(); // try { // ((UnicodeToHexTransliterator) t).applyPattern("\\x"); // errln("FAIL: UnicodeToHexTransliterator::applyPattern succeeded with a bad pattern."); // } catch (Exception e) { // } // } public void TestRBTErrors() { String rules = "ab>y"; String id = "MyRandom-YReverse"; String goodPattern = "[[:L:]&[\\u0000-\\uFFFF]]"; /* all BMP letters */ UnicodeSet set = null; try { set = new UnicodeSet(goodPattern); try { Transliterator t = Transliterator.createFromRules(id, rules, Transliterator.REVERSE); t.setFilter(set); Transliterator.registerClass(id, t.getClass(), null); Transliterator.unregister(id); try { Transliterator.getInstance(id, Transliterator.REVERSE); errln("FAIL: construction of unregistered ID should have failed."); } catch (IllegalArgumentException e) { } } catch (IllegalArgumentException e) { errln("FAIL: Was not able to create a good RBT to test registration."); } } catch (IllegalArgumentException e) { errln("FAIL: Was not able to create a good UnicodeSet based on valid patterns."); return; } } // public void TestHexToUniErrors() { // Transliterator t = null; // //try { // unneeded - exception cannot be thrown // t = new HexToUnicodeTransliterator("", null); // //} catch (Exception e) { // // errln("FAIL: Could not create a HexToUnicodeTransliterator with an empty pattern."); // //} // try { // t = new HexToUnicodeTransliterator("\\x", null); // errln("FAIL: Created a HexToUnicodeTransliterator with a bad pattern."); // } catch (IllegalArgumentException e) { // } // // t = new HexToUnicodeTransliterator(); // try { // ((HexToUnicodeTransliterator) t).applyPattern("\\x"); // errln("FAIL: HexToUnicodeTransliterator::applyPattern succeeded with a bad pattern."); // } catch (IllegalArgumentException e) { // } // } }