Remove the SUBSIZED characteristic from filtered streams

... not just SIZED.

Author: lowasser

Change-Id: Ided646c04907b2095437e504b4e7af0b462b0e74
Review-Link: https://gwt-review.googlesource.com/#/c/18460/
diff --git a/user/super/com/google/gwt/emul/java/lang/Double.java b/user/super/com/google/gwt/emul/java/lang/Double.java
index 173a63c..f41d44b 100644
--- a/user/super/com/google/gwt/emul/java/lang/Double.java
+++ b/user/super/com/google/gwt/emul/java/lang/Double.java
@@ -18,7 +18,6 @@
 import static javaemul.internal.InternalPreconditions.checkNotNull;
 
 import javaemul.internal.JsUtils;
-
 import jsinterop.annotations.JsMethod;
 
 /**
diff --git a/user/super/com/google/gwt/emul/java/util/stream/DoubleStreamImpl.java b/user/super/com/google/gwt/emul/java/util/stream/DoubleStreamImpl.java
index 5353a05..0669293 100644
--- a/user/super/com/google/gwt/emul/java/util/stream/DoubleStreamImpl.java
+++ b/user/super/com/google/gwt/emul/java/util/stream/DoubleStreamImpl.java
@@ -367,7 +367,9 @@
     private boolean found;
 
     public FilterSpliterator(DoublePredicate filter, Spliterator.OfDouble original) {
-      super(original.estimateSize(), original.characteristics() & ~Spliterator.SIZED);
+      super(
+          original.estimateSize(),
+          original.characteristics() & ~(Spliterator.SIZED | Spliterator.SUBSIZED));
       checkNotNull(filter);
       this.filter = filter;
       this.original = original;
diff --git a/user/super/com/google/gwt/emul/java/util/stream/IntStreamImpl.java b/user/super/com/google/gwt/emul/java/util/stream/IntStreamImpl.java
index 6839314..ca6d158 100644
--- a/user/super/com/google/gwt/emul/java/util/stream/IntStreamImpl.java
+++ b/user/super/com/google/gwt/emul/java/util/stream/IntStreamImpl.java
@@ -380,7 +380,9 @@
     private boolean found;
 
     public FilterSpliterator(IntPredicate filter, Spliterator.OfInt original) {
-      super(original.estimateSize(), original.characteristics() & ~Spliterator.SIZED);
+      super(
+          original.estimateSize(),
+          original.characteristics() & ~(Spliterator.SIZED | Spliterator.SUBSIZED));
       checkNotNull(filter);
       this.filter = filter;
       this.original = original;
diff --git a/user/super/com/google/gwt/emul/java/util/stream/LongStreamImpl.java b/user/super/com/google/gwt/emul/java/util/stream/LongStreamImpl.java
index ee9a379..b4c504e 100644
--- a/user/super/com/google/gwt/emul/java/util/stream/LongStreamImpl.java
+++ b/user/super/com/google/gwt/emul/java/util/stream/LongStreamImpl.java
@@ -372,7 +372,9 @@
     private boolean found;
 
     public FilterSpliterator(LongPredicate filter, Spliterator.OfLong original) {
-      super(original.estimateSize(), original.characteristics() & ~Spliterator.SIZED);
+      super(
+          original.estimateSize(),
+          original.characteristics() & ~(Spliterator.SIZED | Spliterator.SUBSIZED));
       checkNotNull(filter);
       this.filter = filter;
       this.original = original;
diff --git a/user/super/com/google/gwt/emul/java/util/stream/StreamImpl.java b/user/super/com/google/gwt/emul/java/util/stream/StreamImpl.java
index 1126fc6..8918a1c 100644
--- a/user/super/com/google/gwt/emul/java/util/stream/StreamImpl.java
+++ b/user/super/com/google/gwt/emul/java/util/stream/StreamImpl.java
@@ -403,7 +403,9 @@
     private boolean found;
 
     public FilterSpliterator(Predicate<? super T> filter, Spliterator<T> original) {
-      super(original.estimateSize(), original.characteristics() & ~Spliterator.SIZED);
+      super(
+          original.estimateSize(),
+          original.characteristics() & ~(Spliterator.SIZED | Spliterator.SUBSIZED));
       checkNotNull(filter);
       this.filter = filter;
       this.original = original;
diff --git a/user/test/com/google/gwt/emultest/java8/util/stream/DoubleStreamTest.java b/user/test/com/google/gwt/emultest/java8/util/stream/DoubleStreamTest.java
index f8f6715..68140c7 100644
--- a/user/test/com/google/gwt/emultest/java8/util/stream/DoubleStreamTest.java
+++ b/user/test/com/google/gwt/emultest/java8/util/stream/DoubleStreamTest.java
@@ -165,6 +165,14 @@
     DoubleStream.of(1d, 2d, 3d).filter(i -> data[0] |= true);
     assertFalse(data[0]);
 
+    // Nothing's *defined* to care about the Spliterator characteristics, but the implementation
+    // can't actually know the size before executing, so we check the characteristics explicitly.
+    assertFalse(
+        DoubleStream.of(1d, 2d, 3d)
+            .filter(a -> a == 1d)
+            .spliterator()
+            .hasCharacteristics(Spliterator.SIZED | Spliterator.SUBSIZED));
+
     // one result
     assertEquals(
         new double[] {1d}, DoubleStream.of(1d, 2d, 3d, 4d, 3d).filter(a -> a == 1).toArray());
diff --git a/user/test/com/google/gwt/emultest/java8/util/stream/IntStreamTest.java b/user/test/com/google/gwt/emultest/java8/util/stream/IntStreamTest.java
index 8b72465..5fea722 100644
--- a/user/test/com/google/gwt/emultest/java8/util/stream/IntStreamTest.java
+++ b/user/test/com/google/gwt/emultest/java8/util/stream/IntStreamTest.java
@@ -178,6 +178,14 @@
     IntStream.of(1, 2, 3).filter(i -> data[0] |= true);
     assertFalse(data[0]);
 
+    // Nothing's *defined* to care about the Spliterator characteristics, but the implementation
+    // can't actually know the size before executing, so we check the characteristics explicitly.
+    assertFalse(
+        IntStream.of(1, 2, 3)
+            .filter(a -> a == 1)
+            .spliterator()
+            .hasCharacteristics(Spliterator.SIZED | Spliterator.SUBSIZED));
+
     // one result
     assertEquals(new int[] {1}, IntStream.of(1, 2, 3, 4, 3).filter(a -> a == 1).toArray());
     // zero results
diff --git a/user/test/com/google/gwt/emultest/java8/util/stream/LongStreamTest.java b/user/test/com/google/gwt/emultest/java8/util/stream/LongStreamTest.java
index 0efee03..ff76477 100644
--- a/user/test/com/google/gwt/emultest/java8/util/stream/LongStreamTest.java
+++ b/user/test/com/google/gwt/emultest/java8/util/stream/LongStreamTest.java
@@ -177,6 +177,14 @@
     LongStream.of(1L, 2L, 3L).filter(i -> data[0] |= true);
     assertFalse(data[0]);
 
+    // Nothing's *defined* to care about the Spliterator characteristics, but the implementation
+    // can't actually know the size before executing, so we check the characteristics explicitly.
+    assertFalse(
+        LongStream.of(1L, 2L, 3L)
+            .filter(a -> a == 1L)
+            .spliterator()
+            .hasCharacteristics(Spliterator.SIZED | Spliterator.SUBSIZED));
+
     // one result
     assertEquals(new long[] {1L}, LongStream.of(1L, 2L, 3L, 4L, 3L).filter(a -> a == 1).toArray());
     // zero results
diff --git a/user/test/com/google/gwt/emultest/java8/util/stream/StreamTest.java b/user/test/com/google/gwt/emultest/java8/util/stream/StreamTest.java
index 1e0b5a0..bfb828a 100644
--- a/user/test/com/google/gwt/emultest/java8/util/stream/StreamTest.java
+++ b/user/test/com/google/gwt/emultest/java8/util/stream/StreamTest.java
@@ -231,6 +231,14 @@
     Stream.of(1, 2, 3).filter(i -> data[0] |= true);
     assertFalse(data[0]);
 
+    // Nothing's *defined* to care about the Spliterator characteristics, but the implementation
+    // can't actually know the size before executing, so we check the characteristics explicitly.
+    assertFalse(
+        Stream.of("a", "b", "c", "d", "c")
+            .filter(a -> a.equals("a"))
+            .spliterator()
+            .hasCharacteristics(Spliterator.SIZED | Spliterator.SUBSIZED));
+
     // one result
     assertEquals(
         Collections.singletonList("a"),