Patch fixes issue 3057 and adds test cases for it.
Patch by: amitmanjhi
Review by: scottb
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@5366 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/user/super/com/google/gwt/emul/java/util/AbstractList.java b/user/super/com/google/gwt/emul/java/util/AbstractList.java
index d8e4a2e..7a08442 100644
--- a/user/super/com/google/gwt/emul/java/util/AbstractList.java
+++ b/user/super/com/google/gwt/emul/java/util/AbstractList.java
@@ -218,7 +218,7 @@
}
public ListIterator<E> listIterator() {
- return new ListIteratorImpl();
+ return listIterator(0);
}
public ListIterator<E> listIterator(int from) {
diff --git a/user/test/com/google/gwt/emultest/java/util/AbstractSequentialListTest.java b/user/test/com/google/gwt/emultest/java/util/AbstractSequentialListTest.java
new file mode 100644
index 0000000..e8d6369
--- /dev/null
+++ b/user/test/com/google/gwt/emultest/java/util/AbstractSequentialListTest.java
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2009 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.google.gwt.emultest.java.util;
+
+import java.util.AbstractSequentialList;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.ListIterator;
+
+/**
+ * Test custom iterators for AbstractSequentialList. Checks issue 3057.
+ */
+@SuppressWarnings("unchecked")
+public class AbstractSequentialListTest extends EmulTestBase {
+
+ // a simple wrapper over LinkedList.
+ private class AbstractSequentialListImpl<E> extends AbstractSequentialList<E> {
+
+ private LinkedList<E> internalList = new LinkedList<E>();
+
+ @Override
+ public ListIterator<E> listIterator(final int index) {
+ // a custom iterator that skips the 3rd element
+ return new ListIterator<E>() {
+
+ int position = index;
+
+ @Override
+ public void add(E e) {
+ internalList.add(position, e);
+ position++;
+ }
+
+ @Override
+ public boolean hasNext() {
+ return position < internalList.size();
+ }
+
+ @Override
+ public boolean hasPrevious() {
+ return position > 0;
+ }
+
+ @Override
+ public E next() {
+ E el = internalList.get(position);
+ position++;
+ // skip the 3rd element
+ if (position == 3) {
+ return next();
+ }
+ return el;
+ }
+
+ @Override
+ public int nextIndex() {
+ throw new UnsupportedOperationException(
+ "nextIndex operation not supported");
+ }
+
+ @Override
+ public E previous() {
+ throw new UnsupportedOperationException(
+ "previous operation not supported");
+ }
+
+ @Override
+ public int previousIndex() {
+ throw new UnsupportedOperationException(
+ "previousIndex operation not supported");
+ }
+
+ @Override
+ public void remove() {
+ throw new UnsupportedOperationException(
+ "remove operation not supported");
+ }
+
+ @Override
+ public void set(E e) {
+ throw new UnsupportedOperationException("set operation not supported");
+ }
+
+ };
+ }
+
+ @Override
+ public int size() {
+ return internalList.size();
+ }
+ }
+
+ public void testIteratorFunction() {
+ List l = new AbstractSequentialListImpl<Integer>();
+ int firstFivePrimes[] = {2, 3, 5, 7, 11};
+ for (int prime : firstFivePrimes) {
+ l.add(new Integer(prime));
+ }
+ assertEquals(5, l.size());
+
+ /*
+ * check that the iteration order is correct irrespective of whether
+ * iterator(), listIterator(), or listIterator(0) is called.
+ */
+ checkIterator(l.iterator());
+ checkIterator(l.listIterator());
+ checkIterator(l.listIterator(0));
+ }
+
+ private void checkIterator(Iterator iterator) {
+ assertEquals(new Integer(2), iterator.next());
+ assertEquals(new Integer(3), iterator.next());
+ // assertEquals(new Integer(5), iterator.next()); // skip 3rd element
+ assertEquals(new Integer(7), iterator.next());
+ assertEquals(new Integer(11), iterator.next());
+ }
+
+}