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 */
61package java.text;
62import 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 */
79public 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}
192