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;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.Iterables.getOnlyElement;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.Iterables.unmodifiableIterable;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.Sets.newHashSet;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.lang.reflect.Proxy.newProxyInstance;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.Arrays.asList;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.Helpers;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.ListTestSuiteBuilder;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.MinimalCollection;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.MinimalIterable;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionFeature;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionSize;
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.google.ListGenerators.BuilderAddAllListGenerator;
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.google.ListGenerators.BuilderReversedListGenerator;
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.google.ListGenerators.ImmutableListHeadSubListGenerator;
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.google.ListGenerators.ImmutableListMiddleSubListGenerator;
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.google.ListGenerators.ImmutableListOfGenerator;
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.google.ListGenerators.ImmutableListTailSubListGenerator;
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.google.ListGenerators.UnhashableElementsImmutableListGenerator;
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.testers.ListHashCodeTester;
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.NullPointerTester;
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.SerializableTester;
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
440888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.Test;
450888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestCase;
460888a09821a98ac0680fad765217302858e70fa4Paul Duffinimport junit.framework.TestSuite;
470888a09821a98ac0680fad765217302858e70fa4Paul Duffin
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.lang.reflect.InvocationHandler;
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.lang.reflect.InvocationTargetException;
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.lang.reflect.Method;
517dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.Arrays;
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator;
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set;
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.concurrent.CopyOnWriteArrayList;
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unit test for {@link ImmutableList}.
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author George van den Driessche
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Jared Levy
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class ImmutableListTest extends TestCase {
687dd252788645e940eada959bdde927426e2531c9Paul Duffin
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("suite")
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static Test suite() {
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TestSuite suite = new TestSuite();
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(ListTestSuiteBuilder.using(new ImmutableListOfGenerator())
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ImmutableList")
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY,
757dd252788645e940eada959bdde927426e2531c9Paul Duffin            CollectionFeature.SERIALIZABLE,
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(ListTestSuiteBuilder.using(new BuilderAddAllListGenerator())
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ImmutableList, built with Builder.add")
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY,
817dd252788645e940eada959bdde927426e2531c9Paul Duffin            CollectionFeature.SERIALIZABLE,
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(ListTestSuiteBuilder.using(new BuilderAddAllListGenerator())
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ImmutableList, built with Builder.addAll")
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY,
877dd252788645e940eada959bdde927426e2531c9Paul Duffin            CollectionFeature.SERIALIZABLE,
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(ListTestSuiteBuilder.using(new BuilderReversedListGenerator())
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ImmutableList, reversed")
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY,
937dd252788645e940eada959bdde927426e2531c9Paul Duffin            CollectionFeature.SERIALIZABLE,
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(ListTestSuiteBuilder.using(
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new ImmutableListHeadSubListGenerator())
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ImmutableList, head subList")
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY,
1007dd252788645e940eada959bdde927426e2531c9Paul Duffin            CollectionFeature.SERIALIZABLE,
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(ListTestSuiteBuilder.using(
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new ImmutableListTailSubListGenerator())
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ImmutableList, tail subList")
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY,
1077dd252788645e940eada959bdde927426e2531c9Paul Duffin            CollectionFeature.SERIALIZABLE,
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(ListTestSuiteBuilder.using(
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new ImmutableListMiddleSubListGenerator())
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ImmutableList, middle subList")
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY,
1147dd252788645e940eada959bdde927426e2531c9Paul Duffin            CollectionFeature.SERIALIZABLE,
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(ListTestSuiteBuilder.using(
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new UnhashableElementsImmutableListGenerator())
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .suppressing(ListHashCodeTester.getHashCodeMethod())
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ImmutableList, unhashable values")
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY,
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return suite;
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class CreationTests extends TestCase {
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCreation_noArgs() {
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> list = ImmutableList.of();
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Collections.emptyList(), list);
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCreation_oneElement() {
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> list = ImmutableList.of("a");
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Collections.singletonList("a"), list);
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCreation_twoElements() {
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> list = ImmutableList.of("a", "b");
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Lists.newArrayList("a", "b"), list);
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCreation_threeElements() {
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> list = ImmutableList.of("a", "b", "c");
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Lists.newArrayList("a", "b", "c"), list);
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCreation_fourElements() {
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> list = ImmutableList.of("a", "b", "c", "d");
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Lists.newArrayList("a", "b", "c", "d"), list);
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCreation_fiveElements() {
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> list = ImmutableList.of("a", "b", "c", "d", "e");
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Lists.newArrayList("a", "b", "c", "d", "e"), list);
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCreation_sixElements() {
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> list = ImmutableList.of("a", "b", "c", "d", "e", "f");
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Lists.newArrayList("a", "b", "c", "d", "e", "f"), list);
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCreation_sevenElements() {
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> list = ImmutableList.of("a", "b", "c", "d", "e", "f", "g");
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Lists.newArrayList("a", "b", "c", "d", "e", "f", "g"), list);
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCreation_eightElements() {
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> list = ImmutableList.of(
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "a", "b", "c", "d", "e", "f", "g", "h");
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Lists.newArrayList(
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "a", "b", "c", "d", "e", "f", "g", "h"), list);
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCreation_nineElements() {
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> list = ImmutableList.of(
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "a", "b", "c", "d", "e", "f", "g", "h", "i");
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Lists.newArrayList(
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "a", "b", "c", "d", "e", "f", "g", "h", "i"), list);
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCreation_tenElements() {
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> list = ImmutableList.of(
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "a", "b", "c", "d", "e", "f", "g", "h", "i", "j");
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Lists.newArrayList(
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "a", "b", "c", "d", "e", "f", "g", "h", "i", "j"), list);
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCreation_elevenElements() {
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> list = ImmutableList.of(
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k");
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Lists.newArrayList(
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k"), list);
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Varargs versions
1977dd252788645e940eada959bdde927426e2531c9Paul Duffin
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCreation_twelveElements() {
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> list = ImmutableList.of(
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l");
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Lists.newArrayList(
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l"), list);
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCreation_thirteenElements() {
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> list = ImmutableList.of(
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m");
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Lists.newArrayList(
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m"),
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          list);
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCreation_fourteenElements() {
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> list = ImmutableList.of(
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n");
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Lists.newArrayList(
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n"),
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          list);
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCreation_singletonNull() {
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableList.of((String) null);
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCreation_withNull() {
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableList.of("a", null, "b");
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCreation_generic() {
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> a = ImmutableList.of("a");
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // only verify that there is no compile warning
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableList.of(a, a);
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCreation_arrayOfArray() {
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      String[] array = new String[] { "a" };
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String[]> list = ImmutableList.<String[]>of(array);
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Collections.singletonList(array), list);
2477dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOf_emptyArray() {
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      String[] array = new String[0];
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> list = ImmutableList.copyOf(array);
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Collections.emptyList(), list);
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOf_arrayOfOneElement() {
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      String[] array = new String[] { "a" };
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> list = ImmutableList.copyOf(array);
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Collections.singletonList("a"), list);
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOf_nullArray() {
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableList.copyOf((String[]) null);
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
2650888a09821a98ac0680fad765217302858e70fa4Paul Duffin      } catch (NullPointerException expected) {
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOf_arrayContainingOnlyNull() {
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      String[] array = new String[] { null };
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableList.copyOf(array);
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOf_collection_empty() {
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // "<String>" is required to work around a javac 1.5 bug.
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Collection<String> c = MinimalCollection.<String>of();
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> list = ImmutableList.copyOf(c);
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Collections.emptyList(), list);
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOf_collection_oneElement() {
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Collection<String> c = MinimalCollection.of("a");
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> list = ImmutableList.copyOf(c);
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Collections.singletonList("a"), list);
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOf_collection_general() {
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Collection<String> c = MinimalCollection.of("a", "b", "a");
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> list = ImmutableList.copyOf(c);
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(asList("a", "b", "a"), list);
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> mutableList = asList("a", "b");
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      list = ImmutableList.copyOf(mutableList);
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      mutableList.set(0, "c");
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(asList("a", "b"), list);
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOf_collectionContainingNull() {
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Collection<String> c = MinimalCollection.of("a", null, "b");
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableList.copyOf(c);
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOf_iterator_empty() {
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterator<String> iterator = Iterators.emptyIterator();
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> list = ImmutableList.copyOf(iterator);
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Collections.emptyList(), list);
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOf_iterator_oneElement() {
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterator<String> iterator = Iterators.singletonIterator("a");
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> list = ImmutableList.copyOf(iterator);
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(Collections.singletonList("a"), list);
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOf_iterator_general() {
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterator<String> iterator = asList("a", "b", "a").iterator();
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> list = ImmutableList.copyOf(iterator);
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(asList("a", "b", "a"), list);
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOf_iteratorContainingNull() {
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterator<String> iterator = asList("a", null, "b").iterator();
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableList.copyOf(iterator);
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3367dd252788645e940eada959bdde927426e2531c9Paul Duffin
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOf_iteratorNull() {
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableList.copyOf((Iterator<String>) null);
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail();
3410888a09821a98ac0680fad765217302858e70fa4Paul Duffin      } catch (NullPointerException expected) {
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3447dd252788645e940eada959bdde927426e2531c9Paul Duffin
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOf_concurrentlyMutating() {
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> sample = Lists.newArrayList("a", "b", "c");
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int delta : new int[] {-1, 0, 1}) {
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        for (int i = 0; i < sample.size(); i++) {
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          Collection<String> misleading =
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              Helpers.misleadingSizeCollection(delta);
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          List<String> expected = sample.subList(0, i);
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          misleading.addAll(expected);
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertEquals(expected, ImmutableList.copyOf(misleading));
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          assertEquals(expected,
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              ImmutableList.copyOf((Iterable<String>) misleading));
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private static class CountingIterable implements Iterable<String> {
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      int count = 0;
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      public Iterator<String> iterator() {
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        count++;
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return asList("a", "b", "a").iterator();
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOf_plainIterable() {
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      CountingIterable iterable = new CountingIterable();
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> list = ImmutableList.copyOf(iterable);
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(asList("a", "b", "a"), list);
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOf_plainIterable_iteratesOnce() {
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      CountingIterable iterable = new CountingIterable();
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableList.copyOf(iterable);
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(1, iterable.count);
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOf_shortcut_empty() {
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Collection<String> c = ImmutableList.of();
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertSame(c, ImmutableList.copyOf(c));
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOf_shortcut_singleton() {
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Collection<String> c = ImmutableList.of("a");
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertSame(c, ImmutableList.copyOf(c));
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOf_shortcut_immutableList() {
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Collection<String> c = ImmutableList.of("a", "b", "c");
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertSame(c, ImmutableList.copyOf(c));
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3957dd252788645e940eada959bdde927426e2531c9Paul Duffin
3967dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void testBuilderAddArrayHandlesNulls() {
3977dd252788645e940eada959bdde927426e2531c9Paul Duffin      String[] elements = {"a", null, "b"};
3987dd252788645e940eada959bdde927426e2531c9Paul Duffin      ImmutableList.Builder<String> builder = ImmutableList.builder();
3997dd252788645e940eada959bdde927426e2531c9Paul Duffin      try {
4007dd252788645e940eada959bdde927426e2531c9Paul Duffin        builder.add(elements);
4017dd252788645e940eada959bdde927426e2531c9Paul Duffin        fail ("Expected NullPointerException");
4027dd252788645e940eada959bdde927426e2531c9Paul Duffin      } catch (NullPointerException expected) {
4037dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
4047dd252788645e940eada959bdde927426e2531c9Paul Duffin      ImmutableList<String> result = builder.build();
4057dd252788645e940eada959bdde927426e2531c9Paul Duffin
4067dd252788645e940eada959bdde927426e2531c9Paul Duffin      /*
4077dd252788645e940eada959bdde927426e2531c9Paul Duffin       * Maybe it rejects all elements, or maybe it adds "a" before failing.
4087dd252788645e940eada959bdde927426e2531c9Paul Duffin       * Either way is fine with us.
4097dd252788645e940eada959bdde927426e2531c9Paul Duffin       */
4107dd252788645e940eada959bdde927426e2531c9Paul Duffin      if (result.isEmpty()) {
4117dd252788645e940eada959bdde927426e2531c9Paul Duffin        return;
4127dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
4137dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertTrue(ImmutableList.of("a").equals(result));
4147dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertEquals(1, result.size());
4157dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
4167dd252788645e940eada959bdde927426e2531c9Paul Duffin
4177dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void testBuilderAddCollectionHandlesNulls() {
4187dd252788645e940eada959bdde927426e2531c9Paul Duffin      List<String> elements = Arrays.asList("a", null, "b");
4197dd252788645e940eada959bdde927426e2531c9Paul Duffin      ImmutableList.Builder<String> builder = ImmutableList.builder();
4207dd252788645e940eada959bdde927426e2531c9Paul Duffin      try {
4217dd252788645e940eada959bdde927426e2531c9Paul Duffin        builder.addAll(elements);
4227dd252788645e940eada959bdde927426e2531c9Paul Duffin        fail ("Expected NullPointerException");
4237dd252788645e940eada959bdde927426e2531c9Paul Duffin      } catch (NullPointerException expected) {
4247dd252788645e940eada959bdde927426e2531c9Paul Duffin      }
4257dd252788645e940eada959bdde927426e2531c9Paul Duffin      ImmutableList<String> result = builder.build();
4267dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertEquals(ImmutableList.of("a"), result);
4277dd252788645e940eada959bdde927426e2531c9Paul Duffin      assertEquals(1, result.size());
4287dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4307dd252788645e940eada959bdde927426e2531c9Paul Duffin
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("reflection")
4327dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static class ConcurrentTests extends TestCase {
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    enum WrapWithIterable { WRAP, NO_WRAP }
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private static void runConcurrentlyMutatedTest(
4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Collection<Integer> initialContents,
4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterable<ListFrobber> actionsToPerformConcurrently,
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        WrapWithIterable wrap) {
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ConcurrentlyMutatedList<Integer> concurrentlyMutatedList =
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          newConcurrentlyMutatedList(
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              initialContents, actionsToPerformConcurrently);
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterable<Integer> iterableToCopy = wrap == WrapWithIterable.WRAP
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ? unmodifiableIterable(concurrentlyMutatedList)
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          : concurrentlyMutatedList;
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableList<Integer> copyOfIterable =
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ImmutableList.copyOf(iterableToCopy);
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(concurrentlyMutatedList.getAllStates()
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .contains(copyOfIterable));
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4530888a09821a98ac0680fad765217302858e70fa4Paul Duffin      // Check that we didn't end up with a RegularImmutableList of size 1.
4540888a09821a98ac0680fad765217302858e70fa4Paul Duffin      assertEquals(copyOfIterable.size() == 1,
4550888a09821a98ac0680fad765217302858e70fa4Paul Duffin          copyOfIterable instanceof SingletonImmutableList);
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private static void runConcurrentlyMutatedTest(WrapWithIterable wrap) {
4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      /*
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert       * TODO: Iterate over many array sizes and all possible operation lists,
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert       * performing adds and removes in different ways.
4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert       */
4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      runConcurrentlyMutatedTest(
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          elements(),
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ops(add(1), add(2)),
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          wrap);
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      runConcurrentlyMutatedTest(
4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          elements(),
4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ops(add(1), nop()),
4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          wrap);
4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      runConcurrentlyMutatedTest(
4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          elements(),
4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ops(add(1), remove()),
4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          wrap);
4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      runConcurrentlyMutatedTest(
4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          elements(),
4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ops(nop(), add(1)),
4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          wrap);
4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      runConcurrentlyMutatedTest(
4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          elements(1),
4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ops(remove(), nop()),
4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          wrap);
4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      runConcurrentlyMutatedTest(
4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          elements(1),
4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ops(remove(), add(2)),
4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          wrap);
4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      runConcurrentlyMutatedTest(
4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          elements(1, 2),
4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ops(remove(), remove()),
4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          wrap);
4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      runConcurrentlyMutatedTest(
4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          elements(1, 2),
5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ops(remove(), nop()),
5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          wrap);
5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      runConcurrentlyMutatedTest(
5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          elements(1, 2),
5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ops(remove(), add(3)),
5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          wrap);
5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      runConcurrentlyMutatedTest(
5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          elements(1, 2),
5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ops(nop(), remove()),
5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          wrap);
5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      runConcurrentlyMutatedTest(
5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          elements(1, 2, 3),
5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          ops(remove(), remove()),
5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          wrap);
5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private static ImmutableList<Integer> elements(Integer... elements) {
5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ImmutableList.copyOf(elements);
5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private static ImmutableList<ListFrobber> ops(ListFrobber... elements) {
5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return ImmutableList.copyOf(elements);
5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOf_concurrentlyMutatedList() {
5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      runConcurrentlyMutatedTest(WrapWithIterable.NO_WRAP);
5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testCopyOf_concurrentlyMutatedIterable() {
5321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      runConcurrentlyMutatedTest(WrapWithIterable.WRAP);
5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /** An operation to perform on a list. */
5361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    interface ListFrobber {
5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      void perform(List<Integer> list);
5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5400888a09821a98ac0680fad765217302858e70fa4Paul Duffin    static ListFrobber add(final int element) {
5411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return new ListFrobber() {
5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        @Override
5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        public void perform(List<Integer> list) {
5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          list.add(0, element);
5451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
5461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      };
5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5490888a09821a98ac0680fad765217302858e70fa4Paul Duffin    static ListFrobber remove() {
5501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return new ListFrobber() {
5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        @Override
5521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        public void perform(List<Integer> list) {
5531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          list.remove(0);
5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
5551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      };
5561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5580888a09821a98ac0680fad765217302858e70fa4Paul Duffin    static ListFrobber nop() {
5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return new ListFrobber() {
5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        @Override
5611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        public void perform(List<Integer> list) {
5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      };
5641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /**
5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * A list that mutates itself after every call to each of its {@link List}
5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * methods.
5691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     */
5701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    interface ConcurrentlyMutatedList<E> extends List<E> {
5711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      /**
5721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert       * The elements of a {@link ConcurrentlyMutatedList} are added and removed
5731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert       * over time. This method returns every state that the list has passed
5741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert       * through at some point.
5751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert       */
5761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Set<List<E>> getAllStates();
5771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /**
5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * Returns a {@link ConcurrentlyMutatedList} that performs the given
5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * operations as its concurrent modifications. The mutations occur in the
5821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * same thread as the triggering method call.
5831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     */
5841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private static ConcurrentlyMutatedList<Integer> newConcurrentlyMutatedList(
5851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        final Collection<Integer> initialContents,
5861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        final Iterable<ListFrobber> actionsToPerformConcurrently) {
5871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      InvocationHandler invocationHandler = new InvocationHandler() {
5881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        final CopyOnWriteArrayList<Integer> delegate =
5891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            new CopyOnWriteArrayList<Integer>(initialContents);
5901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        final Method getAllStatesMethod = getOnlyElement(asList(
5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            ConcurrentlyMutatedList.class.getDeclaredMethods()));
5931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        final Iterator<ListFrobber> remainingActions =
5951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            actionsToPerformConcurrently.iterator();
5961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        final Set<List<Integer>> allStates = newHashSet();
5981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        @Override
6001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        public Object invoke(Object proxy, Method method,
6011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Object[] args) throws Throwable {
6021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          return method.equals(getAllStatesMethod)
6031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              ? getAllStates()
6041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              : invokeListMethod(method, args);
6051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
6061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        private Set<List<Integer>> getAllStates() {
6081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          return allStates;
6091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
6101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        private Object invokeListMethod(Method method, Object[] args)
6121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            throws Throwable {
6131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          try {
6141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Object returnValue = method.invoke(delegate, args);
6151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            mutateDelegate();
6161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return returnValue;
6171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          } catch (InvocationTargetException e) {
6181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            throw e.getCause();
6191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          } catch (IllegalAccessException e) {
6201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            throw new AssertionError(e);
6211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
6221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
6231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        private void mutateDelegate() {
6251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          allStates.add(ImmutableList.copyOf(delegate));
6261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          remainingActions.next().perform(delegate);
6271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          allStates.add(ImmutableList.copyOf(delegate));
6281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
6291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      };
6301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @SuppressWarnings("unchecked")
6321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ConcurrentlyMutatedList<Integer> list =
6331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          (ConcurrentlyMutatedList<Integer>) newProxyInstance(
6341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              ImmutableListTest.CreationTests.class.getClassLoader(),
6351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              new Class[] {ConcurrentlyMutatedList.class}, invocationHandler);
6361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return list;
6371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6397dd252788645e940eada959bdde927426e2531c9Paul Duffin
6401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static class BasicTests extends TestCase {
6411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @GwtIncompatible("NullPointerTester")
6437dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void testNullPointers() {
6441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      NullPointerTester tester = new NullPointerTester();
6451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      tester.testAllPublicStaticMethods(ImmutableList.class);
6461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      tester.testAllPublicInstanceMethods(ImmutableList.of(1, 2, 3));
6471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @GwtIncompatible("SerializableTester")
6501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testSerialization_empty() {
6511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Collection<String> c = ImmutableList.of();
6521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertSame(c, SerializableTester.reserialize(c));
6531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @GwtIncompatible("SerializableTester")
6561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testSerialization_singleton() {
6571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Collection<String> c = ImmutableList.of("a");
6587dd252788645e940eada959bdde927426e2531c9Paul Duffin      SerializableTester.reserializeAndAssert(c);
6591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @GwtIncompatible("SerializableTester")
6621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testSerialization_multiple() {
6631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Collection<String> c = ImmutableList.of("a", "b", "c");
6641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      SerializableTester.reserializeAndAssert(c);
6651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testEquals_immutableList() {
6681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Collection<String> c = ImmutableList.of("a", "b", "c");
6691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(c.equals(ImmutableList.of("a", "b", "c")));
6701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(c.equals(ImmutableList.of("a", "c", "b")));
6711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(c.equals(ImmutableList.of("a", "b")));
6721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertFalse(c.equals(ImmutableList.of("a", "b", "c", "d")));
6731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilderAdd() {
6761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableList<String> list = new ImmutableList.Builder<String>()
6771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .add("a")
6781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .add("b")
6791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .add("a")
6801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .add("c")
6811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .build();
6821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(asList("a", "b", "a", "c"), list);
6831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilderAdd_varargs() {
6861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableList<String> list = new ImmutableList.Builder<String>()
6871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .add("a", "b", "a", "c")
6881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .build();
6891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(asList("a", "b", "a", "c"), list);
6901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilderAddAll_iterable() {
6931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> a = asList("a", "b");
6941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> b = asList("c", "d");
6951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableList<String> list = new ImmutableList.Builder<String>()
6961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .addAll(a)
6971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .addAll(b)
6981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .build();
6991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(asList( "a", "b", "c", "d"), list);
7001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      b.set(0, "f");
7011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(asList( "a", "b", "c", "d"), list);
7021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilderAddAll_iterator() {
7051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> a = asList("a", "b");
7061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> b = asList("c", "d");
7071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableList<String> list = new ImmutableList.Builder<String>()
7081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .addAll(a.iterator())
7091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .addAll(b.iterator())
7101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          .build();
7111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(asList( "a", "b", "c", "d"), list);
7121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      b.set(0, "f");
7131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(asList( "a", "b", "c", "d"), list);
7141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testComplexBuilder() {
7171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<Integer> colorElem = asList(0x00, 0x33, 0x66, 0x99, 0xCC, 0xFF);
7181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableList.Builder<Integer> webSafeColorsBuilder
7191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          = ImmutableList.builder();
7201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (Integer red : colorElem) {
7211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        for (Integer green : colorElem) {
7221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          for (Integer blue : colorElem) {
7231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            webSafeColorsBuilder.add((red << 16) + (green << 8) + blue);
7241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
7251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
7261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
7271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableList<Integer> webSafeColors = webSafeColorsBuilder.build();
7281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(216, webSafeColors.size());
7291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Integer[] webSafeColorArray =
7301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          webSafeColors.toArray(new Integer[webSafeColors.size()]);
7311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(0x000000, (int) webSafeColorArray[0]);
7321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(0x000033, (int) webSafeColorArray[1]);
7331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(0x000066, (int) webSafeColorArray[2]);
7341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(0x003300, (int) webSafeColorArray[6]);
7351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(0x330000, (int) webSafeColorArray[36]);
7361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(0x000066, (int) webSafeColors.get(2));
7371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(0x003300, (int) webSafeColors.get(6));
7381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableList<Integer> addedColor
7391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          = webSafeColorsBuilder.add(0x00BFFF).build();
7401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals("Modifying the builder should not have changed any already"
7411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          + " built sets", 216, webSafeColors.size());
7421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals("the new array should be one bigger than webSafeColors",
7431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          217, addedColor.size());
7441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Integer[] appendColorArray =
7451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          addedColor.toArray(new Integer[addedColor.size()]);
7461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(0x00BFFF, (int) appendColorArray[216]);
7471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilderAddHandlesNullsCorrectly() {
7501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableList.Builder<String> builder = ImmutableList.builder();
7511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
7521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        builder.add((String) null);
7531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("expected NullPointerException");
7541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
7551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
7561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
7581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        builder.add((String[]) null);
7591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("expected NullPointerException");
7601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
7611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
7621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
7641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        builder.add("a", null, "b");
7651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("expected NullPointerException");
7661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
7671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
7681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testBuilderAddAllHandlesNullsCorrectly() {
7711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableList.Builder<String> builder = ImmutableList.builder();
7721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
7731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        builder.addAll((Iterable<String>) null);
7741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("expected NullPointerException");
7751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
7761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
7771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
7791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        builder.addAll((Iterator<String>) null);
7801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("expected NullPointerException");
7811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
7821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
7831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder = ImmutableList.builder();
7851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> listWithNulls = asList("a", null, "b");
7861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
7871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        builder.addAll(listWithNulls);
7881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("expected NullPointerException");
7891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
7901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
7911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      builder = ImmutableList.builder();
7931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterator<String> iteratorWithNulls = asList("a", null, "b").iterator();
7941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
7951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        builder.addAll(iteratorWithNulls);
7961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("expected NullPointerException");
7971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
7981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
7991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterable<String> iterableWithNulls = MinimalIterable.of("a", null, "b");
8011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      try {
8021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        builder.addAll(iterableWithNulls);
8031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("expected NullPointerException");
8041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      } catch (NullPointerException expected) {
8051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
8061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public void testAsList() {
8091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      ImmutableList<String> list = ImmutableList.of("a", "b");
8101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertSame(list, list.asList());
8111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
814