// Copyright (C) 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html
/********************************************************************
 * COPYRIGHT:
 * Copyright (c) 1998-2016, International Business Machines Corporation and
 * others. All Rights Reserved.
 ********************************************************************/

/**
 * MajorTestLevel is the top level test class for everything in the directory "IntlWork".
 */

/***********************************************************************
* Modification history
* Date        Name        Description
* 02/14/2001  synwee      Release collation for testing.
***********************************************************************/

#include "unicode/utypes.h"
#include "unicode/localpointer.h"
#include "itmajor.h"

#include "itutil.h"
#include "tscoll.h"
#include "itformat.h"
#include "ittrans.h"
#include "itrbbi.h"
#include "itrbnf.h"
#include "itrbnfp.h"
#include "itrbnfrt.h"
#include "itspoof.h"
#include "normconf.h"
#include "regextst.h"
#include "tstnorm.h"
#include "canittst.h"
#include "icusvtst.h"
#include "testidna.h"
#include "convtest.h"
#include "csdetest.h"

extern IntlTest *createBiDiConformanceTest();

#define CASE_SUITE(id, suite) case id:                  \
                          name = #suite;                \
                          if(exec) {                    \
                              logln(#suite "---");      \
                              suite test;               \
                              callTest(test, par);      \
                          }                             \
                          break

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

        case 1: name = "normalize";
#if !UCONFIG_NO_NORMALIZATION
                if (exec) {
                    logln("TestSuite Normalize---"); logln();
                    IntlTestNormalize test;
                    callTest( test, par );
                }
#endif
                break;

        case 2: name = "collate";
#if !UCONFIG_NO_COLLATION
                if (exec) {
                    logln("TestSuite Collator---"); logln();
                    IntlTestCollator test;
                    callTest( test, par );
                }
#endif
                break;

        case 3: name = "regex";
#if !UCONFIG_NO_REGULAR_EXPRESSIONS
                if (exec) {
                    logln("TestSuite Regex---"); logln();
                    RegexTest test;
                    callTest( test, par );
                }
#endif
                break;

        case 4: name = "format";
#if !UCONFIG_NO_FORMATTING
                if (exec) {
                    logln("TestSuite Format---"); logln();
                    IntlTestFormat test;
                    callTest( test, par );
                }
#endif
                break;

        case 5: name = "translit";
#if !UCONFIG_NO_TRANSLITERATION
                if (exec) {
                    logln("TestSuite Transliterator---"); logln();
                    IntlTestTransliterator test;
                    callTest( test, par );
                }
#endif
                break;

        case 6: name = "rbbi";
#if !UCONFIG_NO_BREAK_ITERATION && !UCONFIG_NO_REGULAR_EXPRESSIONS
                if (exec) {
                    logln("TestSuite RuleBasedBreakIterator---"); logln();
                    IntlTestRBBI test;
                    callTest( test, par );
                }
#endif
                break;
        case 7: name = "rbnf";
#if !UCONFIG_NO_FORMATTING
                if (exec) {
                    logln("TestSuite RuleBasedNumberFormat----"); logln();
                    IntlTestRBNF test;
                    callTest(test, par);
                }
#endif
                break;
        case 8: name = "rbnfrt";
#if !UCONFIG_NO_FORMATTING
                if (exec) {
                    logln("TestSuite RuleBasedNumberFormat RT----"); logln();
                    RbnfRoundTripTest test;
                    callTest(test, par);
                }
#endif
                break;

        case 9: name = "icuserv";
#if !UCONFIG_NO_SERVICE
                if (exec) {
                    logln("TestSuite ICUService---"); logln();
                    ICUServiceTest test;
                    callTest(test, par);
                }
#endif
                break;
        case 10: name = "idna";
#if !UCONFIG_NO_IDNA  && !UCONFIG_NO_TRANSLITERATION
            if(exec){
                logln("TestSuite IDNA----"); logln();
                TestIDNA test;
                callTest(test,par);
            }
#endif
            break;
        case 11: name = "convert";
#if !UCONFIG_NO_LEGACY_CONVERSION
                if (exec) {
                    logln("TestSuite Conversion---"); logln();
                    ConversionTest test;
                    callTest( test, par );
                }
#endif
                break;

            case 12: name = "rbnfp";
#if !UCONFIG_NO_FORMATTING
                if (exec) {
                    logln("TestSuite RuleBasedNumberParse ----"); logln();
                    IntlTestRBNFParse test;
                    callTest(test, par);
                }
#endif
                break;

            case 13: name = "csdet";
                if (exec) {
                    logln("TestSuite CharsetDetection---"); logln();
                    CharsetDetectionTest test;
                    callTest(test, par);
                }

                break;

            case 14:
#if !UCONFIG_NO_REGULAR_EXPRESSIONS && !UCONFIG_NO_NORMALIZATION && !UCONFIG_NO_FILE_IO
                name = "spoof";
                if (exec) {
                    logln("TestSuite SpoofDetection---"); logln();
                    IntlTestSpoof test;
                    callTest(test, par);
                }
#else
                name = "skip";
#endif
                break;

            case 15: name = "bidi";
                if (exec) {
                    logln("TestSuite bidi---"); logln();
                    LocalPointer<IntlTest> test(createBiDiConformanceTest());
                    callTest(*test, par);
                }

                break;

        default: name = ""; break;
    }


}

void IntlTestNormalize::runIndexedTest( int32_t index, UBool exec, const char* &name, char* par )
{
    if(exec) logln("TestSuite Normalize:");
#if UCONFIG_NO_NORMALIZATION
    name="";
#else
    switch (index) {
        CASE_SUITE(0, BasicNormalizerTest);
        CASE_SUITE(1, NormalizerConformanceTest); // this takes a long time
        CASE_SUITE(2, CanonicalIteratorTest);
        default:
            name="";
            break;
    }
#endif
}
