//##header
/**
 *******************************************************************************
 * Copyright (C) 2001-2006, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */
package com.ibm.icu.dev.test;

import java.util.Iterator;

/**
 * Represents a collection of test data described in a file.
 * 
 */
public interface TestDataModule {
    /**
     * Return the name of this test data module.
     */
    public String getName();

    /**
     * Get additional data related to the module, e.g. DESCRIPTION,
     * global settings.  Might be null.
     */
    public DataMap getInfo();

    /**
     * Returns the TestData corresponding to name, or null if name not
     * found in this module.  Throw error if name is not found.  
     * @throws DataModuleFormatError
     */
    public TestData getTestData(String name) throws DataModuleFormatError;

    /**
     * @return Iterator<TestData>
     */
    public Iterator getTestDataIterator();

    public static class Factory{

        static final TestDataModule get(String baseName, String localeName) throws DataModuleFormatError {
            return new ResourceModule(baseName, localeName);
        }
    }

    public static class DataModuleFormatError extends Exception{
        public DataModuleFormatError(String msg){
            super(msg);
        }
//#ifndef FOUNDATION
        public DataModuleFormatError(String msg, Throwable cause){
            super(msg, cause);
        }
        public DataModuleFormatError(Throwable cause) {
            super(cause);
        }
//#endif
    }
    
    /**
     * Represents a single test in the module.
     */
    public static interface TestData {
        public String getName();
        /**
         * Get additional data related to the test data, e.g. DESCRIPTION,
         * global settings.  Might be null.
         */
        public DataMap getInfo();
        /**
         * @return Iterator<DataMap>
         */
        public Iterator getSettingsIterator();
        /**
         * @return Iterator<DataMap>
         */
        public Iterator getDataIterator();
    }

    /**
     * Map-like interface for accessing key-value pairs by key.
     * If the vaule is not found by given key, return null. 
     * The behavior is analogous the get() method of the Map interface.
     * 
     * @author Raymond Yang
     */
    public interface DataMap {
//    public abstract boolean    isDefined(String key);
//
    public abstract Object     getObject(String key);
    public abstract String     getString(String key);
//    public abstract char       getChar(String key);
//    public abstract int        getInt(String key);
//    public abstract byte       getByte(String key);
//    public abstract boolean    getBoolean(String key);
//
//    public abstract Object[]   getObjectArray(String key);
//    public abstract String[]   getStringArray(String key);
//    public abstract char[]     getCharArray(String key);
//    public abstract int[]      getIntArray(String key);
//    public abstract byte[]     getByteArray(String key);
//    public abstract boolean[]  getBooleanArray(String key);
    }
}
    
