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