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


#ifndef _INTLTESTTEXTBOUNDARY
#define _INTLTESTTEXTBOUNDARY


#include "unicode/utypes.h"
#include "intltest.h"
#include "unicode/brkiter.h"

class Vector;
class Enumeration;

/**
 * Test the BreakIterator class and indirectly all related classes
 */
class IntlTestTextBoundary: public IntlTest {
public:
    IntlTestTextBoundary();
    ~IntlTestTextBoundary();
    
    void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par = NULL );
    /**
     * Test sentence break using generalIteratorTest()
     **/
    void TestSentenceIteration(void);
    /**
     * Test word break using generalIteratorTest()
     **/
    void TestWordIteration(void);
    /**
     * Test line break using generalIteratorTest()
     **/ 
    void TestLineIteration(void);
    /**
     * Test character break using generalIteratorTest()
     **/
    void TestCharacterIteration(void);
    /**
     * Test sentence break using ()
     **/
    void TestSentenceInvariants(void);
     /**
     * Test sentence break Invariants using generalIteratorTest()
     **/ 
    void TestWordInvariants(void);
     /**
     * Test sentence break Invariants using generalIteratorTest()
     **/
    void TestLineInvariants(void);
     /**
     * Test sentence break Invariants using generalIteratorTest()
     **/
    void TestCharacterInvariants(void);
     /**
     * Test Japanese line break Invariants using generalIteratorTest()
     **/
    void TestJapaneseLineBreak(void);
     /**
     * Test Thai line break using generalIteratorTest()
     **/
    void TestThaiLineBreak(void);
     /**
     * Test Mixed Thai (thai with other languages like english)line break using generalIteratorTest()
     **/
    void TestMixedThaiLineBreak(void);
    /**
     * Test Thai Line break with Maiyamok using generalIteratorTest()
     * The Thai maiyamok character is a shorthand symbol that means "repeat the previous
     * word".  Instead of appearing as a word unto itself, however, it's kept together
     * with the word before it
     **/
    void TestMaiyamok(void);
    /**
     * test behaviour of BreakIterator on an empty string
     **/
    void TestEmptyString(void);
    /**
     * Test BreakIterator::getAvailableLocales
     **/
    void TestGetAvailableLocales(void);
    /**
     * Test BreakIterator::getDisplayName
     **/
    void TestGetDisplayName(void);
    /**
     * test methods preceding, following and isBoundary
     **/
    void TestPreceding(void);

    void TestBug4153072(void);
    /**
     * Test End Behaviour
     * @bug 4068137
     **/
    void TestEndBehaviour(void);

/***********************/
private:
    /**
     * internal methods to prepare test data
     **/
    void addTestWordData(void);
    void addTestSentenceData(void);
    void addTestLineData(void);
    void addTestCharacterData(void);
    UnicodeString createTestData(Enumeration* e);

    /**
     * Perform tests of BreakIterator forward and backward functionality 
     * on different kinds of iterators (word, sentence, line and character).
     * It tests the methods first(), next(), current(), preceding(), following()
     * previous() and isBoundary().
     * It makes use of internal functions to achieve this.
     **/
    void generalIteratorTest(BreakIterator& bi, Vector* expectedResult);
    /**
     * Internal method to perform iteration and test the first() and next() functions
     **/
    Vector* testFirstAndNext(BreakIterator& bi, UnicodeString& text);
    /**
     * Internal method to perform iteration and test the last() and previous() functions
     **/
    Vector* testLastAndPrevious(BreakIterator& bi, UnicodeString& text);
    /**
     * Internal method to perform iteration and test the following() function
     **/
    void testFollowing(BreakIterator& bi, UnicodeString& text, int32_t *boundaries);
    /**
     * Internal method to perform iteration and test the preceding() function
     **/
    void testPreceding(BreakIterator& bi, UnicodeString& text, int32_t *boundaries);
    /**
     * Internal method to perform iteration and test the isBoundary() function
     **/
    void testIsBoundary(BreakIterator& bi, UnicodeString& text, int32_t *boundaries);
    /** 
     * Internal method which does the comparision of expected and got results.
     **/
    void compareFragmentLists(UnicodeString& f1Name, UnicodeString& f2Name, Vector* f1, Vector* f2);
    /**
     * Internal method to perform tests of BreakIterator multiple selection functionality 
     * on different kinds of iterators (word, sentence, line and character)
     **/
    void doMultipleSelectionTest(BreakIterator& iterator, UnicodeString& testText);
    /**
     * Internal method to perform tests of BreakIterator break Invariants 
     * on different kinds of iterators (word, sentence, line and character)
     **/
    void doBreakInvariantTest(BreakIterator& tb, UnicodeString& testChars);
    /**
     * Internal method to perform tests of BreakIterator other invariants 
     * on different kinds of iterators (word, sentence, line and character)
     **/
    void doOtherInvariantTest(BreakIterator& tb, UnicodeString& testChars);
    /**
     * Perform tests with short sample code
     **/ 
    void sample(BreakIterator& tb, UnicodeString& text, UnicodeString& title);
    /**
     * The vectors holding test data for testing 
     * different kinds of iterators( word, sentence, line and character)
     **/
    Vector* lineSelectionData;
    Vector* sentenceSelectionData;
    Vector* wordSelectionData;
    Vector* characterSelectionData;

    static const UChar cannedTestArray[];
    static UnicodeString *cannedTestChars;
};


#endif
