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());
+  }
+
+}