/*
**********************************************************************
*   Copyright (C) 1999-2003, International Business Machines
*   Corporation and others.  All Rights Reserved.
**********************************************************************
*   Date        Name        Description
*   12/09/99    aliu        Ported from Java.
**********************************************************************
*/

#ifndef COLLATIONTHAITEST_H
#define COLLATIONTHAITEST_H

#include "unicode/utypes.h"

#if !UCONFIG_NO_COLLATION

#include "tscoll.h"

class CollationThaiTest : public IntlTestCollator {
    Collator* coll; // Thai collator

public:

    CollationThaiTest();
    virtual ~CollationThaiTest();

    void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par = NULL );
    
private:

    /**
     * Read the external dictionary file, which is already in proper
     * sorted order, and confirm that the collator compares each line as
     * preceding the following line.
     */
    void TestDictionary(void);
    
    /**
     * Odd corner conditions taken from "How to Sort Thai Without Rewriting Sort",
     * by Doug Cooper, http://seasrc.th.net/paper/thaisort.zip
     */
    void TestCornerCases(void);
    
    /**
     * Read the external names list, and confirms that the collator 
     * gets the same results when comparing lines one to another
     * using regular and iterative comparison.
     */
    void TestNamesList(void);

    /** 
     * test that invalid Thai sorts properly
     */
    void TestInvalidThai(void);

    /** 
     * test that reording is done properly
     */
    void TestReordering(void);

private:

    void compareArray(Collator& c, const char* tests[],
                      int32_t testsLength);

    int8_t sign(int32_t i);
    
    /**
     * Set a UnicodeString corresponding to the given string.  Use
     * UnicodeString and the default converter, unless we see the sequence
     * "\\u", in which case we interpret the subsequent escape.
     */
    UnicodeString& parseChars(UnicodeString& result,
                              const char* chars);
};

#endif /* #if !UCONFIG_NO_COLLATION */

#endif
