| OLD | NEW | 
|---|
|  | (Empty) | 
| 1 /* |  | 
| 2  ****************************************************************************** |  | 
| 3  * Copyright (C) 2005-2007, International Business Machines Corporation and   * |  | 
| 4  * others. All Rights Reserved.                                               * |  | 
| 5  ****************************************************************************** |  | 
| 6  */ |  | 
| 7 #include <stdio.h> |  | 
| 8 #include <string.h> |  | 
| 9 #include <stdlib.h> |  | 
| 10 #include <time.h> |  | 
| 11 #include "rndmcoll.h" |  | 
| 12 #include "wbnf.h" |  | 
| 13 |  | 
| 14 |  | 
| 15 #if !UCONFIG_NO_COLLATION |  | 
| 16 |  | 
| 17 //Raymond: Following comments are copied from Java implementation |  | 
| 18 // |  | 
| 19 // each rule can be: |  | 
| 20 //      "[" command "]" |  | 
| 21 //      "& [" position "]" |  | 
| 22 //      "&" before chars |  | 
| 23 //      relation "[variable top]" |  | 
| 24 //      relation (chars "|")? chars ("/" chars)? |  | 
| 25 // plus, a reset must come before a relation |  | 
| 26 |  | 
| 27 |  | 
| 28 static const char collationBNF[] = |  | 
| 29     "$s = ' '? 50%;" |  | 
| 30     "$crlf = '\r\n';" |  | 
| 31 |  | 
| 32     "$alternateOptions = non'-'ignorable | shifted;" |  | 
| 33     "$onoff = on | off;" |  | 
| 34     "$caseFirstOptions = off | upper | lower;" |  | 
| 35     "$strengthOptions = '1' | '2' | '3' | '4' | 'I';" |  | 
| 36     "$commandList = '['" |  | 
| 37     " ( alternate ' ' $alternateOptions" |  | 
| 38     " | backwards' 2'" |  | 
| 39     " | normalization ' ' $onoff " |  | 
| 40     " | caseLevel ' ' $onoff " |  | 
| 41     " | hiraganaQ ' ' $onoff" |  | 
| 42     " | caseFirst ' ' $caseFirstOptions" |  | 
| 43     " | strength ' ' $strengthOptions" |  | 
| 44     " ) ']';" |  | 
| 45     "$command = $commandList $crlf;" |  | 
| 46 |  | 
| 47     "$ignorableTypes = (tertiary | secondary | primary) ' ' ignorable;" |  | 
| 48     "$allTypes = variable | regular | implicit | trailing | $ignorableTypes;" |  | 
| 49     "$positionList = '[' (first | last) ' ' $allTypes ']';" |  | 
| 50 |  | 
| 51     "$beforeList = '[before ' ('1' | '2' | '3') ']';" |  | 
| 52 |  | 
| 53     "$relationList = (" |  | 
| 54     "   '<'" |  | 
| 55     " | '<<'" |  | 
| 56     " | ';'" |  | 
| 57     " | '<<<'" |  | 
| 58     " | ','" |  | 
| 59     " | '='" |  | 
| 60     ");" |  | 
| 61     "$string = $chars{1,5}~@;" |  | 
| 62     "$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| '<'| '&'| '['| ']';" |  | 
| 63     "$rel1 = '[variable top]' $s;" |  | 
| 64     "$p1 = ($string $s '|' $s)? 25%;" |  | 
| 65     "$p2 = ('/' $s $string $s)? 25%;" |  | 
| 66     "$rel2 = $p1 $string $s $p2;" |  | 
| 67     "$relation = $relationList $s ($rel1 | $rel2) $crlf;" |  | 
| 68 |  | 
| 69     "$reset = '&' $s ($beforeList $s)? 10% ($positionList 1% | $string 10%) $crl
     f;" |  | 
| 70     "$mostRules = $command 1% | $reset 5% | $relation 25%;" |  | 
| 71     "$root = $command{0,5} $reset $mostRules{1,20};"; |  | 
| 72 |  | 
| 73 |  | 
| 74 void RandomCollatorTest::Test2(){ |  | 
| 75     // See ticket 5747 about reenabling this test. |  | 
| 76     errln("TestWbnf is incorrectly implemented.\nThis test should be modeled to 
     use the existing test frame work for naming tests.\n"); |  | 
| 77     TestWbnf(); |  | 
| 78 } |  | 
| 79 |  | 
| 80 |  | 
| 81 void RandomCollatorTest::runIndexedTest( int32_t index, UBool exec, const char* 
     &name, char* ){ |  | 
| 82     if (exec) logln("TestSuite RandomCollatorTest: "); |  | 
| 83     switch (index) { |  | 
| 84         TESTCASE(0, Test); |  | 
| 85         TESTCASE(1, Test2); |  | 
| 86         default: name = ""; break; |  | 
| 87     } |  | 
| 88 } |  | 
| 89 |  | 
| 90 /* |  | 
| 91 class TestColltorCompare{ |  | 
| 92 public: |  | 
| 93     UBool operator()(Collator &coll, int count = 1000){ |  | 
| 94         UnicodeString a(test_string.get_a_string()); |  | 
| 95         UnicodeString b(test_string.get_a_string()); |  | 
| 96         UnicodeString c(test_string.get_a_string()); |  | 
| 97         do{ |  | 
| 98             if (check_transitivity(coll, a, b, c)){ |  | 
| 99                 a = b; |  | 
| 100                 b = c; |  | 
| 101                 c = UnicodeString(test_string.get_a_string()); |  | 
| 102             } |  | 
| 103         }while(count-- >= 0 ); |  | 
| 104 |  | 
| 105         return FALSE; |  | 
| 106     } |  | 
| 107     TestColltorCompare():test_string("$s = $c{1,8};", "$s", "$c", new Magic_Sele
     ctOneChar("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ[]&<")){ |  | 
| 108     } |  | 
| 109 private: |  | 
| 110     UBool check_transitivity(const Collator & coll, const UnicodeString &a, cons
     t UnicodeString &b, const UnicodeString &c){ |  | 
| 111         int ab = coll.compare(a,b), ba = coll.compare(b,a); |  | 
| 112         int bc = coll.compare(b,c), cb = coll.compare(c,b); |  | 
| 113         int ca = coll.compare(c,a), ac = coll.compare(a,c); |  | 
| 114         //       a |  | 
| 115         //      / \ |  | 
| 116         //     b - c |  | 
| 117         // |  | 
| 118         if (//counter-clockwise, maximum |  | 
| 119               (ab >=0 && bc >=0 && ac <0) |  | 
| 120             ||(bc >=0 && ca >=0 && ba <0) |  | 
| 121             ||(ca >=0 && ab >=0 && cb <0) |  | 
| 122 |  | 
| 123             //counter-clockwise, minimum |  | 
| 124             ||(ab <=0 && bc <=0 && ca >0) |  | 
| 125             ||(bc <=0 && ca <=0 && ba >0) |  | 
| 126             ||(ca <=0 && ab <=0 && cb >0) |  | 
| 127             ){ |  | 
| 128                 return FALSE; |  | 
| 129             } |  | 
| 130           return TRUE; |  | 
| 131     } |  | 
| 132 |  | 
| 133     LanguageGenerator test_string; |  | 
| 134 };*/ |  | 
| 135 |  | 
| 136 void RandomCollatorTest::Test(){ |  | 
| 137     // See ticket 5747 about reenabling this test. |  | 
| 138     errln("This test needs to be fixed.\n"); |  | 
| 139 |  | 
| 140     LanguageGenerator test_rule; |  | 
| 141     if (test_rule.parseBNF(collationBNF, "$root", TRUE) != LanguageGenerator::OK
     ){ |  | 
| 142         errln("The test code itself is wrong."); |  | 
| 143         return; |  | 
| 144     }; |  | 
| 145 |  | 
| 146     //TestColltorCompare coll_test; |  | 
| 147 |  | 
| 148     static const int CONSTRUCT_RANDOM_COUNT = 1000; |  | 
| 149     int i; |  | 
| 150     for (i=0; i < CONSTRUCT_RANDOM_COUNT; i++){ |  | 
| 151         const char * rule = test_rule.next(); |  | 
| 152         logln("\n-----------------------------------%d\n",i); |  | 
| 153         logln(UnicodeString(rule, strlen(rule))); |  | 
| 154 |  | 
| 155         UnicodeString newRule(rule);    // potential bug |  | 
| 156         UErrorCode status = U_ZERO_ERROR; |  | 
| 157         logln(   "===========================================\n"); |  | 
| 158         fwrite(rule, strlen(rule),1,stdout); |  | 
| 159         logln("\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"); |  | 
| 160 |  | 
| 161         Collator * c = new RuleBasedCollator(newRule,status); |  | 
| 162 |  | 
| 163         if (U_FAILURE(status)) { |  | 
| 164             errln( "Could not create Collator for the %d(th) generated rule.\n" |  | 
| 165                    "Error Name: %s\n" |  | 
| 166                    "The rule is ", |  | 
| 167                    i, u_errorName(status)); |  | 
| 168             return; |  | 
| 169         } |  | 
| 170 |  | 
| 171         delete c; |  | 
| 172     } |  | 
| 173 } |  | 
| 174 |  | 
| 175 #endif /* #if !UCONFIG_NO_COLLATION */ |  | 
| 176 |  | 
| OLD | NEW | 
|---|