/**
 *******************************************************************************
 * Copyright (C) 2001-2004, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */
package com.ibm.icu.dev.test.translit;
import com.ibm.icu.dev.test.*;
import com.ibm.icu.text.*;

/**
 * @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 {
            UnicodeSet set1 = new UnicodeSet(badPattern);
            errln("FAIL: Created a UnicodeSet based on bad patterns.");
            if (set1 != null) {
                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 t1 =
                        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) {
//        }
//    }
}
