| Index: icu46/source/test/intltest/rndmcoll.cpp
|
| ===================================================================
|
| --- icu46/source/test/intltest/rndmcoll.cpp (revision 0)
|
| +++ icu46/source/test/intltest/rndmcoll.cpp (revision 0)
|
| @@ -0,0 +1,176 @@
|
| +/*
|
| + ******************************************************************************
|
| + * Copyright (C) 2005-2007, International Business Machines Corporation and *
|
| + * others. All Rights Reserved. *
|
| + ******************************************************************************
|
| + */
|
| +#include <stdio.h>
|
| +#include <string.h>
|
| +#include <stdlib.h>
|
| +#include <time.h>
|
| +#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};";
|
| +
|
| +
|
| +void RandomCollatorTest::Test2(){
|
| + // See ticket 5747 about reenabling this test.
|
| + 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(){
|
| + // See ticket 5747 about reenabling this test.
|
| + 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 */
|
| +
|
|
|
| Property changes on: icu46/source/test/intltest/rndmcoll.cpp
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|