/*
**********************************************************************
* Copyright (C) 2011-2015, International Business Machines Corporation 
* and others.  All Rights Reserved.
**********************************************************************
*/
/**
 * IntlTestSpoof tests for USpoofDetector
 */

#include "unicode/utypes.h"

#if !UCONFIG_NO_REGULAR_EXPRESSIONS && !UCONFIG_NO_NORMALIZATION && !UCONFIG_NO_FILE_IO

#include "itspoof.h"

#include "unicode/normlzr.h"
#include "unicode/regex.h"
#include "unicode/unistr.h"
#include "unicode/uscript.h"
#include "unicode/uspoof.h"

#include "cstring.h"
#include "identifier_info.h"
#include "scriptset.h"
#include "uhash.h"

#include <stdlib.h>
#include <stdio.h>

#define TEST_ASSERT_SUCCESS(status) {if (U_FAILURE(status)) { \
    errcheckln(status, "Failure at file %s, line %d, error = %s", __FILE__, __LINE__, u_errorName(status));}}

#define TEST_ASSERT(expr) {if ((expr)==FALSE) { \
    errln("Test Failure at file %s, line %d: \"%s\" is false.", __FILE__, __LINE__, #expr);};}

#define TEST_ASSERT_MSG(expr, msg) {if ((expr)==FALSE) { \
    dataerrln("Test Failure at file %s, line %d, %s: \"%s\" is false.", __FILE__, __LINE__, msg, #expr);};}

#define TEST_ASSERT_EQ(a, b) { if ((a) != (b)) { \
    errln("Test Failure at file %s, line %d: \"%s\" (%d) != \"%s\" (%d)", \
             __FILE__, __LINE__, #a, (a), #b, (b)); }}

#define TEST_ASSERT_NE(a, b) { if ((a) == (b)) { \
    errln("Test Failure at file %s, line %d: \"%s\" (%d) == \"%s\" (%d)", \
             __FILE__, __LINE__, #a, (a), #b, (b)); }}

/*
 *   TEST_SETUP and TEST_TEARDOWN
 *         macros to handle the boilerplate around setting up test case.
 *         Put arbitrary test code between SETUP and TEARDOWN.
 *         "sc" is the ready-to-go  SpoofChecker for use in the tests.
 */
#define TEST_SETUP {  \
    UErrorCode status = U_ZERO_ERROR; \
    USpoofChecker *sc;     \
    sc = uspoof_open(&status);  \
    TEST_ASSERT_SUCCESS(status);   \
    if (U_SUCCESS(status)){

#define TEST_TEARDOWN  \
    }  \
    TEST_ASSERT_SUCCESS(status);  \
    uspoof_close(sc);  \
}




void IntlTestSpoof::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
{
    if (exec) logln("TestSuite spoof: ");
    switch (index) {
        case 0:
            name = "TestSpoofAPI"; 
            if (exec) {
                testSpoofAPI();
            }
            break;
        case 1:
            name = "TestSkeleton"; 
            if (exec) {
                testSkeleton();
            }
            break;
        case 2:
            name = "TestAreConfusable";
            if (exec) {
                testAreConfusable();
            }
            break;
        case 3:
            name = "TestInvisible";
            if (exec) {
                testInvisible();
            }
            break;
        case 4:
            name = "testConfData";
            if (exec) {
                testConfData();
            }
            break;
        case 5:
            name = "testBug8654";
            if (exec) {
                testBug8654();
            }
            break;
        case 6:
            name = "testIdentifierInfo";
            if (exec) {
                testIdentifierInfo();
            }
            break;
        case 7:
            name = "testScriptSet";
            if (exec) {
                testScriptSet();
            }
            break;
        case 8:
            name = "testRestrictionLevel";
            if (exec) {
                testRestrictionLevel();
            }
            break;
       case 9:
            name = "testMixedNumbers";
            if (exec) {
                testMixedNumbers();
            }
            break;


        default: name=""; break;
    }
}

void IntlTestSpoof::testSpoofAPI() {

    TEST_SETUP
        UnicodeString s("xyz");  // Many latin ranges are whole-script confusable with other scripts.
                                 // If this test starts failing, consult confusablesWholeScript.txt
        int32_t position = 666;
        int32_t checkResults = uspoof_checkUnicodeString(sc, s, &position, &status);
        TEST_ASSERT_SUCCESS(status);
        TEST_ASSERT_EQ(0, checkResults);
        TEST_ASSERT_EQ(0, position);
    TEST_TEARDOWN;
    
    TEST_SETUP
        UnicodeString s1("cxs");
        UnicodeString s2 = UnicodeString("\\u0441\\u0445\\u0455").unescape();  // Cyrillic "cxs"
        int32_t checkResults = uspoof_areConfusableUnicodeString(sc, s1, s2, &status);
        TEST_ASSERT_EQ(USPOOF_MIXED_SCRIPT_CONFUSABLE | USPOOF_WHOLE_SCRIPT_CONFUSABLE, checkResults);

    TEST_TEARDOWN;

    TEST_SETUP
        UnicodeString s("I1l0O");
        UnicodeString dest;
        UnicodeString &retStr = uspoof_getSkeletonUnicodeString(sc, USPOOF_ANY_CASE, s, dest, &status);
        TEST_ASSERT_SUCCESS(status);
        TEST_ASSERT(UnicodeString("lllOO") == dest);
        TEST_ASSERT(&dest == &retStr);
    TEST_TEARDOWN;
}


#define CHECK_SKELETON(type, input, expected) { \
    checkSkeleton(sc, type, input, expected, __LINE__); \
    }


// testSkeleton.   Spot check a number of confusable skeleton substitutions from the 
//                 Unicode data file confusables.txt
//                 Test cases chosen for substitutions of various lengths, and 
//                 membership in different mapping tables.
//          Note: for ICU 55, all tables collapsed to the MA table data.
//          TODO: for ICU 56 with Unicode 8, revisit this test.
//
void IntlTestSpoof::testSkeleton() {
    const uint32_t ML = 0;
    const uint32_t SL = USPOOF_SINGLE_SCRIPT_CONFUSABLE;
    const uint32_t MA = USPOOF_ANY_CASE;
    const uint32_t SA = USPOOF_SINGLE_SCRIPT_CONFUSABLE | USPOOF_ANY_CASE;

    TEST_SETUP
        CHECK_SKELETON(SL, "nochange", "nochange");
        CHECK_SKELETON(SA, "nochange", "nochange");
        CHECK_SKELETON(ML, "nochange", "nochange");
        CHECK_SKELETON(MA, "nochange", "nochange");
        CHECK_SKELETON(MA, "love", "love"); 
        CHECK_SKELETON(MA, "1ove", "love");   // Digit 1 to letter l
        CHECK_SKELETON(ML, "OOPS", "OOPS");
        CHECK_SKELETON(ML, "00PS", "OOPS");
        CHECK_SKELETON(MA, "OOPS", "OOPS");
        CHECK_SKELETON(MA, "00PS", "OOPS");   // Digit 0 to letter O in any case mode only
        CHECK_SKELETON(SL, "\\u059c", "\\u0301");
        CHECK_SKELETON(SL, "\\u2A74", "\\u003A\\u003A\\u003D");
        CHECK_SKELETON(SL, "\\u247E", "\\u0028\\u006C\\u006C\\u0029");  // "(ll)"
        CHECK_SKELETON(SL, "\\uFDFB", "\\u062C\\u0644\\u0020\\u062C\\u0644\\u006c\\u0644\\u006f");

        // This mapping exists in the ML and MA tables, does not exist in SL, SA
        // 0C83 ;	0983 ;	ML
        // 0C83 ;	0983 ;	MA
        // 

        CHECK_SKELETON(SL, "\\u0C83", "\\u0983");      
        CHECK_SKELETON(SA, "\\u0C83", "\\u0983");          
        CHECK_SKELETON(ML, "\\u0C83", "\\u0983");
        CHECK_SKELETON(MA, "\\u0C83", "\\u0983");
        
        // 0391 mappings exist only in MA and SA tables.
        CHECK_SKELETON(MA, "\\u0391", "A");
        CHECK_SKELETON(SA, "\\u0391", "A");
        CHECK_SKELETON(ML, "\\u0391", "A");
        CHECK_SKELETON(SL, "\\u0391", "A");

        // 13CF Mappings in all four tables, different in MA.
        CHECK_SKELETON(ML, "\\u13CF", "b");
        CHECK_SKELETON(MA, "\\u13CF", "b");
        CHECK_SKELETON(SL, "\\u13CF", "b");
        CHECK_SKELETON(SA, "\\u13CF", "b");

        // 0022 ;  0027 0027 ; 
        // all tables.
        CHECK_SKELETON(SL, "\\u0022", "\\u0027\\u0027");
        CHECK_SKELETON(SA, "\\u0022", "\\u0027\\u0027");
        CHECK_SKELETON(ML, "\\u0022", "\\u0027\\u0027");
        CHECK_SKELETON(MA, "\\u0022", "\\u0027\\u0027");

        // 017F mappings exist only in MA and SA tables.
        CHECK_SKELETON(MA, "\\u017F", "f");
        CHECK_SKELETON(SA, "\\u017F", "f");
        CHECK_SKELETON(ML, "\\u017F", "f");
        CHECK_SKELETON(SL, "\\u017F", "f");

    TEST_TEARDOWN;
}


//
//  Run a single confusable skeleton transformation test case.
//
void IntlTestSpoof::checkSkeleton(const USpoofChecker *sc, uint32_t type, 
                                  const char *input, const char *expected, int32_t lineNum) {
    UnicodeString uInput = UnicodeString(input).unescape();
    UnicodeString uExpected = UnicodeString(expected).unescape();
    
    UErrorCode status = U_ZERO_ERROR;
    UnicodeString actual;
    uspoof_getSkeletonUnicodeString(sc, type, uInput, actual, &status);
    if (U_FAILURE(status)) {
        errln("File %s, Line %d, Test case from line %d, status is %s", __FILE__, __LINE__, lineNum,
              u_errorName(status));
        return;
    }
    if (uExpected != actual) {
        errln("File %s, Line %d, Test case from line %d, Actual and Expected skeletons differ.",
               __FILE__, __LINE__, lineNum);
        errln(UnicodeString(" Actual   Skeleton: \"") + actual + UnicodeString("\"\n") +
              UnicodeString(" Expected Skeleton: \"") + uExpected + UnicodeString("\""));
    }
}

void IntlTestSpoof::testAreConfusable() {
    TEST_SETUP
        UnicodeString s1("A long string that will overflow stack buffers.  A long string that will overflow stack buffers. "
                         "A long string that will overflow stack buffers.  A long string that will overflow stack buffers. ");
        UnicodeString s2("A long string that wi11 overflow stack buffers.  A long string that will overflow stack buffers. "
                         "A long string that wi11 overflow stack buffers.  A long string that will overflow stack buffers. ");
        TEST_ASSERT_EQ(USPOOF_SINGLE_SCRIPT_CONFUSABLE, uspoof_areConfusableUnicodeString(sc, s1, s2, &status));
        TEST_ASSERT_SUCCESS(status);

    TEST_TEARDOWN;
}

void IntlTestSpoof::testInvisible() {
    TEST_SETUP
        UnicodeString  s = UnicodeString("abcd\\u0301ef").unescape();
        int32_t position = -42;
        TEST_ASSERT_EQ(0, uspoof_checkUnicodeString(sc, s, &position, &status));
        TEST_ASSERT_SUCCESS(status);
        TEST_ASSERT(0 == position);

        UnicodeString  s2 = UnicodeString("abcd\\u0301\\u0302\\u0301ef").unescape();
        TEST_ASSERT_EQ(USPOOF_INVISIBLE, uspoof_checkUnicodeString(sc, s2, &position, &status));
        TEST_ASSERT_SUCCESS(status);
        TEST_ASSERT_EQ(0, position);

        // Two acute accents, one from the composed a with acute accent, \u00e1,
        // and one separate.
        position = -42;
        UnicodeString  s3 = UnicodeString("abcd\\u00e1\\u0301xyz").unescape();
        TEST_ASSERT_EQ(USPOOF_INVISIBLE, uspoof_checkUnicodeString(sc, s3, &position, &status));
        TEST_ASSERT_SUCCESS(status);
        TEST_ASSERT_EQ(0, position);
    TEST_TEARDOWN;
}

void IntlTestSpoof::testBug8654() {
    TEST_SETUP
        UnicodeString s = UnicodeString("B\\u00c1\\u0301").unescape();
        int32_t position = -42;
        TEST_ASSERT_EQ(USPOOF_INVISIBLE, uspoof_checkUnicodeString(sc, s, &position, &status) & USPOOF_INVISIBLE );
        TEST_ASSERT_SUCCESS(status);
        TEST_ASSERT_EQ(0, position);
    TEST_TEARDOWN;
}

static UnicodeString parseHex(const UnicodeString &in) {
    // Convert a series of hex numbers in a Unicode String to a string with the
    // corresponding characters.
    // The conversion is _really_ annoying.  There must be some function to just do it.
    UnicodeString result;
    UChar32 cc = 0;
    for (int32_t i=0; i<in.length(); i++) {
        UChar c = in.charAt(i);
        if (c == 0x20) {   // Space
            if (cc > 0) {
               result.append(cc);
               cc = 0;
            }
        } else if (c>=0x30 && c<=0x39) {
            cc = (cc<<4) + (c - 0x30);
        } else if ((c>=0x41 && c<=0x46) || (c>=0x61 && c<=0x66)) {
            cc = (cc<<4) + (c & 0x0f)+9;
        }
        // else do something with bad input.
    }
    if (cc > 0) {
        result.append(cc);
    }
    return result;
}


//
// Append the hex form of a UChar32 to a UnicodeString.
// Used in formatting error messages.
// Match the formatting of numbers in confusables.txt
// Minimum of 4 digits, no leading zeroes for positions 5 and up.
//
static void appendHexUChar(UnicodeString &dest, UChar32 c) {
    UBool   doZeroes = FALSE;    
    for (int bitNum=28; bitNum>=0; bitNum-=4) {
        if (bitNum <= 12) {
            doZeroes = TRUE;
        }
        int hexDigit = (c>>bitNum) & 0x0f;
        if (hexDigit != 0 || doZeroes) {
            doZeroes = TRUE;
            dest.append((UChar)(hexDigit<=9? hexDigit + 0x30: hexDigit -10 + 0x41));
        }
    }
    dest.append((UChar)0x20);
}

U_DEFINE_LOCAL_OPEN_POINTER(LocalStdioFilePointer, FILE, fclose);

//  testConfData - Check each data item from the Unicode confusables.txt file,
//                 verify that it transforms correctly in a skeleton.
//
void IntlTestSpoof::testConfData() {
    char buffer[2000];
    if (getUnidataPath(buffer) == NULL) {
        errln("Skipping test spoof/testConfData. Unable to find path to source/data/unidata/.");
        return;
    }
    uprv_strcat(buffer, "confusables.txt");

    LocalStdioFilePointer f(fopen(buffer, "rb"));
    if (f.isNull()) {
        errln("Skipping test spoof/testConfData.  File confusables.txt not accessible.");
        return;
    }
    fseek(f.getAlias(), 0, SEEK_END);
    int32_t  fileSize = ftell(f.getAlias());
    LocalArray<char> fileBuf(new char[fileSize]);
    fseek(f.getAlias(), 0, SEEK_SET);
    int32_t amt_read = fread(fileBuf.getAlias(), 1, fileSize, f.getAlias());
    TEST_ASSERT_EQ(amt_read, fileSize);
    TEST_ASSERT(fileSize>0);
    if (amt_read != fileSize || fileSize <=0) {
        return;
    }
    UnicodeString confusablesTxt = UnicodeString::fromUTF8(StringPiece(fileBuf.getAlias(), fileSize));

    UErrorCode status = U_ZERO_ERROR;
    LocalUSpoofCheckerPointer sc(uspoof_open(&status));
    TEST_ASSERT_SUCCESS(status);

    // Parse lines from the confusables.txt file.  Example Line:
    // FF44 ;	0064 ;	SL	# ( d -> d ) FULLWIDTH ....
    // Three fields.  The hex fields can contain more than one character,
    //                and each character may be more than 4 digits (for supplemntals)
    // This regular expression matches lines and splits the fields into capture groups.
    RegexMatcher parseLine("(?m)^([0-9A-F]{4}[^#;]*?);([^#;]*?);([^#]*)", confusablesTxt, 0, status);
    TEST_ASSERT_SUCCESS(status);
    while (parseLine.find()) {
        UnicodeString from = parseHex(parseLine.group(1, status));
        if (!Normalizer::isNormalized(from, UNORM_NFD, status)) {
            // The source character was not NFD.
            // Skip this case; the first step in obtaining a skeleton is to NFD the input,
            //  so the mapping in this line of confusables.txt will never be applied.
            continue;
        }

        UnicodeString rawExpected = parseHex(parseLine.group(2, status));
        UnicodeString expected;
        Normalizer::decompose(rawExpected, FALSE /*NFD*/, 0, expected, status);
        TEST_ASSERT_SUCCESS(status);

        int32_t skeletonType = 0;
        UnicodeString tableType = parseLine.group(3, status);
        TEST_ASSERT_SUCCESS(status);
        if (tableType.indexOf("SL") >= 0) {
            skeletonType = USPOOF_SINGLE_SCRIPT_CONFUSABLE;
        } else if (tableType.indexOf("SA") >= 0) {
            skeletonType = USPOOF_SINGLE_SCRIPT_CONFUSABLE | USPOOF_ANY_CASE;
        } else if (tableType.indexOf("ML") >= 0) {
            skeletonType = 0;
        } else if (tableType.indexOf("MA") >= 0) {
            skeletonType = USPOOF_ANY_CASE;
        }

        UnicodeString actual;
        uspoof_getSkeletonUnicodeString(sc.getAlias(), skeletonType, from, actual, &status);
        TEST_ASSERT_SUCCESS(status);
        TEST_ASSERT(actual == expected);
        if (actual != expected) {
            errln(parseLine.group(0, status));
            UnicodeString line = "Actual: ";
            int i = 0;
            while (i < actual.length()) {
                appendHexUChar(line, actual.char32At(i));
                i = actual.moveIndex32(i, 1);
            }
            errln(line);
        }
        if (U_FAILURE(status)) {
            break;
        }
    }
}

// testIdentifierInfo. Note that IdentifierInfo is not public ICU API at this time
void IntlTestSpoof::testIdentifierInfo() {
    UErrorCode status = U_ZERO_ERROR;
    ScriptSet bitset12; bitset12.set(USCRIPT_LATIN, status).set(USCRIPT_HANGUL, status);
    ScriptSet bitset2;  bitset2.set(USCRIPT_HANGUL, status);
    TEST_ASSERT(bitset12.contains(bitset2));
    TEST_ASSERT(bitset12.contains(bitset12));
    TEST_ASSERT(!bitset2.contains(bitset12));

    ScriptSet arabSet;  arabSet.set(USCRIPT_ARABIC, status);
    ScriptSet latinSet; latinSet.set(USCRIPT_LATIN, status);
    UElement arabEl;  arabEl.pointer = &arabSet;
    UElement latinEl; latinEl.pointer = &latinSet;
    TEST_ASSERT(uhash_compareScriptSet(arabEl, latinEl) < 0);
    TEST_ASSERT(uhash_compareScriptSet(latinEl, arabEl) > 0);

    UnicodeString scriptString;
    bitset12.displayScripts(scriptString);
    TEST_ASSERT(UNICODE_STRING_SIMPLE("Hang Latn") == scriptString);

    status = U_ZERO_ERROR;
    UHashtable *alternates = uhash_open(uhash_hashScriptSet ,uhash_compareScriptSet, NULL, &status);
    uhash_puti(alternates, &bitset12, 1, &status);
    uhash_puti(alternates, &bitset2, 1, &status);
    UnicodeString alternatesString;
    IdentifierInfo::displayAlternates(alternatesString, alternates, status);
    TEST_ASSERT(UNICODE_STRING_SIMPLE("Hang; Hang Latn") == alternatesString);
    TEST_ASSERT_SUCCESS(status);

    status = U_ZERO_ERROR;
    ScriptSet tScriptSet;
    tScriptSet.parseScripts(scriptString, status);
    TEST_ASSERT_SUCCESS(status);
    TEST_ASSERT(bitset12 == tScriptSet);
    UnicodeString ss;
    ss.remove();
    uhash_close(alternates);

    struct Test {
        const char         *fTestString;
        URestrictionLevel   fRestrictionLevel;
        const char         *fNumerics;
        const char         *fScripts;
        const char         *fAlternates;
        const char         *fCommonAlternates;
    } tests[] = {
            {"\\u0061\\u2665",                USPOOF_UNRESTRICTIVE,      "[]", "Latn", "", ""},
            {"\\u0061\\u3006",                USPOOF_HIGHLY_RESTRICTIVE, "[]", "Latn", "Hani Hira Kana", "Hani Hira Kana"},
            {"\\u0061\\u30FC\\u3006",         USPOOF_HIGHLY_RESTRICTIVE, "[]", "Latn", "Hira Kana", "Hira Kana"},
            {"\\u0061\\u30FC\\u3006\\u30A2",  USPOOF_HIGHLY_RESTRICTIVE, "[]", "Latn Kana", "", ""},
            {"\\u30A2\\u0061\\u30FC\\u3006",  USPOOF_HIGHLY_RESTRICTIVE, "[]", "Latn Kana", "", ""},
            {"\\u0061\\u0031\\u0661",         USPOOF_UNRESTRICTIVE,      "[\\u0030\\u0660]", "Latn", "Arab Thaa", "Arab Thaa"},
            {"\\u0061\\u0031\\u0661\\u06F1",  USPOOF_UNRESTRICTIVE,      "[\\u0030\\u0660\\u06F0]", "Latn Arab", "", ""},
            {"\\u0661\\u30FC\\u3006\\u0061\\u30A2\\u0031\\u0967\\u06F1",  USPOOF_UNRESTRICTIVE, 
                  "[\\u0030\\u0660\\u06F0\\u0966]", "Latn Kana Arab", "Deva Kthi Mahj", "Deva Kthi Mahj"},
            {"\\u0061\\u30A2\\u30FC\\u3006\\u0031\\u0967\\u0661\\u06F1",  USPOOF_UNRESTRICTIVE, 
                  "[\\u0030\\u0660\\u06F0\\u0966]", "Latn Kana Arab", "Deva Kthi Mahj", "Deva Kthi Mahj"}
    };

    int testNum;
    for (testNum = 0; testNum < UPRV_LENGTHOF(tests); testNum++) {
        char testNumStr[40];
        sprintf(testNumStr, "testNum = %d", testNum);
        Test &test = tests[testNum];
        status = U_ZERO_ERROR;
        UnicodeString testString(test.fTestString);  // Note: may do charset conversion.
        testString = testString.unescape();
        IdentifierInfo idInfo(status);
        TEST_ASSERT_SUCCESS(status);
        idInfo.setIdentifierProfile(*uspoof_getRecommendedUnicodeSet(&status));
        idInfo.setIdentifier(testString, status);
        TEST_ASSERT_MSG(*idInfo.getIdentifier() == testString, testNumStr);

        URestrictionLevel restrictionLevel = test.fRestrictionLevel;
        TEST_ASSERT_MSG(restrictionLevel == idInfo.getRestrictionLevel(status), testNumStr);
        
        status = U_ZERO_ERROR;
        UnicodeSet numerics(UnicodeString(test.fNumerics).unescape(), status);
        TEST_ASSERT_SUCCESS(status);
        TEST_ASSERT_MSG(numerics == *idInfo.getNumerics(), testNumStr);

        ScriptSet scripts;
        scripts.parseScripts(UnicodeString(test.fScripts), status);
        TEST_ASSERT_MSG(scripts == *idInfo.getScripts(), testNumStr);

        UnicodeString alternatesStr;
        IdentifierInfo::displayAlternates(alternatesStr, idInfo.getAlternates(), status);
        TEST_ASSERT_MSG(UnicodeString(test.fAlternates) == alternatesStr, testNumStr);

        ScriptSet commonAlternates;
        commonAlternates.parseScripts(UnicodeString(test.fCommonAlternates), status);
        TEST_ASSERT_MSG(commonAlternates == *idInfo.getCommonAmongAlternates(), testNumStr);
    }

    // Test of getScriptCount()
    //   Script and or Script Extension for chars used in the tests
    //     \\u3013  ; Bopo Hang Hani Hira Kana # So       GETA MARK
    //     \\uA838  ; Deva Gujr Guru Kthi Takr # Sc       NORTH INDIC RUPEE MARK
    //     \\u0951  ; Deva Latn                # Mn       DEVANAGARI STRESS SIGN UDATTA
    //
    //     \\u0370  ; Greek                    # L        GREEK CAPITAL LETTER HETA
    //     \\u0481  ; Cyrillic                 # L&       CYRILLIC SMALL LETTER KOPPA
    //     \\u0904  ; Devanagari               # Lo       DEVANAGARI LETTER SHORT A
    //     \\u3041  ; Hiragana                 # Lo       HIRAGANA LETTER SMALL A
    //     1234     ; Common                   #          ascii digits
    //     \\u0300  ; Inherited                # Mn       COMBINING GRAVE ACCENT
    
    struct ScriptTest {
        const char *fTestString;
        int32_t     fScriptCount;
    } scriptTests[] = {
        {"Hello", 1},
        {"Hello\\u0370", 2},
        {"1234", 0},
        {"Hello1234\\u0300", 1},   // Common and Inherited are ignored.
        {"\\u0030", 0},
        {"abc\\u0951", 1},
        {"abc\\u3013", 2},
        {"\\uA838\\u0951", 1},     // Triggers commonAmongAlternates path.
        {"\\u3013\\uA838", 2}
    };

    status = U_ZERO_ERROR;
    IdentifierInfo identifierInfo(status);
    for (testNum=0; testNum<UPRV_LENGTHOF(scriptTests); testNum++) {
        ScriptTest &test = scriptTests[testNum];
        char msgBuf[100];
        sprintf(msgBuf, "testNum = %d ", testNum);
        UnicodeString testString = UnicodeString(test.fTestString).unescape();
        
        status = U_ZERO_ERROR;
        identifierInfo.setIdentifier(testString, status);
        int32_t scriptCount = identifierInfo.getScriptCount();
        TEST_ASSERT_MSG(test.fScriptCount == scriptCount, msgBuf);
    }
}

void IntlTestSpoof::testScriptSet() {
    ScriptSet s1;
    ScriptSet s2;
    UErrorCode status = U_ZERO_ERROR;

    TEST_ASSERT(s1 == s2);
    s1.set(USCRIPT_ARABIC,status);
    TEST_ASSERT_SUCCESS(status);
    TEST_ASSERT(!(s1 == s2));
    TEST_ASSERT(s1.test(USCRIPT_ARABIC, status));
    TEST_ASSERT(s1.test(USCRIPT_GREEK, status) == FALSE);

    status = U_ZERO_ERROR;
    s1.reset(USCRIPT_ARABIC, status);
    TEST_ASSERT(s1 == s2);

    status = U_ZERO_ERROR;
    s1.setAll();
    TEST_ASSERT(s1.test(USCRIPT_COMMON, status));
    TEST_ASSERT(s1.test(USCRIPT_ETHIOPIC, status));
    TEST_ASSERT(s1.test(USCRIPT_CODE_LIMIT, status));
    s1.resetAll();
    TEST_ASSERT(!s1.test(USCRIPT_COMMON, status));
    TEST_ASSERT(!s1.test(USCRIPT_ETHIOPIC, status));
    TEST_ASSERT(!s1.test(USCRIPT_CODE_LIMIT, status));

    status = U_ZERO_ERROR;
    s1.set(USCRIPT_TAKRI, status);
    s1.set(USCRIPT_BLISSYMBOLS, status);
    s2.setAll();
    TEST_ASSERT(s2.contains(s1));
    TEST_ASSERT(!s1.contains(s2));
    TEST_ASSERT(s2.intersects(s1));
    TEST_ASSERT(s1.intersects(s2));
    s2.reset(USCRIPT_TAKRI, status);
    TEST_ASSERT(!s2.contains(s1));
    TEST_ASSERT(!s1.contains(s2));
    TEST_ASSERT(s1.intersects(s2));
    TEST_ASSERT(s2.intersects(s1));
    TEST_ASSERT_SUCCESS(status);

    status = U_ZERO_ERROR;
    s1.resetAll();
    s1.set(USCRIPT_NKO, status);
    s1.set(USCRIPT_COMMON, status);
    s2 = s1;
    TEST_ASSERT(s2 == s1);
    TEST_ASSERT_EQ(2, s2.countMembers());
    s2.intersect(s1);
    TEST_ASSERT(s2 == s1);
    s2.setAll();
    TEST_ASSERT(!(s2 == s1));
    TEST_ASSERT(s2.countMembers() >= USCRIPT_CODE_LIMIT);
    s2.intersect(s1);
    TEST_ASSERT(s2 == s1);
    
    s2.setAll();
    s2.reset(USCRIPT_COMMON, status);
    s2.intersect(s1);
    TEST_ASSERT(s2.countMembers() == 1);

    s1.resetAll();
    s1.set(USCRIPT_AFAKA, status);
    s1.set(USCRIPT_VAI, status);
    s1.set(USCRIPT_INHERITED, status);
    int32_t n = -1;
    for (int32_t i=0; i<4; i++) {
        n = s1.nextSetBit(n+1);
        switch (i) {
          case 0: TEST_ASSERT_EQ(USCRIPT_INHERITED, n); break;
          case 1: TEST_ASSERT_EQ(USCRIPT_VAI, n); break;
          case 2: TEST_ASSERT_EQ(USCRIPT_AFAKA, n); break;
          case 3: TEST_ASSERT_EQ(-1, (int32_t)n); break;
          default: TEST_ASSERT(FALSE);
        }
    }
    TEST_ASSERT_SUCCESS(status);
}


void IntlTestSpoof::testRestrictionLevel() {
    struct Test {
        const char         *fId;
        URestrictionLevel   fExpectedRestrictionLevel;
    } tests[] = {
        {"\\u0061\\u03B3\\u2665", USPOOF_UNRESTRICTIVE},
        {"a",                     USPOOF_ASCII},
        {"\\u03B3",               USPOOF_SINGLE_SCRIPT_RESTRICTIVE},
        {"\\u0061\\u30A2\\u30FC", USPOOF_HIGHLY_RESTRICTIVE},
        {"\\u0061\\u0904",        USPOOF_MODERATELY_RESTRICTIVE},
        {"\\u0061\\u03B3",        USPOOF_MINIMALLY_RESTRICTIVE}
    };
    char msgBuffer[100];

    URestrictionLevel restrictionLevels[] = { USPOOF_ASCII, USPOOF_SINGLE_SCRIPT_RESTRICTIVE, 
         USPOOF_HIGHLY_RESTRICTIVE, USPOOF_MODERATELY_RESTRICTIVE, USPOOF_MINIMALLY_RESTRICTIVE, 
         USPOOF_UNRESTRICTIVE};
    
    UErrorCode status = U_ZERO_ERROR;
    IdentifierInfo idInfo(status);
    TEST_ASSERT_SUCCESS(status);
    idInfo.setIdentifierProfile(*uspoof_getRecommendedUnicodeSet(&status));
    TEST_ASSERT_SUCCESS(status);
    for (int32_t testNum=0; testNum < UPRV_LENGTHOF(tests); testNum++) {
        status = U_ZERO_ERROR;
        const Test &test = tests[testNum];
        UnicodeString testString = UnicodeString(test.fId).unescape();
        URestrictionLevel expectedLevel = test.fExpectedRestrictionLevel;
        idInfo.setIdentifier(testString, status);
        sprintf(msgBuffer, "testNum = %d ", testNum);
        TEST_ASSERT_SUCCESS(status);
        TEST_ASSERT_MSG(expectedLevel == idInfo.getRestrictionLevel(status), msgBuffer);
        for (int levelIndex=0; levelIndex<UPRV_LENGTHOF(restrictionLevels); levelIndex++) {
            status = U_ZERO_ERROR;
            URestrictionLevel levelSetInSpoofChecker = restrictionLevels[levelIndex];
            USpoofChecker *sc = uspoof_open(&status);
            uspoof_setChecks(sc, USPOOF_RESTRICTION_LEVEL, &status);
            uspoof_setAllowedChars(sc, uspoof_getRecommendedSet(&status), &status);
            uspoof_setRestrictionLevel(sc, levelSetInSpoofChecker);
            int32_t actualValue = uspoof_checkUnicodeString(sc, testString, NULL, &status);
            
            // we want to fail if the text is (say) MODERATE and the testLevel is ASCII
            int32_t expectedValue = 0;
            if (expectedLevel > levelSetInSpoofChecker) {
                expectedValue |= USPOOF_RESTRICTION_LEVEL;
            }
            if (!uspoof_getRecommendedUnicodeSet(&status)->containsAll(testString)) {
                expectedValue |= USPOOF_CHAR_LIMIT;
            }
            sprintf(msgBuffer, "testNum = %d, levelIndex = %d, expected = %#x, actual = %#x",
                    testNum, levelIndex, expectedValue, actualValue);
            TEST_ASSERT_MSG(expectedValue == actualValue, msgBuffer);
            TEST_ASSERT_SUCCESS(status);

            // Run the same check again, with the Spoof Checker configured to return
            // the actual restriction level.
            uspoof_setChecks(sc, USPOOF_AUX_INFO | USPOOF_RESTRICTION_LEVEL, &status);
            uspoof_setAllowedChars(sc, uspoof_getRecommendedSet(&status), &status);
            uspoof_setRestrictionLevel(sc, levelSetInSpoofChecker);
            int32_t result = uspoof_checkUnicodeString(sc, testString, NULL, &status);
            TEST_ASSERT_SUCCESS(status);
            if (U_SUCCESS(status)) {
                TEST_ASSERT_EQ(expectedLevel, result & USPOOF_RESTRICTION_LEVEL_MASK);
                TEST_ASSERT_EQ(expectedValue, result & USPOOF_ALL_CHECKS);
            }
            uspoof_close(sc);
        }
    }
}


void IntlTestSpoof::testMixedNumbers() {
    struct Test {
        const char *fTestString;
        const char *fExpectedSet;
    } tests[] = {
        {"1",              "[0]"},
        {"\\u0967",        "[\\u0966]"},
        {"1\\u0967",       "[0\\u0966]"},
        {"\\u0661\\u06F1", "[\\u0660\\u06F0]"}
    };
    UErrorCode status = U_ZERO_ERROR;
    IdentifierInfo idInfo(status);
    for (int32_t testNum=0; testNum < UPRV_LENGTHOF(tests); testNum++) {
        char msgBuf[100];
        sprintf(msgBuf, "testNum = %d ", testNum);
        Test &test = tests[testNum];

        status = U_ZERO_ERROR;
        UnicodeString testString = UnicodeString(test.fTestString).unescape();
        UnicodeSet expectedSet(UnicodeString(test.fExpectedSet).unescape(), status);
        idInfo.setIdentifier(testString, status);
        TEST_ASSERT_SUCCESS(status);
        TEST_ASSERT_MSG(expectedSet == *idInfo.getNumerics(), msgBuf);

        status = U_ZERO_ERROR;
        USpoofChecker *sc = uspoof_open(&status);
        uspoof_setChecks(sc, USPOOF_MIXED_NUMBERS, &status); // only check this
        int32_t result = uspoof_checkUnicodeString(sc, testString, NULL, &status);
        UBool mixedNumberFailure = ((result & USPOOF_MIXED_NUMBERS) != 0);
        TEST_ASSERT_MSG((expectedSet.size() > 1) == mixedNumberFailure, msgBuf);
        uspoof_close(sc);
    }
}

#endif /* !UCONFIG_NO_REGULAR_EXPRESSIONS && !UCONFIG_NO_NORMALIZATION && !UCONFIG_NO_FILE_IO */
