1 /* 2 * Copyright (C) 2009 The Guava Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.google.common.collect.testing; 18 19 import com.google.common.collect.testing.features.CollectionFeature; 20 import com.google.common.collect.testing.features.CollectionSize; 21 import com.google.common.collect.testing.features.ListFeature; 22 23 import junit.framework.Test; 24 import junit.framework.TestSuite; 25 26 import java.lang.reflect.Method; 27 import java.util.AbstractList; 28 import java.util.AbstractSequentialList; 29 import java.util.ArrayList; 30 import java.util.Arrays; 31 import java.util.Collection; 32 import java.util.Collections; 33 import java.util.LinkedList; 34 import java.util.List; 35 import java.util.ListIterator; 36 import java.util.concurrent.CopyOnWriteArrayList; 37 38 /** 39 * Generates a test suite covering the {@link List} implementations in the 40 * {@link java.util} package. Can be subclassed to specify tests that should 41 * be suppressed. 42 * 43 * @author Kevin Bourrillion 44 */ 45 public class TestsForListsInJavaUtil { 46 public static Test suite() { 47 return new TestsForListsInJavaUtil().allTests(); 48 } 49 50 public Test allTests() { 51 TestSuite suite = new TestSuite("java.util Lists"); 52 suite.addTest(testsForEmptyList()); 53 suite.addTest(testsForSingletonList()); 54 suite.addTest(testsForArraysAsList()); 55 suite.addTest(testsForArrayList()); 56 suite.addTest(testsForLinkedList()); 57 suite.addTest(testsForCopyOnWriteArrayList()); 58 suite.addTest(testsForUnmodifiableList()); 59 suite.addTest(testsForCheckedList()); 60 suite.addTest(testsForAbstractList()); 61 suite.addTest(testsForAbstractSequentialList()); 62 return suite; 63 } 64 65 protected Collection<Method> suppressForEmptyList() { 66 return Collections.emptySet(); 67 } 68 protected Collection<Method> suppressForSingletonList() { 69 return Collections.emptySet(); 70 } 71 protected Collection<Method> suppressForArraysAsList() { 72 return Collections.emptySet(); 73 } 74 protected Collection<Method> suppressForArrayList() { 75 return Collections.emptySet(); 76 } 77 protected Collection<Method> suppressForLinkedList() { 78 return Collections.emptySet(); 79 } 80 protected Collection<Method> suppressForCopyOnWriteArrayList() { 81 return Collections.emptySet(); 82 } 83 protected Collection<Method> suppressForUnmodifiableList() { 84 return Collections.emptySet(); 85 } 86 protected Collection<Method> suppressForCheckedList() { 87 return Collections.emptySet(); 88 } 89 protected Collection<Method> suppressForAbstractList() { 90 return Collections.emptySet(); 91 } 92 protected Collection<Method> suppressForAbstractSequentialList() { 93 return Collections.emptySet(); 94 } 95 96 public Test testsForEmptyList() { 97 return ListTestSuiteBuilder 98 .using(new TestStringListGenerator() { 99 @Override public List<String> create(String[] elements) { 100 return Collections.emptyList(); 101 } 102 }) 103 .named("emptyList") 104 .withFeatures( 105 CollectionFeature.SERIALIZABLE, 106 CollectionSize.ZERO) 107 .suppressing(suppressForEmptyList()) 108 .createTestSuite(); 109 } 110 111 public Test testsForSingletonList() { 112 return ListTestSuiteBuilder 113 .using(new TestStringListGenerator() { 114 @Override public List<String> create(String[] elements) { 115 return Collections.singletonList(elements[0]); 116 } 117 }) 118 .named("singletonList") 119 .withFeatures( 120 CollectionFeature.SERIALIZABLE, 121 CollectionFeature.ALLOWS_NULL_VALUES, 122 CollectionSize.ONE) 123 .suppressing(suppressForSingletonList()) 124 .createTestSuite(); 125 } 126 127 public Test testsForArraysAsList() { 128 return ListTestSuiteBuilder 129 .using(new TestStringListGenerator() { 130 @Override public List<String> create(String[] elements) { 131 return Arrays.asList(elements.clone()); 132 } 133 }) 134 .named("Arrays.asList") 135 .withFeatures( 136 ListFeature.SUPPORTS_SET, 137 CollectionFeature.SERIALIZABLE, 138 CollectionFeature.ALLOWS_NULL_VALUES, 139 CollectionSize.ANY) 140 .suppressing(suppressForArraysAsList()) 141 .createTestSuite(); 142 } 143 144 public Test testsForArrayList() { 145 return ListTestSuiteBuilder 146 .using(new TestStringListGenerator() { 147 @Override public List<String> create(String[] elements) { 148 return new ArrayList<String>(MinimalCollection.of(elements)); 149 } 150 }) 151 .named("ArrayList") 152 .withFeatures( 153 ListFeature.GENERAL_PURPOSE, 154 CollectionFeature.SERIALIZABLE, 155 CollectionFeature.ALLOWS_NULL_VALUES, 156 CollectionFeature.FAILS_FAST_ON_CONCURRENT_MODIFICATION, 157 CollectionSize.ANY) 158 .suppressing(suppressForArrayList()) 159 .createTestSuite(); 160 } 161 162 public Test testsForLinkedList() { 163 return ListTestSuiteBuilder 164 .using(new TestStringListGenerator() { 165 @Override public List<String> create(String[] elements) { 166 return new LinkedList<String>(MinimalCollection.of(elements)); 167 } 168 }) 169 .named("LinkedList") 170 .withFeatures( 171 ListFeature.GENERAL_PURPOSE, 172 CollectionFeature.SERIALIZABLE, 173 CollectionFeature.ALLOWS_NULL_VALUES, 174 CollectionFeature.FAILS_FAST_ON_CONCURRENT_MODIFICATION, 175 CollectionSize.ANY) 176 .suppressing(suppressForLinkedList()) 177 .createTestSuite(); 178 } 179 180 public Test testsForCopyOnWriteArrayList() { 181 return ListTestSuiteBuilder 182 .using(new TestStringListGenerator() { 183 @Override public List<String> create(String[] elements) { 184 return new CopyOnWriteArrayList<String>( 185 MinimalCollection.of(elements)); 186 } 187 }) 188 .named("CopyOnWriteArrayList") 189 .withFeatures( 190 ListFeature.SUPPORTS_ADD_WITH_INDEX, 191 ListFeature.SUPPORTS_REMOVE_WITH_INDEX, 192 ListFeature.SUPPORTS_SET, 193 CollectionFeature.SUPPORTS_ADD, 194 CollectionFeature.SUPPORTS_REMOVE, 195 CollectionFeature.SERIALIZABLE, 196 CollectionFeature.ALLOWS_NULL_VALUES, 197 CollectionSize.ANY) 198 .suppressing(suppressForCopyOnWriteArrayList()) 199 .createTestSuite(); 200 } 201 202 public Test testsForUnmodifiableList() { 203 return ListTestSuiteBuilder 204 .using(new TestStringListGenerator() { 205 @Override public List<String> create(String[] elements) { 206 List<String> innerList = new ArrayList<String>(); 207 Collections.addAll(innerList, elements); 208 return Collections.unmodifiableList(innerList); 209 } 210 }) 211 .named("unmodifiableList/ArrayList") 212 .withFeatures( 213 CollectionFeature.SERIALIZABLE, 214 CollectionFeature.ALLOWS_NULL_VALUES, 215 CollectionSize.ANY) 216 .suppressing(suppressForUnmodifiableList()) 217 .createTestSuite(); 218 } 219 220 public Test testsForCheckedList() { 221 return ListTestSuiteBuilder 222 .using(new TestStringListGenerator() { 223 @Override public List<String> create(String[] elements) { 224 List<String> innerList = new ArrayList<String>(); 225 Collections.addAll(innerList, elements); 226 return Collections.checkedList(innerList, String.class); 227 } 228 }) 229 .named("checkedList/ArrayList") 230 .withFeatures( 231 ListFeature.GENERAL_PURPOSE, 232 CollectionFeature.SERIALIZABLE, 233 CollectionFeature.RESTRICTS_ELEMENTS, 234 CollectionFeature.ALLOWS_NULL_VALUES, 235 CollectionSize.ANY) 236 .suppressing(suppressForCheckedList()) 237 .createTestSuite(); 238 } 239 240 public Test testsForAbstractList() { 241 return ListTestSuiteBuilder 242 .using(new TestStringListGenerator () { 243 @Override protected List<String> create(final String[] elements) { 244 return new AbstractList<String>() { 245 @Override public int size() { 246 return elements.length; 247 } 248 @Override public String get(int index) { 249 return elements[index]; 250 } 251 }; 252 } 253 }) 254 .named("AbstractList") 255 .withFeatures( 256 CollectionFeature.NONE, 257 CollectionFeature.ALLOWS_NULL_VALUES, 258 CollectionSize.ANY) 259 .suppressing(suppressForAbstractList()) 260 .createTestSuite(); 261 } 262 263 public Test testsForAbstractSequentialList() { 264 return ListTestSuiteBuilder 265 .using(new TestStringListGenerator () { 266 @Override protected List<String> create(final String[] elements) { 267 // For this test we trust ArrayList works 268 final List<String> list = new ArrayList<String>(); 269 Collections.addAll(list, elements); 270 return new AbstractSequentialList<String>() { 271 @Override public int size() { 272 return list.size(); 273 } 274 @Override public ListIterator<String> listIterator(int index) { 275 return list.listIterator(index); 276 } 277 }; 278 } 279 }) 280 .named("AbstractSequentialList") 281 .withFeatures( 282 ListFeature.GENERAL_PURPOSE, 283 CollectionFeature.ALLOWS_NULL_VALUES, 284 CollectionSize.ANY) 285 .suppressing(suppressForAbstractSequentialList()) 286 .createTestSuite(); 287 } 288 } 289