1 /* 2 * Copyright (c) 2003, 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 4904067 27 * @summary Unit test for Collections.checkedList 28 * @author Josh Bloch 29 * @key randomness 30 */ 31 32 import java.util.ArrayList; 33 import java.util.Arrays; 34 import java.util.Collections; 35 import java.util.Iterator; 36 import java.util.List; 37 import java.util.ListIterator; 38 import java.util.Random; 39 40 public class CheckedListBash { 41 static Random rnd = new Random(); 42 43 public static void main(String[] args) { 44 int numItr = 100; 45 int listSize = 100; 46 47 for (int i=0; i<numItr; i++) { 48 List s1 = newList(); 49 AddRandoms(s1, listSize); 50 51 List s2 = newList(); 52 AddRandoms(s2, listSize); 53 54 List intersection = clone(s1); intersection.retainAll(s2); 55 List diff1 = clone(s1); diff1.removeAll(s2); 56 List diff2 = clone(s2); diff2.removeAll(s1); 57 List union = clone(s1); union.addAll(s2); 58 59 if (diff1.removeAll(diff2)) 60 fail("List algebra identity 2 failed"); 61 if (diff1.removeAll(intersection)) 62 fail("List algebra identity 3 failed"); 63 if (diff2.removeAll(diff1)) 64 fail("List algebra identity 4 failed"); 65 if (diff2.removeAll(intersection)) 66 fail("List algebra identity 5 failed"); 67 if (intersection.removeAll(diff1)) 68 fail("List algebra identity 6 failed"); 69 if (intersection.removeAll(diff1)) 70 fail("List algebra identity 7 failed"); 71 72 intersection.addAll(diff1); intersection.addAll(diff2); 73 if (!(intersection.containsAll(union) && 74 union.containsAll(intersection))) 75 fail("List algebra identity 1 failed"); 76 77 Iterator e = union.iterator(); 78 while (e.hasNext()) 79 intersection.remove(e.next()); 80 if (!intersection.isEmpty()) 81 fail("Copy nonempty after deleting all elements."); 82 83 e = union.iterator(); 84 while (e.hasNext()) { 85 Object o = e.next(); 86 if (!union.contains(o)) 87 fail("List doesn't contain one of its elements."); 88 e.remove(); 89 } 90 if (!union.isEmpty()) 91 fail("List nonempty after deleting all elements."); 92 93 s1.clear(); 94 if (s1.size() != 0) 95 fail("Clear didn't reduce size to zero."); 96 97 s1.addAll(0, s2); 98 if (!(s1.equals(s2) && s2.equals(s1))) 99 fail("addAll(int, Collection) doesn't work."); 100 // Reverse List 101 for (int j=0, n=s1.size(); j<n; j++) 102 s1.set(j, s1.set(n-j-1, s1.get(j))); 103 // Reverse it again 104 for (int j=0, n=s1.size(); j<n; j++) 105 s1.set(j, s1.set(n-j-1, s1.get(j))); 106 if (!(s1.equals(s2) && s2.equals(s1))) 107 fail("set(int, Object) doesn't work"); 108 } 109 110 List s = newList(); 111 for (int i=0; i<listSize; i++) 112 s.add(new Integer(i)); 113 if (s.size() != listSize) 114 fail("Size of [0..n-1] != n"); 115 116 List even = clone(s); 117 Iterator it = even.iterator(); 118 while (it.hasNext()) 119 if (((Integer)it.next()).intValue() % 2 == 1) 120 it.remove(); 121 it = even.iterator(); 122 while (it.hasNext()) 123 if (((Integer)it.next()).intValue() % 2 == 1) 124 fail("Failed to remove all odd nubmers."); 125 126 List odd = clone(s); 127 for (int i=0; i<(listSize/2); i++) 128 odd.remove(i); 129 for (int i=0; i<(listSize/2); i++) 130 if (((Integer)odd.get(i)).intValue() % 2 != 1) 131 fail("Failed to remove all even nubmers."); 132 133 List all = clone(odd); 134 for (int i=0; i<(listSize/2); i++) 135 all.add(2*i, even.get(i)); 136 if (!all.equals(s)) 137 fail("Failed to reconstruct ints from odds and evens."); 138 139 all = clone(odd); 140 ListIterator itAll = all.listIterator(all.size()); 141 ListIterator itEven = even.listIterator(even.size()); 142 while (itEven.hasPrevious()) { 143 itAll.previous(); 144 itAll.add(itEven.previous()); 145 itAll.previous(); // ??? 146 } 147 itAll = all.listIterator(); 148 while (itAll.hasNext()) { 149 Integer i = (Integer)itAll.next(); 150 itAll.set(new Integer(i.intValue())); 151 } 152 itAll = all.listIterator(); 153 it = s.iterator(); 154 while (it.hasNext()) 155 if (it.next()==itAll.next()) 156 fail("Iterator.set failed to change value."); 157 if (!all.equals(s)) 158 fail("Failed to reconstruct ints with ListIterator."); 159 160 it = all.listIterator(); 161 int i=0; 162 while (it.hasNext()) { 163 Object o = it.next(); 164 if (all.indexOf(o) != all.lastIndexOf(o)) 165 fail("Apparent duplicate detected."); 166 if (all.subList(i, all.size()).indexOf(o) != 0 || 167 all.subList(i+1, all.size()).indexOf(o) != -1) 168 fail("subList/indexOf is screwy."); 169 if (all.subList(0,i+1).lastIndexOf(o) != i) 170 fail("subList/lastIndexOf is screwy."); 171 i++; 172 } 173 174 List l = newList(); 175 AddRandoms(l, listSize); 176 Integer[] ia = (Integer[]) l.toArray(new Integer[0]); 177 if (!l.equals(Arrays.asList(ia))) 178 fail("toArray(Object[]) is hosed (1)"); 179 ia = new Integer[listSize]; 180 Integer[] ib = (Integer[]) l.toArray(ia); 181 if (ia != ib || !l.equals(Arrays.asList(ia))) 182 fail("toArray(Object[]) is hosed (2)"); 183 ia = new Integer[listSize+1]; 184 ia[listSize] = new Integer(69); 185 ib = (Integer[]) l.toArray(ia); 186 if (ia != ib || ia[listSize] != null 187 || !l.equals(Arrays.asList(ia).subList(0, listSize))) 188 fail("toArray(Object[]) is hosed (3)"); 189 190 } 191 192 // Done inefficiently so as to exercise toArray 193 static List clone(List s) { 194 List a = Arrays.asList(s.toArray()); 195 if (s.hashCode() != a.hashCode()) 196 fail("Incorrect hashCode computation."); 197 198 List clone = newList(); 199 clone.addAll(a); 200 if (!s.equals(clone)) 201 fail("List not equal to copy."); 202 if (!s.containsAll(clone)) 203 fail("List does not contain copy."); 204 if (!clone.containsAll(s)) 205 fail("Copy does not contain list."); 206 207 return clone; 208 } 209 210 static List newList() { 211 List s = Collections.checkedList(new ArrayList(), Integer.class); 212 if (!s.isEmpty()) 213 fail("New instance non empty."); 214 return s; 215 } 216 217 static void AddRandoms(List s, int n) { 218 for (int i = 0; i < n; i++) { 219 Integer e = rnd.nextInt(n); 220 221 int preSize = s.size(); 222 if (!s.add(e)) 223 fail("Add failed."); 224 int postSize = s.size(); 225 if (postSize - preSize != 1) 226 fail("Add didn't increase size by 1."); 227 } 228 } 229 230 static void fail(String s) { 231 throw new RuntimeException(s); 232 } 233 }