2 *******************************************************************************
\r
3 * Copyright (C) 2002-2010, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
9 * Port From: ICU4C v2.1 : Collate/CollationEnglishTest
\r
10 * Source File: $ICU4CRoot/source/test/intltest/encoll.cpp
\r
13 package com.ibm.icu.dev.test.collator;
\r
15 import java.util.Locale;
\r
17 import com.ibm.icu.dev.test.TestFmwk;
\r
18 import com.ibm.icu.text.CollationKey;
\r
19 import com.ibm.icu.text.Collator;
\r
21 public class CollationEnglishTest extends TestFmwk{
\r
22 public static void main(String[] args) throws Exception{
\r
23 new CollationEnglishTest().run(args);
\r
26 private static char[][] testSourceCases = {
\r
27 {0x0061 /* 'a' */, 0x0062 /* 'b' */},
\r
28 {0x0062 /* 'b' */, 0x006C /* 'l' */, 0x0061 /* 'a' */, 0x0063 /* 'c' */, 0x006B /* 'k' */, 0x002D /* '-' */, 0x0062 /* 'b' */, 0x0069 /* 'i' */, 0x0072 /* 'r' */, 0x0064 /* 'd' */},
\r
29 {0x0062 /* 'b' */, 0x006C /* 'l' */, 0x0061 /* 'a' */, 0x0063 /* 'c' */, 0x006B /* 'k' */, 0x0020 /* ' ' */, 0x0062 /* 'b' */, 0x0069 /* 'i' */, 0x0072 /* 'r' */, 0x0064 /* 'd' */},
\r
30 {0x0062 /* 'b' */, 0x006C /* 'l' */, 0x0061 /* 'a' */, 0x0063 /* 'c' */, 0x006B /* 'k' */, 0x002D /* '-' */, 0x0062 /* 'b' */, 0x0069 /* 'i' */, 0x0072 /* 'r' */, 0x0064 /* 'd' */},
\r
31 {0x0048 /* 'H' */, 0x0065 /* 'e' */, 0x006C /* 'l' */, 0x006C /* 'l' */, 0x006F /* 'o' */},
\r
32 {0x0041 /* 'A' */, 0x0042 /* 'B' */, 0x0043 /* 'C' */},
\r
33 {0x0061 /* 'a' */, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
34 {0x0062 /* 'b' */, 0x006C /* 'l' */, 0x0061 /* 'a' */, 0x0063 /* 'c' */, 0x006B /* 'k' */, 0x0062 /* 'b' */, 0x0069 /* 'i' */, 0x0072 /* 'r' */, 0x0064 /* 'd' */},
\r
35 {0x0062 /* 'b' */, 0x006C /* 'l' */, 0x0061 /* 'a' */, 0x0063 /* 'c' */, 0x006B /* 'k' */, 0x002D /* '-' */, 0x0062 /* 'b' */, 0x0069 /* 'i' */, 0x0072 /* 'r' */, 0x0064 /* 'd' */},
\r
36 {0x0062 /* 'b' */, 0x006C /* 'l' */, 0x0061 /* 'a' */, 0x0063 /* 'c' */, 0x006B /* 'k' */, 0x002D /* '-' */, 0x0062 /* 'b' */, 0x0069 /* 'i' */, 0x0072 /* 'r' */, 0x0064 /* 'd' */},
\r
37 {0x0070 /* 'p' */, 0x00EA, 0x0063 /* 'c' */, 0x0068 /* 'h' */, 0x0065 /* 'e' */},
\r
38 {0x0070 /* 'p' */, 0x00E9, 0x0063 /* 'c' */, 0x0068 /* 'h' */, 0x00E9},
\r
39 {0x00C4, 0x0042 /* 'B' */, 0x0308, 0x0043 /* 'C' */, 0x0308},
\r
40 {0x0061 /* 'a' */, 0x0308, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
41 {0x0070 /* 'p' */, 0x00E9, 0x0063 /* 'c' */, 0x0068 /* 'h' */, 0x0065 /* 'e' */, 0x0072 /* 'r' */},
\r
42 {0x0072 /* 'r' */, 0x006F /* 'o' */, 0x006C /* 'l' */, 0x0065 /* 'e' */, 0x0073 /* 's' */},
\r
43 {0x0061 /* 'a' */, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
46 {0x0061 /* 'a' */, 0x0062 /* 'b' */},
\r
47 {0x0074 /* 't' */, 0x0063 /* 'c' */, 0x006F /* 'o' */, 0x006D /* 'm' */, 0x0070 /* 'p' */, 0x0061 /* 'a' */, 0x0072 /* 'r' */, 0x0065 /* 'e' */, 0x0070 /* 'p' */, 0x006C /* 'l' */, 0x0061 /* 'a' */, 0x0069 /* 'i' */, 0x006E /* 'n' */},
\r
48 {0x0061 /* 'a' */, 0x0062 /* 'b' */},
\r
49 {0x0061 /* 'a' */, 0x0023 /* '#' */, 0x0062 /* 'b' */},
\r
50 {0x0061 /* 'a' */, 0x0023 /* '#' */, 0x0062 /* 'b' */},
\r
51 {0x0061 /* 'a' */, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
52 {0x0041 /* 'A' */, 0x0062 /* 'b' */, 0x0063 /* 'c' */, 0x0064 /* 'd' */, 0x0061 /* 'a' */},
\r
53 {0x0061 /* 'a' */, 0x0062 /* 'b' */, 0x0063 /* 'c' */, 0x0064 /* 'd' */, 0x0061 /* 'a' */},
\r
54 {0x0061 /* 'a' */, 0x0062 /* 'b' */, 0x0063 /* 'c' */, 0x0064 /* 'd' */, 0x0061 /* 'a' */},
\r
55 {0x00E6, 0x0062 /* 'b' */, 0x0063 /* 'c' */, 0x0064 /* 'd' */, 0x0061 /* 'a' */},
\r
56 {0x00E4, 0x0062 /* 'b' */, 0x0063 /* 'c' */, 0x0064 /* 'd' */, 0x0061 /* 'a' */},
\r
57 {0x0061 /* 'a' */, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
58 {0x0061 /* 'a' */, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
59 {0x0061 /* 'a' */, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
60 {0x0061 /* 'a' */, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
61 {0x0061 /* 'a' */, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
62 {0x0061 /* 'a' */, 0x0063 /* 'c' */, 0x0048 /* 'H' */, 0x0063 /* 'c' */},
\r
63 {0x0061 /* 'a' */, 0x0308, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
64 {0x0074 /* 't' */, 0x0068 /* 'h' */, 0x0069 /* 'i' */, 0x0302, 0x0073 /* 's' */},
\r
65 {0x0070 /* 'p' */, 0x00EA, 0x0063 /* 'c' */, 0x0068 /* 'h' */, 0x0065 /* 'e' */},
\r
66 {0x0061 /* 'a' */, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
67 {0x0061 /* 'a' */, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
68 {0x0061 /* 'a' */, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
69 {0x0061 /* 'a' */, 0x00E6, 0x0063 /* 'c' */},
\r
70 {0x0061 /* 'a' */, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
71 {0x0061 /* 'a' */, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
72 {0x0061 /* 'a' */, 0x00E6, 0x0063 /* 'c' */},
\r
73 {0x0061 /* 'a' */, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
74 {0x0061 /* 'a' */, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
75 {0x0070 /* 'p' */, 0x00E9, 0x0063 /* 'c' */, 0x0068 /* 'h' */, 0x00E9} // 49
\r
78 private static char[][] testTargetCases = {
\r
79 {0x0061 /* 'a' */, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
80 {0x0062 /* 'b' */, 0x006C /* 'l' */, 0x0061 /* 'a' */, 0x0063 /* 'c' */, 0x006B /* 'k' */, 0x0062 /* 'b' */, 0x0069 /* 'i' */, 0x0072 /* 'r' */, 0x0064 /* 'd' */},
\r
81 {0x0062 /* 'b' */, 0x006C /* 'l' */, 0x0061 /* 'a' */, 0x0063 /* 'c' */, 0x006B /* 'k' */, 0x002D /* '-' */, 0x0062 /* 'b' */, 0x0069 /* 'i' */, 0x0072 /* 'r' */, 0x0064 /* 'd' */},
\r
82 {0x0062 /* 'b' */, 0x006C /* 'l' */, 0x0061 /* 'a' */, 0x0063 /* 'c' */, 0x006B /* 'k' */},
\r
83 {0x0068 /* 'h' */, 0x0065 /* 'e' */, 0x006C /* 'l' */, 0x006C /* 'l' */, 0x006F /* 'o' */},
\r
84 {0x0041 /* 'A' */, 0x0042 /* 'B' */, 0x0043 /* 'C' */},
\r
85 {0x0041 /* 'A' */, 0x0042 /* 'B' */, 0x0043 /* 'C' */},
\r
86 {0x0062 /* 'b' */, 0x006C /* 'l' */, 0x0061 /* 'a' */, 0x0063 /* 'c' */, 0x006B /* 'k' */, 0x0062 /* 'b' */, 0x0069 /* 'i' */, 0x0072 /* 'r' */, 0x0064 /* 'd' */, 0x0073 /* 's' */},
\r
87 {0x0062 /* 'b' */, 0x006C /* 'l' */, 0x0061 /* 'a' */, 0x0063 /* 'c' */, 0x006B /* 'k' */, 0x0062 /* 'b' */, 0x0069 /* 'i' */, 0x0072 /* 'r' */, 0x0064 /* 'd' */, 0x0073 /* 's' */},
\r
88 {0x0062 /* 'b' */, 0x006C /* 'l' */, 0x0061 /* 'a' */, 0x0063 /* 'c' */, 0x006B /* 'k' */, 0x0062 /* 'b' */, 0x0069 /* 'i' */, 0x0072 /* 'r' */, 0x0064 /* 'd' */},
\r
89 {0x0070 /* 'p' */, 0x00E9, 0x0063 /* 'c' */, 0x0068 /* 'h' */, 0x00E9},
\r
90 {0x0070 /* 'p' */, 0x00E9, 0x0063 /* 'c' */, 0x0068 /* 'h' */, 0x0065 /* 'e' */, 0x0072 /* 'r' */},
\r
91 {0x00C4, 0x0042 /* 'B' */, 0x0308, 0x0043 /* 'C' */, 0x0308},
\r
92 {0x0041 /* 'A' */, 0x0308, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
93 {0x0070 /* 'p' */, 0x00E9, 0x0063 /* 'c' */, 0x0068 /* 'h' */, 0x0065 /* 'e' */},
\r
94 {0x0072 /* 'r' */, 0x006F /* 'o' */, 0x0302, 0x006C /* 'l' */, 0x0065 /* 'e' */},
\r
95 {0x0041 /* 'A' */, 0x00E1, 0x0063 /* 'c' */, 0x0064 /* 'd' */},
\r
96 {0x0041 /* 'A' */, 0x00E1, 0x0063 /* 'c' */, 0x0064 /* 'd' */},
\r
97 {0x0061 /* 'a' */, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
98 {0x0061 /* 'a' */, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
99 {0x0054 /* 'T' */, 0x0043 /* 'C' */, 0x006F /* 'o' */, 0x006D /* 'm' */, 0x0070 /* 'p' */, 0x0061 /* 'a' */, 0x0072 /* 'r' */, 0x0065 /* 'e' */, 0x0050 /* 'P' */, 0x006C /* 'l' */, 0x0061 /* 'a' */, 0x0069 /* 'i' */, 0x006E /* 'n' */},
\r
100 {0x0061 /* 'a' */, 0x0042 /* 'B' */, 0x0063 /* 'c' */},
\r
101 {0x0061 /* 'a' */, 0x0023 /* '#' */, 0x0042 /* 'B' */},
\r
102 {0x0061 /* 'a' */, 0x0026 /* '&' */, 0x0062 /* 'b' */},
\r
103 {0x0061 /* 'a' */, 0x0023 /* '#' */, 0x0063 /* 'c' */},
\r
104 {0x0061 /* 'a' */, 0x0062 /* 'b' */, 0x0063 /* 'c' */, 0x0064 /* 'd' */, 0x0061 /* 'a' */},
\r
105 {0x00C4, 0x0062 /* 'b' */, 0x0063 /* 'c' */, 0x0064 /* 'd' */, 0x0061 /* 'a' */},
\r
106 {0x00E4, 0x0062 /* 'b' */, 0x0063 /* 'c' */, 0x0064 /* 'd' */, 0x0061 /* 'a' */},
\r
107 {0x00C4, 0x0062 /* 'b' */, 0x0063 /* 'c' */, 0x0064 /* 'd' */, 0x0061 /* 'a' */},
\r
108 {0x00C4, 0x0062 /* 'b' */, 0x0063 /* 'c' */, 0x0064 /* 'd' */, 0x0061 /* 'a' */},
\r
109 {0x0061 /* 'a' */, 0x0062 /* 'b' */, 0x0023 /* '#' */, 0x0063 /* 'c' */},
\r
110 {0x0061 /* 'a' */, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
111 {0x0061 /* 'a' */, 0x0062 /* 'b' */, 0x003D /* '=' */, 0x0063 /* 'c' */},
\r
112 {0x0061 /* 'a' */, 0x0062 /* 'b' */, 0x0064 /* 'd' */},
\r
113 {0x00E4, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
114 {0x0061 /* 'a' */, 0x0043 /* 'C' */, 0x0048 /* 'H' */, 0x0063 /* 'c' */},
\r
115 {0x00E4, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
116 {0x0074 /* 't' */, 0x0068 /* 'h' */, 0x00EE, 0x0073 /* 's' */},
\r
117 {0x0070 /* 'p' */, 0x00E9, 0x0063 /* 'c' */, 0x0068 /* 'h' */, 0x00E9},
\r
118 {0x0061 /* 'a' */, 0x0042 /* 'B' */, 0x0043 /* 'C' */},
\r
119 {0x0061 /* 'a' */, 0x0062 /* 'b' */, 0x0064 /* 'd' */},
\r
120 {0x00E4, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
121 {0x0061 /* 'a' */, 0x00C6, 0x0063 /* 'c' */},
\r
122 {0x0061 /* 'a' */, 0x0042 /* 'B' */, 0x0064 /* 'd' */},
\r
123 {0x00E4, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
124 {0x0061 /* 'a' */, 0x00C6, 0x0063 /* 'c' */},
\r
125 {0x0061 /* 'a' */, 0x0042 /* 'B' */, 0x0064 /* 'd' */},
\r
126 {0x00E4, 0x0062 /* 'b' */, 0x0063 /* 'c' */},
\r
127 {0x0070 /* 'p' */, 0x00EA, 0x0063 /* 'c' */, 0x0068 /* 'h' */, 0x0065 /* 'e' */}
\r
130 private static int[] results = {
\r
131 //-1:LESS; 0:EQUAL; 1:GREATER
\r
133 -1, /*Collator::GREATER,*/
\r
141 -1, /*Collator::GREATER,*/ /* 10 */
\r
158 /* Test Tertiary > 26 */
\r
169 /* test identical > 36 */
\r
172 /* test primary > 38 */
\r
178 /* test secondary > 43 */
\r
187 private static char [][] testBugs = {
\r
200 // 0x0300 is grave, 0x0301 is acute
\r
201 // the order of elements in this array must be different than the order in CollationFrenchTest
\r
202 private static char[][] testAcute = {
\r
204 {0x65, 0x65, 0x0301},
\r
205 {0x65, 0x65, 0x0301, 0x0300},
\r
206 {0x65, 0x65, 0x0300},
\r
207 {0x65, 0x65, 0x0300, 0x0301},
\r
208 {0x65, 0x0301, 0x65},
\r
209 {0x65, 0x0301, 0x65, 0x0301},
\r
210 {0x65, 0x0301, 0x65, 0x0301, 0x0300},
\r
211 {0x65, 0x0301, 0x65, 0x0300},
\r
212 {0x65, 0x0301, 0x65, 0x0300, 0x0301},
\r
213 {0x65, 0x0301, 0x0300, 0x65},
\r
214 {0x65, 0x0301, 0x0300, 0x65, 0x0301},
\r
215 {0x65, 0x0301, 0x0300, 0x65, 0x0301, 0x0300},
\r
216 {0x65, 0x0301, 0x0300, 0x65, 0x0300},
\r
217 {0x65, 0x0301, 0x0300, 0x65, 0x0300, 0x0301},
\r
218 {0x65, 0x0300, 0x65},
\r
219 {0x65, 0x0300, 0x65, 0x0301},
\r
220 {0x65, 0x0300, 0x65, 0x0301, 0x0300},
\r
221 {0x65, 0x0300, 0x65, 0x0300},
\r
222 {0x65, 0x0300, 0x65, 0x0300, 0x0301},
\r
223 {0x65, 0x0300, 0x0301, 0x65},
\r
224 {0x65, 0x0300, 0x0301, 0x65, 0x0301},
\r
225 {0x65, 0x0300, 0x0301, 0x65, 0x0301, 0x0300},
\r
226 {0x65, 0x0300, 0x0301, 0x65, 0x0300},
\r
227 {0x65, 0x0300, 0x0301, 0x65, 0x0300, 0x0301}
\r
230 private static char[][] testMore = {
\r
231 {0x0061 /* 'a' */, 0x0065 /* 'e' */},
\r
234 {0x0061 /* 'a' */, 0x0066 /* 'f' */},
\r
235 {0x006F /* 'o' */, 0x0065 /* 'e' */},
\r
238 {0x006F /* 'o' */, 0x0066 /* 'f' */},
\r
241 private Collator myCollation = null;
\r
243 public CollationEnglishTest() {
\r
245 protected void init()throws Exception{
\r
246 myCollation = Collator.getInstance(Locale.ENGLISH);
\r
249 //performs test with strength PRIMARY
\r
250 public void TestPrimary() {
\r
252 myCollation.setStrength(Collator.PRIMARY);
\r
253 for (i = 38; i < 43 ; i++) {
\r
254 doTest(testSourceCases[i], testTargetCases[i], results[i]);
\r
258 //perform test with strength SECONDARY
\r
259 public void TestSecondary() {
\r
261 myCollation.setStrength(Collator.SECONDARY);
\r
262 for (i = 43; i < 49 ; i++) {
\r
263 doTest(testSourceCases[i], testTargetCases[i], results[i]);
\r
266 //test acute and grave ordering (compare to french collation)
\r
269 for (i = 0; i < testAcute.length; i++) {
\r
270 for (j = 0; j < testAcute.length; j++) {
\r
271 logln("i = " + i + "; j = " + j);
\r
278 doTest(testAcute[i], testAcute[j], expected );
\r
283 //perform test with strength TERTIARY
\r
284 public void TestTertiary() {
\r
286 myCollation.setStrength(Collator.TERTIARY);
\r
287 //for (i = 0; i < 38 ; i++) //attention: there is something wrong with 36, 37.
\r
288 for (i = 0; i < 38 ; i++)
\r
290 doTest(testSourceCases[i], testTargetCases[i], results[i]);
\r
294 for (i = 0; i < 10; i++)
\r
296 for (j = i+1; j < 10; j++)
\r
298 doTest(testBugs[i], testBugs[j], -1);
\r
302 //test more interesting cases
\r
304 for (i = 0; i < testMore.length; i++)
\r
306 for (j = 0; j < testMore.length; j++)
\r
314 doTest(testMore[i], testMore[j], expected );
\r
319 // main test routine, tests rules defined by the "en" locale
\r
320 private void doTest(char[] source, char[] target, int result){
\r
322 String s = new String(source);
\r
323 String t = new String(target);
\r
324 int compareResult = myCollation.compare(s, t);
\r
325 CollationKey sortKey1, sortKey2;
\r
326 sortKey1 = myCollation.getCollationKey(s);
\r
327 sortKey2 = myCollation.getCollationKey(t);
\r
328 int keyResult = sortKey1.compareTo(sortKey2);
\r
329 reportCResult(s, t, sortKey1, sortKey2, compareResult, keyResult, compareResult, result);
\r
333 private void reportCResult( String source, String target, CollationKey sourceKey, CollationKey targetKey,
\r
334 int compareResult, int keyResult, int incResult, int expectedResult ){
\r
335 if (expectedResult < -1 || expectedResult > 1)
\r
337 errln("***** invalid call to reportCResult ****");
\r
341 boolean ok1 = (compareResult == expectedResult);
\r
342 boolean ok2 = (keyResult == expectedResult);
\r
343 boolean ok3 = (incResult == expectedResult);
\r
345 if (ok1 && ok2 && ok3 && !isVerbose()){
\r
348 String msg1 = ok1? "Ok: compare(\"" : "FAIL: compare(\"";
\r
349 String msg2 = "\", \"";
\r
350 String msg3 = "\") returned ";
\r
351 String msg4 = "; expected ";
\r
353 String sExpect = new String("");
\r
354 String sResult = new String("");
\r
355 sResult = appendCompareResult(compareResult, sResult);
\r
356 sExpect = appendCompareResult(expectedResult, sExpect);
\r
358 logln(msg1 + source + msg2 + target + msg3 + sResult);
\r
360 errln(msg1 + source + msg2 + target + msg3 + sResult + msg4 + sExpect);
\r
363 msg1 = ok2 ? "Ok: key(\"" : "FAIL: key(\"";
\r
364 msg2 = "\").compareTo(key(\"";
\r
365 msg3 = "\")) returned ";
\r
366 sResult = appendCompareResult(keyResult, sResult);
\r
368 logln(msg1 + source + msg2 + target + msg3 + sResult);
\r
370 errln(msg1 + source + msg2 + target + msg3 + sResult + msg4 + sExpect);
\r
373 errln(msg1 + prettify(sourceKey) + msg2 + prettify(targetKey));
\r
376 msg1 = ok3 ? "Ok: incCompare(\"" : "FAIL: incCompare(\"";
\r
378 msg3 = "\") returned ";
\r
380 sResult = appendCompareResult(incResult, sResult);
\r
383 logln(msg1 + source + msg2 + target + msg3 + sResult);
\r
385 errln(msg1 + source + msg2 + target + msg3 + sResult + msg4 + sExpect);
\r
390 private String appendCompareResult(int result, String target){
\r
391 if (result == -1) //LESS
\r
395 else if (result == 0) //EQUAL
\r
399 else if (result == 1) //GREATER
\r
401 target += "GREATER";
\r
407 target += huh + result;
\r
412 String prettify(CollationKey sourceKey) {
\r
414 byte[] bytes= sourceKey.toByteArray();
\r
415 String target = "[";
\r
417 for (i = 0; i < bytes.length; i++) {
\r
418 target += Integer.toHexString(bytes[i]);
\r