1/*
2 * Copyright (c) 2004, 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 * @bug     5050285
27 * @summary Inserting enum of wrong type does horrible things to EnumSet/Map
28 * @author  Josh Bloch
29 */
30
31import java.util.*;
32
33public class InsertWrongType {
34    public static void main(String[] args) throws Exception {
35        // Ordinal in range
36        addIllTypedElt(Test32.class,  Test33.T1);  // Regular
37        addIllTypedElt(Test127.class, Test128.T1); // Jumbo
38
39        // Ordinal out of range
40        addIllTypedElt(Test32.class,  Test33.T33);   // Regular
41        addIllTypedElt(Test127.class, Test128.T128); // Jumbo
42
43        // Ordinal in range
44        addAllIllTypedElt(Test32.class,  Test33.T1);  // Regular
45        addAllIllTypedElt(Test127.class, Test128.T1); // Jumbo
46
47        // Ordinal out of range
48        addAllIllTypedElt(Test32.class,  Test33.T33);   // Regular
49        addAllIllTypedElt(Test127.class, Test128.T128); // Jumbo
50
51        addAllEmptyMistypedEnumSet(Test32.class, Test33.class);   // Regular
52        addAllEmptyMistypedEnumSet(Test127.class, Test128.class); // Jumbo
53
54        heterogeneousCopyOf(Test32.T1,  Test33.T2);     // Regular
55        heterogeneousCopyOf(Test127.T1,  Test128.T2);   // Jumbo
56
57        heterogeneousOf2(Test32.T1,  Test33.T2);     // Regular
58        heterogeneousOf2(Test127.T1,  Test128.T2);   // Jumbo
59
60        heterogeneousOf3(Test32.T1,  Test33.T2);     // Regular
61        heterogeneousOf3(Test127.T1,  Test128.T2);   // Jumbo
62
63        heterogeneousOf4(Test32.T1,  Test33.T2);     // Regular
64        heterogeneousOf4(Test127.T1,  Test128.T2);   // Jumbo
65
66        heterogeneousOf5(Test32.T1,  Test33.T2);     // Regular
67        heterogeneousOf5(Test127.T1,  Test128.T2);   // Jumbo
68
69        heterogeneousOfVar(Test32.T1,  Test33.T2);     // Regular
70        heterogeneousOfVar(Test127.T1,  Test128.T2);   // Jumbo
71
72        putIllTypedKey(Test32.class,  Test33.T1);
73        putIllTypedKey(Test32.class,  Test33.T33);
74
75        putAllIllTypedKey(Test32.class,  Test33.T1);
76        putAllIllTypedKey(Test32.class,  Test33.T33);
77
78        putAllIllTypedKeyEnumMap(Test32.class,  Test33.T1);
79        putAllIllTypedKeyEnumMap(Test32.class,  Test33.T33);
80
81        putAllEmptyMistypedEnumMap(Test32.class, Test33.class);
82    }
83
84
85    static void addIllTypedElt(Class enumClass, Enum elt) {
86        EnumSet set = EnumSet.noneOf(enumClass);
87        try {
88            set.add(elt);
89        } catch(ClassCastException e) {
90            return;
91        }
92        throw new RuntimeException("Incorrectly typed add succeeded");
93    }
94
95    static void addAllIllTypedElt(Class enumClass, Enum elt) {
96        EnumSet set = EnumSet.noneOf(enumClass);
97        try {
98            set.addAll(Collections.singleton(elt));
99        } catch(ClassCastException e) {
100            return;
101        }
102        throw new RuntimeException("Incorrectly typed addAll succeeded");
103    }
104
105    static void addAllEmptyMistypedEnumSet(Class destClass, Class srcClass) {
106        EnumSet dest = EnumSet.noneOf(destClass);
107        EnumSet src  = EnumSet.noneOf(srcClass);
108        dest.addAll(src);
109    }
110
111    static void heterogeneousCopyOf(Enum e1, Enum e2) {
112        List list = new ArrayList();
113        list.add(e1);
114        list.add(e2);
115        try {
116            EnumSet.copyOf(list);
117        } catch(ClassCastException e) {
118            return;
119        }
120        throw new RuntimeException("heterogeneous copyOf succeeded");
121    }
122
123    static void heterogeneousOf2(Enum e1, Enum e2) {
124        try {
125            EnumSet.of(e1, e2);
126        } catch(ClassCastException e) {
127            return;
128        }
129        throw new RuntimeException("heterogeneous of (2 args) succeeded");
130    }
131
132    static void heterogeneousOf3(Enum e1, Enum e2) {
133        try {
134            EnumSet.of(e1, e1, e2);
135        } catch(ClassCastException e) {
136            return;
137        }
138        throw new RuntimeException("heterogeneous of (3 args) succeeded");
139    }
140
141    static void heterogeneousOf4(Enum e1, Enum e2) {
142        try {
143            EnumSet.of(e1, e1, e1, e2);
144        } catch(ClassCastException e) {
145            return;
146        }
147        throw new RuntimeException("heterogeneous of (4 args) succeeded");
148    }
149
150    static void heterogeneousOf5(Enum e1, Enum e2) {
151        try {
152            EnumSet.of(e1, e1, e1, e1, e2);
153        } catch(ClassCastException e) {
154            return;
155        }
156        throw new RuntimeException("heterogeneous of (5 args) succeeded");
157    }
158
159    static void heterogeneousOfVar(Enum e1, Enum e2) {
160        try {
161            EnumSet.of(e1, e1, e1, e1, e1, e2);
162        } catch(ClassCastException e) {
163            return;
164        }
165        throw new RuntimeException("heterogeneous of (Var args) succeeded");
166    }
167
168    static void putIllTypedKey(Class enumClass, Enum elt) {
169        EnumMap map = new EnumMap(enumClass);
170        try {
171            map.put(elt, "foofy");
172        } catch(ClassCastException e) {
173            return;
174        }
175        throw new RuntimeException("Incorrectly typed put succeeded");
176    }
177
178    static void putAllIllTypedKey(Class enumClass, Enum elt) {
179        EnumMap dest = new EnumMap(enumClass);
180        Map src = new HashMap();
181        src.put(elt, "goofy");
182        try {
183            dest.putAll(src);
184        } catch(ClassCastException e) {
185            return;
186        }
187        throw new RuntimeException("Incorrectly typed putAll succeeded");
188    }
189
190    static void putAllIllTypedKeyEnumMap(Class enumClass, Enum elt) {
191        EnumMap dest = new EnumMap(enumClass);
192        Map src = new EnumMap(elt.getClass());
193        src.put(elt, "goofy");
194        try {
195            dest.putAll(src);
196        } catch(ClassCastException e) {
197            return;
198        }
199        throw new RuntimeException("Incorrectly typed enum put All succeeded");
200    }
201
202    static void putAllEmptyMistypedEnumMap(Class destClass, Class srcClass) {
203        EnumMap dest = new EnumMap(destClass);
204        EnumMap src = new EnumMap(srcClass);
205        dest.putAll(src);
206    }
207
208    enum Test32 {
209        T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16,
210        T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
211        T31, T32
212    }
213
214    enum Test33 {
215        T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16,
216        T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
217        T31, T32, T33
218    }
219
220    enum Test127 {
221        T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
222        T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
223        T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
224        T44, T45, T46, T47, T48, T49, T50, T51, T52, T53, T54, T55, T56, T57,
225        T58, T59, T60, T61, T62, T63, T64, T65, T66, T67, T68, T69, T70, T71,
226        T72, T73, T74, T75, T76, T77, T78, T79, T80, T81, T82, T83, T84, T85,
227        T86, T87, T88, T89, T90, T91, T92, T93, T94, T95, T96, T97, T98, T99,
228        T100, T101, T102, T103, T104, T105, T106, T107, T108, T109, T110, T111,
229        T112, T113, T114, T115, T116, T117, T118, T119, T120, T121, T122, T123,
230        T124, T125, T126, T127
231    }
232
233    enum Test128 {
234        T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
235        T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
236        T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
237        T44, T45, T46, T47, T48, T49, T50, T51, T52, T53, T54, T55, T56, T57,
238        T58, T59, T60, T61, T62, T63, T64, T65, T66, T67, T68, T69, T70, T71,
239        T72, T73, T74, T75, T76, T77, T78, T79, T80, T81, T82, T83, T84, T85,
240        T86, T87, T88, T89, T90, T91, T92, T93, T94, T95, T96, T97, T98, T99,
241        T100, T101, T102, T103, T104, T105, T106, T107, T108, T109, T110, T111,
242        T112, T113, T114, T115, T116, T117, T118, T119, T120, T121, T122, T123,
243        T124, T125, T126, T127, T128
244    }
245}
246