Fixes List.subList problems.
Public review at: http://gwt-code-reviews.appspot.com/620802/show
Issue: 4993
Patch by: markovuksanovic@gmail.com
Review by: jat, rice
git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@8308 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 53754c7..74570f3 100644
--- a/user/super/com/google/gwt/emul/java/util/AbstractList.java
+++ b/user/super/com/google/gwt/emul/java/util/AbstractList.java
@@ -170,7 +170,7 @@
}
private void checkIndexForAdd(int index) {
- checkIndex(index, size - 1);
+ checkIndex(index, size + 1);
}
private int getSize(int fromIndex, int toIndex) {
diff --git a/user/test/com/google/gwt/emultest/java/util/ListTestBase.java b/user/test/com/google/gwt/emultest/java/util/ListTestBase.java
index 681756a..d3988b6 100644
--- a/user/test/com/google/gwt/emultest/java/util/ListTestBase.java
+++ b/user/test/com/google/gwt/emultest/java/util/ListTestBase.java
@@ -31,7 +31,7 @@
public abstract class ListTestBase extends TestArrayList {
private static volatile boolean NO_OPTIMIZE_FALSE = false;
-
+
public void testAddAll() {
assertFalse(makeEmptyList().addAll(makeEmptyList()));
assertTrue(makeEmptyList().addAll(makeFullList()));
@@ -42,7 +42,7 @@
assertFalse(makeFullList().addAll(1, makeEmptyList()));
assertTrue(makeFullList().addAll(1, makeFullList()));
}
-
+
public void testAddWatch() {
List s = makeEmptyList();
s.add("watch");
@@ -107,6 +107,10 @@
assertTrue(i.hasPrevious());
}
+ public void testListIteratorRemove() {
+ // TODO(jat): implement
+ }
+
public void testListIteratorSetInSeveralPositions() {
List l = makeEmptyList();
for (int n = 0; n < 5; n += 2) {
@@ -121,10 +125,6 @@
}
}
- public void testListIteratorRemove() {
- // TODO(jat): implement
- }
-
public void testRemoveAllDuplicates() {
Collection c = makeCollection();
c.add("a");
@@ -135,6 +135,162 @@
assertEquals(0, c.size());
}
+ public void testSubList() {
+ List<Integer> wrappedList = createListWithContent(new int[] {1, 2, 3, 4, 5});
+ List<Integer> testList = wrappedList.subList(1, 4);
+ assertEquals(3, testList.size());
+
+ assertEquals(testList, Arrays.asList(2, 3, 4));
+ checkListSizeAndContent(testList, 2, 3, 4);
+ testList.add(1, 6);
+ assertEquals(testList, Arrays.asList(2, 6, 3, 4));
+ checkListSizeAndContent(testList, 2, 6, 3, 4);
+ assertEquals(wrappedList, Arrays.asList(1, 2, 6, 3, 4, 5));
+ checkListSizeAndContent(wrappedList, 1, 2, 6, 3, 4, 5);
+ testList.remove(2);
+ assertEquals(testList, Arrays.asList(2, 6, 4));
+ checkListSizeAndContent(testList, 2, 6, 4);
+
+ try {
+ testList.remove(3);
+ fail("Expected remove to fail");
+ } catch (IndexOutOfBoundsException e) {
+ }
+
+ checkListSizeAndContent(wrappedList, 1, 2, 6, 4, 5);
+ testList.set(0, 7);
+ checkListSizeAndContent(testList, 7, 6, 4);
+ checkListSizeAndContent(wrappedList, 1, 7, 6, 4, 5);
+
+ try {
+ wrappedList.subList(-1, 5);
+ fail("expected IndexOutOfBoundsException");
+ } catch (IndexOutOfBoundsException e) {
+ }
+
+ try {
+ wrappedList.subList(0, 15);
+ fail("expected IndexOutOfBoundsException");
+ } catch (IndexOutOfBoundsException e) {
+ }
+
+ try {
+ wrappedList.subList(5, 1);
+ fail("expected IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
+ }
+
+ try {
+ wrappedList.subList(0, 1).add(2, 5);
+ fail("expected IndexOutOfBoundsException");
+ } catch (IndexOutOfBoundsException e) {
+ }
+
+ try {
+ wrappedList.subList(0, 1).add(-1, 5);
+ fail("expected IndexOutOfBoundsException");
+ } catch (IndexOutOfBoundsException e) {
+ }
+
+ try {
+ wrappedList.subList(0, 1).get(1);
+ fail("expected IndexOutOfBoundsException");
+ } catch (IndexOutOfBoundsException e) {
+ }
+
+ try {
+ wrappedList.subList(0, 1).get(-1);
+ fail("expected IndexOutOfBoundsException");
+ } catch (IndexOutOfBoundsException e) {
+ }
+
+ try {
+ wrappedList.subList(0, 1).set(2, 2);
+ fail("expected IndexOutOfBoundsException");
+ } catch (IndexOutOfBoundsException e) {
+ }
+
+ try {
+ wrappedList.subList(0, 1).set(-1, 5);
+ fail("expected IndexOutOfBoundsException");
+ } catch (IndexOutOfBoundsException e) {
+ }
+ }
+
+ /**
+ * Test add() method for list returned by List<E>.subList() method.
+ */
+ public void testSubListAdd() {
+ List<Integer> baseList = createListWithContent(new int[] {1, 2, 3, 4, 5});
+ List<Integer> sublist = baseList.subList(1, 3);
+ assertEquals(2, sublist.size());
+
+ sublist.add(33);
+ sublist.add(34);
+
+ assertEquals(4, sublist.size());
+ assertEquals(7, baseList.size());
+
+ /*
+ * Assert correct values are found right before and after insertion. We're
+ * checking the original list (baseList) even though the changes were made
+ * in the sublist. That is because modifications made to the list returned
+ * by sublist method should reflect in the original list.
+ */
+ assertEquals(3, (int) baseList.get(2));
+ assertEquals(33, (int) baseList.get(3));
+ assertEquals(34, (int) baseList.get(4));
+ assertEquals(4, (int) baseList.get(5));
+
+ /*
+ * Assert that it is possible to add element at the beginning of the
+ * sublist.
+ */
+ sublist.add(0, 22);
+ sublist.add(0, 21);
+ checkListSizeAndContent(sublist, 21, 22, 2, 3, 33, 34);
+ checkListSizeAndContent(baseList, 1, 21, 22, 2, 3, 33, 34, 4, 5);
+
+ // check adding at the end by specifying the index
+ sublist.add(6, 35);
+ checkListSizeAndContent(sublist, 21, 22, 2, 3, 33, 34, 35);
+ checkListSizeAndContent(baseList, 1, 21, 22, 2, 3, 33, 34, 35, 4, 5);
+
+ /*
+ * Assert adding to underlying list after the sublist view has been defined.
+ * After such an action behavior of sublist is undefined.
+ */
+ baseList.add(9, 44);
+ baseList.add(55);
+ baseList.add(0, 10);
+ checkListSizeAndContent(baseList, 10, 1, 21, 22, 2, 3, 33, 34, 35, 4, 44, 5, 55);
+ }
+
+ public void testSubListRemove() {
+ List<Integer> baseList = createListWithContent(new int[] {1, 2, 3, 4, 5});
+ List<Integer> sublist = baseList.subList(1, 3);
+
+ sublist.remove(0);
+ assertEquals(4, baseList.size());
+ assertEquals(3, baseList.get(1).intValue());
+
+ try {
+ sublist.remove(1);
+ fail("Expected IndexOutOfBoundsException");
+ } catch (IndexOutOfBoundsException expected) {
+ }
+
+ assertFalse(sublist.remove(Integer.valueOf(4)));
+
+ assertTrue(sublist.remove(Integer.valueOf(3)));
+
+ assertEquals(0, sublist.size());
+ assertEquals(3, baseList.size());
+
+ sublist.add(6);
+ checkListSizeAndContent(baseList, 1, 6, 4, 5);
+ }
+
public void testToArray() {
List l = makeEmptyList();
for (int i = 0; i < 10; i++) {
@@ -196,95 +352,13 @@
}
}
- public void testSubList() {
- List<Integer> wrappedList = createListWithContent(new int[]{1, 2, 3, 4, 5});
- List<Integer> testList = wrappedList.subList(1, 4);
- assertEquals(3, testList.size());
-
- assertEquals(testList, Arrays.asList(2, 3, 4));
- checkListSizeAndContent(testList, new int[]{2, 3, 4});
- testList.add(1, 6);
- assertEquals(testList, Arrays.asList(2, 6, 3, 4));
- checkListSizeAndContent(testList, new int[]{2, 6, 3, 4});
- assertEquals(wrappedList, Arrays.asList(1, 2, 6, 3, 4, 5));
- checkListSizeAndContent(wrappedList, new int[]{1, 2, 6, 3, 4, 5});
- testList.remove(2);
- assertEquals(testList, Arrays.asList(2, 6, 4));
- checkListSizeAndContent(testList, new int[]{2, 6, 4});
-
- try {
- testList.remove(3);
- fail("Expected remove to fail");
- } catch (IndexOutOfBoundsException e) {
- }
-
- checkListSizeAndContent(wrappedList, new int[]{1, 2, 6, 4, 5});
- testList.set(0, 7);
- checkListSizeAndContent(testList, new int[]{7, 6, 4});
- checkListSizeAndContent(wrappedList, new int[]{1, 7, 6, 4, 5});
-
- try {
- wrappedList.subList(-1, 5);
- fail("expected IndexOutOfBoundsException");
- } catch (IndexOutOfBoundsException e) {
- }
-
- try {
- wrappedList.subList(0, 15);
- fail("expected IndexOutOfBoundsException");
- } catch (IndexOutOfBoundsException e) {
- }
-
- try {
- wrappedList.subList(5, 1);
- fail("expected IllegalArgumentException");
- } catch (IllegalArgumentException e) {
- }
-
- try {
- wrappedList.subList(0, 1).add(2, 5);
- fail("expected IndexOutOfBoundsException");
- } catch (IndexOutOfBoundsException e) {
- }
-
- try {
- wrappedList.subList(0, 1).add(-1, 5);
- fail("expected IndexOutOfBoundsException");
- } catch (IndexOutOfBoundsException e) {
- }
-
- try {
- wrappedList.subList(0, 1).get(1);
- fail("expected IndexOutOfBoundsException");
- } catch (IndexOutOfBoundsException e) {
- }
-
- try {
- wrappedList.subList(0, 1).get(-1);
- fail("expected IndexOutOfBoundsException");
- } catch (IndexOutOfBoundsException e) {
- }
-
- try {
- wrappedList.subList(0, 1).set(2, 2);
- fail("expected IndexOutOfBoundsException");
- } catch (IndexOutOfBoundsException e) {
- }
-
- try {
- wrappedList.subList(0, 1).set(-1, 5);
- fail("expected IndexOutOfBoundsException");
- } catch (IndexOutOfBoundsException e) {
- }
- }
-
- private void checkListSizeAndContent(List<Integer> in, int[] expected) {
+ private void checkListSizeAndContent(List<Integer> in, int... expected) {
assertEquals(expected.length, in.size());
for (int i = 0; i < expected.length; i++) {
assertEquals(expected[i], (int) in.get(i));
}
}
-
+
private List<Integer> createListWithContent(int[] in) {
List<Integer> results = new ArrayList<Integer>();
for (int i = 0; i < in.length; i++) {