/********************************************************************
 * 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, bool_t exec, 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
