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"),