Home | History | Annotate | Download | only in collect
      1 /*
      2  * Copyright (C) 2007 The Guava Authors
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  * http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.google.common.collect;
     18 
     19 import static com.google.common.collect.Iterators.advance;
     20 import static com.google.common.collect.Iterators.get;
     21 import static com.google.common.collect.Iterators.getLast;
     22 import static com.google.common.collect.Lists.newArrayList;
     23 import static com.google.common.truth.Truth.assertThat;
     24 import static java.util.Arrays.asList;
     25 
     26 import com.google.common.annotations.GwtCompatible;
     27 import com.google.common.base.Function;
     28 import com.google.common.base.Predicate;
     29 import com.google.common.base.Predicates;
     30 
     31 import junit.framework.AssertionFailedError;
     32 import junit.framework.TestCase;
     33 
     34 import java.util.Collections;
     35 import java.util.Enumeration;
     36 import java.util.Iterator;
     37 import java.util.List;
     38 import java.util.ListIterator;
     39 import java.util.NoSuchElementException;
     40 import java.util.RandomAccess;
     41 import java.util.Set;
     42 import java.util.Vector;
     43 
     44 /**
     45  * Unit test for {@code Iterators}.
     46  *
     47  * @author Kevin Bourrillion
     48  */
     49 @GwtCompatible(emulated = true)
     50 public class IteratorsTest extends TestCase {
     51 
     52   public void testEmptyIterator() {
     53     Iterator<String> iterator = Iterators.emptyIterator();
     54     assertFalse(iterator.hasNext());
     55     try {
     56       iterator.next();
     57       fail("no exception thrown");
     58     } catch (NoSuchElementException expected) {
     59     }
     60     try {
     61       iterator.remove();
     62       fail("no exception thrown");
     63     } catch (UnsupportedOperationException expected) {
     64     }
     65   }
     66 
     67   public void testEmptyListIterator() {
     68     ListIterator<String> iterator = Iterators.emptyListIterator();
     69     assertFalse(iterator.hasNext());
     70     assertFalse(iterator.hasPrevious());
     71     assertEquals(0, iterator.nextIndex());
     72     assertEquals(-1, iterator.previousIndex());
     73     try {
     74       iterator.next();
     75       fail("no exception thrown");
     76     } catch (NoSuchElementException expected) {
     77     }
     78     try {
     79       iterator.previous();
     80       fail("no exception thrown");
     81     } catch (NoSuchElementException expected) {
     82     }
     83     try {
     84       iterator.remove();
     85       fail("no exception thrown");
     86     } catch (UnsupportedOperationException expected) {
     87     }
     88     try {
     89       iterator.set("a");
     90       fail("no exception thrown");
     91     } catch (UnsupportedOperationException expected) {
     92     }
     93     try {
     94       iterator.add("a");
     95       fail("no exception thrown");
     96     } catch (UnsupportedOperationException expected) {
     97     }
     98   }
     99 
    100   public void testEmptyModifiableIterator() {
    101     Iterator<String> iterator = Iterators.emptyModifiableIterator();
    102     assertFalse(iterator.hasNext());
    103     try {
    104       iterator.next();
    105       fail("Expected NoSuchElementException");
    106     } catch (NoSuchElementException expected) {
    107     }
    108     try {
    109       iterator.remove();
    110       fail("Expected IllegalStateException");
    111     } catch (IllegalStateException expected) {
    112     }
    113   }
    114 
    115   public void testSize0() {
    116     Iterator<String> iterator = Iterators.emptyIterator();
    117     assertEquals(0, Iterators.size(iterator));
    118   }
    119 
    120   public void testSize1() {
    121     Iterator<Integer> iterator = Collections.singleton(0).iterator();
    122     assertEquals(1, Iterators.size(iterator));
    123   }
    124 
    125   public void testSize_partiallyConsumed() {
    126     Iterator<Integer> iterator = asList(1, 2, 3, 4, 5).iterator();
    127     iterator.next();
    128     iterator.next();
    129     assertEquals(3, Iterators.size(iterator));
    130   }
    131 
    132   public void test_contains_nonnull_yes() {
    133     Iterator<String> set = asList("a", null, "b").iterator();
    134     assertTrue(Iterators.contains(set, "b"));
    135   }
    136 
    137   public void test_contains_nonnull_no() {
    138     Iterator<String> set = asList("a", "b").iterator();
    139     assertFalse(Iterators.contains(set, "c"));
    140   }
    141 
    142   public void test_contains_null_yes() {
    143     Iterator<String> set = asList("a", null, "b").iterator();
    144     assertTrue(Iterators.contains(set, null));
    145   }
    146 
    147   public void test_contains_null_no() {
    148     Iterator<String> set = asList("a", "b").iterator();
    149     assertFalse(Iterators.contains(set, null));
    150   }
    151 
    152   public void testGetOnlyElement_noDefault_valid() {
    153     Iterator<String> iterator = Collections.singletonList("foo").iterator();
    154     assertEquals("foo", Iterators.getOnlyElement(iterator));
    155   }
    156 
    157   public void testGetOnlyElement_noDefault_empty() {
    158     Iterator<String> iterator = Iterators.emptyIterator();
    159     try {
    160       Iterators.getOnlyElement(iterator);
    161       fail();
    162     } catch (NoSuchElementException expected) {
    163     }
    164   }
    165 
    166   public void testGetOnlyElement_noDefault_moreThanOneLessThanFiveElements() {
    167     Iterator<String> iterator = asList("one", "two").iterator();
    168     try {
    169       Iterators.getOnlyElement(iterator);
    170       fail();
    171     } catch (IllegalArgumentException expected) {
    172       assertEquals("expected one element but was: <one, two>",
    173                    expected.getMessage());
    174     }
    175   }
    176 
    177   public void testGetOnlyElement_noDefault_fiveElements() {
    178     Iterator<String> iterator =
    179         asList("one", "two", "three", "four", "five").iterator();
    180     try {
    181       Iterators.getOnlyElement(iterator);
    182       fail();
    183     } catch (IllegalArgumentException expected) {
    184       assertEquals("expected one element but was: "
    185                    + "<one, two, three, four, five>",
    186                    expected.getMessage());
    187     }
    188   }
    189 
    190   public void testGetOnlyElement_noDefault_moreThanFiveElements() {
    191     Iterator<String> iterator =
    192         asList("one", "two", "three", "four", "five", "six").iterator();
    193     try {
    194       Iterators.getOnlyElement(iterator);
    195       fail();
    196     } catch (IllegalArgumentException expected) {
    197       assertEquals("expected one element but was: "
    198                    + "<one, two, three, four, five, ...>",
    199                    expected.getMessage());
    200     }
    201   }
    202 
    203   public void testGetOnlyElement_withDefault_singleton() {
    204     Iterator<String> iterator = Collections.singletonList("foo").iterator();
    205     assertEquals("foo", Iterators.getOnlyElement(iterator, "bar"));
    206   }
    207 
    208   public void testGetOnlyElement_withDefault_empty() {
    209     Iterator<String> iterator = Iterators.emptyIterator();
    210     assertEquals("bar", Iterators.getOnlyElement(iterator, "bar"));
    211   }
    212 
    213   public void testGetOnlyElement_withDefault_empty_null() {
    214     Iterator<String> iterator = Iterators.emptyIterator();
    215     assertNull(Iterators.getOnlyElement(iterator, null));
    216   }
    217 
    218   public void testGetOnlyElement_withDefault_two() {
    219     Iterator<String> iterator = asList("foo", "bar").iterator();
    220     try {
    221       Iterators.getOnlyElement(iterator, "x");
    222       fail();
    223     } catch (IllegalArgumentException expected) {
    224       assertEquals("expected one element but was: <foo, bar>",
    225                    expected.getMessage());
    226     }
    227   }
    228 
    229   public void testFilterSimple() {
    230     Iterator<String> unfiltered = Lists.newArrayList("foo", "bar").iterator();
    231     Iterator<String> filtered = Iterators.filter(unfiltered,
    232                                                  Predicates.equalTo("foo"));
    233     List<String> expected = Collections.singletonList("foo");
    234     List<String> actual = Lists.newArrayList(filtered);
    235     assertEquals(expected, actual);
    236   }
    237 
    238   public void testFilterNoMatch() {
    239     Iterator<String> unfiltered = Lists.newArrayList("foo", "bar").iterator();
    240     Iterator<String> filtered = Iterators.filter(unfiltered,
    241                                                  Predicates.alwaysFalse());
    242     List<String> expected = Collections.emptyList();
    243     List<String> actual = Lists.newArrayList(filtered);
    244     assertEquals(expected, actual);
    245   }
    246 
    247   public void testFilterMatchAll() {
    248     Iterator<String> unfiltered = Lists.newArrayList("foo", "bar").iterator();
    249     Iterator<String> filtered = Iterators.filter(unfiltered,
    250                                                  Predicates.alwaysTrue());
    251     List<String> expected = Lists.newArrayList("foo", "bar");
    252     List<String> actual = Lists.newArrayList(filtered);
    253     assertEquals(expected, actual);
    254   }
    255 
    256   public void testFilterNothing() {
    257     Iterator<String> unfiltered = Collections.<String>emptyList().iterator();
    258     Iterator<String> filtered = Iterators.filter(unfiltered,
    259         new Predicate<String>() {
    260           @Override
    261           public boolean apply(String s) {
    262             throw new AssertionFailedError("Should never be evaluated");
    263           }
    264         });
    265 
    266     List<String> expected = Collections.emptyList();
    267     List<String> actual = Lists.newArrayList(filtered);
    268     assertEquals(expected, actual);
    269   }
    270 
    271   public void testAny() {
    272     List<String> list = Lists.newArrayList();
    273     Predicate<String> predicate = Predicates.equalTo("pants");
    274 
    275     assertFalse(Iterators.any(list.iterator(), predicate));
    276     list.add("cool");
    277     assertFalse(Iterators.any(list.iterator(), predicate));
    278     list.add("pants");
    279     assertTrue(Iterators.any(list.iterator(), predicate));
    280   }
    281 
    282   public void testAll() {
    283     List<String> list = Lists.newArrayList();
    284     Predicate<String> predicate = Predicates.equalTo("cool");
    285 
    286     assertTrue(Iterators.all(list.iterator(), predicate));
    287     list.add("cool");
    288     assertTrue(Iterators.all(list.iterator(), predicate));
    289     list.add("pants");
    290     assertFalse(Iterators.all(list.iterator(), predicate));
    291   }
    292 
    293   public void testFind_firstElement() {
    294     Iterable<String> list = Lists.newArrayList("cool", "pants");
    295     Iterator<String> iterator = list.iterator();
    296     assertEquals("cool", Iterators.find(iterator, Predicates.equalTo("cool")));
    297     assertEquals("pants", iterator.next());
    298   }
    299 
    300   public void testFind_lastElement() {
    301     Iterable<String> list = Lists.newArrayList("cool", "pants");
    302     Iterator<String> iterator = list.iterator();
    303     assertEquals("pants", Iterators.find(iterator,
    304         Predicates.equalTo("pants")));
    305     assertFalse(iterator.hasNext());
    306   }
    307 
    308   public void testFind_notPresent() {
    309     Iterable<String> list = Lists.newArrayList("cool", "pants");
    310     Iterator<String> iterator = list.iterator();
    311     try {
    312       Iterators.find(iterator, Predicates.alwaysFalse());
    313       fail();
    314     } catch (NoSuchElementException e) {
    315     }
    316     assertFalse(iterator.hasNext());
    317   }
    318 
    319   public void testFind_matchAlways() {
    320     Iterable<String> list = Lists.newArrayList("cool", "pants");
    321     Iterator<String> iterator = list.iterator();
    322     assertEquals("cool", Iterators.find(iterator, Predicates.alwaysTrue()));
    323   }
    324 
    325   public void testFind_withDefault_first() {
    326     Iterable<String> list = Lists.newArrayList("cool", "pants");
    327     Iterator<String> iterator = list.iterator();
    328     assertEquals("cool",
    329         Iterators.find(iterator, Predicates.equalTo("cool"), "woot"));
    330     assertEquals("pants", iterator.next());
    331   }
    332 
    333   public void testFind_withDefault_last() {
    334     Iterable<String> list = Lists.newArrayList("cool", "pants");
    335     Iterator<String> iterator = list.iterator();
    336     assertEquals("pants",
    337         Iterators.find(iterator, Predicates.equalTo("pants"), "woot"));
    338     assertFalse(iterator.hasNext());
    339   }
    340 
    341   public void testFind_withDefault_notPresent() {
    342     Iterable<String> list = Lists.newArrayList("cool", "pants");
    343     Iterator<String> iterator = list.iterator();
    344     assertEquals("woot",
    345         Iterators.find(iterator, Predicates.alwaysFalse(), "woot"));
    346     assertFalse(iterator.hasNext());
    347   }
    348 
    349   public void testFind_withDefault_notPresent_nullReturn() {
    350     Iterable<String> list = Lists.newArrayList("cool", "pants");
    351     Iterator<String> iterator = list.iterator();
    352     assertNull(
    353         Iterators.find(iterator, Predicates.alwaysFalse(), null));
    354     assertFalse(iterator.hasNext());
    355   }
    356 
    357   public void testFind_withDefault_matchAlways() {
    358     Iterable<String> list = Lists.newArrayList("cool", "pants");
    359     Iterator<String> iterator = list.iterator();
    360     assertEquals("cool",
    361         Iterators.find(iterator, Predicates.alwaysTrue(), "woot"));
    362     assertEquals("pants", iterator.next());
    363   }
    364 
    365   public void testTryFind_firstElement() {
    366     Iterable<String> list = Lists.newArrayList("cool", "pants");
    367     Iterator<String> iterator = list.iterator();
    368     assertEquals("cool",
    369         Iterators.tryFind(iterator, Predicates.equalTo("cool")).get());
    370   }
    371 
    372   public void testTryFind_lastElement() {
    373     Iterable<String> list = Lists.newArrayList("cool", "pants");
    374     Iterator<String> iterator = list.iterator();
    375     assertEquals("pants",
    376         Iterators.tryFind(iterator, Predicates.equalTo("pants")).get());
    377   }
    378 
    379   public void testTryFind_alwaysTrue() {
    380     Iterable<String> list = Lists.newArrayList("cool", "pants");
    381     Iterator<String> iterator = list.iterator();
    382     assertEquals("cool",
    383         Iterators.tryFind(iterator, Predicates.alwaysTrue()).get());
    384   }
    385 
    386   public void testTryFind_alwaysFalse_orDefault() {
    387     Iterable<String> list = Lists.newArrayList("cool", "pants");
    388     Iterator<String> iterator = list.iterator();
    389     assertEquals("woot",
    390         Iterators.tryFind(iterator, Predicates.alwaysFalse()).or("woot"));
    391     assertFalse(iterator.hasNext());
    392   }
    393 
    394   public void testTryFind_alwaysFalse_isPresent() {
    395     Iterable<String> list = Lists.newArrayList("cool", "pants");
    396     Iterator<String> iterator = list.iterator();
    397     assertFalse(
    398         Iterators.tryFind(iterator, Predicates.alwaysFalse()).isPresent());
    399     assertFalse(iterator.hasNext());
    400   }
    401 
    402   public void testTransform() {
    403     Iterator<String> input = asList("1", "2", "3").iterator();
    404     Iterator<Integer> result = Iterators.transform(input,
    405         new Function<String, Integer>() {
    406           @Override
    407           public Integer apply(String from) {
    408             return Integer.valueOf(from);
    409           }
    410         });
    411 
    412     List<Integer> actual = Lists.newArrayList(result);
    413     List<Integer> expected = asList(1, 2, 3);
    414     assertEquals(expected, actual);
    415   }
    416 
    417   public void testTransformRemove() {
    418     List<String> list = Lists.newArrayList("1", "2", "3");
    419     Iterator<String> input = list.iterator();
    420     Iterator<Integer> iterator = Iterators.transform(input,
    421         new Function<String, Integer>() {
    422           @Override
    423           public Integer apply(String from) {
    424             return Integer.valueOf(from);
    425           }
    426         });
    427 
    428     assertEquals(Integer.valueOf(1), iterator.next());
    429     assertEquals(Integer.valueOf(2), iterator.next());
    430     iterator.remove();
    431     assertEquals(asList("1", "3"), list);
    432   }
    433 
    434   public void testPoorlyBehavedTransform() {
    435     Iterator<String> input = asList("1", null, "3").iterator();
    436     Iterator<Integer> result = Iterators.transform(input,
    437         new Function<String, Integer>() {
    438           @Override
    439           public Integer apply(String from) {
    440             return Integer.valueOf(from);
    441           }
    442         });
    443 
    444     result.next();
    445     try {
    446       result.next();
    447       fail("Expected NFE");
    448     } catch (NumberFormatException nfe) {
    449       // Expected to fail.
    450     }
    451   }
    452 
    453   public void testNullFriendlyTransform() {
    454     Iterator<Integer> input = asList(1, 2, null, 3).iterator();
    455     Iterator<String> result = Iterators.transform(input,
    456         new Function<Integer, String>() {
    457           @Override
    458           public String apply(Integer from) {
    459             return String.valueOf(from);
    460           }
    461         });
    462 
    463     List<String> actual = Lists.newArrayList(result);
    464     List<String> expected = asList("1", "2", "null", "3");
    465     assertEquals(expected, actual);
    466   }
    467 
    468   public void testCycleOfEmpty() {
    469     // "<String>" for javac 1.5.
    470     Iterator<String> cycle = Iterators.<String>cycle();
    471     assertFalse(cycle.hasNext());
    472   }
    473 
    474   public void testCycleOfOne() {
    475     Iterator<String> cycle = Iterators.cycle("a");
    476     for (int i = 0; i < 3; i++) {
    477       assertTrue(cycle.hasNext());
    478       assertEquals("a", cycle.next());
    479     }
    480   }
    481 
    482   public void testCycleOfOneWithRemove() {
    483     Iterable<String> iterable = Lists.newArrayList("a");
    484     Iterator<String> cycle = Iterators.cycle(iterable);
    485     assertTrue(cycle.hasNext());
    486     assertEquals("a", cycle.next());
    487     cycle.remove();
    488     assertEquals(Collections.emptyList(), iterable);
    489     assertFalse(cycle.hasNext());
    490   }
    491 
    492   public void testCycleOfTwo() {
    493     Iterator<String> cycle = Iterators.cycle("a", "b");
    494     for (int i = 0; i < 3; i++) {
    495       assertTrue(cycle.hasNext());
    496       assertEquals("a", cycle.next());
    497       assertTrue(cycle.hasNext());
    498       assertEquals("b", cycle.next());
    499     }
    500   }
    501 
    502   public void testCycleOfTwoWithRemove() {
    503     Iterable<String> iterable = Lists.newArrayList("a", "b");
    504     Iterator<String> cycle = Iterators.cycle(iterable);
    505     assertTrue(cycle.hasNext());
    506     assertEquals("a", cycle.next());
    507     assertTrue(cycle.hasNext());
    508     assertEquals("b", cycle.next());
    509     assertTrue(cycle.hasNext());
    510     assertEquals("a", cycle.next());
    511     cycle.remove();
    512     assertEquals(Collections.singletonList("b"), iterable);
    513     assertTrue(cycle.hasNext());
    514     assertEquals("b", cycle.next());
    515     assertTrue(cycle.hasNext());
    516     assertEquals("b", cycle.next());
    517     cycle.remove();
    518     assertEquals(Collections.emptyList(), iterable);
    519     assertFalse(cycle.hasNext());
    520   }
    521 
    522   public void testCycleRemoveWithoutNext() {
    523     Iterator<String> cycle = Iterators.cycle("a", "b");
    524     assertTrue(cycle.hasNext());
    525     try {
    526       cycle.remove();
    527       fail("no exception thrown");
    528     } catch (IllegalStateException expected) {
    529     }
    530   }
    531 
    532   public void testCycleRemoveSameElementTwice() {
    533     Iterator<String> cycle = Iterators.cycle("a", "b");
    534     cycle.next();
    535     cycle.remove();
    536     try {
    537       cycle.remove();
    538       fail("no exception thrown");
    539     } catch (IllegalStateException expected) {
    540     }
    541   }
    542 
    543   public void testCycleWhenRemoveIsNotSupported() {
    544     Iterable<String> iterable = asList("a", "b");
    545     Iterator<String> cycle = Iterators.cycle(iterable);
    546     cycle.next();
    547     try {
    548       cycle.remove();
    549       fail("no exception thrown");
    550     } catch (UnsupportedOperationException expected) {
    551     }
    552   }
    553 
    554   public void testCycleRemoveAfterHasNext() {
    555     Iterable<String> iterable = Lists.newArrayList("a");
    556     Iterator<String> cycle = Iterators.cycle(iterable);
    557     assertTrue(cycle.hasNext());
    558     assertEquals("a", cycle.next());
    559     assertTrue(cycle.hasNext());
    560     cycle.remove();
    561     assertEquals(Collections.emptyList(), iterable);
    562     assertFalse(cycle.hasNext());
    563   }
    564 
    565   public void testCycleNoSuchElementException() {
    566     Iterable<String> iterable = Lists.newArrayList("a");
    567     Iterator<String> cycle = Iterators.cycle(iterable);
    568     assertTrue(cycle.hasNext());
    569     assertEquals("a", cycle.next());
    570     cycle.remove();
    571     assertFalse(cycle.hasNext());
    572     try {
    573       cycle.next();
    574       fail();
    575     } catch (NoSuchElementException expected) {}
    576   }
    577 
    578   /**
    579    * Illustrates the somewhat bizarre behavior when a null is passed in.
    580    */
    581   public void testConcatContainingNull() {
    582     @SuppressWarnings("unchecked")
    583     Iterator<Iterator<Integer>> input
    584         = asList(iterateOver(1, 2), null, iterateOver(3)).iterator();
    585     Iterator<Integer> result = Iterators.concat(input);
    586     assertEquals(1, (int) result.next());
    587     assertEquals(2, (int) result.next());
    588     try {
    589       result.hasNext();
    590       fail("no exception thrown");
    591     } catch (NullPointerException e) {
    592     }
    593     try {
    594       result.next();
    595       fail("no exception thrown");
    596     } catch (NullPointerException e) {
    597     }
    598     // There is no way to get "through" to the 3.  Buh-bye
    599   }
    600 
    601   @SuppressWarnings("unchecked")
    602   public void testConcatVarArgsContainingNull() {
    603     try {
    604       Iterators.concat(iterateOver(1, 2), null, iterateOver(3), iterateOver(4),
    605           iterateOver(5));
    606       fail("no exception thrown");
    607     } catch (NullPointerException e) {
    608     }
    609   }
    610 
    611   public void testAddAllWithEmptyIterator() {
    612     List<String> alreadyThere = Lists.newArrayList("already", "there");
    613 
    614     boolean changed = Iterators.addAll(alreadyThere,
    615                                        Iterators.<String>emptyIterator());
    616     assertThat(alreadyThere).has().exactly("already", "there").inOrder();
    617     assertFalse(changed);
    618   }
    619 
    620   public void testAddAllToList() {
    621     List<String> alreadyThere = Lists.newArrayList("already", "there");
    622     List<String> freshlyAdded = Lists.newArrayList("freshly", "added");
    623 
    624     boolean changed = Iterators.addAll(alreadyThere, freshlyAdded.iterator());
    625 
    626     assertThat(alreadyThere).has().exactly("already", "there", "freshly", "added");
    627     assertTrue(changed);
    628   }
    629 
    630   public void testAddAllToSet() {
    631     Set<String> alreadyThere
    632         = Sets.newLinkedHashSet(asList("already", "there"));
    633     List<String> oneMore = Lists.newArrayList("there");
    634 
    635     boolean changed = Iterators.addAll(alreadyThere, oneMore.iterator());
    636     assertThat(alreadyThere).has().exactly("already", "there").inOrder();
    637     assertFalse(changed);
    638   }
    639 
    640   private static Iterator<Integer> iterateOver(final Integer... values) {
    641     return newArrayList(values).iterator();
    642   }
    643 
    644   public void testElementsEqual() {
    645     Iterable<?> a;
    646     Iterable<?> b;
    647 
    648     // Base case.
    649     a = Lists.newArrayList();
    650     b = Collections.emptySet();
    651     assertTrue(Iterators.elementsEqual(a.iterator(), b.iterator()));
    652 
    653     // A few elements.
    654     a = asList(4, 8, 15, 16, 23, 42);
    655     b = asList(4, 8, 15, 16, 23, 42);
    656     assertTrue(Iterators.elementsEqual(a.iterator(), b.iterator()));
    657 
    658     // The same, but with nulls.
    659     a = asList(4, 8, null, 16, 23, 42);
    660     b = asList(4, 8, null, 16, 23, 42);
    661     assertTrue(Iterators.elementsEqual(a.iterator(), b.iterator()));
    662 
    663     // Different Iterable types (still equal elements, though).
    664     a = ImmutableList.of(4, 8, 15, 16, 23, 42);
    665     b = asList(4, 8, 15, 16, 23, 42);
    666     assertTrue(Iterators.elementsEqual(a.iterator(), b.iterator()));
    667 
    668     // An element differs.
    669     a = asList(4, 8, 15, 12, 23, 42);
    670     b = asList(4, 8, 15, 16, 23, 42);
    671     assertFalse(Iterators.elementsEqual(a.iterator(), b.iterator()));
    672 
    673     // null versus non-null.
    674     a = asList(4, 8, 15, null, 23, 42);
    675     b = asList(4, 8, 15, 16, 23, 42);
    676     assertFalse(Iterators.elementsEqual(a.iterator(), b.iterator()));
    677     assertFalse(Iterators.elementsEqual(b.iterator(), a.iterator()));
    678 
    679     // Different lengths.
    680     a = asList(4, 8, 15, 16, 23);
    681     b = asList(4, 8, 15, 16, 23, 42);
    682     assertFalse(Iterators.elementsEqual(a.iterator(), b.iterator()));
    683     assertFalse(Iterators.elementsEqual(b.iterator(), a.iterator()));
    684 
    685     // Different lengths, one is empty.
    686     a = Collections.emptySet();
    687     b = asList(4, 8, 15, 16, 23, 42);
    688     assertFalse(Iterators.elementsEqual(a.iterator(), b.iterator()));
    689     assertFalse(Iterators.elementsEqual(b.iterator(), a.iterator()));
    690   }
    691 
    692   public void testPartition_badSize() {
    693     Iterator<Integer> source = Iterators.singletonIterator(1);
    694     try {
    695       Iterators.partition(source, 0);
    696       fail();
    697     } catch (IllegalArgumentException expected) {
    698     }
    699   }
    700 
    701   public void testPartition_empty() {
    702     Iterator<Integer> source = Iterators.emptyIterator();
    703     Iterator<List<Integer>> partitions = Iterators.partition(source, 1);
    704     assertFalse(partitions.hasNext());
    705   }
    706 
    707   public void testPartition_singleton1() {
    708     Iterator<Integer> source = Iterators.singletonIterator(1);
    709     Iterator<List<Integer>> partitions = Iterators.partition(source, 1);
    710     assertTrue(partitions.hasNext());
    711     assertTrue(partitions.hasNext());
    712     assertEquals(ImmutableList.of(1), partitions.next());
    713     assertFalse(partitions.hasNext());
    714   }
    715 
    716   public void testPartition_singleton2() {
    717     Iterator<Integer> source = Iterators.singletonIterator(1);
    718     Iterator<List<Integer>> partitions = Iterators.partition(source, 2);
    719     assertTrue(partitions.hasNext());
    720     assertTrue(partitions.hasNext());
    721     assertEquals(ImmutableList.of(1), partitions.next());
    722     assertFalse(partitions.hasNext());
    723   }
    724 
    725   public void testPartition_view() {
    726     List<Integer> list = asList(1, 2);
    727     Iterator<List<Integer>> partitions
    728         = Iterators.partition(list.iterator(), 1);
    729 
    730     // Changes before the partition is retrieved are reflected
    731     list.set(0, 3);
    732     List<Integer> first = partitions.next();
    733 
    734     // Changes after are not
    735     list.set(0, 4);
    736 
    737     assertEquals(ImmutableList.of(3), first);
    738   }
    739 
    740   public void testPaddedPartition_badSize() {
    741     Iterator<Integer> source = Iterators.singletonIterator(1);
    742     try {
    743       Iterators.paddedPartition(source, 0);
    744       fail();
    745     } catch (IllegalArgumentException expected) {
    746     }
    747   }
    748 
    749   public void testPaddedPartition_empty() {
    750     Iterator<Integer> source = Iterators.emptyIterator();
    751     Iterator<List<Integer>> partitions = Iterators.paddedPartition(source, 1);
    752     assertFalse(partitions.hasNext());
    753   }
    754 
    755   public void testPaddedPartition_singleton1() {
    756     Iterator<Integer> source = Iterators.singletonIterator(1);
    757     Iterator<List<Integer>> partitions = Iterators.paddedPartition(source, 1);
    758     assertTrue(partitions.hasNext());
    759     assertTrue(partitions.hasNext());
    760     assertEquals(ImmutableList.of(1), partitions.next());
    761     assertFalse(partitions.hasNext());
    762   }
    763 
    764   public void testPaddedPartition_singleton2() {
    765     Iterator<Integer> source = Iterators.singletonIterator(1);
    766     Iterator<List<Integer>> partitions = Iterators.paddedPartition(source, 2);
    767     assertTrue(partitions.hasNext());
    768     assertTrue(partitions.hasNext());
    769     assertEquals(asList(1, null), partitions.next());
    770     assertFalse(partitions.hasNext());
    771   }
    772 
    773   public void testPaddedPartition_view() {
    774     List<Integer> list = asList(1, 2);
    775     Iterator<List<Integer>> partitions
    776         = Iterators.paddedPartition(list.iterator(), 1);
    777 
    778     // Changes before the PaddedPartition is retrieved are reflected
    779     list.set(0, 3);
    780     List<Integer> first = partitions.next();
    781 
    782     // Changes after are not
    783     list.set(0, 4);
    784 
    785     assertEquals(ImmutableList.of(3), first);
    786   }
    787 
    788   public void testPaddedPartitionRandomAccess() {
    789     Iterator<Integer> source = asList(1, 2, 3).iterator();
    790     Iterator<List<Integer>> partitions = Iterators.paddedPartition(source, 2);
    791     assertTrue(partitions.next() instanceof RandomAccess);
    792     assertTrue(partitions.next() instanceof RandomAccess);
    793   }
    794 
    795   public void testForArrayEmpty() {
    796     String[] array = new String[0];
    797     Iterator<String> iterator = Iterators.forArray(array);
    798     assertFalse(iterator.hasNext());
    799     try {
    800       iterator.next();
    801       fail();
    802     } catch (NoSuchElementException expected) {}
    803   }
    804 
    805   public void testForArrayTypical() {
    806     String[] array = {"foo", "bar"};
    807     Iterator<String> iterator = Iterators.forArray(array);
    808     assertTrue(iterator.hasNext());
    809     assertEquals("foo", iterator.next());
    810     assertTrue(iterator.hasNext());
    811     try {
    812       iterator.remove();
    813       fail();
    814     } catch (UnsupportedOperationException expected) {}
    815     assertEquals("bar", iterator.next());
    816     assertFalse(iterator.hasNext());
    817     try {
    818       iterator.next();
    819       fail();
    820     } catch (NoSuchElementException expected) {}
    821   }
    822 
    823   public void testForArrayOffset() {
    824     String[] array = {"foo", "bar", "cat", "dog"};
    825     Iterator<String> iterator = Iterators.forArray(array, 1, 2, 0);
    826     assertTrue(iterator.hasNext());
    827     assertEquals("bar", iterator.next());
    828     assertTrue(iterator.hasNext());
    829     assertEquals("cat", iterator.next());
    830     assertFalse(iterator.hasNext());
    831     try {
    832       Iterators.forArray(array, 2, 3, 0);
    833       fail();
    834     } catch (IndexOutOfBoundsException expected) {}
    835   }
    836 
    837   public void testForArrayLength0() {
    838     String[] array = {"foo", "bar"};
    839     assertFalse(Iterators.forArray(array, 0, 0, 0).hasNext());
    840     assertFalse(Iterators.forArray(array, 1, 0, 0).hasNext());
    841     assertFalse(Iterators.forArray(array, 2, 0, 0).hasNext());
    842     try {
    843       Iterators.forArray(array, -1, 0, 0);
    844       fail();
    845     } catch (IndexOutOfBoundsException expected) {}
    846     try {
    847       Iterators.forArray(array, 3, 0, 0);
    848       fail();
    849     } catch (IndexOutOfBoundsException expected) {}
    850   }
    851 
    852   public void testForEnumerationEmpty() {
    853     Enumeration<Integer> enumer = enumerate();
    854     Iterator<Integer> iter = Iterators.forEnumeration(enumer);
    855 
    856     assertFalse(iter.hasNext());
    857     try {
    858       iter.next();
    859       fail();
    860     } catch (NoSuchElementException expected) {
    861     }
    862   }
    863 
    864   public void testForEnumerationSingleton() {
    865     Enumeration<Integer> enumer = enumerate(1);
    866     Iterator<Integer> iter = Iterators.forEnumeration(enumer);
    867 
    868     assertTrue(iter.hasNext());
    869     assertTrue(iter.hasNext());
    870     assertEquals(1, (int) iter.next());
    871     try {
    872       iter.remove();
    873       fail();
    874     } catch (UnsupportedOperationException expected) {
    875     }
    876     assertFalse(iter.hasNext());
    877     try {
    878       iter.next();
    879       fail();
    880     } catch (NoSuchElementException expected) {
    881     }
    882   }
    883 
    884   public void testForEnumerationTypical() {
    885     Enumeration<Integer> enumer = enumerate(1, 2, 3);
    886     Iterator<Integer> iter = Iterators.forEnumeration(enumer);
    887 
    888     assertTrue(iter.hasNext());
    889     assertEquals(1, (int) iter.next());
    890     assertTrue(iter.hasNext());
    891     assertEquals(2, (int) iter.next());
    892     assertTrue(iter.hasNext());
    893     assertEquals(3, (int) iter.next());
    894     assertFalse(iter.hasNext());
    895   }
    896 
    897   public void testAsEnumerationEmpty() {
    898     Iterator<Integer> iter = Iterators.emptyIterator();
    899     Enumeration<Integer> enumer = Iterators.asEnumeration(iter);
    900 
    901     assertFalse(enumer.hasMoreElements());
    902     try {
    903       enumer.nextElement();
    904       fail();
    905     } catch (NoSuchElementException expected) {
    906     }
    907   }
    908 
    909   public void testAsEnumerationSingleton() {
    910     Iterator<Integer> iter = ImmutableList.of(1).iterator();
    911     Enumeration<Integer> enumer = Iterators.asEnumeration(iter);
    912 
    913     assertTrue(enumer.hasMoreElements());
    914     assertTrue(enumer.hasMoreElements());
    915     assertEquals(1, (int) enumer.nextElement());
    916     assertFalse(enumer.hasMoreElements());
    917     try {
    918       enumer.nextElement();
    919       fail();
    920     } catch (NoSuchElementException expected) {
    921     }
    922   }
    923 
    924   public void testAsEnumerationTypical() {
    925     Iterator<Integer> iter = ImmutableList.of(1, 2, 3).iterator();
    926     Enumeration<Integer> enumer = Iterators.asEnumeration(iter);
    927 
    928     assertTrue(enumer.hasMoreElements());
    929     assertEquals(1, (int) enumer.nextElement());
    930     assertTrue(enumer.hasMoreElements());
    931     assertEquals(2, (int) enumer.nextElement());
    932     assertTrue(enumer.hasMoreElements());
    933     assertEquals(3, (int) enumer.nextElement());
    934     assertFalse(enumer.hasMoreElements());
    935   }
    936 
    937   private static Enumeration<Integer> enumerate(Integer... ints) {
    938     Vector<Integer> vector = new Vector<Integer>();
    939     vector.addAll(asList(ints));
    940     return vector.elements();
    941   }
    942 
    943   public void testToString() {
    944     Iterator<String> iterator = Lists.newArrayList("yam", "bam", "jam", "ham").iterator();
    945     assertEquals("[yam, bam, jam, ham]", Iterators.toString(iterator));
    946   }
    947 
    948   public void testToStringWithNull() {
    949     Iterator<String> iterator = Lists.newArrayList("hello", null, "world").iterator();
    950     assertEquals("[hello, null, world]", Iterators.toString(iterator));
    951   }
    952 
    953   public void testToStringEmptyIterator() {
    954     Iterator<String> iterator = Collections.<String>emptyList().iterator();
    955     assertEquals("[]", Iterators.toString(iterator));
    956   }
    957 
    958   public void testLimit() {
    959     List<String> list = newArrayList();
    960     try {
    961       Iterators.limit(list.iterator(), -1);
    962       fail("expected exception");
    963     } catch (IllegalArgumentException expected) {
    964       // expected
    965     }
    966 
    967     assertFalse(Iterators.limit(list.iterator(), 0).hasNext());
    968     assertFalse(Iterators.limit(list.iterator(), 1).hasNext());
    969 
    970     list.add("cool");
    971     assertFalse(Iterators.limit(list.iterator(), 0).hasNext());
    972     assertEquals(list, newArrayList(Iterators.limit(list.iterator(), 1)));
    973     assertEquals(list, newArrayList(Iterators.limit(list.iterator(), 2)));
    974 
    975     list.add("pants");
    976     assertFalse(Iterators.limit(list.iterator(), 0).hasNext());
    977     assertEquals(ImmutableList.of("cool"),
    978         newArrayList(Iterators.limit(list.iterator(), 1)));
    979     assertEquals(list, newArrayList(Iterators.limit(list.iterator(), 2)));
    980     assertEquals(list, newArrayList(Iterators.limit(list.iterator(), 3)));
    981   }
    982 
    983   public void testLimitRemove() {
    984     List<String> list = newArrayList();
    985     list.add("cool");
    986     list.add("pants");
    987     Iterator<String> iterator = Iterators.limit(list.iterator(), 1);
    988     iterator.next();
    989     iterator.remove();
    990     assertFalse(iterator.hasNext());
    991     assertEquals(1, list.size());
    992     assertEquals("pants", list.get(0));
    993   }
    994 
    995   public void testGetNext_withDefault_singleton() {
    996     Iterator<String> iterator = Collections.singletonList("foo").iterator();
    997     assertEquals("foo", Iterators.getNext(iterator, "bar"));
    998   }
    999 
   1000   public void testGetNext_withDefault_empty() {
   1001     Iterator<String> iterator = Iterators.emptyIterator();
   1002     assertEquals("bar", Iterators.getNext(iterator, "bar"));
   1003   }
   1004 
   1005   public void testGetNext_withDefault_empty_null() {
   1006     Iterator<String> iterator = Iterators.emptyIterator();
   1007     assertNull(Iterators.getNext(iterator, null));
   1008   }
   1009 
   1010   public void testGetNext_withDefault_two() {
   1011     Iterator<String> iterator = asList("foo", "bar").iterator();
   1012     assertEquals("foo", Iterators.getNext(iterator, "x"));
   1013   }
   1014 
   1015   public void testGetLast_basic() {
   1016     List<String> list = newArrayList();
   1017     list.add("a");
   1018     list.add("b");
   1019     assertEquals("b", getLast(list.iterator()));
   1020   }
   1021 
   1022   public void testGetLast_exception() {
   1023     List<String> list = newArrayList();
   1024     try {
   1025       getLast(list.iterator());
   1026       fail();
   1027     } catch (NoSuchElementException expected) {
   1028     }
   1029   }
   1030 
   1031   public void testGetLast_withDefault_singleton() {
   1032     Iterator<String> iterator = Collections.singletonList("foo").iterator();
   1033     assertEquals("foo", Iterators.getLast(iterator, "bar"));
   1034   }
   1035 
   1036   public void testGetLast_withDefault_empty() {
   1037     Iterator<String> iterator = Iterators.emptyIterator();
   1038     assertEquals("bar", Iterators.getLast(iterator, "bar"));
   1039   }
   1040 
   1041   public void testGetLast_withDefault_empty_null() {
   1042     Iterator<String> iterator = Iterators.emptyIterator();
   1043     assertNull(Iterators.getLast(iterator, null));
   1044   }
   1045 
   1046   public void testGetLast_withDefault_two() {
   1047     Iterator<String> iterator = asList("foo", "bar").iterator();
   1048     assertEquals("bar", Iterators.getLast(iterator, "x"));
   1049   }
   1050 
   1051   public void testGet_basic() {
   1052     List<String> list = newArrayList();
   1053     list.add("a");
   1054     list.add("b");
   1055     Iterator<String> iterator = list.iterator();
   1056     assertEquals("b", get(iterator, 1));
   1057     assertFalse(iterator.hasNext());
   1058   }
   1059 
   1060   public void testGet_atSize() {
   1061     List<String> list = newArrayList();
   1062     list.add("a");
   1063     list.add("b");
   1064     Iterator<String> iterator = list.iterator();
   1065     try {
   1066       get(iterator, 2);
   1067       fail();
   1068     } catch (IndexOutOfBoundsException expected) {}
   1069     assertFalse(iterator.hasNext());
   1070   }
   1071 
   1072   public void testGet_pastEnd() {
   1073     List<String> list = newArrayList();
   1074     list.add("a");
   1075     list.add("b");
   1076     Iterator<String> iterator = list.iterator();
   1077     try {
   1078       get(iterator, 5);
   1079       fail();
   1080     } catch (IndexOutOfBoundsException expected) {}
   1081     assertFalse(iterator.hasNext());
   1082   }
   1083 
   1084   public void testGet_empty() {
   1085     List<String> list = newArrayList();
   1086     Iterator<String> iterator = list.iterator();
   1087     try {
   1088       get(iterator, 0);
   1089       fail();
   1090     } catch (IndexOutOfBoundsException expected) {}
   1091     assertFalse(iterator.hasNext());
   1092   }
   1093 
   1094   public void testGet_negativeIndex() {
   1095     List<String> list = newArrayList("a", "b", "c");
   1096     Iterator<String> iterator = list.iterator();
   1097     try {
   1098       get(iterator, -1);
   1099       fail();
   1100     } catch (IndexOutOfBoundsException expected) {}
   1101   }
   1102 
   1103   public void testGet_withDefault_basic() {
   1104     List<String> list = newArrayList();
   1105     list.add("a");
   1106     list.add("b");
   1107     Iterator<String> iterator = list.iterator();
   1108     assertEquals("a", get(iterator, 0, "c"));
   1109     assertTrue(iterator.hasNext());
   1110   }
   1111 
   1112   public void testGet_withDefault_atSize() {
   1113     List<String> list = newArrayList();
   1114     list.add("a");
   1115     list.add("b");
   1116     Iterator<String> iterator = list.iterator();
   1117     assertEquals("c", get(iterator, 2, "c"));
   1118     assertFalse(iterator.hasNext());
   1119   }
   1120 
   1121   public void testGet_withDefault_pastEnd() {
   1122     List<String> list = newArrayList();
   1123     list.add("a");
   1124     list.add("b");
   1125     Iterator<String> iterator = list.iterator();
   1126     assertEquals("c", get(iterator, 3, "c"));
   1127     assertFalse(iterator.hasNext());
   1128   }
   1129 
   1130   public void testGet_withDefault_negativeIndex() {
   1131     List<String> list = newArrayList();
   1132     list.add("a");
   1133     list.add("b");
   1134     Iterator<String> iterator = list.iterator();
   1135     try {
   1136       get(iterator, -1, "c");
   1137       fail();
   1138     } catch (IndexOutOfBoundsException expected) {
   1139       // pass
   1140     }
   1141     assertTrue(iterator.hasNext());
   1142   }
   1143 
   1144   public void testAdvance_basic() {
   1145     List<String> list = newArrayList();
   1146     list.add("a");
   1147     list.add("b");
   1148     Iterator<String> iterator = list.iterator();
   1149     advance(iterator, 1);
   1150     assertEquals("b", iterator.next());
   1151   }
   1152 
   1153   public void testAdvance_pastEnd() {
   1154     List<String> list = newArrayList();
   1155     list.add("a");
   1156     list.add("b");
   1157     Iterator<String> iterator = list.iterator();
   1158     advance(iterator, 5);
   1159     assertFalse(iterator.hasNext());
   1160   }
   1161 
   1162   public void testAdvance_illegalArgument() {
   1163     List<String> list = newArrayList("a", "b", "c");
   1164     Iterator<String> iterator = list.iterator();
   1165     try {
   1166       advance(iterator, -1);
   1167       fail();
   1168     } catch (IllegalArgumentException expected) {}
   1169   }
   1170 
   1171   public void testFrequency() {
   1172     List<String> list = newArrayList("a", null, "b", null, "a", null);
   1173     assertEquals(2, Iterators.frequency(list.iterator(), "a"));
   1174     assertEquals(1, Iterators.frequency(list.iterator(), "b"));
   1175     assertEquals(0, Iterators.frequency(list.iterator(), "c"));
   1176     assertEquals(0, Iterators.frequency(list.iterator(), 4.2));
   1177     assertEquals(3, Iterators.frequency(list.iterator(), null));
   1178   }
   1179 
   1180   public void testRemoveAll() {
   1181     List<String> list = newArrayList("a", "b", "c", "d", "e");
   1182     assertTrue(Iterators.removeAll(
   1183         list.iterator(), newArrayList("b", "d", "f")));
   1184     assertEquals(newArrayList("a", "c", "e"), list);
   1185     assertFalse(Iterators.removeAll(
   1186         list.iterator(), newArrayList("x", "y", "z")));
   1187     assertEquals(newArrayList("a", "c", "e"), list);
   1188   }
   1189 
   1190   public void testRemoveIf() {
   1191     List<String> list = newArrayList("a", "b", "c", "d", "e");
   1192     assertTrue(Iterators.removeIf(
   1193         list.iterator(),
   1194         new Predicate<String>() {
   1195           @Override
   1196           public boolean apply(String s) {
   1197             return s.equals("b") || s.equals("d") || s.equals("f");
   1198           }
   1199         }));
   1200     assertEquals(newArrayList("a", "c", "e"), list);
   1201     assertFalse(Iterators.removeIf(
   1202         list.iterator(),
   1203         new Predicate<String>() {
   1204           @Override
   1205           public boolean apply(String s) {
   1206             return s.equals("x") || s.equals("y") || s.equals("z");
   1207           }
   1208         }));
   1209     assertEquals(newArrayList("a", "c", "e"), list);
   1210   }
   1211 
   1212   public void testRetainAll() {
   1213     List<String> list = newArrayList("a", "b", "c", "d", "e");
   1214     assertTrue(Iterators.retainAll(
   1215         list.iterator(), newArrayList("b", "d", "f")));
   1216     assertEquals(newArrayList("b", "d"), list);
   1217     assertFalse(Iterators.retainAll(
   1218         list.iterator(), newArrayList("b", "e", "d")));
   1219     assertEquals(newArrayList("b", "d"), list);
   1220   }
   1221 
   1222   public void testConsumingIterator() {
   1223     // Test data
   1224     List<String> list = Lists.newArrayList("a", "b");
   1225 
   1226     // Test & Verify
   1227     Iterator<String> consumingIterator =
   1228         Iterators.consumingIterator(list.iterator());
   1229 
   1230     assertEquals("Iterators.consumingIterator(...)", consumingIterator.toString());
   1231 
   1232     assertThat(list).has().exactly("a", "b").inOrder();
   1233 
   1234     assertTrue(consumingIterator.hasNext());
   1235     assertThat(list).has().exactly("a", "b").inOrder();
   1236     assertEquals("a", consumingIterator.next());
   1237     assertThat(list).has().item("b");
   1238 
   1239     assertTrue(consumingIterator.hasNext());
   1240     assertEquals("b", consumingIterator.next());
   1241     assertThat(list).isEmpty();
   1242 
   1243     assertFalse(consumingIterator.hasNext());
   1244   }
   1245 
   1246   public void testIndexOf_consumedData() {
   1247     Iterator<String> iterator =
   1248         Lists.newArrayList("manny", "mo", "jack").iterator();
   1249     assertEquals(1, Iterators.indexOf(iterator, Predicates.equalTo("mo")));
   1250     assertEquals("jack", iterator.next());
   1251     assertFalse(iterator.hasNext());
   1252   }
   1253 
   1254   public void testIndexOf_consumedDataWithDuplicates() {
   1255     Iterator<String> iterator =
   1256         Lists.newArrayList("manny", "mo", "mo", "jack").iterator();
   1257     assertEquals(1, Iterators.indexOf(iterator, Predicates.equalTo("mo")));
   1258     assertEquals("mo", iterator.next());
   1259     assertEquals("jack", iterator.next());
   1260     assertFalse(iterator.hasNext());
   1261   }
   1262 
   1263   public void testIndexOf_consumedDataNoMatch() {
   1264     Iterator<String> iterator =
   1265         Lists.newArrayList("manny", "mo", "mo", "jack").iterator();
   1266     assertEquals(-1, Iterators.indexOf(iterator, Predicates.equalTo("bob")));
   1267     assertFalse(iterator.hasNext());
   1268   }
   1269 
   1270   @SuppressWarnings("deprecation")
   1271   public void testUnmodifiableIteratorShortCircuit() {
   1272     Iterator<String> mod = Lists.newArrayList("a", "b", "c").iterator();
   1273     UnmodifiableIterator<String> unmod = Iterators.unmodifiableIterator(mod);
   1274     assertNotSame(mod, unmod);
   1275     assertSame(unmod, Iterators.unmodifiableIterator(unmod));
   1276     assertSame(unmod, Iterators.unmodifiableIterator((Iterator<String>) unmod));
   1277   }
   1278 
   1279   @SuppressWarnings("deprecation")
   1280   public void testPeekingIteratorShortCircuit() {
   1281     Iterator<String> nonpeek = Lists.newArrayList("a", "b", "c").iterator();
   1282     PeekingIterator<String> peek = Iterators.peekingIterator(nonpeek);
   1283     assertNotSame(peek, nonpeek);
   1284     assertSame(peek, Iterators.peekingIterator(peek));
   1285     assertSame(peek, Iterators.peekingIterator((Iterator<String>) peek));
   1286   }
   1287 }
   1288