• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /********************************************************************
2  * COPYRIGHT:
3  * Copyright (c) 1997-2009, International Business Machines Corporation and
4  * others. All Rights Reserved.
5  ********************************************************************/
6 
7 #include "unicode/utypes.h"
8 
9 #if !UCONFIG_NO_COLLATION
10 
11 #include "unicode/coll.h"
12 #include "unicode/tblcoll.h"
13 #include "unicode/unistr.h"
14 #include "unicode/sortkey.h"
15 #include "allcoll.h"
16 #include "sfwdchit.h"
17 #include "../cintltst/calldata.h"
18 
19 
CollationDummyTest()20 CollationDummyTest::CollationDummyTest()
21 : myCollation(0)
22 {
23     /*UErrorCode status = U_ZERO_ERROR;
24     UnicodeString rules(TRUE, DEFAULTRULEARRAY, sizeof(DEFAULTRULEARRAY)/sizeof(DEFAULTRULEARRAY[0]));
25     UnicodeString newRules("& C < ch, cH, Ch, CH & Five, 5 & Four, 4 & one, 1 & Ampersand; '&' & Two, 2 ");
26     rules += newRules;
27     myCollation = new RuleBasedCollator(rules, status);
28     */
29 
30     UErrorCode status = U_ZERO_ERROR;
31     UnicodeString ruleset("& C < ch, cH, Ch, CH & Five, 5 & Four, 4 & one, 1 & Ampersand; '&' & Two, 2 ");
32     if (myCollation != NULL)
33     {
34       delete myCollation;
35     }
36     myCollation = new RuleBasedCollator(ruleset, status);
37     if(U_FAILURE(status)){
38         errcheckln(status, "ERROR: in creation of rule based collator from ruleset - %s", u_errorName(status));
39         delete myCollation;
40         myCollation = 0;
41     }
42 }
43 
~CollationDummyTest()44 CollationDummyTest::~CollationDummyTest()
45 {
46     delete myCollation;
47 }
48 
49 const Collator::EComparisonResult CollationDummyTest::results[] = {
50     Collator::LESS,
51     Collator::LESS, /*Collator::GREATER,*/
52     Collator::LESS,
53     Collator::LESS,
54     Collator::LESS,
55     Collator::LESS,
56     Collator::LESS,
57     Collator::GREATER,
58     Collator::GREATER,
59     Collator::LESS,                                     /*  10 */
60     Collator::GREATER,
61     Collator::LESS,
62     Collator::GREATER,
63     Collator::GREATER,
64     Collator::LESS,
65     Collator::LESS,
66     Collator::LESS,
67     /*  test primary > 17 */
68     Collator::EQUAL,
69     Collator::EQUAL,
70     Collator::EQUAL,                                    /*  20 */
71     Collator::LESS,
72     Collator::LESS,
73     Collator::EQUAL,
74     Collator::EQUAL,
75     Collator::EQUAL,
76     Collator::LESS,
77     /*  test secondary > 26 */
78     Collator::EQUAL,
79     Collator::EQUAL,
80     Collator::EQUAL,
81     Collator::EQUAL,
82     Collator::EQUAL,                                    /*  30 */
83     Collator::EQUAL,
84     Collator::LESS,
85     Collator::EQUAL,                                     /*  34 */
86     Collator::EQUAL,
87     Collator::EQUAL,
88     Collator::LESS
89 };
90 
91 
TestTertiary()92 void CollationDummyTest::TestTertiary(/* char* par */)
93 {
94     int32_t i = 0;
95     myCollation->setStrength(Collator::TERTIARY);
96     for (i = 0; i < 17 ; i++)
97     {
98         doTest(myCollation, testSourceCases[i], testTargetCases[i], results[i]);
99     }
100 }
TestPrimary()101 void CollationDummyTest::TestPrimary(/* char* par */)
102 {
103     /* problem in strcollinc for unfinshed contractions */
104     UErrorCode status = U_ZERO_ERROR;
105 
106     myCollation->setAttribute(UCOL_NORMALIZATION_MODE, UCOL_ON, status);
107     myCollation->setStrength(Collator::PRIMARY);
108 
109     if (U_FAILURE(status))
110     {
111       errln("Failure in setting attribute for normalization mode\n");
112     }
113 
114     for (int i = 17; i < 26 ; i++)
115     {
116         doTest(myCollation, testSourceCases[i], testTargetCases[i], results[i]);
117     }
118 }
119 
TestSecondary()120 void CollationDummyTest::TestSecondary(/* char* par */)
121 {
122     int32_t i;
123     myCollation->setStrength(Collator::SECONDARY);
124     for (i = 26; i < 34; i++)
125     {
126         doTest(myCollation, testSourceCases[i], testTargetCases[i], results[i]);
127     }
128 }
129 
TestExtra()130 void CollationDummyTest::TestExtra(/* char* par */)
131 {
132     int32_t i, j;
133     myCollation->setStrength(Collator::TERTIARY);
134     for (i = 0; i < COUNT_TEST_CASES-1; i++)
135     {
136         for (j = i + 1; j < COUNT_TEST_CASES; j += 1)
137         {
138             doTest(myCollation, testCases[i], testCases[j], Collator::LESS);
139         }
140     }
141 }
142 
TestIdentical()143 void CollationDummyTest::TestIdentical()
144 {
145     int32_t i;
146     myCollation->setStrength(Collator::IDENTICAL);
147     for (i= 34; i<37; i++)
148     {
149         doTest(myCollation, testSourceCases[i], testTargetCases[i], results[i]);
150     }
151 }
152 
TestJB581(void)153 void CollationDummyTest::TestJB581(void)
154 {
155     UErrorCode status = U_ZERO_ERROR;
156 
157     UnicodeString source("THISISATEST.");
158     UnicodeString target("Thisisatest.");
159 
160     Collator *coll = Collator::createInstance("en_US", status);
161     if (U_FAILURE(status)){
162         errln("ERROR: Failed to create the collator for : en_US\n");
163         return;
164     }
165 
166     Collator::EComparisonResult result = coll->compare(source, target);
167     /* result is 1, secondary differences only for ignorable space characters*/
168     if (result != 1)
169     {
170         errln("Comparing two strings with only secondary differences in C failed.\n");
171     }
172     /* To compare them with just primary differences */
173     coll->setStrength(Collator::PRIMARY);
174     result = coll->compare(source, target);
175     /* result is 0 */
176     if (result != 0)
177     {
178         errln("Comparing two strings with no differences in C failed.\n");
179     }
180     /* Now, do the same comparison with keys */
181     CollationKey sourceKeyOut,
182       targetKeyOut;
183     coll->getCollationKey(source, sourceKeyOut, status);
184     coll->getCollationKey(target, targetKeyOut, status);
185     result = sourceKeyOut.compareTo(targetKeyOut);
186     if (result != 0)
187     {
188         errln("Comparing two strings with sort keys in C failed.\n");
189     }
190     delete coll;
191 }
192 
runIndexedTest(int32_t index,UBool exec,const char * & name,char *)193 void CollationDummyTest::runIndexedTest( int32_t index, UBool exec, const char* &name, char* /*par*/ )
194 {
195     if (exec) logln("TestSuite CollationDummyTest: ");
196     if(myCollation) {
197       switch (index) {
198           case 0: name = "TestPrimary";   if (exec)   TestPrimary(/* par */); break;
199           case 1: name = "TestSecondary"; if (exec)   TestSecondary(/* par */); break;
200           case 2: name = "TestTertiary";  if (exec)   TestTertiary(/* par */); break;
201           case 3: name = "TestExtra";     if (exec)   TestExtra(/* par */); break;
202           case 4: name = "TestIdentical"; if (exec)   TestIdentical(/* par */); break;
203           case 5: name = "TestJB581";     if (exec)   TestJB581(/* par */); break;
204           default: name = ""; break;
205       }
206     } else {
207       dataerrln("Collator couldn't be instantiated!");
208       name = "";
209     }
210 }
211 
212 #endif /* #if !UCONFIG_NO_COLLATION */
213