RFR 8169808 Stream returning methods should specify if they are late binding
Martin Buchholz
martinrb at google.com
Wed Nov 23 00:24:05 UTC 2016
On Mon, Nov 21, 2016 at 1:06 PM, Paul Sandoz <paul.sandoz at oracle.com> wrote:
>
> See the SpliteratorLateBindingFailFastTest. That could be refactored out
> as it’s conflating two concepts and is too collection/map focused.
>
Here's my own attempt, for the pending jsr166 integration:
--- src/test/tck/Collection8Test.java 22 Nov 2016 01:08:14 -0000 1.29
+++ src/test/tck/Collection8Test.java 23 Nov 2016 00:20:43 -0000
@@ -606,6 +606,39 @@
assertNull(future.get(0L, MILLISECONDS));
}
+ /**
+ * Spliterators are either IMMUTABLE or truly late-binding or, if
+ * concurrent, use the same "late-binding style" of returning
+ * elements added between creation and first use.
+ */
+ public void testLateBinding() throws Throwable {
+ if (!testImplementationDetails) return;
+ // Immutable (snapshot) spliterators are exempt
+ if (impl.emptyCollection().spliterator()
+ .hasCharacteristics(Spliterator.IMMUTABLE))
+ return;
+ final Object one = impl.makeElement(1);
+ {
+ final Collection c = impl.emptyCollection();
+ final Spliterator split = c.spliterator();
+ c.add(one);
+ assertTrue(split.tryAdvance(e -> { assertSame(e, one); }));
+ assertFalse(split.tryAdvance(e -> { throw new
AssertionError(); }));
+ assertTrue(c.contains(one));
+ }
+ {
+ final AtomicLong count = new AtomicLong(0);
+ final Collection c = impl.emptyCollection();
+ final Spliterator split = c.spliterator();
+ c.add(one);
+ split.forEachRemaining(
+ e -> { assertSame(e, one); count.getAndIncrement(); });
+ assertEquals(1L, count.get());
+ assertFalse(split.tryAdvance(e -> { throw new
AssertionError(); }));
+ assertTrue(c.contains(one));
+ }
+ }
+
More information about the core-libs-dev
mailing list