Make PriorityQueue and Vector more JDK compatible.
Adds missing null checks and other edge cases.
Change-Id: I980a66f7caf8d1c07d74f6eba5b987ca35b692b8
diff --git a/user/super/com/google/gwt/emul/java/util/PriorityQueue.java b/user/super/com/google/gwt/emul/java/util/PriorityQueue.java
index 7fadc73..54eb4aa 100644
--- a/user/super/com/google/gwt/emul/java/util/PriorityQueue.java
+++ b/user/super/com/google/gwt/emul/java/util/PriorityQueue.java
@@ -15,6 +15,10 @@
*/
package java.util;
+import static javaemul.internal.InternalPreconditions.checkArgument;
+import static javaemul.internal.InternalPreconditions.checkCriticalNotNull;
+import static javaemul.internal.InternalPreconditions.checkNotNull;
+
/**
* An unbounded priority queue based on a priority heap. <a
* href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/PriorityQueue.html">[Sun
@@ -86,6 +90,8 @@
@Override
public boolean addAll(Collection<? extends E> c) {
+ checkNotNull(c);
+ checkArgument(c != this);
if (heap.addAll(c)) {
makeHeap(0);
return true;
@@ -104,7 +110,7 @@
@Override
public boolean contains(Object o) {
- return heap.contains(o);
+ return indexOf(o) >= 0;
}
@Override
@@ -125,6 +131,7 @@
@Override
public boolean offer(E e) {
+ checkCriticalNotNull(e);
int node = heap.size();
heap.add(e);
while (node > 0) {
@@ -162,7 +169,7 @@
@Override
public boolean remove(Object o) {
- int index = heap.indexOf(o);
+ int index = indexOf(o);
if (index < 0) {
return false;
}
@@ -268,6 +275,10 @@
return smallestChild;
}
+ private int indexOf(Object o) {
+ return o == null ? -1 : heap.indexOf(o);
+ }
+
private boolean isLeaf(int node) {
return isLeaf(node, heap.size());
}
diff --git a/user/super/com/google/gwt/emul/java/util/Vector.java b/user/super/com/google/gwt/emul/java/util/Vector.java
index 01d0856..79f8f51 100644
--- a/user/super/com/google/gwt/emul/java/util/Vector.java
+++ b/user/super/com/google/gwt/emul/java/util/Vector.java
@@ -78,6 +78,7 @@
@Override
public boolean addAll(int index, Collection<? extends E> c) {
+ checkArrayElementIndex(index, size() + 1);
return arrayList.addAll(index, c);
}
diff --git a/user/test/com/google/gwt/emultest/java/util/PriorityQueueTest.java b/user/test/com/google/gwt/emultest/java/util/PriorityQueueTest.java
index 5abe921..9342911 100644
--- a/user/test/com/google/gwt/emultest/java/util/PriorityQueueTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/PriorityQueueTest.java
@@ -18,6 +18,7 @@
import com.google.gwt.junit.client.GWTTestCase;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.NoSuchElementException;
@@ -34,6 +35,40 @@
return "com.google.gwt.emultest.EmulSuite";
}
+ public void testAdd() {
+ PriorityQueue<Integer> queue = new PriorityQueue<Integer>();
+
+ try {
+ queue.add(null);
+ } catch (NullPointerException expected) {
+ }
+
+ queue.add(1);
+ assertTrue(Arrays.asList(1).containsAll(queue));
+ queue.add(2);
+ assertTrue(Arrays.asList(1, 2).containsAll(queue));
+ }
+
+ public void testAddAll() {
+ PriorityQueue<Integer> queue = new PriorityQueue<>();
+ try {
+ queue.addAll(queue);
+ fail();
+ } catch (IllegalArgumentException expected) {
+ }
+
+ queue = new PriorityQueue<>();
+ try {
+ queue.addAll(Arrays.asList(1, null));
+ fail();
+ } catch (NullPointerException expected) {
+ }
+
+ queue = new PriorityQueue<>();
+ queue.addAll(Arrays.asList(2, 1, 3));
+ assertTrue(Arrays.asList(1, 2, 3).containsAll(queue));
+ }
+
public void testBasic() {
PriorityQueue<Integer> pq = new PriorityQueue<Integer>();
assertEquals(0, pq.size());
@@ -136,18 +171,69 @@
assertEquals(13, pq.remove().intValue());
assertTrue(pq.isEmpty());
}
-
- public void testPollRemove() {
- PriorityQueue<Integer> pq = new PriorityQueue<Integer>();
- try {
- pq.remove();
- fail("Expected NoSuchElementException");
- } catch (NoSuchElementException e) {
- // expected
- }
- assertNull(pq.poll());
+
+ public void testContains() {
+ PriorityQueue<Integer> queue = new PriorityQueue<>();
+
+ assertFalse(queue.contains(null));
+
+ queue.add(3);
+ queue.add(1);
+ queue.add(2);
+ assertTrue(queue.contains(1));
+ assertTrue(queue.contains(2));
+ assertTrue(queue.contains(3));
+ assertFalse(queue.contains(4));
}
+ public void testPeekElement() {
+ PriorityQueue<Integer> queue = new PriorityQueue<>();
+ try {
+ queue.element();
+ fail();
+ } catch (NoSuchElementException expected) {
+ }
+ assertNull(queue.peek());
+
+ queue.add(3);
+ queue.add(1);
+ queue.add(2);
+ assertEquals(1, (int) queue.element());
+ assertEquals(1, (int) queue.peek());
+ assertEquals(3, queue.size());
+ }
+
+ public void testPollRemove() {
+ PriorityQueue<Integer> queue = new PriorityQueue<>();
+ try {
+ queue.remove();
+ fail();
+ } catch (NoSuchElementException expected) {
+ }
+ assertNull(queue.poll());
+
+ queue.add(3);
+ queue.add(1);
+ queue.add(2);
+ assertEquals(1, (int) queue.remove());
+ assertEquals(2, queue.size());
+ assertEquals(2, (int) queue.remove());
+ assertEquals(1, queue.size());
+ assertEquals(3, (int) queue.remove());
+ assertTrue(queue.isEmpty());
+
+ queue = new PriorityQueue<>();
+ queue.add(1);
+ queue.add(2);
+ queue.add(3);
+ assertEquals(1, (int) queue.poll());
+ assertEquals(2, queue.size());
+ assertEquals(2, (int) queue.poll());
+ assertEquals(1, queue.size());
+ assertEquals(3, (int) queue.poll());
+ assertTrue(queue.isEmpty());
+ }
+
private void addArray(Collection<Integer> col, int... values) {
for (int val : values) {
col.add(val);