1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
46
47
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
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
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
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
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
649 a = Lists.newArrayList();
650 b = Collections.emptySet();
651 assertTrue(Iterators.elementsEqual(a.iterator(), b.iterator()));
652
653
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
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
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
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
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
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
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
731 list.set(0, 3);
732 List<Integer> first = partitions.next();
733
734
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
779 list.set(0, 3);
780 List<Integer> first = partitions.next();
781
782
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
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
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
1224 List<String> list = Lists.newArrayList("a", "b");
1225
1226
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 }