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.base.Preconditions.checkNotNull;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.IteratorFeature.UNMODIFIABLE;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.Arrays.asList;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.Collections.singletonList;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static org.junit.contrib.truth.Truth.ASSERT;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Function;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Functions;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.IteratorTester;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.ListTestSuiteBuilder;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.SampleElements;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.TestListGenerator;
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.TestStringListGenerator;
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionFeature;
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionSize;
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.ListFeature;
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.NullPointerTester;
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.SerializableTester;
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.Test;
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase;
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestSuite;
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport org.easymock.EasyMock;
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.io.Serializable;
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.ArrayList;
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator;
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.LinkedList;
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.ListIterator;
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.NoSuchElementException;
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.RandomAccess;
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unit test for {@code Lists}.
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Mike Bostock
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Jared Levy
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class ListsTest extends TestCase {
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final Collection<Integer> SOME_COLLECTION
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      = asList(0, 1, 1);
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final Iterable<Integer> SOME_ITERABLE = new SomeIterable();
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class SomeIterable implements Iterable<Integer>, Serializable {
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Iterator<Integer> iterator() {
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return SOME_COLLECTION.iterator();
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private static final long serialVersionUID = 0;
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final List<Integer> SOME_LIST
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      = Lists.newArrayList(1, 2, 3, 4);
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final List<Integer> SOME_SEQUENTIAL_LIST
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      = Lists.newLinkedList(asList(1, 2, 3, 4));
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final List<String> SOME_STRING_LIST
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      = asList("1", "2", "3", "4");
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final Function<Number, String> SOME_FUNCTION
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      = new SomeFunction();
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class SomeFunction
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      implements Function<Number, String>, Serializable {
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public String apply(Number n) {
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return String.valueOf(n);
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private static final long serialVersionUID = 0;
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("suite")
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static Test suite() {
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TestSuite suite = new TestSuite();
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(ListsTest.class);
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(ListTestSuiteBuilder.using(new TestStringListGenerator() {
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected List<String> create(String[] elements) {
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            String[] rest = new String[elements.length - 1];
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Platform.unsafeArrayCopy(elements, 1, rest, 0, elements.length - 1);
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Lists.asList(elements[0], rest);
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("Lists.asList, 2 parameter")
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.SEVERAL, CollectionSize.ONE,
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_VALUES)
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(ListTestSuiteBuilder.using(new TestStringListGenerator() {
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected List<String> create(String[] elements) {
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            String[] rest = new String[elements.length - 2];
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Platform.unsafeArrayCopy(elements, 2, rest, 0, elements.length - 2);
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Lists.asList(elements[0], elements[1], rest);
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("Lists.asList, 3 parameter")
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.SEVERAL,
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_VALUES)
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final Function<String, String> removeFirst
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = new Function<String, String>() {
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            @Override
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            public String apply(String from) {
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              return (from.length() == 0) ? from : from.substring(1);
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          };
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(ListTestSuiteBuilder.using(new TestStringListGenerator() {
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected List<String> create(String[] elements) {
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            List<String> fromList = Lists.newArrayList();
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            for (String element : elements) {
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              fromList.add("q" + checkNotNull(element));
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Lists.transform(fromList, removeFirst);
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("Lists.transform, random access, no nulls")
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY,
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            ListFeature.REMOVE_OPERATIONS,
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(ListTestSuiteBuilder.using(new TestStringListGenerator() {
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected List<String> create(String[] elements) {
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            List<String> fromList = Lists.newLinkedList();
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            for (String element : elements) {
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              fromList.add("q" + checkNotNull(element));
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            }
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Lists.transform(fromList, removeFirst);
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("Lists.transform, sequential access, no nulls")
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY,
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            ListFeature.REMOVE_OPERATIONS,
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_QUERIES)
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(ListTestSuiteBuilder.using(new TestStringListGenerator() {
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected List<String> create(String[] elements) {
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            List<String> fromList = Lists.newArrayList(elements);
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Lists.transform(fromList, Functions.<String>identity());
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("Lists.transform, random access, nulls")
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY,
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            ListFeature.REMOVE_OPERATIONS,
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_VALUES)
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(ListTestSuiteBuilder.using(new TestStringListGenerator() {
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override protected List<String> create(String[] elements) {
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            List<String> fromList =
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                Lists.newLinkedList(asList(elements));
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Lists.transform(fromList, Functions.<String>identity());
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("Lists.transform, sequential access, nulls")
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(CollectionSize.ANY,
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            ListFeature.REMOVE_OPERATIONS,
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_VALUES)
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(ListTestSuiteBuilder.using(new TestStringListGenerator() {
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected List<String> create(String[] elements) {
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        List<String> list = Lists.newArrayList();
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        for (int i = elements.length - 1; i >= 0; i--)
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          list.add(elements[i]);
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Lists.reverse(list);
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }).named("Lists.reverse[ArrayList]").withFeatures(CollectionSize.ANY,
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        CollectionFeature.ALLOWS_NULL_VALUES, ListFeature.GENERAL_PURPOSE)
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(ListTestSuiteBuilder.using(new TestStringListGenerator() {
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected List<String> create(String[] elements) {
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        String[] reverseElements = new String[elements.length];
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        for (int i = elements.length - 1, j = 0; i >= 0; i--, j++)
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          reverseElements[j] = elements[i];
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Lists.reverse(asList(reverseElements));
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }).named("Lists.reverse[Arrays.asList]").withFeatures(CollectionSize.ANY,
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        CollectionFeature.ALLOWS_NULL_VALUES, ListFeature.SUPPORTS_SET)
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(ListTestSuiteBuilder.using(new TestStringListGenerator() {
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected List<String> create(String[] elements) {
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        List<String> list = Lists.newLinkedList();
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        for (int i = elements.length - 1; i >= 0; i--)
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          list.add(elements[i]);
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Lists.reverse(list);
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }).named("Lists.reverse[LinkedList]").withFeatures(CollectionSize.ANY,
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        CollectionFeature.ALLOWS_NULL_VALUES, ListFeature.GENERAL_PURPOSE)
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(ListTestSuiteBuilder.using(new TestStringListGenerator() {
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected List<String> create(String[] elements) {
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableList.Builder<String> builder = ImmutableList.builder();
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        for (int i = elements.length - 1; i >= 0; i--)
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          builder.add(elements[i]);
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Lists.reverse(builder.build());
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }).named("Lists.reverse[ImmutableList]").withFeatures(CollectionSize.ANY,
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        CollectionFeature.ALLOWS_NULL_QUERIES)
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite());
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ListTestSuiteBuilder.using(new TestListGenerator<Character>() {
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override public List<Character> create(Object... elements) {
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            char[] chars = new char[elements.length];
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            for (int i = 0; i < elements.length; i++)
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              chars[i] = (Character) elements[i];
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Lists.charactersOf(String.copyValueOf(chars));
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override public Character[] createArray(int length) {
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return new Character[length];
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override public Iterable<Character> order(
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              List<Character> insertionOrder) {
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return ImmutableList.copyOf(insertionOrder);
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override public SampleElements<Character> samples() {
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return new SampleElements<Character>('a', 'b', 'c', 'd', 'e');
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }).named("Lists.charactersOf[String]").withFeatures(
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_QUERIES)
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            .createTestSuite());
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ListTestSuiteBuilder.using(new TestListGenerator<Character>() {
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override public List<Character> create(Object... elements) {
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            char[] chars = new char[elements.length];
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            for (int i = 0; i < elements.length; i++)
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              chars[i] = (Character) elements[i];
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            StringBuilder str = new StringBuilder();
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            str.append(chars);
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Lists.charactersOf(str);
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override public Character[] createArray(int length) {
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return new Character[length];
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override public Iterable<Character> order(
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              List<Character> insertionOrder) {
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return ImmutableList.copyOf(insertionOrder);
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override public SampleElements<Character> samples() {
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return new SampleElements<Character>('a', 'b', 'c', 'd', 'e');
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }).named("Lists.charactersOf[CharSequence]").withFeatures(
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionSize.ANY, CollectionFeature.ALLOWS_NULL_QUERIES)
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            .createTestSuite());
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return suite;
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCharactersOfIsView() {
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    StringBuilder builder = new StringBuilder("abc");
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Character> chars = Lists.charactersOf(builder);
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList('a', 'b', 'c'), chars);
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.append("def");
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        asList('a', 'b', 'c', 'd', 'e', 'f'), chars);
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    builder.deleteCharAt(5);
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        asList('a', 'b', 'c', 'd', 'e'), chars);
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNewArrayListEmpty() {
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ArrayList<Integer> list = Lists.newArrayList();
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.emptyList(), list);
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNewArrayListWithCapacity() {
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ArrayList<Integer> list = Lists.newArrayListWithCapacity(0);
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.emptyList(), list);
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ArrayList<Integer> bigger = Lists.newArrayListWithCapacity(256);
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.emptyList(), bigger);
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNewArrayListWithCapacity_negative() {
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Lists.newArrayListWithCapacity(-1);
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNewArrayListWithExpectedSize() {
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ArrayList<Integer> list = Lists.newArrayListWithExpectedSize(0);
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.emptyList(), list);
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ArrayList<Integer> bigger = Lists.newArrayListWithExpectedSize(256);
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.emptyList(), bigger);
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNewArrayListWithExpectedSize_negative() {
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Lists.newArrayListWithExpectedSize(-1);
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNewArrayListVarArgs() {
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ArrayList<Integer> list = Lists.newArrayList(0, 1, 1);
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(SOME_COLLECTION, list);
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testComputeArrayListCapacity() {
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(5, Lists.computeArrayListCapacity(0));
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(13, Lists.computeArrayListCapacity(8));
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(89, Lists.computeArrayListCapacity(77));
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(22000005, Lists.computeArrayListCapacity(20000000));
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Integer.MAX_VALUE,
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Lists.computeArrayListCapacity(Integer.MAX_VALUE - 1000));
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNewArrayListFromCollection() {
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ArrayList<Integer> list = Lists.newArrayList(SOME_COLLECTION);
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(SOME_COLLECTION, list);
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNewArrayListFromIterable() {
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ArrayList<Integer> list = Lists.newArrayList(SOME_ITERABLE);
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(SOME_COLLECTION, list);
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNewArrayListFromIterator() {
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ArrayList<Integer> list = Lists.newArrayList(SOME_COLLECTION.iterator());
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(SOME_COLLECTION, list);
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNewLinkedListEmpty() {
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    LinkedList<Integer> list = Lists.newLinkedList();
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.emptyList(), list);
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNewLinkedListFromCollection() {
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    LinkedList<Integer> list = Lists.newLinkedList(SOME_COLLECTION);
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(SOME_COLLECTION, list);
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNewLinkedListFromIterable() {
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    LinkedList<Integer> list = Lists.newLinkedList(SOME_ITERABLE);
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(SOME_COLLECTION, list);
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("NullPointerTester")
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNullPointerExceptions() throws Exception {
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    NullPointerTester tester = new NullPointerTester();
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicStaticMethods(Lists.class);
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * This is just here to illustrate how {@code Arrays#asList} differs from
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@code Lists#newArrayList}.
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testArraysAsList() {
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> ourWay = Lists.newArrayList("foo", "bar", "baz");
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> otherWay = asList("foo", "bar", "baz");
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // They're logically equal
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ourWay, otherWay);
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // The result of Arrays.asList() is mutable
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    otherWay.set(0, "FOO");
4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("FOO", otherWay.get(0));
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // But it can't grow
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      otherWay.add("nope");
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("no exception thrown");
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // And it can't shrink
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      otherWay.remove(2);
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("no exception thrown");
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAsList1() {
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Lists.asList("foo", new String[] { "bar", "baz" });
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkFooBarBazList(list);
4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SerializableTester.reserializeAndAssert(list);
4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(list instanceof RandomAccess);
4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new IteratorTester<String>(5, UNMODIFIABLE,
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        asList("foo", "bar", "baz"),
4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IteratorTester.KnownOrder.KNOWN_ORDER) {
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<String> newTargetIterator() {
4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Lists.asList("foo", new String[] {"bar", "baz"}).iterator();
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void checkFooBarBazList(List<String> list) {
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(list).hasContentsInOrder("foo", "bar", "baz");
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, list.size());
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertIndexIsOutOfBounds(list, -1);
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("foo", list.get(0));
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("bar", list.get(1));
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("baz", list.get(2));
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertIndexIsOutOfBounds(list, 3);
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAsList1Small() {
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Lists.asList("foo", new String[0]);
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(list).hasContentsInOrder("foo");
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, list.size());
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertIndexIsOutOfBounds(list, -1);
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("foo", list.get(0));
4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertIndexIsOutOfBounds(list, 1);
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(list instanceof RandomAccess);
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new IteratorTester<String>(3, UNMODIFIABLE, singletonList("foo"),
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IteratorTester.KnownOrder.KNOWN_ORDER) {
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<String> newTargetIterator() {
4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Lists.asList("foo", new String[0]).iterator();
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAsList2() {
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Lists.asList("foo", "bar", new String[] { "baz" });
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    checkFooBarBazList(list);
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(list instanceof RandomAccess);
4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new IteratorTester<String>(5, UNMODIFIABLE, asList("foo", "bar",
4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "baz"), IteratorTester.KnownOrder.KNOWN_ORDER) {
4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<String> newTargetIterator() {
4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Lists.asList("foo", "bar", new String[] {"baz"}).iterator();
4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
4781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAsList2Small() {
4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Lists.asList("foo", "bar", new String[0]);
4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(list).hasContentsInOrder("foo", "bar");
4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, list.size());
4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertIndexIsOutOfBounds(list, -1);
4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("foo", list.get(0));
4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("bar", list.get(1));
4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertIndexIsOutOfBounds(list, 2);
4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SerializableTester.reserializeAndAssert(list);
4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(list instanceof RandomAccess);
4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new IteratorTester<String>(5, UNMODIFIABLE, asList("foo", "bar"),
4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IteratorTester.KnownOrder.KNOWN_ORDER) {
4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<String> newTargetIterator() {
4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Lists.asList("foo", "bar", new String[0]).iterator();
4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static void assertIndexIsOutOfBounds(List<String> list, int index) {
4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      list.get(index);
5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {
5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testReverseViewRandomAccess() {
5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> fromList = Lists.newArrayList(SOME_LIST);
5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> toList = Lists.reverse(fromList);
5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertReverseView(fromList, toList);
5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testReverseViewSequential() {
5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> fromList = Lists.newLinkedList(SOME_SEQUENTIAL_LIST);
5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> toList = Lists.reverse(fromList);
5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertReverseView(fromList, toList);
5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static void assertReverseView(List<Integer> fromList,
5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<Integer> toList) {
5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /* fromList modifications reflected in toList */
5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    fromList.set(0, 5);
5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList(4, 3, 2, 5), toList);
5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    fromList.add(6);
5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList(6, 4, 3, 2, 5), toList);
5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    fromList.add(2, 9);
5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList(6, 4, 3, 9, 2, 5), toList);
5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    fromList.remove(Integer.valueOf(2));
5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList(6, 4, 3, 9, 5), toList);
5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    fromList.remove(3);
5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList(6, 3, 9, 5), toList);
5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /* toList modifications reflected in fromList */
5321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toList.remove(0);
5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList(5, 9, 3), fromList);
5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toList.add(7);
5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList(7, 5, 9, 3), fromList);
5361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toList.add(5);
5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList(5, 7, 5, 9, 3), fromList);
5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toList.remove(Integer.valueOf(5));
5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList(5, 7, 9, 3), fromList);
5401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toList.set(1, 8);
5411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList(5, 7, 8, 3), fromList);
5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toList.clear();
5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.emptyList(), fromList);
5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTransformEqualityRandomAccess() {
5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Lists.transform(SOME_LIST, SOME_FUNCTION);
5491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(SOME_STRING_LIST, list);
5501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SerializableTester.reserializeAndAssert(list);
5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("SerializableTester")
5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTransformEqualitySequential() {
5551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Lists.transform(SOME_SEQUENTIAL_LIST, SOME_FUNCTION);
5561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(SOME_STRING_LIST, list);
5571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SerializableTester.reserializeAndAssert(list);
5581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTransformHashCodeRandomAccess() {
5611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Lists.transform(SOME_LIST, SOME_FUNCTION);
5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(SOME_STRING_LIST.hashCode(), list.hashCode());
5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTransformHashCodeSequential() {
5661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Lists.transform(SOME_SEQUENTIAL_LIST, SOME_FUNCTION);
5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(SOME_STRING_LIST.hashCode(), list.hashCode());
5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTransformModifiableRandomAccess() {
5711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> fromList = Lists.newArrayList(SOME_LIST);
5721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Lists.transform(fromList, SOME_FUNCTION);
5731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTransformModifiable(list);
5741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTransformModifiableSequential() {
5771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> fromList = Lists.newLinkedList(SOME_SEQUENTIAL_LIST);
5781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Lists.transform(fromList, SOME_FUNCTION);
5791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTransformModifiable(list);
5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static void assertTransformModifiable(List<String> list) {
5831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
5841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      list.add("5");
5851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("transformed list is addable");
5861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {}
5871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.remove(0);
5881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList("2", "3", "4"), list);
5891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.remove("3");
5901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList("2", "4"), list);
5911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      list.set(0, "5");
5931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("transformed list is setable");
5941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {}
5951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.clear();
5961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.emptyList(), list);
5971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTransformViewRandomAccess() {
6001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> fromList = Lists.newArrayList(SOME_LIST);
6011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> toList = Lists.transform(fromList, SOME_FUNCTION);
6021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTransformView(fromList, toList);
6031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTransformViewSequential() {
6061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> fromList = Lists.newLinkedList(SOME_SEQUENTIAL_LIST);
6071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> toList = Lists.transform(fromList, SOME_FUNCTION);
6081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTransformView(fromList, toList);
6091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static void assertTransformView(List<Integer> fromList,
6121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<String> toList) {
6131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /* fromList modifications reflected in toList */
6141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    fromList.set(0, 5);
6151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList("5", "2", "3", "4"), toList);
6161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    fromList.add(6);
6171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList("5", "2", "3", "4", "6"), toList);
6181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    fromList.remove(Integer.valueOf(2));
6191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList("5", "3", "4", "6"), toList);
6201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    fromList.remove(2);
6211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList("5", "3", "6"), toList);
6221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /* toList modifications reflected in fromList */
6241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toList.remove(2);
6251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList(5, 3), fromList);
6261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toList.remove("5");
6271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList(3), fromList);
6281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    toList.clear();
6291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.emptyList(), fromList);
6301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTransformRandomAccess() {
6331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Lists.transform(SOME_LIST, SOME_FUNCTION);
6341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(list instanceof RandomAccess);
6351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTransformSequential() {
6381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Lists.transform(SOME_SEQUENTIAL_LIST, SOME_FUNCTION);
6391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(list instanceof RandomAccess);
6401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTransformListIteratorRandomAccess() {
6431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> fromList = Lists.newArrayList(SOME_LIST);
6441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Lists.transform(fromList, SOME_FUNCTION);
6451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTransformListIterator(list);
6461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTransformListIteratorSequential() {
6491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> fromList = Lists.newLinkedList(SOME_SEQUENTIAL_LIST);
6501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Lists.transform(fromList, SOME_FUNCTION);
6511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTransformListIterator(list);
6521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static void assertTransformListIterator(List<String> list) {
6551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ListIterator<String> iterator = list.listIterator(1);
6561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, iterator.nextIndex());
6571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("2", iterator.next());
6581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("3", iterator.next());
6591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("4", iterator.next());
6601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(4, iterator.nextIndex());
6611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
6621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      iterator.next();
6631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("did not detect end of list");
6641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchElementException expected) {}
6651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, iterator.previousIndex());
6661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("4", iterator.previous());
6671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("3", iterator.previous());
6681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("2", iterator.previous());
6691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.hasPrevious());
6701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("1", iterator.previous());
6711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasPrevious());
6721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-1, iterator.previousIndex());
6731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
6741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      iterator.previous();
6751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("did not detect beginning of list");
6761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchElementException expected) {}
6771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.remove();
6781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList("2", "3", "4"), list);
6791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(list.isEmpty());
6801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // An UnsupportedOperationException or IllegalStateException may occur.
6821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
6831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      iterator.add("1");
6841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("transformed list iterator is addable");
6851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {
6861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalStateException expected) {}
6871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
6881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      iterator.set("1");
6891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("transformed list iterator is settable");
6901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {
6911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalStateException expected) {}
6921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTransformIteratorRandomAccess() {
6951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> fromList = Lists.newArrayList(SOME_LIST);
6961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Lists.transform(fromList, SOME_FUNCTION);
6971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTransformIterator(list);
6981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTransformIteratorSequential() {
7011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> fromList = Lists.newLinkedList(SOME_SEQUENTIAL_LIST);
7021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Lists.transform(fromList, SOME_FUNCTION);
7031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTransformIterator(list);
7041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
7071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * We use this class to avoid the need to suppress generics checks with
7081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * easy mock.
7091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
7101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private interface IntegerList extends List<Integer> {}
7111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
7131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * This test depends on the fact that {@code AbstractSequentialList.iterator}
7141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * transforms the {@code iterator()} call into a call on {@code
7151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * listIterator(int)}. This is fine because the behavior is clearly
7161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * documented so it's not expected to change.
7171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
7181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("EsayMock")
7191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTransformedSequentialIterationUsesBackingListIterationOnly() {
7201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> randomAccessList = Lists.newArrayList(SOME_SEQUENTIAL_LIST);
7211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ListIterator<Integer> sampleListIterator =
7221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        SOME_SEQUENTIAL_LIST.listIterator();
7231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> listMock = EasyMock.createMock(IntegerList.class);
7241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    EasyMock.expect(listMock.listIterator(0)).andReturn(sampleListIterator);
7251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    EasyMock.replay(listMock);
7261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> transform = Lists.transform(listMock, SOME_FUNCTION);
7271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterables.elementsEqual(
7281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        transform, Lists.transform(randomAccessList, SOME_FUNCTION)));
7291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    EasyMock.verify(listMock);
7301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static void assertTransformIterator(List<String> list) {
7331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
7341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.hasNext());
7351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("1", iterator.next());
7361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.hasNext());
7371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("2", iterator.next());
7381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.hasNext());
7391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("3", iterator.next());
7401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.hasNext());
7411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("4", iterator.next());
7421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
7431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
7441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      iterator.next();
7451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("did not detect end of list");
7461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchElementException expected) {}
7471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.remove();
7481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList("1", "2", "3"), list);
7491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
7501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPartition_badSize() {
7531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> source = Collections.singletonList(1);
7541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
7551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Lists.partition(source, 0);
7561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
7571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
7581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPartition_empty() {
7621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> source = Collections.emptyList();
7631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<List<Integer>> partitions = Lists.partition(source, 1);
7641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(partitions.isEmpty());
7651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, partitions.size());
7661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPartition_1_1() {
7691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> source = Collections.singletonList(1);
7701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<List<Integer>> partitions = Lists.partition(source, 1);
7711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, partitions.size());
7721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.singletonList(1), partitions.get(0));
7731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPartition_1_2() {
7761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> source = Collections.singletonList(1);
7771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<List<Integer>> partitions = Lists.partition(source, 2);
7781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, partitions.size());
7791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.singletonList(1), partitions.get(0));
7801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPartition_2_1() {
7831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> source = asList(1, 2);
7841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<List<Integer>> partitions = Lists.partition(source, 1);
7851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, partitions.size());
7861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.singletonList(1), partitions.get(0));
7871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.singletonList(2), partitions.get(1));
7881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPartition_3_2() {
7911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> source = asList(1, 2, 3);
7921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<List<Integer>> partitions = Lists.partition(source, 2);
7931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, partitions.size());
7941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList(1, 2), partitions.get(0));
7951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList(3), partitions.get(1));
7961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("ArrayList.subList doesn't implement RandomAccess in GWT.")
7991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPartitionRandomAccessTrue() {
8001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> source = asList(1, 2, 3);
8011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<List<Integer>> partitions = Lists.partition(source, 2);
8021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue("partition should be RandomAccess, but not: "
8041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        + partitions.getClass(),
8051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        partitions instanceof RandomAccess);
8061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue("partition[0] should be RandomAccess, but not: "
8081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        + partitions.get(0).getClass(),
8091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        partitions.get(0) instanceof RandomAccess);
8101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue("partition[1] should be RandomAccess, but not: "
8121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        + partitions.get(1).getClass(),
8131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        partitions.get(1) instanceof RandomAccess);
8141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPartitionRandomAccessFalse() {
8171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> source = Lists.newLinkedList(asList(1, 2, 3));
8181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<List<Integer>> partitions = Lists.partition(source, 2);
8191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(partitions instanceof RandomAccess);
8201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(partitions.get(0) instanceof RandomAccess);
8211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(partitions.get(1) instanceof RandomAccess);
8221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // TODO: use the ListTestSuiteBuilder
8251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPartition_view() {
8271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> list = asList(1, 2, 3);
8281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<List<Integer>> partitions = Lists.partition(list, 3);
8291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Changes before the partition is retrieved are reflected
8311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.set(0, 3);
8321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<List<Integer>> iterator = partitions.iterator();
8341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Changes before the partition is retrieved are reflected
8361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.set(1, 4);
8371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> first = iterator.next();
8391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Changes after are too (unlike Iterables.partition)
8411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.set(2, 5);
8421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList(3, 4, 5), first);
8441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Changes to a sublist also write through to the original list
8461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    first.set(1, 6);
8471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList(3, 6, 5), list);
8481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPartitionSize_1() {
8511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> list = asList(1, 2, 3);
8521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, Lists.partition(list, Integer.MAX_VALUE).size());
8531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, Lists.partition(list, Integer.MAX_VALUE - 1).size());
8541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("cannot do such a big explicit copy")
8571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPartitionSize_2() {
8581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, Lists.partition(Collections.nCopies(0x40000001, 1), 0x40000000).size());
8591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // These tests are quick and basic and don't actually show unmodifiability...
8621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
863