1 /*
  2  * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
  3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4  *
  5  * This code is free software; you can redistribute it and/or modify it
  6  * under the terms of the GNU General Public License version 2 only, as
  7  * published by the Free Software Foundation.
  8  *
  9  * This code is distributed in the hope that it will be useful, but WITHOUT
 10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 12  * version 2 for more details (a copy is included in the LICENSE file that
 13  * accompanied this code).
 14  *
 15  * You should have received a copy of the GNU General Public License version
 16  * 2 along with this work; if not, write to the Free Software Foundation,
 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 18  *
 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  */
 23 
 24 /*
 25  * @test
 26  * @library /java/text/testlib
 27  * @summary test Dummy Collation
 28  */
 29 
 30 import java.text.Collator;
 31 import java.text.RuleBasedCollator;
 32 
 33 /*
 34 (C) Copyright Taligent, Inc. 1996 - All Rights Reserved
 35 (C) Copyright IBM Corp. 1996 - All Rights Reserved
 36 
 37   The original version of this source code and documentation is copyrighted and
 38 owned by Taligent, Inc., a wholly-owned subsidiary of IBM. These materials are
 39 provided under terms of a License Agreement between Taligent and Sun. This
 40 technology is protected by multiple US and International patents. This notice and
 41 attribution to Taligent may not be removed.
 42   Taligent is a registered trademark of Taligent, Inc.
 43 */
 44 
 45 public class DummyTest extends CollatorTest {
 46 
 47     public static void main(String[] args) throws Exception {
 48         new DummyTest().run(args);
 49     }
 50 
 51     private static final String DEFAULTRULES =
 52         "='\u200B'=\u200C=\u200D=\u200E=\u200F"
 53         // Control Characters
 54         + "=\u0000 =\u0001 =\u0002 =\u0003 =\u0004" //null, .. eot
 55         + "=\u0005 =\u0006 =\u0007 =\u0008 ='\u0009'" //enq, ...
 56         + "='\u000b' =\u000e" //vt,, so
 57         + "=\u000f ='\u0010' =\u0011 =\u0012 =\u0013" //si, dle, dc1, dc2, dc3
 58         + "=\u0014 =\u0015 =\u0016 =\u0017 =\u0018" //dc4, nak, syn, etb, can
 59         + "=\u0019 =\u001a =\u001b =\u001c =\u001d" //em, sub, esc, fs, gs
 60         + "=\u001e =\u001f =\u007f"                   //rs, us, del
 61         //....then the C1 Latin 1 reserved control codes
 62         + "=\u0080 =\u0081 =\u0082 =\u0083 =\u0084 =\u0085"
 63         + "=\u0086 =\u0087 =\u0088 =\u0089 =\u008a =\u008b"
 64         + "=\u008c =\u008d =\u008e =\u008f =\u0090 =\u0091"
 65         + "=\u0092 =\u0093 =\u0094 =\u0095 =\u0096 =\u0097"
 66         + "=\u0098 =\u0099 =\u009a =\u009b =\u009c =\u009d"
 67         + "=\u009e =\u009f"
 68         // IGNORE except for secondary, tertiary difference
 69         // Spaces
 70         + ";'\u0020';'\u00A0'"                  // spaces
 71         + ";'\u2000';'\u2001';'\u2002';'\u2003';'\u2004'"  // spaces
 72         + ";'\u2005';'\u2006';'\u2007';'\u2008';'\u2009'"  // spaces
 73         + ";'\u200A';'\u3000';'\uFEFF'"                // spaces
 74         + ";'\r' ;'\t' ;'\n';'\f';'\u000b'"  // whitespace
 75 
 76         // Non-spacing accents
 77 
 78         + ";\u0301"          // non-spacing acute accent
 79         + ";\u0300"          // non-spacing grave accent
 80         + ";\u0306"          // non-spacing breve accent
 81         + ";\u0302"          // non-spacing circumflex accent
 82         + ";\u030c"          // non-spacing caron/hacek accent
 83         + ";\u030a"          // non-spacing ring above accent
 84         + ";\u030d"          // non-spacing vertical line above
 85         + ";\u0308"          // non-spacing diaeresis accent
 86         + ";\u030b"          // non-spacing double acute accent
 87         + ";\u0303"          // non-spacing tilde accent
 88         + ";\u0307"          // non-spacing dot above/overdot accent
 89         + ";\u0304"          // non-spacing macron accent
 90         + ";\u0337"          // non-spacing short slash overlay (overstruck diacritic)
 91         + ";\u0327"          // non-spacing cedilla accent
 92         + ";\u0328"          // non-spacing ogonek accent
 93         + ";\u0323"          // non-spacing dot-below/underdot accent
 94         + ";\u0332"          // non-spacing underscore/underline accent
 95         // with the rest of the general diacritical marks in binary order
 96         + ";\u0305"          // non-spacing overscore/overline
 97         + ";\u0309"          // non-spacing hook above
 98         + ";\u030e"          // non-spacing double vertical line above
 99         + ";\u030f"          // non-spacing double grave
100         + ";\u0310"          // non-spacing chandrabindu
101         + ";\u0311"          // non-spacing inverted breve
102         + ";\u0312"          // non-spacing turned comma above/cedilla above
103         + ";\u0313"          // non-spacing comma above
104         + ";\u0314"          // non-spacing reversed comma above
105         + ";\u0315"          // non-spacing comma above right
106         + ";\u0316"          // non-spacing grave below
107         + ";\u0317"          // non-spacing acute below
108         + ";\u0318"          // non-spacing left tack below
109         + ";\u0319"          // non-spacing tack below
110         + ";\u031a"          // non-spacing left angle above
111         + ";\u031b"          // non-spacing horn
112         + ";\u031c"          // non-spacing left half ring below
113         + ";\u031d"          // non-spacing up tack below
114         + ";\u031e"          // non-spacing down tack below
115         + ";\u031f"          // non-spacing plus sign below
116         + ";\u0320"          // non-spacing minus sign below
117         + ";\u0321"          // non-spacing palatalized hook below
118         + ";\u0322"          // non-spacing retroflex hook below
119         + ";\u0324"          // non-spacing double dot below
120         + ";\u0325"          // non-spacing ring below
121         + ";\u0326"          // non-spacing comma below
122         + ";\u0329"          // non-spacing vertical line below
123         + ";\u032a"          // non-spacing bridge below
124         + ";\u032b"          // non-spacing inverted double arch below
125         + ";\u032c"          // non-spacing hacek below
126         + ";\u032d"          // non-spacing circumflex below
127         + ";\u032e"          // non-spacing breve below
128         + ";\u032f"          // non-spacing inverted breve below
129         + ";\u0330"          // non-spacing tilde below
130         + ";\u0331"          // non-spacing macron below
131         + ";\u0333"          // non-spacing double underscore
132         + ";\u0334"          // non-spacing tilde overlay
133         + ";\u0335"          // non-spacing short bar overlay
134         + ";\u0336"          // non-spacing long bar overlay
135         + ";\u0338"          // non-spacing long slash overlay
136         + ";\u0339"          // non-spacing right half ring below
137         + ";\u033a"          // non-spacing inverted bridge below
138         + ";\u033b"          // non-spacing square below
139         + ";\u033c"          // non-spacing seagull below
140         + ";\u033d"          // non-spacing x above
141         + ";\u033e"          // non-spacing vertical tilde
142         + ";\u033f"          // non-spacing double overscore
143         + ";\u0340"          // non-spacing grave tone mark
144         + ";\u0341"          // non-spacing acute tone mark
145         + ";\u0342;\u0343;\u0344;\u0345;\u0360;\u0361"    // newer
146         + ";\u0483;\u0484;\u0485;\u0486"    // Cyrillic accents
147 
148         + ";\u20D0;\u20D1;\u20D2"           // symbol accents
149         + ";\u20D3;\u20D4;\u20D5"           // symbol accents
150         + ";\u20D6;\u20D7;\u20D8"           // symbol accents
151         + ";\u20D9;\u20DA;\u20DB"           // symbol accents
152         + ";\u20DC;\u20DD;\u20DE"           // symbol accents
153         + ";\u20DF;\u20E0;\u20E1"           // symbol accents
154 
155         + ",'\u002D';\u00AD"                // dashes
156         + ";\u2010;\u2011;\u2012"           // dashes
157         + ";\u2013;\u2014;\u2015"           // dashes
158         + ";\u2212"                         // dashes
159 
160         // other punctuation
161 
162         + "<'\u005f'"        // underline/underscore (spacing)
163         + "<\u00af"          // overline or macron (spacing)
164 //        + "<\u00ad"        // syllable hyphen (SHY) or soft hyphen
165         + "<'\u002c'"        // comma (spacing)
166         + "<'\u003b'"        // semicolon
167         + "<'\u003a'"        // colon
168         + "<'\u0021'"        // exclamation point
169         + "<\u00a1"          // inverted exclamation point
170         + "<'\u003f'"        // question mark
171         + "<\u00bf"          // inverted question mark
172         + "<'\u002f'"        // slash
173         + "<'\u002e'"        // period/full stop
174         + "<\u00b4"          // acute accent (spacing)
175         + "<'\u0060'"        // grave accent (spacing)
176         + "<'\u005e'"        // circumflex accent (spacing)
177         + "<\u00a8"          // diaresis/umlaut accent (spacing)
178         + "<'\u007e'"        // tilde accent (spacing)
179         + "<\u00b7"          // middle dot (spacing)
180         + "<\u00b8"          // cedilla accent (spacing)
181         + "<'\u0027'"        // apostrophe
182         + "<'\"'"            // quotation marks
183         + "<\u00ab"          // left angle quotes
184         + "<\u00bb"          // right angle quotes
185         + "<'\u0028'"        // left parenthesis
186         + "<'\u0029'"        // right parenthesis
187         + "<'\u005b'"        // left bracket
188         + "<'\u005d'"        // right bracket
189         + "<'\u007b'"        // left brace
190         + "<'\u007d'"        // right brace
191         + "<\u00a7"          // section symbol
192         + "<\u00b6"          // paragraph symbol
193         + "<\u00a9"          // copyright symbol
194         + "<\u00ae"          // registered trademark symbol
195         + "<'\u0040'"          // at sign
196         + "<\u00a4"          // international currency symbol
197         + "<\u00a2"          // cent sign
198         + "<'\u0024'"        // dollar sign
199         + "<\u00a3"          // pound-sterling sign
200         + "<\u00a5"          // yen sign
201         + "<'\u002a'"        // asterisk
202         + "<'\\u005c'"       // backslash
203         + "<'\u0026'"        // ampersand
204         + "<'\u0023'"        // number sign
205         + "<'\u0025'"        // percent sign
206         + "<'\u002b'"        // plus sign
207 //        + "<\u002d"        // hyphen or minus sign
208         + "<\u00b1"          // plus-or-minus sign
209         + "<\u00f7"          // divide sign
210         + "<\u00d7"          // multiply sign
211         + "<'\u003c'"        // less-than sign
212         + "<'\u003d'"        // equal sign
213         + "<'\u003e'"        // greater-than sign
214         + "<\u00ac"          // end of line symbol/logical NOT symbol
215         + "<'\u007c'"          // vertical line/logical OR symbol
216         + "<\u00a6"          // broken vertical line
217         + "<\u00b0"          // degree symbol
218         + "<\u00b5"          // micro symbol
219 
220         // NUMERICS
221 
222         + "<0<1<2<3<4<5<6<7<8<9"
223         + "<\u00bc<\u00bd<\u00be"   // 1/4,1/2,3/4 fractions
224 
225         // NON-IGNORABLES
226         + "<a,A"
227         + "<b,B"
228         + "<c,C"
229         + "<d,D"
230         + "<\u00F0,\u00D0"                  // eth
231         + "<e,E"
232         + "<f,F"
233         + "<g,G"
234         + "<h,H"
235         + "<i,I"
236         + "<j,J"
237         + "<k,K"
238         + "<l,L"
239         + "<m,M"
240         + "<n,N"
241         + "<o,O"
242         + "<p,P"
243         + "<q,Q"
244         + "<r,R"
245         + "<s, S & SS,\u00DF"             // s-zet
246         + "<t,T"
247         + "&th, \u00FE & TH, \u00DE"           // thorn
248         + "<u,U"
249         + "<v,V"
250         + "<w,W"
251         + "<x,X"
252         + "<y,Y"
253         + "<z,Z"
254         + "&AE,\u00C6"                    // ae & AE ligature
255         + "&AE,\u00E6"
256         + "&OE,\u0152"                    // oe & OE ligature
257         + "&OE,\u0153";
258 
259     /*
260      * Data for TestPrimary()
261      */
262     private static final String[] primarySourceData = {
263         "p\u00EAche",
264         "abc",
265         "abc",
266         "abc",
267         "abc",
268         "abc",
269         "a\u00E6c",
270         "acHc",
271         "black"
272     };
273 
274     private static final String[] primaryTargetData = {
275         "p\u00E9ch\u00E9",
276         "abc",
277         "aBC",
278         "abch",
279         "abd",
280         "\u00E4bc",
281         "a\u00C6c",
282         "aCHc",
283         "black-bird"
284     };
285 
286     private static final int[] primaryResults = {
287          0,  0,  0, -1, -1,  0,  0,  0, -1
288     };
289 
290     /*
291      * Data for TestSecondary()
292      */
293     private static final String[] secondarySourceData = {
294         "four",
295         "five",
296         "1",
297         "abc",
298         "abc",
299         "abcH",
300         "abc",
301         "acHc"
302     };
303 
304     private static final String[] secondaryTargetData = {
305 
306         "4",
307         "5",
308         "one",
309         "abc",
310         "aBc",
311         "abch",
312         "abd",
313         "aCHc"
314     };
315 
316     private static final int[] secondaryResults = {
317          0,  0,  0,  0,  0,  0, -1,  0
318     };
319 
320     /*
321      * Data for TestTertiary()
322      */
323     private static final String[] tertiarySourceData = {
324         "ab'c",
325         "co-op",
326         "ab",
327         "ampersad",
328         "all",
329         "four",
330         "five",
331         "1",
332         "1",
333         "1",
334         "2",
335         "2",
336         "Hello",
337         "a<b",
338         "a<b",
339         "acc",
340         "acHc"
341     };
342 
343     private static final String[] tertiaryTargetData = {
344         "abc",
345         "COOP",
346         "abc",
347         "&",
348         "&",
349         "4",
350         "5",
351         "one",
352         "nne",
353         "pne",
354         "two",
355         "uwo",
356         "hellO",
357         "a<=b",
358         "abc",
359         "aCHc",
360         "aCHc"
361     };
362 
363     private static final int[] tertiaryResults = {
364         -1,  1, -1, -1, -1, -1, -1,  1,  1, -1,
365          1, -1,  1,  1, -1, -1, -1
366     };
367 
368 
369     private static final String[] testData = {
370         "a",
371         "A",
372         "\u00e4",
373         "\u00c4",
374         "ae",
375         "aE",
376         "Ae",
377         "AE",
378         "\u00e6",
379         "\u00c6",
380         "b",
381         "c",
382         "z"
383     };
384 
385     public void TestPrimary() {
386         doTest(getCollator(), Collator.PRIMARY,
387                primarySourceData, primaryTargetData, primaryResults);
388     }
389 
390     public void TestSecondary() {
391         doTest(getCollator(), Collator.SECONDARY,
392                secondarySourceData, secondaryTargetData, secondaryResults);
393     }
394 
395     public void TestTertiary() {
396         Collator col = getCollator();
397 
398         doTest(col, Collator.TERTIARY,
399                tertiarySourceData, tertiaryTargetData, tertiaryResults);
400 
401         for (int i = 0; i < testData.length-1; i++) {
402             for (int j = i+1; j < testData.length; j++) {
403                 doTest(col, testData[i], testData[j], -1);
404             }
405         }
406     }
407 
408     private RuleBasedCollator myCollation = null;
409     private Collator getCollator() {
410         if (myCollation == null) {
411             try {
412                 myCollation = new RuleBasedCollator
413                     (DEFAULTRULES + "& C < ch, cH, Ch, CH & Five, 5 & Four, 4 & one, 1 & Ampersand; '&' & Two, 2 ");
414             } catch (Exception foo) {
415                 errln("Collator creation failed.");
416                 myCollation = (RuleBasedCollator)Collator.getInstance();
417             }
418         }
419         return myCollation;
420     }
421 }