11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2008 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License.
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.collect.testing.testers;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.CollectionFeature.ALLOWS_NULL_VALUES;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.CollectionSize.ONE;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.CollectionSize.ZERO;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.ListFeature.SUPPORTS_ADD_ALL_WITH_INDEX;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.ListFeature.SUPPORTS_ADD_WITH_INDEX;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.Collections.singletonList;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.MinimalCollection;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionFeature;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionSize;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.ListFeature;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A generic JUnit test which tests {@code addAll(int, Collection)} operations
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * on a list. Can't be invoked directly; please see
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link com.google.common.collect.testing.ListTestSuiteBuilder}.
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>This class is GWT compatible.
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Chris Povirk
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@SuppressWarnings("unchecked") // too many "unchecked generic array creations"
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class ListAddAllAtIndexTester<E> extends AbstractListTester<E> {
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @ListFeature.Require(SUPPORTS_ADD_ALL_WITH_INDEX)
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = ZERO)
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAllAtIndex_supportedAllPresent() {
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue("addAll(n, allPresent) should return true",
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        getList().addAll(0, MinimalCollection.of(samples.e0)));
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAdded(0, samples.e0);
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @ListFeature.Require(absent = SUPPORTS_ADD_ALL_WITH_INDEX)
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = ZERO)
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAllAtIndex_unsupportedAllPresent() {
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      getList().addAll(0, MinimalCollection.of(samples.e0));
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("addAll(n, allPresent) should throw");
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @ListFeature.Require(SUPPORTS_ADD_ALL_WITH_INDEX)
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = ZERO)
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAllAtIndex_supportedSomePresent() {
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue("addAll(n, allPresent) should return true",
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        getList().addAll(0, MinimalCollection.of(samples.e0, samples.e3)));
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAdded(0, samples.e0, samples.e3);
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @ListFeature.Require(absent = SUPPORTS_ADD_ALL_WITH_INDEX)
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = ZERO)
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAllAtIndex_unsupportedSomePresent() {
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      getList().addAll(0, MinimalCollection.of(samples.e0, samples.e3));
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("addAll(n, allPresent) should throw");
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectMissing(samples.e3);
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @ListFeature.Require(SUPPORTS_ADD_ALL_WITH_INDEX)
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAllAtIndex_supportedNothing() {
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse("addAll(n, nothing) should return false",
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        getList().addAll(0, emptyCollection()));
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @ListFeature.Require(absent = SUPPORTS_ADD_ALL_WITH_INDEX)
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAllAtIndex_unsupportedNothing() {
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse("addAll(n, nothing) should return false or throw",
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          getList().addAll(0, emptyCollection()));
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException tolerated) {
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @ListFeature.Require(SUPPORTS_ADD_ALL_WITH_INDEX)
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAllAtIndex_withDuplicates() {
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    MinimalCollection<E> elementsToAdd
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = MinimalCollection.of(samples.e0, samples.e1, samples.e0, samples.e1);
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue("addAll(n, hasDuplicates) should return true",
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        getList().addAll(0, elementsToAdd));
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAdded(0, samples.e0, samples.e1, samples.e0, samples.e1);
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @ListFeature.Require(SUPPORTS_ADD_ALL_WITH_INDEX)
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(ALLOWS_NULL_VALUES)
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAllAtIndex_nullSupported() {
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<E> containsNull = singletonList(null);
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue("addAll(n, containsNull) should return true",
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        getList().addAll(0, containsNull));
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /*
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * We need (E) to force interpretation of null as the single element of a
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * varargs array, not the array itself
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     */
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAdded(0, (E) null);
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @ListFeature.Require(SUPPORTS_ADD_ALL_WITH_INDEX)
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(absent = ALLOWS_NULL_VALUES)
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAllAtIndex_nullUnsupported() {
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<E> containsNull = singletonList(null);
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      getList().addAll(0, containsNull);
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("addAll(n, containsNull) should throw");
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectNullMissingWhenNullUnsupported(
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "Should not contain null after unsupported addAll(n, containsNull)");
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @ListFeature.Require(SUPPORTS_ADD_ALL_WITH_INDEX)
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = {ZERO, ONE})
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAllAtIndex_middle() {
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue("addAll(middle, disjoint) should return true",
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        getList().addAll(getNumElements() / 2, createDisjointCollection()));
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAdded(getNumElements() / 2, createDisjointCollection());
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @ListFeature.Require(SUPPORTS_ADD_ALL_WITH_INDEX)
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = ZERO)
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAllAtIndex_end() {
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue("addAll(end, disjoint) should return true",
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        getList().addAll(getNumElements(), createDisjointCollection()));
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAdded(getNumElements(), createDisjointCollection());
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @ListFeature.Require(SUPPORTS_ADD_ALL_WITH_INDEX)
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAllAtIndex_nullCollectionReference() {
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      getList().addAll(0, null);
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("addAll(n, null) should throw");
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @ListFeature.Require(SUPPORTS_ADD_WITH_INDEX)
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAllAtIndex_negative() {
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      getList().addAll(-1, MinimalCollection.of(samples.e3));
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("addAll(-1, e) should throw");
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectMissing(samples.e3);
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @ListFeature.Require(SUPPORTS_ADD_WITH_INDEX)
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAllAtIndex_tooLarge() {
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      getList().addAll(getNumElements() + 1, MinimalCollection.of(samples.e3));
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("addAll(size + 1, e) should throw");
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectMissing(samples.e3);
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
184