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

/**
 * CollationAPITest is a third level test class. This test performs API 
 * related tests for the Collation framework.
 */

#ifndef _APICOLL
#define _APICOLL

#include "unicode/utypes.h"

#if !UCONFIG_NO_COLLATION

#include "unicode/tblcoll.h"
#include "tscoll.h"

class CollationAPITest: public IntlTestCollator {
public:
    void runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par = NULL */);
    void doAssert(UBool condition, const char *message);

    /**
     * This tests the properties of a collator object.
     * - constructor/destructor
     * - factory method createInstance
     * - compare and getCollationKey
     * - get/set decomposition mode and comparison level
     * - displayable name in the desired locale
     */
    void TestProperty(/* char* par */);

    /**
    * This tests the RuleBasedCollator
    * - constructor/destructor
    * - getRules
    */
    void TestRuleBasedColl(/* char* par */);

    /**
    * This tests the RuleBasedCollator
    * - getRules
    */
    void TestRules(/* char* par */);

    /**
    * Tests decomposition setting
    */
    void TestDecomposition();

    /**
    * SafeClone test
    */
    void TestSafeClone();

    /**
     * This tests the properties of a rule based collator object.
     * - constructor/destructor
     * - == and != operators
     * - clone and copy
     * - collation rules access
     */
    void TestOperators(/* char* par */);

    /**
     * This tests the duplication of a collator object.
     */
    void TestDuplicate(/* char* par */);

    /**
     * This tests the comparison convenience methods of a collator object.
     * - greater than
     * - greater than or equal to
     * - equal to
     */
    void TestCompare(/* char* par */);

    /**
     * This tests the hashCode method of a collator object.
     */
    void TestHashCode(/* char* par */);

    /**
     * This tests the collation key related APIs.
     * - constructor/destructor
     * - Collator::getCollationKey
     * - == and != operators
     * - comparison between collation keys
     * - creating collation key with a byte array and vice versa
     */
    void TestCollationKey(/* char* par */);

    /**
     * This tests the CollationElementIterator related APIs.
     * - creation of a CollationElementIterator object
     * - == and != operators
     * - iterating forward
     * - reseting the iterator index
     * - requesting the order properties(primary, secondary or tertiary)
     */
    void TestElemIter(/* char* par */);

    /**
     * This tests the list the all available locales.
     */
    void TestGetAll(/* char* par */);

    /**
     * This tests the sort keys generated by collator
     */
    void TestSortKey();
    void TestSortKeyOverflow();

    /**
     * This tests getMaxExpansion
     */
    void TestMaxExpansion();

    /**
    * Tests the retrieval of names given a locale
    */
    void TestDisplayName();

    /** 
    * Tests the collator attributes
    */
    void TestAttribute();

    /** 
    * Tests the setters and getters of variable top
    */
    void TestVariableTopSetting();
    void TestMaxVariable();

    /**
    * Tests GetLocale for a Collator
    */
    void TestGetLocale();

    /**
    * Tests bounds API
    */
    void TestBounds();

    /**
    * Tests getTailoredSet API
    */
    void TestGetTailoredSet();

    /**
    * Tests the subclassability
    */
    void TestSubclass();

    /**
    * Tests the dynamic and static ids of collation classes
    */
    void TestUClassID();

    /**
    * Test NULL
    */
    void TestNULLCharTailoring();

    void TestClone();
    void TestCloneBinary();
    void TestIterNumeric();
    void TestBadKeywords();

private:
    // If this is too small for the test data, just increase it.
    // Just don't make it too large, otherwise the executable will get too big
    enum EToken_Len { MAX_TOKEN_LEN = 16 };

    void dump(UnicodeString msg, RuleBasedCollator* c, UErrorCode& status);

};

#endif /* #if !UCONFIG_NO_COLLATION */

#endif
