Home | History | Annotate | Download | only in intltest
      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%) $crlf;"
     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_SelectOneChar("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ[]&<")){
    108     }
    109 private:
    110     UBool check_transitivity(const Collator & coll, const UnicodeString &a, const 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 
    177