#ifndef RBBIMONKEYTEST_H
#define RBBIMONKEYTEST_H
#include "unicode/utypes.h"
#if !UCONFIG_NO_BREAK_ITERATION && !UCONFIG_NO_REGULAR_EXPRESSIONS && !UCONFIG_NO_FORMATTING
#include "intltest.h"
#include "unicode/rbbi.h"
#include "unicode/regex.h"
#include "unicode/uniset.h"
#include "unicode/unistr.h"
#include "unicode/uobject.h"
#include "simplethread.h"
#include "ucbuf.h"
#include "uhash.h"
#include "uvector.h"
class BreakRules; class RBBIMonkeyImpl;
class RBBIMonkeyTest: public IntlTest {
public:
RBBIMonkeyTest();
virtual ~RBBIMonkeyTest();
void runIndexedTest( int32_t index, UBool exec, const char* &name, char* par = NULL );
void testMonkey();
private:
const char *fParams;
void testRules(const char *ruleFile);
static UBool getIntParam(UnicodeString name, UnicodeString ¶ms, int64_t &val, UErrorCode &status);
static UBool getStringParam(UnicodeString name, UnicodeString ¶ms, CharString &dest, UErrorCode &status);
static UBool getBoolParam(UnicodeString name, UnicodeString ¶ms, UBool &dest, UErrorCode &status);
};
class CharClass: public UObject {
public:
UnicodeString fName;
UnicodeString fOriginalDef; UnicodeString fExpandedDef; LocalPointer<const UnicodeSet> fSet;
CharClass(const UnicodeString &name, const UnicodeString &originalDef, const UnicodeString &expandedDef, const UnicodeSet *set) :
fName(name), fOriginalDef(originalDef), fExpandedDef(expandedDef), fSet(set) {}
};
class BreakRule: public UObject {
public:
BreakRule();
~BreakRule();
UnicodeString fName; UnicodeString fRule; UnicodeString fExpandedRule; LocalPointer<RegexMatcher> fRuleMatcher; };
class BreakRules: public UObject {
public:
BreakRules(RBBIMonkeyImpl *monkeyImpl, UErrorCode &status);
~BreakRules();
void compileRules(UCHARBUF *rules, UErrorCode &status);
const CharClass *getClassForChar(UChar32 c, int32_t *iter=NULL) const;
RBBIMonkeyImpl *fMonkeyImpl; icu::UVector fBreakRules;
LocalUHashtablePointer fCharClasses; LocalPointer<UVector> fCharClassList; UnicodeSet fDictionarySet; Locale fLocale;
UBreakIteratorType fType;
CharClass *addCharClass(const UnicodeString &name, const UnicodeString &def, UErrorCode &status);
void addRule(const UnicodeString &name, const UnicodeString &def, UErrorCode &status);
bool setKeywordParameter(const UnicodeString &keyword, const UnicodeString &value, UErrorCode &status);
RuleBasedBreakIterator *createICUBreakIterator(UErrorCode &status);
LocalPointer<RegexMatcher> fSetRefsMatcher;
LocalPointer<RegexMatcher> fCommentsMatcher;
LocalPointer<RegexMatcher> fClassDefMatcher;
LocalPointer<RegexMatcher> fRuleDefMatcher;
};
class MonkeyTestData: public UObject {
public:
MonkeyTestData() {};
~MonkeyTestData() {};
void set(BreakRules *rules, IntlTest::icu_rand &rand, UErrorCode &status);
void clearActualBreaks();
void dump(int32_t around = -1) const;
uint32_t fRandomSeed; const BreakRules *fBkRules; UnicodeString fString; UnicodeString fExpectedBreaks; UnicodeString fActualBreaks; UnicodeString fRuleForPosition; UnicodeString f2ndRuleForPos;
};
class RBBIMonkeyImpl: public UObject {
public:
RBBIMonkeyImpl(UErrorCode &status);
~RBBIMonkeyImpl();
void setup(const char *ruleFileName, UErrorCode &status);
void startTest();
void runTest();
void join();
LocalUCHARBUFPointer fRuleCharBuffer; LocalPointer<BreakRules> fRuleSet;
LocalPointer<RuleBasedBreakIterator> fBI;
LocalPointer<MonkeyTestData> fTestData;
IntlTest::icu_rand fRandomGenerator;
const char *fRuleFileName;
UBool fVerbose; int32_t fLoopCount;
UBool fDumpExpansions;
enum CheckDirection {
FORWARD = 1,
REVERSE = 2
};
void clearActualBreaks();
void testForwards(UErrorCode &status);
void testPrevious(UErrorCode &status);
void testFollowing(UErrorCode &status);
void testPreceding(UErrorCode &status);
void testIsBoundary(UErrorCode &status);
void testIsBoundaryRandom(UErrorCode &status);
void checkResults(const char *msg, CheckDirection dir, UErrorCode &status);
class RBBIMonkeyThread: public SimpleThread {
private:
RBBIMonkeyImpl *fMonkeyImpl;
public:
RBBIMonkeyThread(RBBIMonkeyImpl *impl) : fMonkeyImpl(impl) {};
void run() U_OVERRIDE { fMonkeyImpl->runTest(); };
};
private:
void openBreakRules(const char *fileName, UErrorCode &status);
RBBIMonkeyThread fThread;
};
#endif
#endif // RBBIMONKEYTEST_H