11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 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.CollectionFeature.RESTRICTS_ELEMENTS;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.CollectionFeature.SUPPORTS_ADD_ALL;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.features.CollectionSize.ZERO;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.Collections.singletonList;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.AbstractCollectionTester;
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 Bringert
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.lang.reflect.Method;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * A generic JUnit test which tests addAll operations on a collection. Can't be
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * invoked directly; please see
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@link com.google.common.collect.testing.CollectionTestSuiteBuilder}.
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>This class is GWT compatible.
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Chris Povirk
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@SuppressWarnings("unchecked") // too many "unchecked generic array creations"
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class CollectionAddAllTester<E> extends AbstractCollectionTester<E> {
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_ADD_ALL)
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAll_supportedNothing() {
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse("addAll(nothing) should return false",
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        collection.addAll(emptyCollection()));
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(absent = SUPPORTS_ADD_ALL)
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAll_unsupportedNothing() {
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse("addAll(nothing) should return false or throw",
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          collection.addAll(emptyCollection()));
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException tolerated) {
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_ADD_ALL)
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAll_supportedNonePresent() {
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue("addAll(nonePresent) should return true",
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        collection.addAll(createDisjointCollection()));
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAdded(samples.e3, samples.e4);
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(absent = SUPPORTS_ADD_ALL)
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAll_unsupportedNonePresent() {
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      collection.addAll(createDisjointCollection());
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("addAll(nonePresent) should throw");
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectMissing(samples.e3, samples.e4);
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_ADD_ALL)
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = ZERO)
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAll_supportedSomePresent() {
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue("addAll(somePresent) should return true",
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        collection.addAll(MinimalCollection.of(samples.e3, samples.e0)));
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue("should contain " + samples.e3, collection.contains(samples.e3));
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue("should contain " + samples.e0, collection.contains(samples.e0));
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(absent = SUPPORTS_ADD_ALL)
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = ZERO)
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAll_unsupportedSomePresent() {
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      collection.addAll(MinimalCollection.of(samples.e3, samples.e0));
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("addAll(somePresent) should throw");
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(absent = SUPPORTS_ADD_ALL)
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionSize.Require(absent = ZERO)
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAll_unsupportedAllPresent() {
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse("addAll(allPresent) should return false or throw",
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          collection.addAll(MinimalCollection.of(samples.e0)));
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException tolerated) {
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(value = {SUPPORTS_ADD_ALL,
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ALLOWS_NULL_VALUES}, absent = RESTRICTS_ELEMENTS)
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAll_nullSupported() {
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<E> containsNull = singletonList(null);
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue("addAll(containsNull) should return true", collection
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .addAll(containsNull));
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /*
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * We need (E) to force interpretation of null as the single element of a
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * varargs array, not the array itself
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     */
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectAdded((E) null);
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(value = SUPPORTS_ADD_ALL,
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      absent = ALLOWS_NULL_VALUES)
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAll_nullUnsupported() {
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<E> containsNull = singletonList(null);
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      collection.addAll(containsNull);
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("addAll(containsNull) should throw");
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectUnchanged();
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    expectNullMissingWhenNullUnsupported(
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "Should not contain null after unsupported addAll(containsNull)");
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @CollectionFeature.Require(SUPPORTS_ADD_ALL)
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAll_nullCollectionReference() {
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      collection.addAll(null);
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("addAll(null) should throw NullPointerException");
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Returns the {@link Method} instance for {@link
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * #testAddAll_nullUnsupported()} so that tests can suppress it with {@code
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * FeatureSpecificTestSuiteBuilder.suppressing()} until <a
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=5045147">Sun
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * bug 5045147</a> is fixed.
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static Method getAddAllNullUnsupportedMethod() {
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return Platform.getMethod(CollectionAddAllTester.class, "testAddAll_nullUnsupported");
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
158