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

#include "unicode/utypes.h"

#if !UCONFIG_NO_COLLATION

#include "decoll.h"

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

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

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

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

#ifndef _DECOLL
#include "decoll.h"
#endif

#include "sfwdchit.h"

CollationGermanTest::CollationGermanTest()
: myCollation(0)
{
    UErrorCode status = U_ZERO_ERROR;
    myCollation = Collator::createInstance(Locale::getGermany(), status);
    if(!myCollation || U_FAILURE(status)) {
        errcheckln(status, __FILE__ "failed to create! err " + UnicodeString(u_errorName(status)));
        /* if it wasn't already: */
        delete myCollation;
        myCollation = NULL;
    }
}

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

const UChar CollationGermanTest::testSourceCases[][CollationGermanTest::MAX_TOKEN_LEN] =
{
    {0x47, 0x72, 0x00F6, 0x00DF, 0x65, 0},
    {0x61, 0x62, 0x63, 0},
    {0x54, 0x00F6, 0x6e, 0x65, 0},
    {0x54, 0x00F6, 0x6e, 0x65, 0},
    {0x54, 0x00F6, 0x6e, 0x65, 0},
    {0x61, 0x0308, 0x62, 0x63, 0},
    {0x00E4, 0x62, 0x63, 0},
    {0x00E4, 0x62, 0x63, 0},
    {0x53, 0x74, 0x72, 0x61, 0x00DF, 0x65, 0},
    {0x65, 0x66, 0x67, 0},
    {0x00E4, 0x62, 0x63, 0},
    {0x53, 0x74, 0x72, 0x61, 0x00DF, 0x65, 0}
};

const UChar CollationGermanTest::testTargetCases[][CollationGermanTest::MAX_TOKEN_LEN] =
{
    {0x47, 0x72, 0x6f, 0x73, 0x73, 0x69, 0x73, 0x74, 0},
    {0x61, 0x0308, 0x62, 0x63, 0},
    {0x54, 0x6f, 0x6e, 0},
    {0x54, 0x6f, 0x64, 0},
    {0x54, 0x6f, 0x66, 0x75, 0},
    {0x41, 0x0308, 0x62, 0x63, 0},
    {0x61, 0x0308, 0x62, 0x63, 0},
    {0x61, 0x65, 0x62, 0x63, 0},
    {0x53, 0x74, 0x72, 0x61, 0x73, 0x73, 0x65, 0},
    {0x65, 0x66, 0x67, 0},
    {0x61, 0x65, 0x62, 0x63, 0},
    {0x53, 0x74, 0x72, 0x61, 0x73, 0x73, 0x65, 0}
};

const Collator::EComparisonResult CollationGermanTest::results[][2] =
{
      //  Primary                Tertiary
        { Collator::LESS,        Collator::LESS },
        { Collator::EQUAL,        Collator::LESS },
        { Collator::GREATER,    Collator::GREATER },
        { Collator::GREATER,    Collator::GREATER },
        { Collator::GREATER,    Collator::GREATER },
        { Collator::EQUAL,        Collator::LESS },
        { Collator::EQUAL,        Collator::EQUAL },
        { Collator::LESS,        Collator::LESS },
        { Collator::EQUAL,        Collator::GREATER },
        { Collator::EQUAL,        Collator::EQUAL },
        { Collator::LESS,        Collator::LESS },
        { Collator::EQUAL,        Collator::GREATER }
};


void CollationGermanTest::TestTertiary(/* char* par */)
{
    if(myCollation == NULL ) {
        dataerrln("decoll: cannot start test, collator is null\n");
        return;
    }

    int32_t i = 0;
    UErrorCode status = U_ZERO_ERROR;
    myCollation->setStrength(Collator::TERTIARY);
    myCollation->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status);
    for (i = 0; i < 12 ; i++)
    {
        doTest(myCollation, testSourceCases[i], testTargetCases[i], results[i][1]);
    }
}
void CollationGermanTest::TestPrimary(/* char* par */)
{
    if(myCollation == NULL ) {
        dataerrln("decoll: cannot start test, collator is null\n");
        return;
    }
    int32_t i;
    UErrorCode status = U_ZERO_ERROR;
    myCollation->setStrength(Collator::PRIMARY);
    myCollation->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status);
    for (i = 0; i < 12 ; i++)
    {
        doTest(myCollation, testSourceCases[i], testTargetCases[i], results[i][0]);
    }
}

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

#endif /* #if !UCONFIG_NO_COLLATION */
