/* ****************************************************************************** * Copyright (C) 2005-2006, International Business Machines Corporation and * * others. All Rights Reserved. * ****************************************************************************** */ #include #include #include #include #include "rndmcoll.h" #include "wbnf.h" #if !UCONFIG_NO_COLLATION //Raymond: Following comments are copied from Java implementation // // each rule can be: // "[" command "]" // "& [" position "]" // "&" before chars // relation "[variable top]" // relation (chars "|")? chars ("/" chars)? // plus, a reset must come before a relation static const char collationBNF[] = "$s = ' '? 50%;" "$crlf = '\r\n';" "$alternateOptions = non'-'ignorable | shifted;" "$onoff = on | off;" "$caseFirstOptions = off | upper | lower;" "$strengthOptions = '1' | '2' | '3' | '4' | 'I';" "$commandList = '['" " ( alternate ' ' $alternateOptions" " | backwards' 2'" " | normalization ' ' $onoff " " | caseLevel ' ' $onoff " " | hiraganaQ ' ' $onoff" " | caseFirst ' ' $caseFirstOptions" " | strength ' ' $strengthOptions" " ) ']';" "$command = $commandList $crlf;" "$ignorableTypes = (tertiary | secondary | primary) ' ' ignorable;" "$allTypes = variable | regular | implicit | trailing | $ignorableTypes;" "$positionList = '[' (first | last) ' ' $allTypes ']';" "$beforeList = '[before ' ('1' | '2' | '3') ']';" "$relationList = (" " '<'" " | '<<'" " | ';'" " | '<<<'" " | ','" " | '='" ");" "$string = $chars{1,5}~@;" "$chars = a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z| '<'| '&'| '['| ']';" "$rel1 = '[variable top]' $s;" "$p1 = ($string $s '|' $s)? 25%;" "$p2 = ('/' $s $string $s)? 25%;" "$rel2 = $p1 $string $s $p2;" "$relation = $relationList $s ($rel1 | $rel2) $crlf;" "$reset = '&' $s ($beforeList $s)? 10% ($positionList 1% | $string 10%) $crlf;" "$mostRules = $command 1% | $reset 5% | $relation 25%;" "$root = $command{0,5} $reset $mostRules{1,20};"; static const UVersionInfo ICU_37 = {3,7,0,0}; void RandomCollatorTest::Test2(){ if(!isICUVersionAtLeast(ICU_37)){ return; } else { errln("TestWbnf is incorrectly implemented.\nThis test should be modeled to use the existing test frame work for naming tests.\n"); } TestWbnf(); } void RandomCollatorTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* ){ if (exec) logln("TestSuite RandomCollatorTest: "); switch (index) { TESTCASE(0, Test); TESTCASE(1, Test2); default: name = ""; break; } } /* class TestColltorCompare{ public: UBool operator()(Collator &coll, int count = 1000){ UnicodeString a(test_string.get_a_string()); UnicodeString b(test_string.get_a_string()); UnicodeString c(test_string.get_a_string()); do{ if (check_transitivity(coll, a, b, c)){ a = b; b = c; c = UnicodeString(test_string.get_a_string()); } }while(count-- >= 0 ); return FALSE; } TestColltorCompare():test_string("$s = $c{1,8};", "$s", "$c", new Magic_SelectOneChar("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ[]&<")){ } private: UBool check_transitivity(const Collator & coll, const UnicodeString &a, const UnicodeString &b, const UnicodeString &c){ int ab = coll.compare(a,b), ba = coll.compare(b,a); int bc = coll.compare(b,c), cb = coll.compare(c,b); int ca = coll.compare(c,a), ac = coll.compare(a,c); // a // / \ // b - c // if (//counter-clockwise, maximum (ab >=0 && bc >=0 && ac <0) ||(bc >=0 && ca >=0 && ba <0) ||(ca >=0 && ab >=0 && cb <0) //counter-clockwise, minimum ||(ab <=0 && bc <=0 && ca >0) ||(bc <=0 && ca <=0 && ba >0) ||(ca <=0 && ab <=0 && cb >0) ){ return FALSE; } return TRUE; } LanguageGenerator test_string; };*/ void RandomCollatorTest::Test(){ if(!isICUVersionAtLeast(ICU_37)){ return; } else { errln("This test needs to be fixed.\n"); } LanguageGenerator test_rule; if (test_rule.parseBNF(collationBNF, "$root", TRUE) != LanguageGenerator::OK){ errln("The test code itself is wrong."); return; }; //TestColltorCompare coll_test; static const int CONSTRUCT_RANDOM_COUNT = 1000; int i; for (i=0; i < CONSTRUCT_RANDOM_COUNT; i++){ const char * rule = test_rule.next(); logln("\n-----------------------------------%d\n",i); logln(UnicodeString(rule, strlen(rule))); UnicodeString newRule(rule); // potential bug UErrorCode status = U_ZERO_ERROR; logln( "===========================================\n"); fwrite(rule, strlen(rule),1,stdout); logln("\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"); Collator * c = new RuleBasedCollator(newRule,status); if (U_FAILURE(status)) { errln( "Could not create Collator for the %d(th) generated rule.\n" "Error Name: %s\n" "The rule is ", i, u_errorName(status)); return; } delete c; } } #endif /* #if !UCONFIG_NO_COLLATION */