Coverage Summary for Class: ListSubListTester (com.google.common.collect.testing.testers)

Class Class, % Method, % Line, %
ListSubListTester 100% (1/1) 89.7% (26/29) 92.2% (153/166)


1 /* 2  * Copyright (C) 2008 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.testers; 18  19 import static com.google.common.collect.testing.Helpers.getMethod; 20 import static com.google.common.collect.testing.features.CollectionFeature.SERIALIZABLE_INCLUDING_VIEWS; 21 import static com.google.common.collect.testing.features.CollectionSize.ONE; 22 import static com.google.common.collect.testing.features.CollectionSize.ZERO; 23 import static com.google.common.collect.testing.features.ListFeature.SUPPORTS_ADD_WITH_INDEX; 24 import static com.google.common.collect.testing.features.ListFeature.SUPPORTS_REMOVE_WITH_INDEX; 25 import static com.google.common.collect.testing.features.ListFeature.SUPPORTS_SET; 26 import static java.util.Collections.emptyList; 27  28 import com.google.common.annotations.GwtCompatible; 29 import com.google.common.annotations.GwtIncompatible; 30 import com.google.common.collect.testing.Helpers; 31 import com.google.common.collect.testing.features.CollectionFeature; 32 import com.google.common.collect.testing.features.CollectionSize; 33 import com.google.common.collect.testing.features.ListFeature; 34 import com.google.common.testing.SerializableTester; 35 import java.lang.reflect.Method; 36 import java.util.Arrays; 37 import java.util.Collections; 38 import java.util.List; 39 import java.util.concurrent.CopyOnWriteArrayList; 40 import org.junit.Ignore; 41  42 /** 43  * A generic JUnit test which tests {@code subList()} operations on a list. Can't be invoked 44  * directly; please see {@link com.google.common.collect.testing.ListTestSuiteBuilder}. 45  * 46  * @author Chris Povirk 47  */ 48 @SuppressWarnings("unchecked") // too many "unchecked generic array creations" 49 @GwtCompatible(emulated = true) 50 @Ignore // Affects only Android test runner, which respects JUnit 4 annotations on JUnit 3 tests. 51 public class ListSubListTester<E> extends AbstractListTester<E> { 52  public void testSubList_startNegative() { 53  try { 54  getList().subList(-1, 0); 55  fail("subList(-1, 0) should throw"); 56  } catch (IndexOutOfBoundsException expected) { 57  } 58  } 59  60  public void testSubList_endTooLarge() { 61  try { 62  getList().subList(0, getNumElements() + 1); 63  fail("subList(0, size + 1) should throw"); 64  } catch (IndexOutOfBoundsException expected) { 65  } 66  } 67  68  public void testSubList_startGreaterThanEnd() { 69  try { 70  getList().subList(1, 0); 71  fail("subList(1, 0) should throw"); 72  } catch (IndexOutOfBoundsException expected) { 73  } catch (IllegalArgumentException expected) { 74  /* 75  * The subList() docs claim that this should be an 76  * IndexOutOfBoundsException, but many JDK implementations throw 77  * IllegalArgumentException: 78  * http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4506427 79  */ 80  } 81  } 82  83  public void testSubList_empty() { 84  assertEquals("subList(0, 0) should be empty", emptyList(), getList().subList(0, 0)); 85  } 86  87  public void testSubList_entireList() { 88  assertEquals( 89  "subList(0, size) should be equal to the original list", 90  getList(), 91  getList().subList(0, getNumElements())); 92  } 93  94  @ListFeature.Require(SUPPORTS_REMOVE_WITH_INDEX) 95  @CollectionSize.Require(absent = ZERO) 96  public void testSubList_subListRemoveAffectsOriginal() { 97  List<E> subList = getList().subList(0, 1); 98  subList.remove(0); 99  List<E> expected = Arrays.asList(createSamplesArray()).subList(1, getNumElements()); 100  expectContents(expected); 101  } 102  103  @ListFeature.Require(SUPPORTS_REMOVE_WITH_INDEX) 104  @CollectionSize.Require(absent = ZERO) 105  public void testSubList_subListClearAffectsOriginal() { 106  List<E> subList = getList().subList(0, 1); 107  subList.clear(); 108  List<E> expected = Arrays.asList(createSamplesArray()).subList(1, getNumElements()); 109  expectContents(expected); 110  } 111  112  @ListFeature.Require(SUPPORTS_ADD_WITH_INDEX) 113  public void testSubList_subListAddAffectsOriginal() { 114  List<E> subList = getList().subList(0, 0); 115  subList.add(e3()); 116  expectAdded(0, e3()); 117  } 118  119  @ListFeature.Require(SUPPORTS_SET) 120  @CollectionSize.Require(absent = ZERO) 121  public void testSubList_subListSetAffectsOriginal() { 122  List<E> subList = getList().subList(0, 1); 123  subList.set(0, e3()); 124  List<E> expected = Helpers.copyToList(createSamplesArray()); 125  expected.set(0, e3()); 126  expectContents(expected); 127  } 128  129  @ListFeature.Require(SUPPORTS_SET) 130  @CollectionSize.Require(absent = ZERO) 131  public void testSubList_originalListSetAffectsSubList() { 132  List<E> subList = getList().subList(0, 1); 133  getList().set(0, e3()); 134  assertEquals( 135  "A set() call to a list after a sublist has been created " 136  + "should be reflected in the sublist", 137  Collections.singletonList(e3()), 138  subList); 139  } 140  141  @ListFeature.Require(SUPPORTS_REMOVE_WITH_INDEX) 142  @CollectionSize.Require(absent = {ZERO, ONE}) 143  public void testSubList_subListRemoveAffectsOriginalLargeList() { 144  List<E> subList = getList().subList(1, 3); 145  subList.remove(e2()); 146  List<E> expected = Helpers.copyToList(createSamplesArray()); 147  expected.remove(2); 148  expectContents(expected); 149  } 150  151  @ListFeature.Require(SUPPORTS_ADD_WITH_INDEX) 152  @CollectionSize.Require(absent = {ZERO, ONE}) 153  public void testSubList_subListAddAtIndexAffectsOriginalLargeList() { 154  List<E> subList = getList().subList(2, 3); 155  subList.add(0, e3()); 156  expectAdded(2, e3()); 157  } 158  159  @ListFeature.Require(SUPPORTS_SET) 160  @CollectionSize.Require(absent = {ZERO, ONE}) 161  public void testSubList_subListSetAffectsOriginalLargeList() { 162  List<E> subList = getList().subList(1, 2); 163  subList.set(0, e3()); 164  List<E> expected = Helpers.copyToList(createSamplesArray()); 165  expected.set(1, e3()); 166  expectContents(expected); 167  } 168  169  @ListFeature.Require(SUPPORTS_SET) 170  @CollectionSize.Require(absent = {ZERO, ONE}) 171  public void testSubList_originalListSetAffectsSubListLargeList() { 172  List<E> subList = getList().subList(1, 3); 173  getList().set(1, e3()); 174  assertEquals( 175  "A set() call to a list after a sublist has been created " 176  + "should be reflected in the sublist", 177  Arrays.asList(e3(), e2()), 178  subList); 179  } 180  181  public void testSubList_ofSubListEmpty() { 182  List<E> subList = getList().subList(0, 0).subList(0, 0); 183  assertEquals("subList(0, 0).subList(0, 0) should be an empty list", emptyList(), subList); 184  } 185  186  @CollectionSize.Require(absent = {ZERO, ONE}) 187  public void testSubList_ofSubListNonEmpty() { 188  List<E> subList = getList().subList(0, 2).subList(1, 2); 189  assertEquals( 190  "subList(0, 2).subList(1, 2) " 191  + "should be a single-element list of the element at index 1", 192  Collections.singletonList(getOrderedElements().get(1)), 193  subList); 194  } 195  196  @CollectionSize.Require(absent = {ZERO}) 197  public void testSubList_size() { 198  List<E> list = getList(); 199  int size = getNumElements(); 200  assertEquals(size, list.subList(0, size).size()); 201  assertEquals(size - 1, list.subList(0, size - 1).size()); 202  assertEquals(size - 1, list.subList(1, size).size()); 203  assertEquals(0, list.subList(size, size).size()); 204  assertEquals(0, list.subList(0, 0).size()); 205  } 206  207  @CollectionSize.Require(absent = {ZERO}) 208  public void testSubList_isEmpty() { 209  List<E> list = getList(); 210  int size = getNumElements(); 211  for (List<E> subList : 212  Arrays.asList( 213  list.subList(0, size), 214  list.subList(0, size - 1), 215  list.subList(1, size), 216  list.subList(0, 0), 217  list.subList(size, size))) { 218  assertEquals(subList.size() == 0, subList.isEmpty()); 219  } 220  } 221  222  @CollectionSize.Require(absent = {ZERO, ONE}) 223  public void testSubList_get() { 224  List<E> list = getList(); 225  int size = getNumElements(); 226  List<E> copy = list.subList(0, size); 227  List<E> head = list.subList(0, size - 1); 228  List<E> tail = list.subList(1, size); 229  assertEquals(list.get(0), copy.get(0)); 230  assertEquals(list.get(size - 1), copy.get(size - 1)); 231  assertEquals(list.get(1), tail.get(0)); 232  assertEquals(list.get(size - 1), tail.get(size - 2)); 233  assertEquals(list.get(0), head.get(0)); 234  assertEquals(list.get(size - 2), head.get(size - 2)); 235  for (List<E> subList : Arrays.asList(copy, head, tail)) { 236  for (int index : Arrays.asList(-1, subList.size())) { 237  try { 238  subList.get(index); 239  fail("expected IndexOutOfBoundsException"); 240  } catch (IndexOutOfBoundsException expected) { 241  } 242  } 243  } 244  } 245  246  @CollectionSize.Require(absent = {ZERO, ONE}) 247  public void testSubList_contains() { 248  List<E> list = getList(); 249  int size = getNumElements(); 250  List<E> copy = list.subList(0, size); 251  List<E> head = list.subList(0, size - 1); 252  List<E> tail = list.subList(1, size); 253  assertTrue(copy.contains(list.get(0))); 254  assertTrue(head.contains(list.get(0))); 255  assertTrue(tail.contains(list.get(1))); 256  // The following assumes all elements are distinct. 257  assertTrue(copy.contains(list.get(size - 1))); 258  assertTrue(head.contains(list.get(size - 2))); 259  assertTrue(tail.contains(list.get(size - 1))); 260  assertFalse(head.contains(list.get(size - 1))); 261  assertFalse(tail.contains(list.get(0))); 262  } 263  264  @CollectionSize.Require(absent = {ZERO, ONE}) 265  public void testSubList_indexOf() { 266  List<E> list = getList(); 267  int size = getNumElements(); 268  List<E> copy = list.subList(0, size); 269  List<E> head = list.subList(0, size - 1); 270  List<E> tail = list.subList(1, size); 271  assertEquals(0, copy.indexOf(list.get(0))); 272  assertEquals(0, head.indexOf(list.get(0))); 273  assertEquals(0, tail.indexOf(list.get(1))); 274  // The following assumes all elements are distinct. 275  assertEquals(size - 1, copy.indexOf(list.get(size - 1))); 276  assertEquals(size - 2, head.indexOf(list.get(size - 2))); 277  assertEquals(size - 2, tail.indexOf(list.get(size - 1))); 278  assertEquals(-1, head.indexOf(list.get(size - 1))); 279  assertEquals(-1, tail.indexOf(list.get(0))); 280  } 281  282  @CollectionSize.Require(absent = {ZERO, ONE}) 283  public void testSubList_lastIndexOf() { 284  List<E> list = getList(); 285  int size = list.size(); 286  List<E> copy = list.subList(0, size); 287  List<E> head = list.subList(0, size - 1); 288  List<E> tail = list.subList(1, size); 289  assertEquals(size - 1, copy.lastIndexOf(list.get(size - 1))); 290  assertEquals(size - 2, head.lastIndexOf(list.get(size - 2))); 291  assertEquals(size - 2, tail.lastIndexOf(list.get(size - 1))); 292  // The following assumes all elements are distinct. 293  assertEquals(0, copy.lastIndexOf(list.get(0))); 294  assertEquals(0, head.lastIndexOf(list.get(0))); 295  assertEquals(0, tail.lastIndexOf(list.get(1))); 296  assertEquals(-1, head.lastIndexOf(list.get(size - 1))); 297  assertEquals(-1, tail.lastIndexOf(list.get(0))); 298  } 299  300  @CollectionFeature.Require(SERIALIZABLE_INCLUDING_VIEWS) 301  public void testReserializeWholeSubList() { 302  SerializableTester.reserializeAndAssert(getList().subList(0, getNumElements())); 303  } 304  305  @CollectionFeature.Require(SERIALIZABLE_INCLUDING_VIEWS) 306  public void testReserializeEmptySubList() { 307  SerializableTester.reserializeAndAssert(getList().subList(0, 0)); 308  } 309  310  @CollectionFeature.Require(SERIALIZABLE_INCLUDING_VIEWS) 311  @CollectionSize.Require(absent = {ZERO, ONE}) 312  public void testReserializeSubList() { 313  SerializableTester.reserializeAndAssert(getList().subList(0, 2)); 314  } 315  316  /** 317  * Returns the {@link Method} instance for {@link #testSubList_originalListSetAffectsSubList()} so 318  * that tests of {@link CopyOnWriteArrayList} can suppress them with {@code 319  * FeatureSpecificTestSuiteBuilder.suppressing()} until <a 320  * href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6570631">Sun bug 6570631</a> is fixed. 321  */ 322  @GwtIncompatible // reflection 323  public static Method getSubListOriginalListSetAffectsSubListMethod() { 324  return getMethod(ListSubListTester.class, "testSubList_originalListSetAffectsSubList"); 325  } 326  327  /** 328  * Returns the {@link Method} instance for {@link 329  * #testSubList_originalListSetAffectsSubListLargeList()} ()} so that tests of {@link 330  * CopyOnWriteArrayList} can suppress them with {@code 331  * FeatureSpecificTestSuiteBuilder.suppressing()} until <a 332  * href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6570631">Sun bug 6570631</a> is fixed. 333  */ 334  @GwtIncompatible // reflection 335  public static Method getSubListOriginalListSetAffectsSubListLargeListMethod() { 336  return getMethod(ListSubListTester.class, "testSubList_originalListSetAffectsSubListLargeList"); 337  } 338  339  /** 340  * Returns the {@link Method} instance for {@link 341  * #testSubList_subListRemoveAffectsOriginalLargeList()} so that tests of {@link 342  * CopyOnWriteArrayList} can suppress it with {@code 343  * FeatureSpecificTestSuiteBuilder.suppressing()} until <a 344  * href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6570575">Sun bug 6570575</a> is fixed. 345  */ 346  @GwtIncompatible // reflection 347  public static Method getSubListSubListRemoveAffectsOriginalLargeListMethod() { 348  return getMethod(ListSubListTester.class, "testSubList_subListRemoveAffectsOriginalLargeList"); 349  } 350  351  /* 352  * TODO: perform all List tests on subList(), but beware infinite recursion 353  */ 354 }