11d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/*
21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 The Guava Authors
31d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License");
51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License.
61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at
71d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
81d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * http://www.apache.org/licenses/LICENSE-2.0
91d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unless required by applicable law or agreed to in writing, software
111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS,
121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and
141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License.
151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpackage com.google.common.collect;
181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.Iterables.skip;
201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.Lists.newArrayList;
211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.Sets.newLinkedHashSet;
221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.IteratorFeature.MODIFIABLE;
231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.collect.testing.IteratorFeature.UNMODIFIABLE;
241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.Arrays.asList;
251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static java.util.Collections.emptyList;
261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static org.junit.contrib.truth.Truth.ASSERT;
271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtCompatible;
291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.GwtIncompatible;
301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Function;
311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Optional;
321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Predicate;
331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.base.Predicates;
341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.collect.testing.IteratorTester;
351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.testing.NullPointerTester;
361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport junit.framework.TestCase;
381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.ArrayList;
401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Arrays;
411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collection;
421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Collections;
431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.ConcurrentModificationException;
441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Iterator;
451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.List;
461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.NoSuchElementException;
471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Queue;
481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.RandomAccess;
491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.Set;
501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.SortedSet;
511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.TreeSet;
521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert/**
541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Unit test for {@code Iterables}.
551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert *
561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Kevin Bourrillion
571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @author Jared Levy
581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */
591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true)
601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertpublic class IterablesTest extends TestCase {
611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSize0() {
631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = Collections.emptySet();
641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, Iterables.size(iterable));
651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSize1Collection() {
681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = Collections.singleton("a");
691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, Iterables.size(iterable));
701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSize2NonCollection() {
731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<Integer> iterable = new Iterable<Integer>() {
741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override
751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      public Iterator<Integer> iterator() {
761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return asList(0, 1).iterator();
771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, Iterables.size(iterable));
801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("serial")
831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSize_collection_doesntIterate() {
841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> nums = asList(1, 2, 3, 4, 5);
851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> collection = new ArrayList<Integer>(nums) {
861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override public Iterator<Integer> iterator() {
871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        fail("Don't iterate me!");
881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return null;
891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(5, Iterables.size(collection));
921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static Iterable<String> iterable(String... elements) {
951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final List<String> list = asList(elements);
961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new Iterable<String>() {
971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override
981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      public Iterator<String> iterator() {
991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return list.iterator();
1001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
1011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
1021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void test_contains_null_set_yes() {
1051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> set = Sets.newHashSet("a", null, "b");
1061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterables.contains(set, null));
1071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void test_contains_null_set_no() {
1101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> set = Sets.newHashSet("a", "b");
1111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterables.contains(set, null));
1121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void test_contains_null_iterable_yes() {
1151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> set = iterable("a", null, "b");
1161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterables.contains(set, null));
1171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void test_contains_null_iterable_no() {
1201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> set = iterable("a", "b");
1211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterables.contains(set, null));
1221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void test_contains_nonnull_set_yes() {
1251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> set = Sets.newHashSet("a", null, "b");
1261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterables.contains(set, "b"));
1271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void test_contains_nonnull_set_no() {
1301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> set = Sets.newHashSet("a", "b");
1311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterables.contains(set, "c"));
1321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void test_contains_nonnull_iterable_yes() {
1351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> set = iterable("a", null, "b");
1361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterables.contains(set, "b"));
1371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void test_contains_nonnull_iterable_no() {
1401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> set = iterable("a", "b");
1411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterables.contains(set, "c"));
1421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetOnlyElement_noDefault_valid() {
1451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = Collections.singletonList("foo");
1461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("foo", Iterables.getOnlyElement(iterable));
1471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetOnlyElement_noDefault_empty() {
1501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = Collections.emptyList();
1511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterables.getOnlyElement(iterable);
1531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchElementException expected) {
1551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetOnlyElement_noDefault_multiple() {
1591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = asList("foo", "bar");
1601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterables.getOnlyElement(iterable);
1621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetOnlyElement_withDefault_singleton() {
1681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = Collections.singletonList("foo");
1691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("foo", Iterables.getOnlyElement(iterable, "bar"));
1701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetOnlyElement_withDefault_empty() {
1731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = Collections.emptyList();
1741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("bar", Iterables.getOnlyElement(iterable, "bar"));
1751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetOnlyElement_withDefault_empty_null() {
1781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = Collections.emptyList();
1791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(Iterables.getOnlyElement(iterable, null));
1801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetOnlyElement_withDefault_multiple() {
1831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = asList("foo", "bar");
1841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
1851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterables.getOnlyElement(iterable, "x");
1861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
1871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Iterables.toArray(Iterable, Class)")
1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testToArrayEmpty() {
1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = Collections.emptyList();
1941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String[] array = Iterables.toArray(iterable, String.class);
1951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Arrays.equals(new String[0], array));
1961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
1971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
1981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Iterables.toArray(Iterable, Class)")
1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testToArraySingleton() {
2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = Collections.singletonList("a");
2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String[] array = Iterables.toArray(iterable, String.class);
2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Arrays.equals(new String[] {"a"}, array));
2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Iterables.toArray(Iterable, Class)")
2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testToArray() {
2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String[] sourceArray = new String[] {"a", "b", "c"};
2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = asList(sourceArray);
2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String[] newArray = Iterables.toArray(iterable, String.class);
2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Arrays.equals(sourceArray, newArray));
2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFilter() {
2141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> unfiltered = newArrayList("foo", "bar");
2151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> filtered = Iterables.filter(unfiltered,
2161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert                                                 Predicates.equalTo("foo"));
2171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> expected = Collections.singletonList("foo");
2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> actual = newArrayList(filtered);
2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, actual);
2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertCanIterateAgain(filtered);
2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[foo]", filtered.toString());
2231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAny() {
2261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList();
2271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<String> predicate = Predicates.equalTo("pants");
2281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterables.any(list, predicate));
2301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("cool");
2311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterables.any(list, predicate));
2321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("pants");
2331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterables.any(list, predicate));
2341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAll() {
2371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList();
2381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Predicate<String> predicate = Predicates.equalTo("cool");
2391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterables.all(list, predicate));
2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("cool");
2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterables.all(list, predicate));
2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("pants");
2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterables.all(list, predicate));
2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFind() {
2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> list = newArrayList("cool", "pants");
2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("cool", Iterables.find(list, Predicates.equalTo("cool")));
2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("pants", Iterables.find(list, Predicates.equalTo("pants")));
2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterables.find(list, Predicates.alwaysFalse());
2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
2541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchElementException e) {
2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("cool", Iterables.find(list, Predicates.alwaysTrue()));
2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertCanIterateAgain(list);
2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFind_withDefault() {
2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> list = Lists.newArrayList("cool", "pants");
2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("cool",
2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterables.find(list, Predicates.equalTo("cool"), "woot"));
2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("pants",
2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterables.find(list, Predicates.equalTo("pants"), "woot"));
2661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("woot", Iterables.find(list,
2671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Predicates.alwaysFalse(), "woot"));
2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(Iterables.find(list, Predicates.alwaysFalse(), null));
2691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("cool",
2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterables.find(list, Predicates.alwaysTrue(), "woot"));
2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertCanIterateAgain(list);
2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTryFind() {
2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> list = newArrayList("cool", "pants");
2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Optional.of("cool"),
2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterables.tryFind(list, Predicates.equalTo("cool")));
2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Optional.of("pants"),
2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterables.tryFind(list, Predicates.equalTo("pants")));
2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Optional.of("cool"),
2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterables.tryFind(list, Predicates.alwaysTrue()));
2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Optional.absent(),
2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterables.tryFind(list, Predicates.alwaysFalse()));
2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertCanIterateAgain(list);
2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class TypeA {}
2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private interface TypeB {}
2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class HasBoth extends TypeA implements TypeB {}
2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("Iterables.filter(Iterable, Class)")
2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFilterByType() throws Exception {
2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    HasBoth hasBoth = new HasBoth();
2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<TypeA> alist = Lists
2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        .newArrayList(new TypeA(), new TypeA(), hasBoth, new TypeA());
2961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<TypeB> blist = Iterables.filter(alist, TypeB.class);
2971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(blist).hasContentsInOrder(hasBoth);
2981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
2991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testTransform() {
3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> input = asList("1", "2", "3");
3021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<Integer> result = Iterables.transform(input,
3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new Function<String, Integer>() {
3041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
3051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public Integer apply(String from) {
3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Integer.valueOf(from);
3071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
3081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        });
3091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> actual = newArrayList(result);
3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> expected = asList(1, 2, 3);
3121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, actual);
3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertCanIterateAgain(result);
3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[1, 2, 3]", result.toString());
3151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPoorlyBehavedTransform() {
3181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> input = asList("1", null, "3");
3191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<Integer> result = Iterables.transform(input,
3201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new Function<String, Integer>() {
3211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
3221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public Integer apply(String from) {
3231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Integer.valueOf(from);
3241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
3251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        });
3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> resultIterator = result.iterator();
3281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    resultIterator.next();
3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
3311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      resultIterator.next();
3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("Expected NFE");
3331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NumberFormatException nfe) {
3341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // Expected to fail.
3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNullFriendlyTransform() {
3391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> input = asList(1, 2, null, 3);
3401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> result = Iterables.transform(input,
3411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new Function<Integer, String>() {
3421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
3431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public String apply(Integer from) {
3441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return String.valueOf(from);
3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        });
3471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> actual = newArrayList(result);
3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> expected = asList("1", "2", "null", "3");
3501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, actual);
3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Far less exhaustive than the tests in IteratorsTest
3541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testCycle() {
3551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> cycle = Iterables.cycle("a", "b");
3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    int howManyChecked = 0;
3581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (String string : cycle) {
3591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      String expected = (howManyChecked % 2 == 0) ? "a" : "b";
3601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals(expected, string);
3611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      if (howManyChecked++ == 5) {
3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        break;
3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
3641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // We left the last iterator pointing to "b". But a new iterator should
3671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // always point to "a".
3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (String string : cycle) {
3691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      assertEquals("a", string);
3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      break;
3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
3721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[a, b] (cycled)", cycle.toString());
3741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Again, the exhaustive tests are in IteratorsTest
3771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConcatIterable() {
3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> list1 = newArrayList(1);
3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> list2 = newArrayList(4);
3801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @SuppressWarnings("unchecked")
3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<List<Integer>> input = newArrayList(list1, list2);
3831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<Integer> result = Iterables.concat(input);
3851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList(1, 4), newArrayList(result));
3861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Now change the inputs and see result dynamically change as well
3881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list1.add(2);
3901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> list3 = newArrayList(3);
3911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    input.add(1, list3);
3921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList(1, 2, 3, 4), newArrayList(result));
3941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[1, 2, 3, 4]", result.toString());
3951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
3961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
3971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConcatVarargs() {
3981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> list1 = newArrayList(1);
3991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> list2 = newArrayList(4);
4001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> list3 = newArrayList(7, 8);
4011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> list4 = newArrayList(9);
4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> list5 = newArrayList(10);
4031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @SuppressWarnings("unchecked")
4041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<Integer> result =
4051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterables.concat(list1, list2, list3, list4, list5);
4061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList(1, 4, 7, 8, 9, 10), newArrayList(result));
4071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[1, 4, 7, 8, 9, 10]", result.toString());
4081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConcatNullPointerException() {
4111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> list1 = newArrayList(1);
4121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> list2 = newArrayList(4);
4131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
4151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterables.concat(list1, null, list2);
4161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
4171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NullPointerException expected) {}
4181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConcatPeformingFiniteCycle() {
4211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<Integer> iterable = asList(1, 2, 3);
4221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    int n = 4;
4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<Integer> repeated
4241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = Iterables.concat(Collections.nCopies(n, iterable));
4251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(repeated).hasContentsInOrder(
4261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3);
4271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPartition_badSize() {
4301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<Integer> source = Collections.singleton(1);
4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterables.partition(source, 0);
4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
4341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {
4351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
4361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPartition_empty() {
4391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<Integer> source = Collections.emptySet();
4401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<List<Integer>> partitions = Iterables.partition(source, 1);
4411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterables.isEmpty(partitions));
4421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPartition_singleton1() {
4451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<Integer> source = Collections.singleton(1);
4461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<List<Integer>> partitions = Iterables.partition(source, 1);
4471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, Iterables.size(partitions));
4481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Collections.singletonList(1), partitions.iterator().next());
4491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPartition_view() {
4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> list = asList(1, 2);
4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<List<Integer>> partitions = Iterables.partition(list, 2);
4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Changes before the partition is retrieved are reflected
4561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.set(0, 3);
4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<List<Integer>> iterator = partitions.iterator();
4591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Changes before the partition is retrieved are reflected
4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.set(1, 4);
4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> first = iterator.next();
4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Changes after are not
4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.set(0, 5);
4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(ImmutableList.of(3, 4), first);
4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("?")
4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // TODO: Figure out why this is failing in GWT.
4731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPartitionRandomAccessInput() {
4741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<Integer> source = asList(1, 2, 3);
4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<List<Integer>> partitions = Iterables.partition(source, 2);
4761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<List<Integer>> iterator = partitions.iterator();
4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.next() instanceof RandomAccess);
4781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.next() instanceof RandomAccess);
4791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("?")
4821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // TODO: Figure out why this is failing in GWT.
4831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPartitionNonRandomAccessInput() {
4841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<Integer> source = Lists.newLinkedList(asList(1, 2, 3));
4851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<List<Integer>> partitions = Iterables.partition(source, 2);
4861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<List<Integer>> iterator = partitions.iterator();
4871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Even though the input list doesn't implement RandomAccess, the output
4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // lists do.
4891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.next() instanceof RandomAccess);
4901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.next() instanceof RandomAccess);
4911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
4931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPaddedPartition_basic() {
4941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> list = asList(1, 2, 3, 4, 5);
4951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<List<Integer>> partitions = Iterables.paddedPartition(list, 2);
4961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, Iterables.size(partitions));
4971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(asList(5, null), Iterables.getLast(partitions));
4981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPaddedPartitionRandomAccessInput() {
5011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<Integer> source = asList(1, 2, 3);
5021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<List<Integer>> partitions = Iterables.paddedPartition(source, 2);
5031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<List<Integer>> iterator = partitions.iterator();
5041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.next() instanceof RandomAccess);
5051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.next() instanceof RandomAccess);
5061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testPaddedPartitionNonRandomAccessInput() {
5091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<Integer> source = Lists.newLinkedList(asList(1, 2, 3));
5101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<List<Integer>> partitions = Iterables.paddedPartition(source, 2);
5111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<List<Integer>> iterator = partitions.iterator();
5121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Even though the input list doesn't implement RandomAccess, the output
5131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // lists do.
5141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.next() instanceof RandomAccess);
5151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(iterator.next() instanceof RandomAccess);
5161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // More tests in IteratorsTest
5191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testAddAllToList() {
5201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> alreadyThere = newArrayList("already", "there");
5211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> freshlyAdded = newArrayList("freshly", "added");
5221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    boolean changed = Iterables.addAll(alreadyThere, freshlyAdded);
5241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(alreadyThere).hasContentsInOrder(
5251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        "already", "there", "freshly", "added");
5261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(changed);
5271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static void assertCanIterateAgain(Iterable<?> iterable) {
5301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (@SuppressWarnings("unused") Object obj : iterable) {
5311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
5321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("NullPointerTester")
5351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testNullPointerExceptions() throws Exception {
5361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    NullPointerTester tester = new NullPointerTester();
5371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    tester.testAllPublicStaticMethods(Iterables.class);
5381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // More exhaustive tests are in IteratorsTest.
5411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testElementsEqual() throws Exception {
5421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<?> a;
5431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<?> b;
5441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // A few elements.
5461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    a = asList(4, 8, 15, 16, 23, 42);
5471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    b = asList(4, 8, 15, 16, 23, 42);
5481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterables.elementsEqual(a, b));
5491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // An element differs.
5511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    a = asList(4, 8, 15, 12, 23, 42);
5521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    b = asList(4, 8, 15, 16, 23, 42);
5531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterables.elementsEqual(a, b));
5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // null versus non-null.
5561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    a = asList(4, 8, 15, null, 23, 42);
5571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    b = asList(4, 8, 15, 16, 23, 42);
5581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterables.elementsEqual(a, b));
5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterables.elementsEqual(b, a));
5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Different lengths.
5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    a = asList(4, 8, 15, 16, 23);
5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    b = asList(4, 8, 15, 16, 23, 42);
5641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterables.elementsEqual(a, b));
5651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterables.elementsEqual(b, a));
5661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("slow (~30s)")
5691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("deprecation") // test of a deprecated method
5701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testReversePassesIteratorsTester() {
5711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new IteratorTester<Integer>(5, MODIFIABLE, newArrayList(2, 4, 6, 8),
5721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IteratorTester.KnownOrder.KNOWN_ORDER) {
5731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<Integer> newTargetIterator() {
5741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Iterables.reverse(newArrayList(8, 6, 4, 2)).iterator();
5751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
5761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
5771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
5781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("deprecation") // test of a deprecated method
5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testReverseWorksAsExpected() {
5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String[] testStrs = new String[] {"foo", "bar", "baz"};
5821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    String[] expected = new String[] {"baz", "bar", "foo"};
5831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> stuff = ImmutableList.copyOf(testStrs);
5851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> reversed = Iterables.reverse(stuff);
5871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(reversed).hasContentsInOrder(expected);
5881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[baz, bar, foo]", reversed.toString());
5891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> removable = newArrayList("foo", "bar", "bad", "baz");
5911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reversed = Iterables.reverse(removable);
5931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(reversed).hasContentsInOrder("baz", "bad", "bar", "foo");
5941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
5951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> reverseIter = reversed.iterator();
5961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("baz", reverseIter.next());
5971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("bad", reverseIter.next());
5981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    reverseIter.remove();
5991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(reversed).hasContentsInOrder(expected);
6011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(reversed).hasContentsInOrder(expected);
6021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testToString() {
6051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Collections.emptyList();
6061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[]", Iterables.toString(list));
6071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list = newArrayList("yam", "bam", "jam", "ham");
6091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[yam, bam, jam, ham]", Iterables.toString(list));
6101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLimit() {
6131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = newArrayList("foo", "bar", "baz");
6141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> limited = Iterables.limit(iterable, 2);
6151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> expected = ImmutableList.of("foo", "bar");
6171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> actual = newArrayList(limited);
6181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(expected, actual);
6191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertCanIterateAgain(limited);
6201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[foo, bar]", limited.toString());
6211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testLimit_illegalArgument() {
6241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList("a", "b", "c");
6251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
6261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterables.limit(list, -1);
6271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
6281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {}
6291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIsEmpty() {
6321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> emptyList = Collections.emptyList();
6331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterables.isEmpty(emptyList));
6341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> singletonList = Collections.singletonList("foo");
6361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterables.isEmpty(singletonList));
6371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSkip_simple() {
6401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> set = ImmutableSet.of("a", "b", "c", "d", "e");
6411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(newArrayList("c", "d", "e"), newArrayList(skip(set, 2)));
6421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[c, d, e]", skip(set, 2).toString());
6431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSkip_simpleList() {
6461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> list = newArrayList("a", "b", "c", "d", "e");
6471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(newArrayList("c", "d", "e"), newArrayList(skip(list, 2)));
6481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[c, d, e]", skip(list, 2).toString());
6491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSkip_pastEnd() {
6521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> set = ImmutableSet.of("a", "b");
6531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(emptyList(), newArrayList(skip(set, 20)));
6541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSkip_pastEndList() {
6571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> list = newArrayList("a", "b");
6581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(emptyList(), newArrayList(skip(list, 20)));
6591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSkip_skipNone() {
6621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> set = ImmutableSet.of("a", "b");
6631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(newArrayList("a", "b"), newArrayList(skip(set, 0)));
6641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSkip_skipNoneList() {
6671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> list = newArrayList("a", "b");
6681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(newArrayList("a", "b"), newArrayList(skip(list, 0)));
6691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("slow (~35s)")
6721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSkip_iterator() {
6731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new IteratorTester<Integer>(5, MODIFIABLE, newArrayList(2, 3),
6741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IteratorTester.KnownOrder.KNOWN_ORDER) {
6751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<Integer> newTargetIterator() {
6761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return skip(newLinkedHashSet(asList(1, 2, 3)), 1).iterator();
6771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
6781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
6791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("slow (~35s)")
6821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSkip_iteratorList() {
6831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new IteratorTester<Integer>(5, MODIFIABLE, newArrayList(2, 3),
6841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IteratorTester.KnownOrder.KNOWN_ORDER) {
6851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<Integer> newTargetIterator() {
6861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return skip(newArrayList(1, 2, 3), 1).iterator();
6871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
6881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
6891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
6901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
6911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSkip_nonStructurallyModifiedList() throws Exception {
6921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList("a", "b", "c");
6931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> tail = skip(list, 1);
6941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> tailIterator = tail.iterator();
6951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.set(2, "C");
6961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("b", tailIterator.next());
6971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("C", tailIterator.next());
6981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(tailIterator.hasNext());
6991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSkip_structurallyModifiedSkipSome() throws Exception {
7021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> set = newLinkedHashSet(asList("a", "b", "c"));
7031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> tail = skip(set, 1);
7041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    set.remove("b");
7051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    set.addAll(newArrayList("A", "B", "C"));
7061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(tail).hasContentsInOrder("c", "A", "B", "C");
7071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSkip_structurallyModifiedSkipSomeList() throws Exception {
7101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList("a", "b", "c");
7111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> tail = skip(list, 1);
7121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.subList(1, 3).clear();
7131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.addAll(0, newArrayList("A", "B", "C"));
7141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(tail).hasContentsInOrder("B", "C", "a");
7151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSkip_structurallyModifiedSkipAll() throws Exception {
7181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Collection<String> set = newLinkedHashSet(asList("a", "b", "c"));
7191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> tail = skip(set, 2);
7201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    set.remove("a");
7211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    set.remove("b");
7221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(tail.iterator().hasNext());
7231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSkip_structurallyModifiedSkipAllList() throws Exception {
7261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList("a", "b", "c");
7271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> tail = skip(list, 2);
7281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.subList(0, 2).clear();
7291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterables.isEmpty(tail));
7301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testSkip_illegalArgument() {
7331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList("a", "b", "c");
7341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
7351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      skip(list, -1);
7361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
7371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IllegalArgumentException expected) {}
7381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void testGetOnAbc(Iterable<String> iterable) {
7411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
7421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterables.get(iterable, -1);
7431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
7441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {}
7451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("a", Iterables.get(iterable, 0));
7461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("b", Iterables.get(iterable, 1));
7471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("c", Iterables.get(iterable, 2));
7481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
7491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterables.get(iterable, 3);
7501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
7511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException nsee) {}
7521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
7531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterables.get(iterable, 4);
7541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
7551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException nsee) {}
7561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void testGetOnEmpty(Iterable<String> iterable) {
7591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
7601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterables.get(iterable, 0);
7611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
7621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {}
7631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet_list() {
7661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testGetOnAbc(newArrayList("a", "b", "c"));
7671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet_emptyList() {
7701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testGetOnEmpty(Collections.<String>emptyList());
7711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet_sortedSet() {
7741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testGetOnAbc(ImmutableSortedSet.of("b", "c", "a"));
7751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet_emptySortedSet() {
7781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testGetOnEmpty(ImmutableSortedSet.<String>of());
7791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet_iterable() {
7821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testGetOnAbc(ImmutableSet.of("a", "b", "c"));
7831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet_emptyIterable() {
7861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    testGetOnEmpty(Sets.<String>newHashSet());
7871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet_withDefault_negativePosition() {
7901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
7911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterables.get(newArrayList("a", "b", "c"), -1, "d");
7921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
7931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (IndexOutOfBoundsException expected) {
7941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // pass
7951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
7961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
7971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
7981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet_withDefault_simple() {
7991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ArrayList<String> list = newArrayList("a", "b", "c");
8001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("b", Iterables.get(list, 1, "d"));
8011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet_withDefault_iterable() {
8041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<String> set = ImmutableSet.of("a", "b", "c");
8051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("b", Iterables.get(set, 1, "d"));
8061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet_withDefault_last() {
8091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ArrayList<String> list = newArrayList("a", "b", "c");
8101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("c", Iterables.get(list, 2, "d"));
8111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet_withDefault_lastPlusOne() {
8141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ArrayList<String> list = newArrayList("a", "b", "c");
8151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("d", Iterables.get(list, 3, "d"));
8161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGet_withDefault_doesntIterate() {
8191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = new DiesOnIteratorArrayList();
8201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    list.add("a");
8211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("a", Iterables.get(list, 0, "b"));
8221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetFirst_withDefault_singleton() {
8251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = Collections.singletonList("foo");
8261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("foo", Iterables.getFirst(iterable, "bar"));
8271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetFirst_withDefault_empty() {
8301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = Collections.emptyList();
8311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("bar", Iterables.getFirst(iterable, "bar"));
8321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetFirst_withDefault_empty_null() {
8351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = Collections.emptyList();
8361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(Iterables.getFirst(iterable, null));
8371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetFirst_withDefault_multiple() {
8401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = asList("foo", "bar");
8411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("foo", Iterables.getFirst(iterable, "qux"));
8421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetLast_list() {
8451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList("a", "b", "c");
8461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("c", Iterables.getLast(list));
8471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetLast_emptyList() {
8501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Collections.emptyList();
8511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
8521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterables.getLast(list);
8531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
8541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchElementException e) {}
8551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetLast_sortedSet() {
8581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SortedSet<String> sortedSet = ImmutableSortedSet.of("b", "c", "a");
8591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("c", Iterables.getLast(sortedSet));
8601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetLast_withDefault_singleton() {
8631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = Collections.singletonList("foo");
8641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("foo", Iterables.getLast(iterable, "bar"));
8651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetLast_withDefault_empty() {
8681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = Collections.emptyList();
8691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("bar", Iterables.getLast(iterable, "bar"));
8701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetLast_withDefault_empty_null() {
8731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = Collections.emptyList();
8741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertNull(Iterables.getLast(iterable, null));
8751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetLast_withDefault_multiple() {
8781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = asList("foo", "bar");
8791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("bar", Iterables.getLast(iterable, "qux"));
8801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
8831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@link ArrayList} extension that forbids the use of
8841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@link Collection#iterator} for tests that need to prove that it isn't
8851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * called.
8861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
8871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class DiesOnIteratorArrayList extends ArrayList<String> {
8881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /**
8891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * @throws UnsupportedOperationException all the time
8901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     */
8911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
8921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Iterator<String> iterator() {
8931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throw new UnsupportedOperationException();
8941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
8951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
8961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
8971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetLast_withDefault_not_empty_list() {
8981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // TODO: verify that this is the best testing strategy.
8991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> diesOnIteratorList = new DiesOnIteratorArrayList();
9001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    diesOnIteratorList.add("bar");
9011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("bar", Iterables.getLast(diesOnIteratorList, "qux"));
9031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /**
9061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@link TreeSet} extension that forbids the use of
9071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * {@link Collection#iterator} for tests that need to prove that it isn't
9081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   * called.
9091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert   */
9101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final class DiesOnIteratorTreeSet extends TreeSet<String> {
9111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /**
9121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * @throws UnsupportedOperationException all the time
9131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     */
9141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override
9151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    public Iterator<String> iterator() {
9161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throw new UnsupportedOperationException();
9171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
9181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetLast_withDefault_not_empty_sortedSet() {
9211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // TODO: verify that this is the best testing strategy.
9221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SortedSet<String> diesOnIteratorSortedSet = new DiesOnIteratorTreeSet();
9231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    diesOnIteratorSortedSet.add("bar");
9241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("bar", Iterables.getLast(diesOnIteratorSortedSet, "qux"));
9261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetLast_emptySortedSet() {
9291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    SortedSet<String> sortedSet = ImmutableSortedSet.of();
9301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
9311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterables.getLast(sortedSet);
9321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
9331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchElementException e) {}
9341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetLast_iterable() {
9371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<String> set = ImmutableSet.of("a", "b", "c");
9381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("c", Iterables.getLast(set));
9391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testGetLast_emptyIterable() {
9421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<String> set = Sets.newHashSet();
9431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
9441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterables.getLast(set);
9451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
9461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchElementException e) {}
9471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testUnmodifiableIterable() {
9501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList("a", "b", "c");
9511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = Iterables.unmodifiableIterable(list);
9521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> iterator = iterable.iterator();
9531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    iterator.next();
9541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
9551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      iterator.remove();
9561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail();
9571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (UnsupportedOperationException expected) {}
9581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[a, b, c]", iterable.toString());
9591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @SuppressWarnings("deprecation") // test of deprecated method
9621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testUnmodifiableIterableShortCircuit() {
9631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList("a", "b", "c");
9641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = Iterables.unmodifiableIterable(list);
9651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable2 = Iterables.unmodifiableIterable(iterable);
9661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(iterable, iterable2);
9671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ImmutableList<String> immutableList = ImmutableList.of("a", "b", "c");
9681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(immutableList, Iterables.unmodifiableIterable(immutableList));
9691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertSame(immutableList,
9701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterables.unmodifiableIterable((List<String>) immutableList));
9711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFrequency_multiset() {
9741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Multiset<String> multiset
9751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        = ImmutableMultiset.of("a", "b", "a", "c", "b", "a");
9761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, Iterables.frequency(multiset, "a"));
9771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, Iterables.frequency(multiset, "b"));
9781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, Iterables.frequency(multiset, "c"));
9791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, Iterables.frequency(multiset, "d"));
9801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, Iterables.frequency(multiset, 4.2));
9811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, Iterables.frequency(multiset, null));
9821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFrequency_set() {
9851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Set<String> set = Sets.newHashSet("a", "b", "c");
9861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, Iterables.frequency(set, "a"));
9871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, Iterables.frequency(set, "b"));
9881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, Iterables.frequency(set, "c"));
9891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, Iterables.frequency(set, "d"));
9901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, Iterables.frequency(set, 4.2));
9911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, Iterables.frequency(set, null));
9921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
9931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
9941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testFrequency_list() {
9951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList("a", "b", "a", "c", "b", "a");
9961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, Iterables.frequency(list, "a"));
9971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(2, Iterables.frequency(list, "b"));
9981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, Iterables.frequency(list, "c"));
9991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, Iterables.frequency(list, "d"));
10001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, Iterables.frequency(list, 4.2));
10011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, Iterables.frequency(list, null));
10021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveAll_collection() {
10051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList("a", "b", "c", "d", "e");
10061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterables.removeAll(list, newArrayList("b", "d", "f")));
10071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(newArrayList("a", "c", "e"), list);
10081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterables.removeAll(list, newArrayList("x", "y", "z")));
10091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(newArrayList("a", "c", "e"), list);
10101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveAll_iterable() {
10131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final List<String> list = newArrayList("a", "b", "c", "d", "e");
10141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = new Iterable<String>() {
10151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override
10161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      public Iterator<String> iterator() {
10171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return list.iterator();
10181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
10191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
10201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterables.removeAll(iterable, newArrayList("b", "d", "f")));
10211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(newArrayList("a", "c", "e"), list);
10221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterables.removeAll(iterable, newArrayList("x", "y", "z")));
10231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(newArrayList("a", "c", "e"), list);
10241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_collection() {
10271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList("a", "b", "c", "d", "e");
10281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterables.retainAll(list, newArrayList("b", "d", "f")));
10291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(newArrayList("b", "d"), list);
10301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterables.retainAll(list, newArrayList("b", "e", "d")));
10311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(newArrayList("b", "d"), list);
10321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRetainAll_iterable() {
10351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final List<String> list = newArrayList("a", "b", "c", "d", "e");
10361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> iterable = new Iterable<String>() {
10371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override
10381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      public Iterator<String> iterator() {
10391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return list.iterator();
10401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
10411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
10421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterables.retainAll(iterable, newArrayList("b", "d", "f")));
10431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(newArrayList("b", "d"), list);
10441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterables.retainAll(iterable, newArrayList("b", "e", "d")));
10451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(newArrayList("b", "d"), list);
10461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveIf_randomAccess() {
10491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList("a", "b", "c", "d", "e");
10501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterables.removeIf(list,
10511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new Predicate<String>() {
10521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
10531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public boolean apply(String s) {
10541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return s.equals("b") || s.equals("d") || s.equals("f");
10551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
10561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }));
10571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(newArrayList("a", "c", "e"), list);
10581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterables.removeIf(list,
10591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new Predicate<String>() {
10601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
10611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public boolean apply(String s) {
10621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return s.equals("x") || s.equals("y") || s.equals("z");
10631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
10641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }));
10651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(newArrayList("a", "c", "e"), list);
10661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveIf_transformedList() {
10691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = newArrayList("1", "2", "3", "4", "5");
10701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> transformed = Lists.transform(list,
10711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new Function<String, Integer>() {
10721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
10731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public Integer apply(String s) {
10741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return Integer.valueOf(s);
10751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
10761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        });
10771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterables.removeIf(transformed,
10781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new Predicate<Integer>() {
10791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
10801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public boolean apply(Integer n) {
10811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return (n & 1) == 0;  // isEven()
10821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
10831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }));
10841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(newArrayList("1", "3", "5"), list);
10851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterables.removeIf(transformed,
10861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new Predicate<Integer>() {
10871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
10881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public boolean apply(Integer n) {
10891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return (n & 1) == 0;  // isEven()
10901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
10911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }));
10921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(newArrayList("1", "3", "5"), list);
10931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
10941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
10951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testRemoveIf_noRandomAccess() {
10961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Lists.newLinkedList(asList("a", "b", "c", "d", "e"));
10971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(Iterables.removeIf(list,
10981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new Predicate<String>() {
10991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
11001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public boolean apply(String s) {
11011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return s.equals("b") || s.equals("d") || s.equals("f");
11021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
11031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }));
11041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(newArrayList("a", "c", "e"), list);
11051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(Iterables.removeIf(list,
11061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new Predicate<String>() {
11071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          @Override
11081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          public boolean apply(String s) {
11091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            return s.equals("x") || s.equals("y") || s.equals("z");
11101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          }
11111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }));
11121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(newArrayList("a", "c", "e"), list);
11131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // The Maps returned by Maps.filterEntries(), Maps.filterKeys(), and
11161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Maps.filterValues() are not tested with removeIf() since Maps are not
11171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Iterable.  Those returned by Iterators.filter() and Iterables.filter()
11181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // are not tested because they are unmodifiable.
11191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIterableWithToString() {
11211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[]", create().toString());
11221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[a]", create("a").toString());
11231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[a, b, c]", create("a", "b", "c").toString());
11241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[c, a, a]", create("c", "a", "a").toString());
11251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIterableWithToStringNull() {
11281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[null]", create((String) null).toString());
11291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[null, null]", create(null, null).toString());
11301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("[, null, a]", create("", null, "a").toString());
11311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  /** Returns a new iterable over the specified strings. */
11341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static Iterable<String> create(String... strings) {
11351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final List<String> list = asList(strings);
11361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    return new Iterables.IterableWithToString<String>() {
11371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override
11381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      public Iterator<String> iterator() {
11391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return list.iterator();
11401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
11411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    };
11421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConsumingIterable() {
11451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Test data
11461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Lists.newArrayList(asList("a", "b"));
11471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Test & Verify
11491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<String> consumingIterable = Iterables.consumingIterable(list);
11501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> consumingIterator = consumingIterable.iterator();
11511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(list).hasContentsInOrder("a", "b");
11531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(consumingIterator.hasNext());
11551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(list).hasContentsInOrder("a", "b");
11561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("a", consumingIterator.next());
11571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(list).hasContentsInOrder("b");
11581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(consumingIterator.hasNext());
11601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals("b", consumingIterator.next());
11611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    ASSERT.that(list).isEmpty();
11621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(consumingIterator.hasNext());
11641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  @GwtIncompatible("?")
11671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // TODO: Figure out why this is failing in GWT.
11681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConsumingIterable_duelingIterators() {
11691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Test data
11701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Lists.newArrayList(asList("a", "b"));
11711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Test & Verify
11731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> i1 = Iterables.consumingIterable(list).iterator();
11741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<String> i2 = Iterables.consumingIterable(list).iterator();
11751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    i1.next();
11771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
11781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      i2.next();
11791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("Concurrent modification should throw an exception.");
11801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (ConcurrentModificationException cme) {
11811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // Pass
11821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
11831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConsumingIterable_queue_iterator() {
11861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    final List<Integer> items = ImmutableList.of(4, 8, 15, 16, 23, 42);
11871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    new IteratorTester<Integer>(
11881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        3,
11891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        UNMODIFIABLE,
11901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        items,
11911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        IteratorTester.KnownOrder.KNOWN_ORDER) {
11921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      @Override protected Iterator<Integer> newTargetIterator() {
11931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        return Iterables.consumingIterable(Lists.newLinkedList(items))
11941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert            .iterator();
11951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
11961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }.test();
11971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
11981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
11991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConsumingIterable_queue_removesFromQueue() {
12001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Queue<Integer> queue = Lists.newLinkedList(asList(5, 14));
12011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> consumingIterator =
12031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterables.consumingIterable(queue).iterator();
12041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(5, queue.peek().intValue());
12061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(5, consumingIterator.next().intValue());
12071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(14, queue.peek().intValue());
12091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(consumingIterator.hasNext());
12101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertTrue(queue.isEmpty());
12111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testConsumingIterable_noIteratorCall() {
12141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Queue<Integer> queue =
12151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        new UnIterableQueue<Integer>(Lists.newLinkedList(asList(5, 14)));
12161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> consumingIterator =
12181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterables.consumingIterable(queue).iterator();
12191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    /*
12201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * Make sure that we can get an element off without calling
12211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     * UnIterableQueue.iterator().
12221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert     */
12231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(5, consumingIterator.next().intValue());
12241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static class UnIterableQueue<T> extends ForwardingQueue<T> {
12271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    private Queue<T> queue;
12281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    UnIterableQueue(Queue<T> queue) {
12301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      this.queue = queue;
12311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override public Iterator<T> iterator() {
12341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      throw new UnsupportedOperationException();
12351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    @Override protected Queue<T> delegate() {
12381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      return queue;
12391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
12401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIndexOf_empty() {
12431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = new ArrayList<String>();
12441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-1, Iterables.indexOf(list, Predicates.equalTo("")));
12451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIndexOf_oneElement() {
12481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Lists.newArrayList("bob");
12491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, Iterables.indexOf(list, Predicates.equalTo("bob")));
12501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-1, Iterables.indexOf(list, Predicates.equalTo("jack")));
12511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIndexOf_twoElements() {
12541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list = Lists.newArrayList("mary", "bob");
12551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, Iterables.indexOf(list, Predicates.equalTo("mary")));
12561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, Iterables.indexOf(list, Predicates.equalTo("bob")));
12571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-1, Iterables.indexOf(list, Predicates.equalTo("jack")));
12581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIndexOf_withDuplicates() {
12611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> list =
12621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Lists.newArrayList("mary", "bob", "bob", "bob", "sam");
12631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(0, Iterables.indexOf(list, Predicates.equalTo("mary")));
12641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(1, Iterables.indexOf(list, Predicates.equalTo("bob")));
12651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(4, Iterables.indexOf(list, Predicates.equalTo("sam")));
12661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(-1, Iterables.indexOf(list, Predicates.equalTo("jack")));
12671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private static final Predicate<CharSequence> STARTSWITH_A =
12701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      new Predicate<CharSequence>() {
12711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        @Override public boolean apply(CharSequence input) {
12721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert          return (input.length() > 0) && (input.charAt(0) == 'a');
12731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        }
12741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      };
12751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIndexOf_genericPredicate() {
12771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<CharSequence> sequences = Lists.newArrayList();
12781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sequences.add("bob");
12791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sequences.add(new StringBuilder("charlie"));
12801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sequences.add(new StringBuffer("henry"));
12811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sequences.add(new StringBuilder("apple"));
12821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    sequences.add("lemon");
12831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, Iterables.indexOf(sequences, STARTSWITH_A));
12851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testIndexOf_genericPredicate2() {
12881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<String> sequences =
12891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Lists.newArrayList("bob", "charlie", "henry", "apple", "lemon");
12901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(3, Iterables.indexOf(sequences, STARTSWITH_A));
12911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
12921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testMergeSorted_empty() {
12941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Setup
12951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<Iterable<Integer>> elements = ImmutableList.of();
12961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
12971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Test
12981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<Integer> iterable =
12991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterables.mergeSorted(elements, Ordering.natural());
13001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Verify
13021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterator<Integer> iterator = iterable.iterator();
13031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertFalse(iterator.hasNext());
13041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    try {
13051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      iterator.next();
13061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      fail("next() on empty iterator should throw NoSuchElementException");
13071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    } catch (NoSuchElementException e) {
13081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      // Huzzah!
13091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testMergeSorted_single_empty() {
13131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Setup
13141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<Integer> iterable0 = ImmutableList.of();
13151d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<Iterable<Integer>> iterables = ImmutableList.of(iterable0);
13161d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13171d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Test & Verify
13181d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    verifyMergeSorted(iterables, ImmutableList.<Integer>of());
13191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testMergeSorted_single() {
13221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Setup
13231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<Integer> iterable0 = ImmutableList.of(1, 2, 3);
13241d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<Iterable<Integer>> iterables = ImmutableList.of(iterable0);
13251d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Test & Verify
13271d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    verifyMergeSorted(iterables, iterable0);
13281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testMergeSorted_pyramid() {
13311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Iterable<Integer>> iterables = Lists.newLinkedList();
13321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> allIntegers = Lists.newArrayList();
13331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    // Creates iterators like: {{}, {0}, {0, 1}, {0, 1, 2}, ...}
13351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = 0; i < 10; i++) {
13361d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<Integer> list = Lists.newLinkedList();
13371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int j = 0; j < i; j++) {
13381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        list.add(j);
13391d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        allIntegers.add(j);
13401d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
13411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      iterables.add(Ordering.natural().sortedCopy(list));
13421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    verifyMergeSorted(iterables, allIntegers);
13451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  // Like the pyramid, but creates more unique values, along with repeated ones.
13481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  public void testMergeSorted_skipping_pyramid() {
13491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Iterable<Integer>> iterables = Lists.newLinkedList();
13501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    List<Integer> allIntegers = Lists.newArrayList();
13511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    for (int i = 0; i < 20; i++) {
13531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      List<Integer> list = Lists.newLinkedList();
13541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      for (int j = 0; j < i; j++) {
13551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        list.add(j * i);
13561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        allIntegers.add(j * i);
13571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      }
13581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      iterables.add(Ordering.natural().sortedCopy(list));
13591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    }
13601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    verifyMergeSorted(iterables, allIntegers);
13621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  private void verifyMergeSorted(Iterable<Iterable<Integer>> iterables,
13651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert      Iterable<Integer> unsortedExpected) {
13661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<Integer> expected =
13671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Ordering.natural().sortedCopy(unsortedExpected);
13681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    Iterable<Integer> mergedIterator =
13701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Iterables.mergeSorted(iterables, Ordering.natural());
13711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert
13721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert    assertEquals(Lists.newLinkedList(expected),
13731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert        Lists.newLinkedList(mergedIterator));
13741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert  }
13751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert}
1376