1 /* 2 * Copyright (c) 1998, 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 import java.lang.reflect.*; 25 import java.util.Hashtable; 26 import java.util.Enumeration; 27 import java.util.Vector; 28 import java.io.*; 29 import java.text.*; 30 31 /** 32 * CollatorTest is a base class for tests that can be run conveniently from 33 * the command line as well as under the Java test harness. 34 * <p> 35 * Sub-classes implement a set of methods named Test<something>. Each 36 * of these methods performs some test. Test methods should indicate 37 * errors by calling either err or errln. This will increment the 38 * errorCount field and may optionally print a message to the log. 39 * Debugging information may also be added to the log via the log 40 * and logln methods. These methods will add their arguments to the 41 * log only if the test is being run in verbose mode. 42 */ 43 public abstract class CollatorTest extends IntlTest { 44 45 //------------------------------------------------------------------------ 46 // These methods are utilities specific to the Collation tests.. 47 //------------------------------------------------------------------------ 48 49 protected void assertEqual(CollationElementIterator i1, CollationElementIterator i2) { 50 int c1, c2, count = 0; 51 do { 52 c1 = i1.next(); 53 c2 = i2.next(); 54 if (c1 != c2) { 55 errln(" " + count + ": " + c1 + " != " + c2); 56 break; 57 } 58 count++; 59 } while (c1 != CollationElementIterator.NULLORDER); 60 } 61 62 // Replace nonprintable characters with unicode escapes 63 static protected String prettify(String str) { 64 StringBuffer result = new StringBuffer(); 65 66 String zero = "0000"; 67 68 for (int i = 0; i < str.length(); i++) { 69 char ch = str.charAt(i); 70 if (ch < 0x09 || (ch > 0x0A && ch < 0x20)|| (ch > 0x7E && ch < 0xA0) || ch > 0x100) { 71 String hex = Integer.toString((int)ch,16); 72 73 result.append("\\u" + zero.substring(0, 4 - hex.length()) + hex); 74 } else { 75 result.append(ch); 76 } 77 } 78 return result.toString(); 79 } 80 81 // Produce a printable representation of a CollationKey 82 static protected String prettify(CollationKey key) { 83 StringBuffer result = new StringBuffer(); 84 byte[] bytes = key.toByteArray(); 85 86 for (int i = 0; i < bytes.length; i += 2) { 87 int val = (bytes[i] << 8) + bytes[i+1]; 88 result.append(Integer.toString(val, 16) + " "); 89 } 90 return result.toString(); 91 } 92 93 //------------------------------------------------------------------------ 94 // Everything below here is boilerplate code that makes it possible 95 // to add a new test by simply adding a function to an existing class 96 //------------------------------------------------------------------------ 97 98 protected void doTest(Collator col, int strength, 99 String[] source, String[] target, int[] result) { 100 if (source.length != target.length) { 101 errln("Data size mismatch: source = " + 102 source.length + ", target = " + target.length); 103 104 return; // Return if "-nothrow" is specified. 105 } 106 if (source.length != result.length) { 107 errln("Data size mismatch: source & target = " + 108 source.length + ", result = " + result.length); 109 110 return; // Return if "-nothrow" is specified. 111 } 112 113 col.setStrength(strength); 114 for (int i = 0; i < source.length ; i++) { 115 doTest(col, source[i], target[i], result[i]); 116 } 117 } 118 119 protected void doTest(Collator col, 120 String source, String target, int result) { 121 char relation = '='; 122 if (result <= -1) { 123 relation = '<'; 124 } else if (result >= 1) { 125 relation = '>'; 126 } 127 128 int compareResult = col.compare(source, target); 129 CollationKey sortKey1 = col.getCollationKey(source); 130 CollationKey sortKey2 = col.getCollationKey(target); 131 int keyResult = sortKey1.compareTo(sortKey2); 132 if (compareResult != keyResult) { 133 errln("Compare and Collation Key results are different! Source = " + 134 source + " Target = " + target); 135 } 136 if (keyResult != result) { 137 errln("Collation Test failed! Source = " + source + " Target = " + 138 target + " result should be " + relation); 139 } 140 } 141 }