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