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 |