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