1bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver/*
2bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver * Copyright 2012, Google Inc.
3bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver * All rights reserved.
4bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver *
5bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver * Redistribution and use in source and binary forms, with or without
6bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver * modification, are permitted provided that the following conditions are
7bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver * met:
8bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver *
9bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver *     * Redistributions of source code must retain the above copyright
10bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver * notice, this list of conditions and the following disclaimer.
11bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver *     * Redistributions in binary form must reproduce the above
12bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver * copyright notice, this list of conditions and the following disclaimer
13bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver * in the documentation and/or other materials provided with the
14bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver * distribution.
15bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver *     * Neither the name of Google Inc. nor the names of its
16bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver * contributors may be used to endorse or promote products derived from
17bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver * this software without specific prior written permission.
18bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver *
19bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver */
31bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
32bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruverpackage org.jf.util;
33bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
34bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruverimport junit.framework.Assert;
35bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruverimport org.junit.Before;
36bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruverimport org.junit.Test;
37bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
38bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruverimport javax.annotation.Nonnull;
39bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruverimport java.util.Iterator;
40bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruverimport java.util.List;
41bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruverimport java.util.ListIterator;
42bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruverimport java.util.NoSuchElementException;
43bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
44bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruverpublic class AbstractForwardSequentialListTest {
45bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    private List<Integer> list;
46bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
47bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    @Before
48bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    public void setup() {
49bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        list = new AbstractForwardSequentialList<Integer>() {
50bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            @Nonnull @Override public Iterator<Integer> iterator() {
51bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver                return new Iterator<Integer>() {
52bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver                    private int index = 0;
53bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
54bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver                    @Override public boolean hasNext() {
55bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver                        return index < 100;
56bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver                    }
57bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
58bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver                    @Override public Integer next() {
59bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver                        if (!hasNext()) {
60bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver                            throw new NoSuchElementException();
61bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver                        }
62bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver                        return index++;
63bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver                    }
64bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
65bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver                    @Override public void remove() {
66bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver                        throw new UnsupportedOperationException();
67bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver                    }
68bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver                };
69bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            }
70bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
71bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            @Override public int size() {
72bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver                return 100;
73bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            }
74bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        };
75bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    }
76bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
77bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    private void testForwardIterationImpl(ListIterator<Integer> iter) {
78bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        Assert.assertFalse(iter.hasPrevious());
79bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
80bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        for (int i=0; i<100; i++) {
81bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            Assert.assertEquals(i, iter.nextIndex());
82bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            Assert.assertEquals(i-1, iter.previousIndex());
83bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
84bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            Assert.assertTrue(iter.hasNext());
85bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
86bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            Assert.assertEquals(i, iter.next().intValue());
87bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            Assert.assertTrue(iter.hasPrevious());
88bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        }
89bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
90bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        Assert.assertFalse(iter.hasNext());
91bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        Assert.assertEquals(iter.nextIndex(), 100);
92bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        Assert.assertEquals(iter.previousIndex(), 99);
93bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    }
94bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
95bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    @Test
96bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    public void testForwardIteration() {
97bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        testForwardIterationImpl(list.listIterator());
98bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    }
99bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
100bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    private void testReverseIterationImpl(ListIterator<Integer> iter) {
101bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        Assert.assertFalse(iter.hasNext());
102bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
103bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        for (int i=99; i>=0; i--) {
104bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            Assert.assertEquals(i+1, iter.nextIndex());
105bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            Assert.assertEquals(i, iter.previousIndex());
106bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
107bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            Assert.assertTrue(iter.hasPrevious());
108bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
109bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            Assert.assertEquals(i, iter.previous().intValue());
110bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            Assert.assertTrue(iter.hasNext());
111bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        }
112bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
113bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        Assert.assertFalse(iter.hasPrevious());
114bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        Assert.assertEquals(0, iter.nextIndex());
115bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        Assert.assertEquals(-1, iter.previousIndex());
116bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    }
117bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
118bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    @Test
119bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    public void testReverseIteration() {
120bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        testReverseIterationImpl(list.listIterator(100));
121bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    }
122bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
123bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    @Test
124bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    public void testAlternatingIteration() {
125bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        ListIterator<Integer> iter = list.listIterator(50);
126bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
127bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        for (int i=0; i<10; i++) {
128bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            Assert.assertTrue(iter.hasNext());
129bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            Assert.assertTrue(iter.hasPrevious());
130bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            Assert.assertEquals(50, iter.nextIndex());
131bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            Assert.assertEquals(49, iter.previousIndex());
132bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
133bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            Assert.assertEquals(50, iter.next().intValue());
134bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
135bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            Assert.assertTrue(iter.hasNext());
136bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            Assert.assertTrue(iter.hasPrevious());
137bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            Assert.assertEquals(51, iter.nextIndex());
138bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            Assert.assertEquals(50, iter.previousIndex());
139bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
140bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            Assert.assertEquals(50, iter.previous().intValue());
141bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        }
142bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    }
143bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
144bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    @Test
145bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    public void testAlternatingIteration2() {
146bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        ListIterator<Integer> iter = list.listIterator(0);
147bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
148bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        for (int i=0; i<10; i++) {
149bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            testForwardIterationImpl(iter);
150bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            testReverseIterationImpl(iter);
151bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        }
152bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    }
153bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
154bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    @Test(expected = IndexOutOfBoundsException.class)
155bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    public void testNegativeIndex() {
156bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        list.listIterator(-1);
157bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    }
158bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
159bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    @Test(expected = IndexOutOfBoundsException.class)
160bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    public void testLargeIndex() {
161bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        list.listIterator(101);
162bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    }
163bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
164bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    @Test(expected = IndexOutOfBoundsException.class)
165bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    public void testLargeIndex2() {
166bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        list.listIterator(1000000);
167bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    }
168bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
169bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    @Test
170bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    public void testForwardIterationException() {
171bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        // note: no "expected = NoSuchElementException", because we want to make sure the exception occurs only during
172bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        // the last call to next()
173bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
174bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        ListIterator<Integer> iter = list.listIterator(0);
175bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        for (int i=0; i<100; i++) {
176bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            iter.next();
177bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        }
178bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        try {
179bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            iter.next();
180bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        } catch (NoSuchElementException ex) {
181bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            return;
182bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        }
183bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        Assert.fail();
184bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    }
185bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
186bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    @Test(expected = NoSuchElementException.class)
187bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    public void testForwardIterationException2() {
188bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        ListIterator<Integer> iter = list.listIterator(100);
189bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        iter.next();
190bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    }
191bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
192bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    @Test
193bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    public void testReverseIterationException() {
194bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        // note: no "expected = NoSuchElementException", because we want to make sure the exception occurs only during
195bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        // the last call to previous()
196bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
197bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        ListIterator<Integer> iter = list.listIterator(100);
198bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        for (int i=0; i<100; i++) {
199bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            iter.previous();
200bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        }
201bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        try {
202bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            iter.previous();
203bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        } catch (NoSuchElementException ex) {
204bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver            return;
205bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        }
206bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        Assert.fail();
207bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    }
208bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver
209bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    @Test(expected = NoSuchElementException.class)
210bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    public void testReverseIterationException2() {
211bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        ListIterator<Integer> iter = list.listIterator(0);
212bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver        iter.previous();
213bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver    }
214bfd74a869ebf4c0f5c1e76bcaa87e09d85b4bedeBen Gruver}
215