/*
 *******************************************************************************
 * Copyright (C) 1996-2009, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 *
 */

package com.ibm.icu.dev.test.serializable;

import java.util.Locale;

import com.ibm.icu.impl.InvalidFormatException;
import com.ibm.icu.impl.locale.LocaleSyntaxException;
import com.ibm.icu.text.ArabicShapingException;
import com.ibm.icu.text.StringPrepParseException;
import com.ibm.icu.util.IllformedLocaleException;
import com.ibm.icu.util.UResourceTypeMismatchException;

/**
 * @author emader
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class ExceptionTests
{
    static abstract class ExceptionHandler implements SerializableTest.Handler
    {
        abstract public Object[] getTestObjects();
        
        public boolean hasSameBehavior(Object a, Object b)
        {
            Exception ea = (Exception) a;
            Exception eb = (Exception) b;
            
            return ea.toString().equals(eb.toString());
        }
    }
    
    static class ArabicShapingExceptionHandler extends ExceptionHandler
    {
        public Object[] getTestObjects()
        {
            Locale locales[] = SerializableTest.getLocales();
            ArabicShapingException exceptions[] = new ArabicShapingException[locales.length];
            
            for (int i = 0; i < locales.length; i += 1) {
                exceptions[i] = new ArabicShapingException(locales[i].toString());
            }
            
            return exceptions;
        }
    }
    
    static class StringPrepParseExceptionHandler extends ExceptionHandler
    {
        public Object[] getTestObjects()
        {
            Locale locales[] = SerializableTest.getLocales();
            String rules = "This is a very odd little set of rules, just for testing, you know...";
            StringPrepParseException exceptions[] = new StringPrepParseException[locales.length];
            
            for (int i = 0; i < locales.length; i += 1) {
                exceptions[i] = new StringPrepParseException(locales[i].toString(), i, rules, i);
            }
            
            return exceptions;
        }
    }
    
    static class UResourceTypeMismatchExceptionHandler extends ExceptionHandler
    {
        public Object[] getTestObjects()
        {
            Locale locales[] = SerializableTest.getLocales();
            UResourceTypeMismatchException exceptions[] = new UResourceTypeMismatchException[locales.length];
            
            for (int i = 0; i < locales.length; i += 1) {
                exceptions[i] = new UResourceTypeMismatchException(locales[i].toString());
            }
            
            return exceptions;
        }
    }
    
    static class InvalidFormatExceptionHandler extends ExceptionHandler
    {
        public Object[] getTestObjects()
        {
            Locale locales[] = SerializableTest.getLocales();
            InvalidFormatException exceptions[] = new InvalidFormatException[locales.length];
            
            for (int i = 0; i < locales.length; i += 1) {
                exceptions[i] = new InvalidFormatException(locales[i].toString());
            }
            
            return exceptions;
        }
    }

    static class IllformedLocaleExceptionHandler extends ExceptionHandler
    {
        public Object[] getTestObjects()
        {
            IllformedLocaleException[] exceptions = new IllformedLocaleException[2];
            exceptions[0] = new IllformedLocaleException("msg1");
            exceptions[1] = new IllformedLocaleException("msg2", 5);
            return exceptions;
        }
        public boolean hasSameBehavior(Object a, Object b)
        {
            IllformedLocaleException ifeA = (IllformedLocaleException) a;
            IllformedLocaleException ifeB = (IllformedLocaleException) b;
            if (ifeA.getErrorIndex() != ifeB.getErrorIndex()) {
                return false;
            }
            return super.hasSameBehavior(a, b);
        }
    }

    static class LocaleSyntaxExceptionHandler extends ExceptionHandler
    {
        public Object[] getTestObjects()
        {
            LocaleSyntaxException[] exceptions = new LocaleSyntaxException[2];
            exceptions[0] = new LocaleSyntaxException("msg1");
            exceptions[1] = new LocaleSyntaxException("msg2", 5);
            return exceptions;
        }
        public boolean hasSameBehavior(Object a, Object b)
        {
            LocaleSyntaxException ifeA = (LocaleSyntaxException) a;
            LocaleSyntaxException ifeB = (LocaleSyntaxException) b;
            if (ifeA.getErrorIndex() != ifeB.getErrorIndex()) {
                return false;
            }
            return super.hasSameBehavior(a, b);
        }
    }

    public static void main(String[] args)
    {
    }
}
