1 /* |
|
2 * Copyright (c) 1999, 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 (this test doesn't have an at-test tag because it's run by a shell |
|
26 script instead of directly by the test harness) |
|
27 */ |
|
28 |
|
29 /* |
|
30 * |
|
31 * |
|
32 * (C) Copyright Taligent, Inc. 1996, 1997 - All Rights Reserved |
|
33 * (C) Copyright IBM Corp. 1996 - 1998 - All Rights Reserved |
|
34 * |
|
35 * Portions copyright (c) 2007 Sun Microsystems, Inc. |
|
36 * All Rights Reserved. |
|
37 * |
|
38 * The original version of this source code and documentation |
|
39 * is copyrighted and owned by Taligent, Inc., a wholly-owned |
|
40 * subsidiary of IBM. These materials are provided under terms |
|
41 * of a License Agreement between Taligent and Sun. This technology |
|
42 * is protected by multiple US and International patents. |
|
43 * |
|
44 * This notice and attribution to Taligent may not be removed. |
|
45 * Taligent is a registered trademark of Taligent, Inc. |
|
46 * |
|
47 * Permission to use, copy, modify, and distribute this software |
|
48 * and its documentation for NON-COMMERCIAL purposes and without |
|
49 * fee is hereby granted provided that this copyright notice |
|
50 * appears in all copies. Please refer to the file "copyright.html" |
|
51 * for further important copyright and licensing information. |
|
52 * |
|
53 * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF |
|
54 * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED |
|
55 * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A |
|
56 * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR |
|
57 * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR |
|
58 * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. |
|
59 * |
|
60 */ |
|
61 package java.text; |
|
62 import sun.text.IntHashtable; |
|
63 |
|
64 |
|
65 /** |
|
66 * This class tests some internal hashCode() functions. |
|
67 * Bug #4170614 complained that we had two iternal classes that |
|
68 * break the invariant that if a.equals(b) than a.hashCode() == |
|
69 * b.hashCode(). This is because these classes overrode equals() |
|
70 * but not hashCode(). These are both purely internal classes, and |
|
71 * the library itself doesn't actually call hashCode(), so this isn't |
|
72 * actually causing anyone problems yet. But if these classes are |
|
73 * ever exposed in the API, their hashCode() methods need to work right. |
|
74 * PatternEntry will never be exposed in the API, but IntHashtable |
|
75 * might be. This is a shell test to allow us to access classes that |
|
76 * are declared package private. |
|
77 * @author Richard Gillam |
|
78 */ |
|
79 public class Bug4170614Test { |
|
80 public static void main(String[] args) throws Exception { |
|
81 testIntHashtable(); |
|
82 testPatternEntry(); |
|
83 } |
|
84 |
|
85 |
|
86 public static void testIntHashtable() throws Exception { |
|
87 IntHashtable fred = new IntHashtable(); |
|
88 fred.put(1, 10); |
|
89 fred.put(2, 20); |
|
90 fred.put(3, 30); |
|
91 |
|
92 IntHashtable barney = new IntHashtable(); |
|
93 barney.put(1, 10); |
|
94 barney.put(3, 30); |
|
95 barney.put(2, 20); |
|
96 |
|
97 IntHashtable homer = new IntHashtable(); |
|
98 homer.put(3, 30); |
|
99 homer.put(1, 10); |
|
100 homer.put(7, 900); |
|
101 |
|
102 if (fred.equals(barney)) { |
|
103 System.out.println("fred.equals(barney)"); |
|
104 } |
|
105 else { |
|
106 System.out.println("!fred.equals(barney)"); |
|
107 } |
|
108 System.out.println("fred.hashCode() == " + fred.hashCode()); |
|
109 System.out.println("barney.hashCode() == " + barney.hashCode()); |
|
110 |
|
111 if (!fred.equals(barney)) { |
|
112 throw new Exception("equals() failed on two hashtables that are equal"); |
|
113 } |
|
114 |
|
115 if (fred.hashCode() != barney.hashCode()) { |
|
116 throw new Exception("hashCode() failed on two hashtables that are equal"); |
|
117 } |
|
118 |
|
119 System.out.println(); |
|
120 if (fred.equals(homer)) { |
|
121 System.out.println("fred.equals(homer)"); |
|
122 } |
|
123 else { |
|
124 System.out.println("!fred.equals(homer)"); |
|
125 } |
|
126 System.out.println("fred.hashCode() == " + fred.hashCode()); |
|
127 System.out.println("homer.hashCode() == " + homer.hashCode()); |
|
128 |
|
129 if (fred.equals(homer)) { |
|
130 throw new Exception("equals() failed on two hashtables that are not equal"); |
|
131 } |
|
132 |
|
133 if (fred.hashCode() == homer.hashCode()) { |
|
134 throw new Exception("hashCode() failed on two hashtables that are not equal"); |
|
135 } |
|
136 |
|
137 System.out.println(); |
|
138 System.out.println("testIntHashtable() passed.\n"); |
|
139 } |
|
140 |
|
141 public static void testPatternEntry() throws Exception { |
|
142 PatternEntry fred = new PatternEntry(1, |
|
143 new StringBuffer("hello"), |
|
144 new StringBuffer("up")); |
|
145 PatternEntry barney = new PatternEntry(1, |
|
146 new StringBuffer("hello"), |
|
147 new StringBuffer("down")); |
|
148 // (equals() only considers the "chars" field, so fred and barney are equal) |
|
149 PatternEntry homer = new PatternEntry(1, |
|
150 new StringBuffer("goodbye"), |
|
151 new StringBuffer("up")); |
|
152 |
|
153 if (fred.equals(barney)) { |
|
154 System.out.println("fred.equals(barney)"); |
|
155 } |
|
156 else { |
|
157 System.out.println("!fred.equals(barney)"); |
|
158 } |
|
159 System.out.println("fred.hashCode() == " + fred.hashCode()); |
|
160 System.out.println("barney.hashCode() == " + barney.hashCode()); |
|
161 |
|
162 if (!fred.equals(barney)) { |
|
163 throw new Exception("equals() failed on two hashtables that are equal"); |
|
164 } |
|
165 |
|
166 if (fred.hashCode() != barney.hashCode()) { |
|
167 throw new Exception("hashCode() failed on two hashtables that are equal"); |
|
168 } |
|
169 |
|
170 System.out.println(); |
|
171 if (fred.equals(homer)) { |
|
172 System.out.println("fred.equals(homer)"); |
|
173 } |
|
174 else { |
|
175 System.out.println("!fred.equals(homer)"); |
|
176 } |
|
177 System.out.println("fred.hashCode() == " + fred.hashCode()); |
|
178 System.out.println("homer.hashCode() == " + homer.hashCode()); |
|
179 |
|
180 if (fred.equals(homer)) { |
|
181 throw new Exception("equals() failed on two hashtables that are not equal"); |
|
182 } |
|
183 |
|
184 if (fred.hashCode() == homer.hashCode()) { |
|
185 throw new Exception("hashCode() failed on two hashtables that are not equal"); |
|
186 } |
|
187 |
|
188 System.out.println(); |
|
189 System.out.println("testPatternEntry() passed.\n"); |
|
190 } |
|
191 } |
|