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.Iterators.get;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.Iterators.getLast;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.Iterators.skip;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.Lists.newArrayList;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.IteratorFeature.MODIFIABLE;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.IteratorFeature.UNMODIFIABLE;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.Arrays.asList;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.Collections.singleton;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static org.junit.contrib.truth.Truth.ASSERT;
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Function;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Predicate;
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Predicates;
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.IteratorFeature;
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.IteratorTester;
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.ListTestSuiteBuilder;
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.TestStringListGenerator;
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionFeature;
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.CollectionSize;
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.features.ListFeature;
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.NullPointerTester;
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.Test;
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase;
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestSuite;
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.ArrayList;
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Arrays;
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.ConcurrentModificationException;
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Enumeration;
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator;
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.NoSuchElementException;
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.RandomAccess;
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set;
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Vector;
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unit test for {@code Iterators}.
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class IteratorsTest extends TestCase {
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("suite")
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public static Test suite() {
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    TestSuite suite = new TestSuite(IteratorsTest.class.getSimpleName());
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTest(testsForRemoveAllAndRetainAll());
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    suite.addTestSuite(IteratorsTest.class);
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return suite;
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testEmptyIterator() {
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = Iterators.emptyIterator();
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      iterator.next();
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("no exception thrown");
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchElementException expected) {
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      iterator.remove();
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("no exception thrown");
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSize0() {
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = Iterators.emptyIterator();
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, Iterators.size(iterator));
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSize1() {
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> iterator = Collections.singleton(0).iterator();
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, Iterators.size(iterator));
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSize_partiallyConsumed() {
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> iterator = asList(1, 2, 3, 4, 5).iterator();
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.next();
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.next();
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, Iterators.size(iterator));
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void test_contains_nonnull_yes() {
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> set = asList("a", null, "b").iterator();
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterators.contains(set, "b"));
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void test_contains_nonnull_no() {
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> set = asList("a", "b").iterator();
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterators.contains(set, "c"));
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void test_contains_null_yes() {
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> set = asList("a", null, "b").iterator();
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterators.contains(set, null));
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void test_contains_null_no() {
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> set = asList("a", "b").iterator();
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterators.contains(set, null));
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetOnlyElement_noDefault_valid() {
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = Collections.singletonList("foo").iterator();
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("foo", Iterators.getOnlyElement(iterator));
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetOnlyElement_noDefault_empty() {
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = Iterators.emptyIterator();
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterators.getOnlyElement(iterator);
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchElementException expected) {
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetOnlyElement_noDefault_moreThanOneLessThanFiveElements() {
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = asList("one", "two").iterator();
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterators.getOnlyElement(iterator);
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals("expected one element but was: <one, two>",
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   expected.getMessage());
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetOnlyElement_noDefault_fiveElements() {
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator =
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        asList("one", "two", "three", "four", "five").iterator();
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterators.getOnlyElement(iterator);
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals("expected one element but was: "
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   + "<one, two, three, four, five>",
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   expected.getMessage());
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetOnlyElement_noDefault_moreThanFiveElements() {
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator =
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        asList("one", "two", "three", "four", "five", "six").iterator();
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterators.getOnlyElement(iterator);
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals("expected one element but was: "
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   + "<one, two, three, four, five, ...>",
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   expected.getMessage());
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetOnlyElement_withDefault_singleton() {
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = Collections.singletonList("foo").iterator();
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("foo", Iterators.getOnlyElement(iterator, "bar"));
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetOnlyElement_withDefault_empty() {
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = Iterators.emptyIterator();
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("bar", Iterators.getOnlyElement(iterator, "bar"));
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetOnlyElement_withDefault_empty_null() {
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = Iterators.emptyIterator();
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(Iterators.getOnlyElement(iterator, null));
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetOnlyElement_withDefault_two() {
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = asList("foo", "bar").iterator();
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterators.getOnlyElement(iterator, "x");
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals("expected one element but was: <foo, bar>",
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                   expected.getMessage());
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Iterators.toArray(Iterator, Class)")
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testToArrayEmpty() {
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = Collections.<String>emptyList().iterator();
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String[] array = Iterators.toArray(iterator, String.class);
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Arrays.equals(new String[0], array));
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Iterators.toArray(Iterator, Class)")
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testToArraySingleton() {
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = Collections.singletonList("a").iterator();
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String[] array = Iterators.toArray(iterator, String.class);
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Arrays.equals(new String[] { "a" }, array));
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Iterators.toArray(Iterator, Class)")
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testToArray() {
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String[] sourceArray = new String[] {"a", "b", "c"};
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = asList(sourceArray).iterator();
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String[] newArray = Iterators.toArray(iterator, String.class);
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Arrays.equals(sourceArray, newArray));
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFilterSimple() {
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> unfiltered = Lists.newArrayList("foo", "bar").iterator();
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> filtered = Iterators.filter(unfiltered,
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                                                 Predicates.equalTo("foo"));
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> expected = Collections.singletonList("foo");
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> actual = Lists.newArrayList(filtered);
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, actual);
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFilterNoMatch() {
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> unfiltered = Lists.newArrayList("foo", "bar").iterator();
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> filtered = Iterators.filter(unfiltered,
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                                                 Predicates.alwaysFalse());
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> expected = Collections.emptyList();
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> actual = Lists.newArrayList(filtered);
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, actual);
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFilterMatchAll() {
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> unfiltered = Lists.newArrayList("foo", "bar").iterator();
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> filtered = Iterators.filter(unfiltered,
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                                                 Predicates.alwaysTrue());
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> expected = Lists.newArrayList("foo", "bar");
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> actual = Lists.newArrayList(filtered);
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, actual);
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFilterNothing() {
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> unfiltered = Collections.<String>emptyList().iterator();
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> filtered = Iterators.filter(unfiltered,
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new Predicate<String>() {
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public boolean apply(String s) {
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            fail("Should never be evaluated");
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return false;
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        });
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> expected = Collections.emptyList();
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> actual = Lists.newArrayList(filtered);
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, actual);
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("unreasonable slow")
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFilterUsingIteratorTester() {
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final List<Integer> list = asList(1, 2, 3, 4, 5);
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final Predicate<Integer> isEven = new Predicate<Integer>() {
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      public boolean apply(Integer integer) {
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return integer % 2 == 0;
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new IteratorTester<Integer>(5, UNMODIFIABLE, asList(2, 4),
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IteratorTester.KnownOrder.KNOWN_ORDER) {
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<Integer> newTargetIterator() {
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Iterators.filter(list.iterator(), isEven);
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAny() {
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Lists.newArrayList();
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<String> predicate = Predicates.equalTo("pants");
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterators.any(list.iterator(), predicate));
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("cool");
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterators.any(list.iterator(), predicate));
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("pants");
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterators.any(list.iterator(), predicate));
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAll() {
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Lists.newArrayList();
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<String> predicate = Predicates.equalTo("cool");
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterators.all(list.iterator(), predicate));
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("cool");
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterators.all(list.iterator(), predicate));
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("pants");
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterators.all(list.iterator(), predicate));
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFind_firstElement() {
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> list = Lists.newArrayList("cool", "pants");
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("cool", Iterators.find(iterator, Predicates.equalTo("cool")));
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("pants", iterator.next());
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFind_lastElement() {
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> list = Lists.newArrayList("cool", "pants");
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("pants", Iterators.find(iterator,
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Predicates.equalTo("pants")));
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFind_notPresent() {
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> list = Lists.newArrayList("cool", "pants");
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterators.find(iterator, Predicates.alwaysFalse());
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchElementException e) {
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFind_matchAlways() {
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> list = Lists.newArrayList("cool", "pants");
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("cool", Iterators.find(iterator, Predicates.alwaysTrue()));
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFind_withDefault_first() {
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> list = Lists.newArrayList("cool", "pants");
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("cool",
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterators.find(iterator, Predicates.equalTo("cool"), "woot"));
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("pants", iterator.next());
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFind_withDefault_last() {
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> list = Lists.newArrayList("cool", "pants");
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("pants",
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterators.find(iterator, Predicates.equalTo("pants"), "woot"));
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFind_withDefault_notPresent() {
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> list = Lists.newArrayList("cool", "pants");
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("woot",
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterators.find(iterator, Predicates.alwaysFalse(), "woot"));
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFind_withDefault_notPresent_nullReturn() {
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> list = Lists.newArrayList("cool", "pants");
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterators.find(iterator, Predicates.alwaysFalse(), null));
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFind_withDefault_matchAlways() {
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> list = Lists.newArrayList("cool", "pants");
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("cool",
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterators.find(iterator, Predicates.alwaysTrue(), "woot"));
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("pants", iterator.next());
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTryFind_firstElement() {
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> list = Lists.newArrayList("cool", "pants");
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("cool",
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterators.tryFind(iterator, Predicates.equalTo("cool")).get());
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTryFind_lastElement() {
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> list = Lists.newArrayList("cool", "pants");
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("pants",
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterators.tryFind(iterator, Predicates.equalTo("pants")).get());
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTryFind_alwaysTrue() {
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> list = Lists.newArrayList("cool", "pants");
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("cool",
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterators.tryFind(iterator, Predicates.alwaysTrue()).get());
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTryFind_alwaysFalse_orDefault() {
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> list = Lists.newArrayList("cool", "pants");
4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("woot",
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterators.tryFind(iterator, Predicates.alwaysFalse()).or("woot"));
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTryFind_alwaysFalse_isPresent() {
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> list = Lists.newArrayList("cool", "pants");
4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterators.tryFind(iterator, Predicates.alwaysFalse()).isPresent());
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTransform() {
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> input = asList("1", "2", "3").iterator();
4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> result = Iterators.transform(input,
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new Function<String, Integer>() {
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public Integer apply(String from) {
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Integer.valueOf(from);
4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        });
4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> actual = Lists.newArrayList(result);
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> expected = asList(1, 2, 3);
4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, actual);
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTransformRemove() {
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Lists.newArrayList("1", "2", "3");
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> input = list.iterator();
4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> iterator = Iterators.transform(input,
4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new Function<String, Integer>() {
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public Integer apply(String from) {
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Integer.valueOf(from);
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        });
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Integer.valueOf(1), iterator.next());
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Integer.valueOf(2), iterator.next());
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.remove();
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList("1", "3"), list);
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPoorlyBehavedTransform() {
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> input = asList("1", null, "3").iterator();
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> result = Iterators.transform(input,
4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new Function<String, Integer>() {
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public Integer apply(String from) {
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Integer.valueOf(from);
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        });
4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    result.next();
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      result.next();
4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("Expected NFE");
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NumberFormatException nfe) {
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // Expected to fail.
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNullFriendlyTransform() {
4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> input = asList(1, 2, null, 3).iterator();
4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> result = Iterators.transform(input,
4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new Function<Integer, String>() {
4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public String apply(Integer from) {
4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return String.valueOf(from);
4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        });
4781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> actual = Lists.newArrayList(result);
4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> expected = asList("1", "2", "null", "3");
4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, actual);
4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCycleOfEmpty() {
4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // "<String>" for javac 1.5.
4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> cycle = Iterators.<String>cycle();
4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(cycle.hasNext());
4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCycleOfOne() {
4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> cycle = Iterators.cycle("a");
4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = 0; i < 3; i++) {
4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(cycle.hasNext());
4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals("a", cycle.next());
4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCycleOfOneWithRemove() {
4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = Lists.newArrayList("a");
5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> cycle = Iterators.cycle(iterable);
5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(cycle.hasNext());
5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("a", cycle.next());
5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    cycle.remove();
5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.emptyList(), iterable);
5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(cycle.hasNext());
5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCycleOfTwo() {
5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> cycle = Iterators.cycle("a", "b");
5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = 0; i < 3; i++) {
5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(cycle.hasNext());
5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals("a", cycle.next());
5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertTrue(cycle.hasNext());
5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals("b", cycle.next());
5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCycleOfTwoWithRemove() {
5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = Lists.newArrayList("a", "b");
5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> cycle = Iterators.cycle(iterable);
5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(cycle.hasNext());
5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("a", cycle.next());
5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(cycle.hasNext());
5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("b", cycle.next());
5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(cycle.hasNext());
5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("a", cycle.next());
5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    cycle.remove();
5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.singletonList("b"), iterable);
5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(cycle.hasNext());
5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("b", cycle.next());
5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(cycle.hasNext());
5321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("b", cycle.next());
5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    cycle.remove();
5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.emptyList(), iterable);
5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(cycle.hasNext());
5361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCycleRemoveWithoutNext() {
5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> cycle = Iterators.cycle("a", "b");
5401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(cycle.hasNext());
5411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      cycle.remove();
5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("no exception thrown");
5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalStateException expected) {
5451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCycleRemoveSameElementTwice() {
5491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> cycle = Iterators.cycle("a", "b");
5501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    cycle.next();
5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    cycle.remove();
5521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
5531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      cycle.remove();
5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("no exception thrown");
5551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalStateException expected) {
5561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCycleWhenRemoveIsNotSupported() {
5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = asList("a", "b");
5611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> cycle = Iterators.cycle(iterable);
5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    cycle.next();
5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
5641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      cycle.remove();
5651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("no exception thrown");
5661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {
5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCycleRemoveAfterHasNext() {
5711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = Lists.newArrayList("a");
5721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> cycle = Iterators.cycle(iterable);
5731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(cycle.hasNext());
5741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("a", cycle.next());
5751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(cycle.hasNext());
5761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    cycle.remove();
5771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.emptyList(), iterable);
5781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(cycle.hasNext());
5791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCycleNoSuchElementException() {
5821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = Lists.newArrayList("a");
5831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> cycle = Iterators.cycle(iterable);
5841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(cycle.hasNext());
5851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("a", cycle.next());
5861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    cycle.remove();
5871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(cycle.hasNext());
5881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
5891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      cycle.next();
5901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
5911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchElementException expected) {}
5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("unreasonable slow")
5951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCycleUsingIteratorTester() {
5961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new IteratorTester<Integer>(5, UNMODIFIABLE, asList(1, 2, 1, 2, 1,
5971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        2, 1, 2, 1, 2, 1, 2), IteratorTester.KnownOrder.KNOWN_ORDER) {
5981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<Integer> newTargetIterator() {
5991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Iterators.cycle(asList(1, 2));
6001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
6011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
6021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("slow (~5s)")
6051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConcatNoIteratorsYieldsEmpty() {
6061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EmptyIteratorTester() {
6071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @SuppressWarnings("unchecked")
6081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<Integer> newTargetIterator() {
6091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Iterators.concat();
6101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
6111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
6121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("slow (~5s)")
6151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConcatOneEmptyIteratorYieldsEmpty() {
6161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EmptyIteratorTester() {
6171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @SuppressWarnings("unchecked")
6181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<Integer> newTargetIterator() {
6191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Iterators.concat(iterateOver());
6201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
6211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
6221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("slow (~5s)")
6251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConcatMultipleEmptyIteratorsYieldsEmpty() {
6261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new EmptyIteratorTester() {
6271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<Integer> newTargetIterator() {
6281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Iterators.concat(iterateOver(), iterateOver());
6291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
6301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
6311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("slow (~3s)")
6341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConcatSingletonYieldsSingleton() {
6351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new SingletonIteratorTester() {
6361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @SuppressWarnings("unchecked")
6371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<Integer> newTargetIterator() {
6381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Iterators.concat(iterateOver(1));
6391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
6401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
6411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("slow (~5s)")
6441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConcatEmptyAndSingletonAndEmptyYieldsSingleton() {
6451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new SingletonIteratorTester() {
6461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<Integer> newTargetIterator() {
6471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Iterators.concat(iterateOver(), iterateOver(1), iterateOver());
6481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
6491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
6501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("fairly slow (~40s)")
6531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConcatSingletonAndSingletonYieldsDoubleton() {
6541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new DoubletonIteratorTester() {
6551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<Integer> newTargetIterator() {
6561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Iterators.concat(iterateOver(1), iterateOver(2));
6571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
6581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
6591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("fairly slow (~40s)")
6621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConcatSingletonAndSingletonWithEmptiesYieldsDoubleton() {
6631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new DoubletonIteratorTester() {
6641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<Integer> newTargetIterator() {
6651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Iterators.concat(
6661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            iterateOver(1), iterateOver(), iterateOver(), iterateOver(2));
6671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
6681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
6691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("fairly slow (~50s)")
6721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConcatUnmodifiable() {
6731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new IteratorTester<Integer>(5, UNMODIFIABLE, asList(1, 2),
6741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IteratorTester.KnownOrder.KNOWN_ORDER) {
6751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<Integer> newTargetIterator() {
6761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Iterators.concat(asList(1).iterator(),
6771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            Arrays.<Integer>asList().iterator(), asList(2).iterator());
6781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
6791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
6801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
6831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * Illustrates the somewhat bizarre behavior when a null is passed in.
6841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
6851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConcatContainingNull() {
6861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @SuppressWarnings("unchecked")
6871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Iterator<Integer>> input
6881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = asList(iterateOver(1, 2), null, iterateOver(3)).iterator();
6891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> result = Iterators.concat(input);
6901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, (int) result.next());
6911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, (int) result.next());
6921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
6931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      result.hasNext();
6941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("no exception thrown");
6951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException e) {
6961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
6971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
6981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      result.next();
6991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("no exception thrown");
7001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException e) {
7011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // There is no way to get "through" to the 3.  Buh-bye
7031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("unchecked")
7061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConcatVarArgsContainingNull() {
7071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
7081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterators.concat(iterateOver(1, 2), null, iterateOver(3), iterateOver(4),
7091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          iterateOver(5));
7101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("no exception thrown");
7111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException e) {
7121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAllWithEmptyIterator() {
7161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> alreadyThere = Lists.newArrayList("already", "there");
7171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    boolean changed = Iterators.addAll(alreadyThere,
7191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                                       Iterators.<String>emptyIterator());
7201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(alreadyThere).hasContentsInOrder("already", "there");
7211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(changed);
7221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAllToList() {
7251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> alreadyThere = Lists.newArrayList("already", "there");
7261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> freshlyAdded = Lists.newArrayList("freshly", "added");
7271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    boolean changed = Iterators.addAll(alreadyThere, freshlyAdded.iterator());
7291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(alreadyThere).hasContentsInOrder("already", "there", "freshly", "added");
7311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(changed);
7321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAllToSet() {
7351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<String> alreadyThere
7361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = Sets.newLinkedHashSet(asList("already", "there"));
7371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> oneMore = Lists.newArrayList("there");
7381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    boolean changed = Iterators.addAll(alreadyThere, oneMore.iterator());
7401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(alreadyThere).hasContentsInOrder("already", "there");
7411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(changed);
7421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("NullPointerTester")
7451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNullPointerExceptions() throws Exception {
7461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    NullPointerTester tester = new NullPointerTester();
7471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicStaticMethods(Iterators.class);
7481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Only used by @GwtIncompatible code")
7511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static abstract class EmptyIteratorTester
7521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      extends IteratorTester<Integer> {
7531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    protected EmptyIteratorTester() {
7541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(3, MODIFIABLE, Collections.<Integer>emptySet(),
7551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          IteratorTester.KnownOrder.KNOWN_ORDER);
7561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Only used by @GwtIncompatible code")
7601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static abstract class SingletonIteratorTester
7611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      extends IteratorTester<Integer> {
7621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    protected SingletonIteratorTester() {
7631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(3, MODIFIABLE, singleton(1), IteratorTester.KnownOrder.KNOWN_ORDER);
7641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Only used by @GwtIncompatible code")
7681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static abstract class DoubletonIteratorTester
7691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      extends IteratorTester<Integer> {
7701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    protected DoubletonIteratorTester() {
7711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      super(5, MODIFIABLE, newArrayList(1, 2),
7721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          IteratorTester.KnownOrder.KNOWN_ORDER);
7731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static Iterator<Integer> iterateOver(final Integer... values) {
7771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return newArrayList(values).iterator();
7781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testElementsEqual() {
7811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<?> a;
7821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<?> b;
7831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Base case.
7851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    a = Lists.newArrayList();
7861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    b = Collections.emptySet();
7871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterators.elementsEqual(a.iterator(), b.iterator()));
7881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // A few elements.
7901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    a = asList(4, 8, 15, 16, 23, 42);
7911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    b = asList(4, 8, 15, 16, 23, 42);
7921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterators.elementsEqual(a.iterator(), b.iterator()));
7931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // The same, but with nulls.
7951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    a = asList(4, 8, null, 16, 23, 42);
7961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    b = asList(4, 8, null, 16, 23, 42);
7971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterators.elementsEqual(a.iterator(), b.iterator()));
7981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Different Iterable types (still equal elements, though).
8001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    a = ImmutableList.of(4, 8, 15, 16, 23, 42);
8011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    b = asList(4, 8, 15, 16, 23, 42);
8021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterators.elementsEqual(a.iterator(), b.iterator()));
8031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // An element differs.
8051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    a = asList(4, 8, 15, 12, 23, 42);
8061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    b = asList(4, 8, 15, 16, 23, 42);
8071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterators.elementsEqual(a.iterator(), b.iterator()));
8081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // null versus non-null.
8101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    a = asList(4, 8, 15, null, 23, 42);
8111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    b = asList(4, 8, 15, 16, 23, 42);
8121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterators.elementsEqual(a.iterator(), b.iterator()));
8131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterators.elementsEqual(b.iterator(), a.iterator()));
8141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Different lengths.
8161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    a = asList(4, 8, 15, 16, 23);
8171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    b = asList(4, 8, 15, 16, 23, 42);
8181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterators.elementsEqual(a.iterator(), b.iterator()));
8191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterators.elementsEqual(b.iterator(), a.iterator()));
8201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Different lengths, one is empty.
8221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    a = Collections.emptySet();
8231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    b = asList(4, 8, 15, 16, 23, 42);
8241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterators.elementsEqual(a.iterator(), b.iterator()));
8251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterators.elementsEqual(b.iterator(), a.iterator()));
8261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPartition_badSize() {
8291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> source = Iterators.singletonIterator(1);
8301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
8311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterators.partition(source, 0);
8321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
8331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
8341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPartition_empty() {
8381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> source = Iterators.emptyIterator();
8391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<List<Integer>> partitions = Iterators.partition(source, 1);
8401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(partitions.hasNext());
8411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPartition_singleton1() {
8441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> source = Iterators.singletonIterator(1);
8451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<List<Integer>> partitions = Iterators.partition(source, 1);
8461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(partitions.hasNext());
8471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(partitions.hasNext());
8481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableList.of(1), partitions.next());
8491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(partitions.hasNext());
8501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPartition_singleton2() {
8531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> source = Iterators.singletonIterator(1);
8541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<List<Integer>> partitions = Iterators.partition(source, 2);
8551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(partitions.hasNext());
8561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(partitions.hasNext());
8571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableList.of(1), partitions.next());
8581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(partitions.hasNext());
8591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("fairly slow (~50s)")
8621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPartition_general() {
8631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new IteratorTester<List<Integer>>(5,
8641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IteratorFeature.UNMODIFIABLE,
8651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableList.of(
8661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            asList(1, 2, 3),
8671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            asList(4, 5, 6),
8681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            asList(7)),
8691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IteratorTester.KnownOrder.KNOWN_ORDER) {
8701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<List<Integer>> newTargetIterator() {
8711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterator<Integer> source = Iterators.forArray(1, 2, 3, 4, 5, 6, 7);
8721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Iterators.partition(source, 3);
8731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
8741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
8751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPartition_view() {
8781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> list = asList(1, 2);
8791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<List<Integer>> partitions
8801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = Iterators.partition(list.iterator(), 1);
8811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Changes before the partition is retrieved are reflected
8831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.set(0, 3);
8841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> first = partitions.next();
8851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Changes after are not
8871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.set(0, 4);
8881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableList.of(3), first);
8901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("?")
8931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // TODO: Figure out why this is failing in GWT.
8941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPartitionRandomAccess() {
8951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> source = asList(1, 2, 3).iterator();
8961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<List<Integer>> partitions = Iterators.partition(source, 2);
8971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(partitions.next() instanceof RandomAccess);
8981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(partitions.next() instanceof RandomAccess);
8991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPaddedPartition_badSize() {
9021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> source = Iterators.singletonIterator(1);
9031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
9041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterators.paddedPartition(source, 0);
9051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
9061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
9071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPaddedPartition_empty() {
9111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> source = Iterators.emptyIterator();
9121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<List<Integer>> partitions = Iterators.paddedPartition(source, 1);
9131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(partitions.hasNext());
9141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPaddedPartition_singleton1() {
9171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> source = Iterators.singletonIterator(1);
9181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<List<Integer>> partitions = Iterators.paddedPartition(source, 1);
9191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(partitions.hasNext());
9201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(partitions.hasNext());
9211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableList.of(1), partitions.next());
9221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(partitions.hasNext());
9231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPaddedPartition_singleton2() {
9261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> source = Iterators.singletonIterator(1);
9271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<List<Integer>> partitions = Iterators.paddedPartition(source, 2);
9281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(partitions.hasNext());
9291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(partitions.hasNext());
9301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList(1, null), partitions.next());
9311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(partitions.hasNext());
9321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("fairly slow (~50s)")
9351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPaddedPartition_general() {
9361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new IteratorTester<List<Integer>>(5,
9371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IteratorFeature.UNMODIFIABLE,
9381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        ImmutableList.of(
9391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            asList(1, 2, 3),
9401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            asList(4, 5, 6),
9411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            asList(7, null, null)),
9421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IteratorTester.KnownOrder.KNOWN_ORDER) {
9431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<List<Integer>> newTargetIterator() {
9441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterator<Integer> source = Iterators.forArray(1, 2, 3, 4, 5, 6, 7);
9451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Iterators.paddedPartition(source, 3);
9461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
9471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
9481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPaddedPartition_view() {
9511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> list = asList(1, 2);
9521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<List<Integer>> partitions
9531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = Iterators.paddedPartition(list.iterator(), 1);
9541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Changes before the PaddedPartition is retrieved are reflected
9561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.set(0, 3);
9571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> first = partitions.next();
9581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Changes after are not
9601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.set(0, 4);
9611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableList.of(3), first);
9631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPaddedPartitionRandomAccess() {
9661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> source = asList(1, 2, 3).iterator();
9671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<List<Integer>> partitions = Iterators.paddedPartition(source, 2);
9681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(partitions.next() instanceof RandomAccess);
9691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(partitions.next() instanceof RandomAccess);
9701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testForArrayEmpty() {
9731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String[] array = new String[0];
9741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = Iterators.forArray(array);
9751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
9761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
9771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      iterator.next();
9781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
9791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchElementException expected) {}
9801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testForArrayTypical() {
9831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String[] array = {"foo", "bar"};
9841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = Iterators.forArray(array);
9851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.hasNext());
9861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("foo", iterator.next());
9871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.hasNext());
9881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
9891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      iterator.remove();
9901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
9911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {}
9921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("bar", iterator.next());
9931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
9941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
9951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      iterator.next();
9961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
9971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchElementException expected) {}
9981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testForArrayOffset() {
10011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String[] array = {"foo", "bar", "cat", "dog"};
10021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = Iterators.forArray(array, 1, 2);
10031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.hasNext());
10041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("bar", iterator.next());
10051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.hasNext());
10061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("cat", iterator.next());
10071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
10081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
10091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterators.forArray(array, 2, 3);
10101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
10111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {}
10121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testForArrayLength0() {
10151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String[] array = {"foo", "bar"};
10161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterators.forArray(array, 0, 0).hasNext());
10171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterators.forArray(array, 1, 0).hasNext());
10181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterators.forArray(array, 2, 0).hasNext());
10191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
10201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterators.forArray(array, -1, 0);
10211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
10221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {}
10231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
10241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterators.forArray(array, 3, 0);
10251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
10261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {}
10271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("unreasonable slow")
10301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testForArrayUsingTester() {
10311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new IteratorTester<Integer>(6, UNMODIFIABLE, asList(1, 2, 3),
10321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IteratorTester.KnownOrder.KNOWN_ORDER) {
10331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<Integer> newTargetIterator() {
10341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Iterators.forArray(1, 2, 3);
10351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
10361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
10371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("unreasonable slow")
10401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testForArrayWithOffsetUsingTester() {
10411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new IteratorTester<Integer>(6, UNMODIFIABLE, asList(1, 2, 3),
10421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IteratorTester.KnownOrder.KNOWN_ORDER) {
10431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<Integer> newTargetIterator() {
10441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Iterators.forArray(new Integer[] { 0, 1, 2, 3, 4 }, 1, 3);
10451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
10461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
10471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testForEnumerationEmpty() {
10501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Enumeration<Integer> enumer = enumerate();
10511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> iter = Iterators.forEnumeration(enumer);
10521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iter.hasNext());
10541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
10551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      iter.next();
10561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
10571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchElementException expected) {
10581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testForEnumerationSingleton() {
10621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Enumeration<Integer> enumer = enumerate(1);
10631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> iter = Iterators.forEnumeration(enumer);
10641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iter.hasNext());
10661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iter.hasNext());
10671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, (int) iter.next());
10681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
10691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      iter.remove();
10701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
10711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {
10721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iter.hasNext());
10741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
10751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      iter.next();
10761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
10771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchElementException expected) {
10781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
10791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testForEnumerationTypical() {
10821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Enumeration<Integer> enumer = enumerate(1, 2, 3);
10831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> iter = Iterators.forEnumeration(enumer);
10841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iter.hasNext());
10861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, (int) iter.next());
10871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iter.hasNext());
10881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, (int) iter.next());
10891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iter.hasNext());
10901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, (int) iter.next());
10911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iter.hasNext());
10921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAsEnumerationEmpty() {
10951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> iter = Iterators.emptyIterator();
10961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Enumeration<Integer> enumer = Iterators.asEnumeration(iter);
10971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(enumer.hasMoreElements());
10991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
11001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      enumer.nextElement();
11011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
11021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchElementException expected) {
11031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAsEnumerationSingleton() {
11071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> iter = ImmutableList.of(1).iterator();
11081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Enumeration<Integer> enumer = Iterators.asEnumeration(iter);
11091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(enumer.hasMoreElements());
11111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(enumer.hasMoreElements());
11121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, (int) enumer.nextElement());
11131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(enumer.hasMoreElements());
11141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
11151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      enumer.nextElement();
11161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
11171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchElementException expected) {
11181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAsEnumerationTypical() {
11221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> iter = ImmutableList.of(1, 2, 3).iterator();
11231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Enumeration<Integer> enumer = Iterators.asEnumeration(iter);
11241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(enumer.hasMoreElements());
11261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, (int) enumer.nextElement());
11271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(enumer.hasMoreElements());
11281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, (int) enumer.nextElement());
11291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(enumer.hasMoreElements());
11301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, (int) enumer.nextElement());
11311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(enumer.hasMoreElements());
11321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static Enumeration<Integer> enumerate(Integer... ints) {
11351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Vector<Integer> vector = new Vector<Integer>();
11361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    vector.addAll(asList(ints));
11371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return vector.elements();
11381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testToString() {
11411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Collections.emptyList();
11421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[]", Iterators.toString(list.iterator()));
11431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list = Lists.newArrayList("yam", "bam", "jam", "ham");
11451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[yam, bam, jam, ham]", Iterators.toString(list.iterator()));
11461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLimit() {
11491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList();
11501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
11511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterators.limit(list.iterator(), -1);
11521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("expected exception");
11531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
11541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // expected
11551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterators.limit(list.iterator(), 0).hasNext());
11581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterators.limit(list.iterator(), 1).hasNext());
11591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("cool");
11611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterators.limit(list.iterator(), 0).hasNext());
11621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(list, newArrayList(Iterators.limit(list.iterator(), 1)));
11631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(list, newArrayList(Iterators.limit(list.iterator(), 2)));
11641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("pants");
11661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterators.limit(list.iterator(), 0).hasNext());
11671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableList.of("cool"),
11681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        newArrayList(Iterators.limit(list.iterator(), 1)));
11691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(list, newArrayList(Iterators.limit(list.iterator(), 2)));
11701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(list, newArrayList(Iterators.limit(list.iterator(), 3)));
11711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLimitRemove() {
11741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList();
11751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("cool");
11761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("pants");
11771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = Iterators.limit(list.iterator(), 1);
11781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.next();
11791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.remove();
11801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
11811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, list.size());
11821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("pants", list.get(0));
11831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("fairly slow (~30s)")
11861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLimitUsingIteratorTester() {
11871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final List<Integer> list = Lists.newArrayList(1, 2, 3, 4, 5);
11881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new IteratorTester<Integer>(5, MODIFIABLE, newArrayList(1, 2, 3),
11891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IteratorTester.KnownOrder.KNOWN_ORDER) {
11901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<Integer> newTargetIterator() {
11911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Iterators.limit(Lists.newArrayList(list).iterator(), 3);
11921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
11931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
11941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetNext_withDefault_singleton() {
11971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = Collections.singletonList("foo").iterator();
11981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("foo", Iterators.getNext(iterator, "bar"));
11991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetNext_withDefault_empty() {
12021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = Iterators.emptyIterator();
12031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("bar", Iterators.getNext(iterator, "bar"));
12041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetNext_withDefault_empty_null() {
12071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = Iterators.emptyIterator();
12081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(Iterators.getNext(iterator, null));
12091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetNext_withDefault_two() {
12121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = asList("foo", "bar").iterator();
12131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("foo", Iterators.getNext(iterator, "x"));
12141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetLast_basic() {
12171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList();
12181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("a");
12191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("b");
12201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("b", getLast(list.iterator()));
12211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetLast_exception() {
12241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList();
12251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
12261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      getLast(list.iterator());
12271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
12281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchElementException expected) {
12291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetLast_withDefault_singleton() {
12331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = Collections.singletonList("foo").iterator();
12341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("foo", Iterators.getLast(iterator, "bar"));
12351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetLast_withDefault_empty() {
12381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = Iterators.emptyIterator();
12391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("bar", Iterators.getLast(iterator, "bar"));
12401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetLast_withDefault_empty_null() {
12431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = Iterators.emptyIterator();
12441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(Iterators.getLast(iterator, null));
12451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetLast_withDefault_two() {
12481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = asList("foo", "bar").iterator();
12491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("bar", Iterators.getLast(iterator, "x"));
12501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet_basic() {
12531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList();
12541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("a");
12551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("b");
12561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
12571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("b", get(iterator, 1));
12581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
12591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet_atSize() {
12621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList();
12631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("a");
12641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("b");
12651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
12661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
12671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      get(iterator, 2);
12681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
12691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {}
12701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
12711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet_pastEnd() {
12741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList();
12751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("a");
12761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("b");
12771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
12781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
12791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      get(iterator, 5);
12801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
12811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {}
12821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
12831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet_empty() {
12861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList();
12871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
12881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
12891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      get(iterator, 0);
12901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
12911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {}
12921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
12931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet_negativeIndex() {
12961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList("a", "b", "c");
12971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
12981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
12991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      get(iterator, -1);
13001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
13011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {}
13021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet_withDefault_basic() {
13051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList();
13061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("a");
13071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("b");
13081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
13091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("a", get(iterator, 0, "c"));
13101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.hasNext());
13111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet_withDefault_atSize() {
13141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList();
13151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("a");
13161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("b");
13171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
13181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("c", get(iterator, 2, "c"));
13191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
13201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet_withDefault_pastEnd() {
13231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList();
13241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("a");
13251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("b");
13261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
13271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("c", get(iterator, 3, "c"));
13281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
13291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet_withDefault_negativeIndex() {
13321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList();
13331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("a");
13341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("b");
13351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
13361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
13371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      get(iterator, -1, "c");
13381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
13391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {
13401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // pass
13411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.hasNext());
13431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSkip_basic() {
13461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList();
13471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("a");
13481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("b");
13491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
13501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    skip(iterator, 1);
13511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("b", iterator.next());
13521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSkip_pastEnd() {
13551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList();
13561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("a");
13571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("b");
13581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
13591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    skip(iterator, 5);
13601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
13611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSkip_illegalArgument() {
13641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList("a", "b", "c");
13651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = list.iterator();
13661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
13671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      skip(iterator, -1);
13681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
13691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {}
13701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFrequency() {
13731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList("a", null, "b", null, "a", null);
13741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, Iterators.frequency(list.iterator(), "a"));
13751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, Iterators.frequency(list.iterator(), "b"));
13761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, Iterators.frequency(list.iterator(), "c"));
13771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, Iterators.frequency(list.iterator(), 4.2));
13781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, Iterators.frequency(list.iterator(), null));
13791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("slow (~4s)")
13821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSingletonIterator() {
13831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new IteratorTester<Integer>(
13841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        3, UNMODIFIABLE, singleton(1), IteratorTester.KnownOrder.KNOWN_ORDER) {
13851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<Integer> newTargetIterator() {
13861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Iterators.singletonIterator(1);
13871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
13881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
13891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveAll() {
13921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList("a", "b", "c", "d", "e");
13931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterators.removeAll(
13941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        list.iterator(), newArrayList("b", "d", "f")));
13951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(newArrayList("a", "c", "e"), list);
13961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterators.removeAll(
13971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        list.iterator(), newArrayList("x", "y", "z")));
13981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(newArrayList("a", "c", "e"), list);
13991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
14001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
14011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveIf() {
14021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList("a", "b", "c", "d", "e");
14031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterators.removeIf(
14041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        list.iterator(),
14051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new Predicate<String>() {
14061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
14071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public boolean apply(String s) {
14081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return s.equals("b") || s.equals("d") || s.equals("f");
14091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
14101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }));
14111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(newArrayList("a", "c", "e"), list);
14121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterators.removeIf(
14131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        list.iterator(),
14141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new Predicate<String>() {
14151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
14161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public boolean apply(String s) {
14171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return s.equals("x") || s.equals("y") || s.equals("z");
14181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
14191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }));
14201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(newArrayList("a", "c", "e"), list);
14211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
14221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
14231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll() {
14241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList("a", "b", "c", "d", "e");
14251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterators.retainAll(
14261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        list.iterator(), newArrayList("b", "d", "f")));
14271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(newArrayList("b", "d"), list);
14281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterators.retainAll(
14291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        list.iterator(), newArrayList("b", "e", "d")));
14301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(newArrayList("b", "d"), list);
14311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
14321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
14331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("ListTestSuiteBuilder")
14341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static Test testsForRemoveAllAndRetainAll() {
14351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return ListTestSuiteBuilder.using(new TestStringListGenerator() {
14361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override public List<String> create(final String[] elements) {
14371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            final List<String> delegate = newArrayList(elements);
14381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return new ForwardingList<String>() {
14391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              @Override protected List<String> delegate() {
14401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                return delegate;
14411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              }
14421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
14431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              @Override public boolean removeAll(Collection<?> c) {
14441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                return Iterators.removeAll(iterator(), c);
14451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              }
14461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
14471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              @Override public boolean retainAll(Collection<?> c) {
14481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                return Iterators.retainAll(iterator(), c);
14491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert              }
14501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            };
14511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
14521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        })
14531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .named("ArrayList with Iterators.removeAll and retainAll")
14541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .withFeatures(
14551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            ListFeature.GENERAL_PURPOSE,
14561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionFeature.ALLOWS_NULL_VALUES,
14571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            CollectionSize.ANY)
14581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .createTestSuite();
14591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
14601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
14611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConsumingIterator() {
14621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Test data
14631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Lists.newArrayList("a", "b");
14641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
14651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Test & Verify
14661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> consumingIterator =
14671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterators.consumingIterator(list.iterator());
14681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
14691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(list).hasContentsInOrder("a", "b");
14701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
14711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(consumingIterator.hasNext());
14721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(list).hasContentsInOrder("a", "b");
14731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("a", consumingIterator.next());
14741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(list).hasContentsInOrder("b");
14751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
14761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(consumingIterator.hasNext());
14771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("b", consumingIterator.next());
14781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(list).isEmpty();
14791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
14801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(consumingIterator.hasNext());
14811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
14821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
14831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("?")
14841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // TODO: Figure out why this is failing in GWT.
14851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConsumingIterator_duelingIterators() {
14861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Test data
14871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Lists.newArrayList("a", "b");
14881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
14891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Test & Verify
14901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> i1 = Iterators.consumingIterator(list.iterator());
14911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> i2 = Iterators.consumingIterator(list.iterator());
14921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
14931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    i1.next();
14941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
14951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      i2.next();
14961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("Concurrent modification should throw an exception.");
14971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (ConcurrentModificationException cme) {
14981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // Pass
14991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
15001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
15011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
15021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIndexOf_consumedData() {
15031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator =
15041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Lists.newArrayList("manny", "mo", "jack").iterator();
15051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, Iterators.indexOf(iterator, Predicates.equalTo("mo")));
15061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("jack", iterator.next());
15071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
15081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
15091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
15101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIndexOf_consumedDataWithDuplicates() {
15111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator =
15121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Lists.newArrayList("manny", "mo", "mo", "jack").iterator();
15131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, Iterators.indexOf(iterator, Predicates.equalTo("mo")));
15141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("mo", iterator.next());
15151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("jack", iterator.next());
15161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
15171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
15181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
15191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIndexOf_consumedDataNoMatch() {
15201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator =
15211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Lists.newArrayList("manny", "mo", "mo", "jack").iterator();
15221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-1, Iterators.indexOf(iterator, Predicates.equalTo("bob")));
15231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
15241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
15251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
15261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("deprecation")
15271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testUnmodifiableIteratorShortCircuit() {
15281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> mod = Lists.newArrayList("a", "b", "c").iterator();
15291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    UnmodifiableIterator<String> unmod = Iterators.unmodifiableIterator(mod);
15301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNotSame(mod, unmod);
15311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(unmod, Iterators.unmodifiableIterator(unmod));
15321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(unmod, Iterators.unmodifiableIterator((Iterator<String>) unmod));
15331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
15341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
15351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("deprecation")
15361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPeekingIteratorShortCircuit() {
15371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> nonpeek = Lists.newArrayList("a", "b", "c").iterator();
15381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    PeekingIterator<String> peek = Iterators.peekingIterator(nonpeek);
15391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNotSame(peek, nonpeek);
15401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(peek, Iterators.peekingIterator(peek));
15411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(peek, Iterators.peekingIterator((Iterator<String>) peek));
15421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
15431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
1544