
/*
********************************************************************
* COPYRIGHT: 
* (C) Copyright Taligent, Inc., 1997
* (C) Copyright International Business Machines Corporation, 1997 - 1998
* Licensed Material - Program-Property of IBM - All Rights Reserved. 
* US Government Users Restricted Rights - Use, duplication, or disclosure 
* restricted by GSA ADP Schedule Contract with IBM Corp. 
*
********************************************************************
*/

#ifndef _COLL
#include "coll.h"
#endif

#ifndef _TBLCOLL
#include "tblcoll.h"
#endif

#ifndef _UNISTR
#include "unistr.h"
#endif

#ifndef _SORTKEY
#include "sortkey.h"
#endif

#ifndef _ESCOLL
#include "escoll.h"
#endif

CollationSpanishTest::CollationSpanishTest()
: myCollation(0)
{
    UErrorCode status = ZERO_ERROR;
    myCollation = Collator::createInstance(Locale("es", "ES", ""),status);
}

CollationSpanishTest::~CollationSpanishTest()
{
    delete myCollation;
}

const UChar CollationSpanishTest::testSourceCases[][CollationSpanishTest::MAX_TOKEN_LEN] = {
    {'a', 'l', 'i', 'a', 's', 0},
    {'E', 'l', 'l', 'i', 'o', 't', 0},
    {'H', 'e', 'l', 'l', 'o', 0},
    {'a', 'c', 'H', 'c', 0},
    {'a', 'c', 'c', 0},
    {'a', 'l', 'i', 'a', 's', 0},
    {'a', 'c', 'H', 'c', 0},
    {'a', 'c', 'c', 0},
    {'H', 'e', 'l', 'l', 'o', 0},
};

const UChar CollationSpanishTest::testTargetCases[][CollationSpanishTest::MAX_TOKEN_LEN] = {
    {'a', 'l', 'l', 'i', 'a', 's', 0},
    {'E', 'm', 'i', 'o', 't', 0},
    {'h', 'e', 'l', 'l', 'O', 0},
    {'a', 'C', 'H', 'c', 0},
    {'a', 'C', 'H', 'c', 0},
    {'a', 'l', 'l', 'i', 'a', 's', 0},
    {'a', 'C', 'H', 'c', 0},
    {'a', 'C', 'H', 'c', 0},
    {'h', 'e', 'l', 'l', 'O', 0},
};

const Collator::EComparisonResult CollationSpanishTest::results[] = {
    Collator::LESS,
    Collator::LESS,
    Collator::GREATER,
    Collator::LESS,
    Collator::LESS,
    // test primary > 5
    Collator::LESS,
    Collator::EQUAL,
    Collator::LESS,
    Collator::EQUAL
};

void CollationSpanishTest::doTest( UnicodeString source, UnicodeString target, Collator::EComparisonResult result)
{
    Collator::EComparisonResult compareResult = myCollation->compare(source, target);
    CollationKey sortKey1, sortKey2;
    UErrorCode key1status = ZERO_ERROR, key2status = ZERO_ERROR; //nos
    myCollation->getCollationKey(source, /*nos*/ sortKey1, key1status );
    myCollation->getCollationKey(target, /*nos*/ sortKey2, key2status );
    if (FAILURE(key1status) || FAILURE(key2status)) {
        errln("SortKey generation Failed.\n");
        return;
    }
    Collator::EComparisonResult keyResult = sortKey1.compareTo(sortKey2);
    reportCResult( source, target, sortKey1, sortKey2, compareResult, keyResult, result );
}

void CollationSpanishTest::TestTertiary( char* par )
{
    int32_t i = 0;
    myCollation->setStrength(Collator::TERTIARY);
    for (i = 0; i < 5 ; i++) {
        doTest(testSourceCases[i], testTargetCases[i], results[i]);
    }
}
void CollationSpanishTest::TestPrimary( char* par )
{
    int32_t i;
    myCollation->setStrength(Collator::PRIMARY);
    for (i = 5; i < 9; i++) {
        doTest(testSourceCases[i], testTargetCases[i], results[i]);
    }
}

void CollationSpanishTest::runIndexedTest( int32_t index, bool_t exec, char* &name, char* par )
{
    if (exec) logln("TestSuite CollationSpanishTest: ");
    switch (index) {
        case 0: name = "TestPrimary";   if (exec)   TestPrimary( par ); break;
        case 1: name = "TestTertiary";  if (exec)   TestTertiary( par ); break;
        default: name = ""; break;
    }
}


