/********************************************************************
 * COPYRIGHT: 
 * Copyright (c) 1997-2001, International Business Machines Corporation and
 * others. All Rights Reserved.
 ********************************************************************/


/**
 * IntlTestUtilities is the medium level test class for everything in the directory "utility".
 */

#include "unicode/utypes.h"
#include "itutil.h"
#include "strtest.h"
#include "loctest.h"
#include "citrtest.h"
#include "ustrtest.h"
#include "ucdtest.h"
#include "restest.h"
#include "restsnew.h"
#include "tsmutex.h"
#include "tsmthred.h"
#include "tsputil.h"
#include "biditst.h"
//#include "custrtest.h"
//#include "ccitrtst.h"
//#include "cloctest.h"
//#include "ctres.h"
//#include "ctucd.h"

void IntlTestUtilities::runIndexedTest( int32_t index, UBool exec, const char* &name, char* par )
{
    if (exec) logln("TestSuite Utilities: ");
    switch (index) {
        case 0:
            name = "MutexTest"; 
            if (exec) {
                logln("MutexTest---"); logln("");
                MutexTest test;
                callTest( test, par );
            }
            break;

        case 1:
            name = "MultithreadTest"; 
            if (exec) {
                logln("MultithreadTest---"); logln("");
                MultithreadTest test;
                callTest( test, par );
            }
            break;

        case 2:
            name = "StringTest"; 
            if (exec) {
                logln("StringTest---"); logln("");
                StringTest test;
                callTest( test, par );
            }
            break;

        case 3:
            name = "UnicodeStringTest"; 
            if (exec) {
                logln("UnicodeStringTest---"); logln("");
                UnicodeStringTest test;
                callTest( test, par );
            }
            break;

        case 4:
            name = "LocaleTest"; 
            if (exec) {
                logln("LocaleTest---"); logln("");
                LocaleTest test;
                callTest( test, par );
            }
            break;

        case 5:
            name = "CharIterTest"; 
            if (exec) {
                logln("CharIterTest---"); logln("");
                CharIterTest test;
                callTest( test, par );
            }
            break;

        case 6:
            name = "UnicodeTest"; 
            if (exec) {
                logln("UnicodeTest---"); logln("");
                UnicodeTest test;
                callTest( test, par );
            }
            break;

        case 7:
            name = "ResourceBundleTest"; 
            if (exec) {
                logln("ResourceBundleTest---"); logln("");
                ResourceBundleTest test;
                callTest( test, par );
            }
            break;
        case 8:
            name = "NewResourceBundleTest"; 
            if (exec) {
                logln("NewResourceBundleTest---"); logln("");
                NewResourceBundleTest test;
                callTest( test, par );
            }
            break;

        case 9:
            name = "PUtilTest"; 
            if (exec) {
                logln("PUtilTest---"); logln("");
                PUtilTest test;
                callTest( test, par );
            }
            break;

        case 10:
            name = "BiDiTest";
            if(exec){
               logln("BiDiTest----"); logln("");
               BiDiTest test;
               callTest(test,par);
            }
            break;

        /*
        case 8:
            name = "LocaleTest"; 
            if (exec) {
                logln("LocaleTest---"); logln("");
                CLocaleTest test;
                callTest( test, par );
            }
            break;


        case 9:
            name = "UnicodeStringCAPI";
            if (exec) {
                logln("UnicodeString C Round Trip test---"); logln("");
                CUnicodeStringTest test;
                callTest(test, par);
            }
            break;

        case 10:
            name = "CharacterIteratorCAPI";
            if (exec) {
                logln("CharacterIterator C Round Trip test---"); logln("");
                CCharIterTest test;
                callTest(test, par);
            }
            break;


        case 11:
            name = "UnicodeCAPI";
            if (exec) {
                logln("Unicode C-API test---"); logln();
                TestCwrapperUnicode test;
                callTest(test, par);
            }
            break;

        case 12:
            name = "ResourceBundleCAPI";
            if (exec) {
                logln("ResourceBundle C-API test---"); logln();
                TestCwrapperResourceBundle test;
                callTest(test, par);
            }
            break;
        */
        default: name = ""; break; //needed to end loop
    }
}

