1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.collections4.iterators;
18
19 import static org.junit.jupiter.api.Assertions.assertEquals;
20 import static org.junit.jupiter.api.Assertions.assertFalse;
21 import static org.junit.jupiter.api.Assertions.assertThrows;
22 import static org.junit.jupiter.api.Assertions.assertTrue;
23
24 import java.util.ArrayList;
25 import java.util.Arrays;
26 import java.util.List;
27 import java.util.ListIterator;
28 import java.util.NoSuchElementException;
29
30 import org.apache.commons.collections4.ResettableListIterator;
31 import org.junit.jupiter.api.Test;
32
33
34
35
36
37
38 public class ReverseListIteratorTest<E> extends AbstractListIteratorTest<E> {
39
40 protected String[] testArray = { "One", "Two", "Three", "Four" };
41
42 @Override
43 public ListIterator<E> makeEmptyIterator() {
44 return new ReverseListIterator<>(new ArrayList<>());
45 }
46
47 @Override
48 @SuppressWarnings("unchecked")
49 public ReverseListIterator<E> makeObject() {
50 final List<E> list = new ArrayList<>(Arrays.asList((E[]) testArray));
51 return new ReverseListIterator<>(list);
52 }
53
54
55 @Test
56 @Override
57 public void testEmptyListIteratorIsIndeedEmpty() {
58 final ListIterator<E> it = makeEmptyIterator();
59 assertFalse(it.hasNext());
60 assertEquals(-1, it.nextIndex());
61 assertFalse(it.hasPrevious());
62 assertEquals(0, it.previousIndex());
63
64 assertThrows(NoSuchElementException.class, () -> it.next(), "NoSuchElementException must be thrown from empty ListIterator");
65
66 assertThrows(NoSuchElementException.class, () -> it.previous(), "NoSuchElementException must be thrown from empty ListIterator");
67 }
68
69 @Test
70 public void testReset() {
71 final ResettableListIterator<E> it = makeObject();
72 assertEquals("Four", it.next());
73 it.reset();
74 assertEquals("Four", it.next());
75 it.next();
76 it.next();
77 it.reset();
78 assertEquals("Four", it.next());
79 }
80
81 @Test
82 public void testReverse() {
83 final ListIterator<E> it = makeObject();
84 assertTrue(it.hasNext());
85 assertEquals(3, it.nextIndex());
86 assertFalse(it.hasPrevious());
87 assertEquals(4, it.previousIndex());
88 assertEquals("Four", it.next());
89 assertEquals(2, it.nextIndex());
90 assertTrue(it.hasNext());
91 assertEquals(3, it.previousIndex());
92 assertTrue(it.hasPrevious());
93 assertEquals("Three", it.next());
94 assertTrue(it.hasNext());
95 assertEquals(1, it.nextIndex());
96 assertTrue(it.hasPrevious());
97 assertEquals(2, it.previousIndex());
98 assertEquals("Two", it.next());
99 assertTrue(it.hasNext());
100 assertEquals(0, it.nextIndex());
101 assertTrue(it.hasPrevious());
102 assertEquals(1, it.previousIndex());
103 assertEquals("One", it.next());
104 assertFalse(it.hasNext());
105 assertEquals(-1, it.nextIndex());
106 assertTrue(it.hasPrevious());
107 assertEquals(0, it.previousIndex());
108 assertEquals("One", it.previous());
109 assertEquals("Two", it.previous());
110 assertEquals("Three", it.previous());
111 assertEquals("Four", it.previous());
112 }
113
114 @Test
115 @Override
116 public void testWalkForwardAndBack() {
117 final ArrayList<E> list = new ArrayList<>();
118 final ListIterator<E> it = makeObject();
119 while (it.hasNext()) {
120 list.add(it.next());
121 }
122
123
124 assertFalse(it.hasNext());
125 assertTrue(it.hasPrevious());
126
127
128
129
130
131
132
133
134
135
136
137 for (int i = list.size() - 1; i >= 0; i--) {
138 assertEquals(list.size() - i - 2, it.nextIndex(), "" + i);
139 assertEquals(list.size() - i - 1, it.previousIndex());
140
141 final Object obj = list.get(i);
142 assertEquals(obj, it.previous());
143 }
144
145
146 assertTrue(it.hasNext());
147 assertFalse(it.hasPrevious());
148
149 assertThrows(NoSuchElementException.class, () -> it.previous(),
150 "NoSuchElementException must be thrown from previous at start of ListIterator");
151 }
152
153 }