use of java8.util.concurrent.ThreadLocalRandom in project streamsupport by stefan-zobel.
the class Collection8Test method testElementRemovalDuringTraversal.
/**
* All elements removed in the middle of CONCURRENT traversal.
*/
@SuppressWarnings({ "unchecked", "rawtypes" })
@Test(dataProvider = "Source")
public void testElementRemovalDuringTraversal(String description, Supplier<CollectionImplementation> sci) {
CollectionImplementation impl = sci.get();
if (HAS_JAVA8_SPLITERATOR_BUG && LinkedBlockingQueue.class.equals(impl.klazz())) {
// https://bugs.openjdk.java.net/browse/JDK-8171051
return;
}
Collection<Object> c = impl.emptyCollection();
ThreadLocalRandom rnd = ThreadLocalRandom.current();
int n = rnd.nextInt(6);
ArrayList copy = new ArrayList();
for (int i = 0; i < n; i++) {
Object x = impl.makeElement(i);
copy.add(x);
c.add(x);
}
ArrayList iterated = new ArrayList();
ArrayList spliterated = new ArrayList();
Spliterator<?> s = Spliterators.spliterator(c);
Iterator<?> it = c.iterator();
for (int i = rnd.nextInt(n + 1); --i >= 0; ) {
assertTrue(s.tryAdvance(spliterated::add));
if (rnd.nextBoolean())
assertTrue(it.hasNext());
iterated.add(it.next());
}
Consumer alwaysThrows = e -> {
throw new AssertionError();
};
if (s.hasCharacteristics(Spliterator.CONCURRENT)) {
// TODO: many more removal methods
c.clear();
if (testImplementationDetails && !(c instanceof java.util.concurrent.ArrayBlockingQueue)) {
if (rnd.nextBoolean())
assertFalse(s.tryAdvance(alwaysThrows));
else
s.forEachRemaining(alwaysThrows);
}
if (it.hasNext())
iterated.add(it.next());
if (rnd.nextBoolean())
assertIteratorExhausted(it);
}
assertTrue(copy.containsAll(iterated));
assertTrue(copy.containsAll(spliterated));
}
use of java8.util.concurrent.ThreadLocalRandom in project streamsupport by stefan-zobel.
the class Collection8Test method testTraversalEquivalence.
/**
* Various ways of traversing a collection yield same elements
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
@Test(dataProvider = "Source")
public void testTraversalEquivalence(String description, Supplier<CollectionImplementation> sci) {
CollectionImplementation impl = sci.get();
Collection c = impl.emptyCollection();
ThreadLocalRandom rnd = ThreadLocalRandom.current();
int n = rnd.nextInt(6);
for (int i = 0; i < n; i++) c.add(impl.makeElement(i));
ArrayList iterated = new ArrayList();
ArrayList iteratedForEachRemaining = new ArrayList();
ArrayList tryAdvanced = new ArrayList();
ArrayList spliterated = new ArrayList();
ArrayList splitonced = new ArrayList();
ArrayList forEached = new ArrayList();
ArrayList streamForEached = new ArrayList();
ConcurrentLinkedQueue parallelStreamForEached = new ConcurrentLinkedQueue();
ArrayList removeIfed = new ArrayList();
for (Object x : c) iterated.add(x);
Iterators.forEachRemaining(c.iterator(), iteratedForEachRemaining::add);
for (Spliterator s = Spliterators.spliterator(c); s.tryAdvance(tryAdvanced::add); ) {
}
Spliterators.spliterator(c).forEachRemaining(spliterated::add);
{
// trySplit returns "strict prefix"
Spliterator<?> s1 = Spliterators.spliterator(c), s2 = s1.trySplit();
if (s2 != null)
s2.forEachRemaining(splitonced::add);
s1.forEachRemaining(splitonced::add);
}
Iterables.forEach(c, forEached::add);
StreamSupport.stream(c).forEach(streamForEached::add);
StreamSupport.parallelStream(c).forEach(parallelStreamForEached::add);
Iterables.removeIf(c, e -> {
removeIfed.add(e);
return false;
});
boolean ordered = Spliterators.spliterator(c).hasCharacteristics(Spliterator.ORDERED);
if (c instanceof List || c instanceof Deque)
assertTrue(ordered);
HashSet<?> cset = new HashSet<>(c);
assertEquals(cset, new HashSet<>(parallelStreamForEached));
if (ordered) {
assertEquals(iterated, iteratedForEachRemaining);
assertEquals(iterated, tryAdvanced);
assertEquals(iterated, spliterated);
assertEquals(iterated, splitonced);
assertEquals(iterated, forEached);
assertEquals(iterated, streamForEached);
assertEquals(iterated, removeIfed);
} else {
assertEquals(cset, new HashSet<>(iterated));
assertEquals(cset, new HashSet<>(iteratedForEachRemaining));
assertEquals(cset, new HashSet<>(tryAdvanced));
assertEquals(cset, new HashSet<>(spliterated));
assertEquals(cset, new HashSet<>(splitonced));
assertEquals(cset, new HashSet<>(forEached));
assertEquals(cset, new HashSet<>(streamForEached));
assertEquals(cset, new HashSet<>(removeIfed));
}
if (c instanceof Deque) {
Deque<?> d = (Deque<?>) c;
ArrayList descending = new ArrayList();
ArrayList descendingForEachRemaining = new ArrayList();
for (Iterator<?> it = d.descendingIterator(); it.hasNext(); ) descending.add(it.next());
Iterators.forEachRemaining(d.descendingIterator(), e -> descendingForEachRemaining.add(e));
Collections.reverse(descending);
Collections.reverse(descendingForEachRemaining);
assertEquals(iterated, descending);
assertEquals(iterated, descendingForEachRemaining);
}
}
use of java8.util.concurrent.ThreadLocalRandom in project streamsupport by stefan-zobel.
the class Collection8Test method testStickySpliteratorExhaustion.
/**
* Concurrent Spliterators, once exhausted, stay exhausted.
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
@Test(dataProvider = "Source")
public void testStickySpliteratorExhaustion(String description, Supplier<CollectionImplementation> sci) throws Throwable {
CollectionImplementation impl = sci.get();
if (HAS_JAVA8_SPLITERATOR_BUG && PriorityBlockingQueue.class.equals(impl.klazz())) {
// https://bugs.openjdk.java.net/browse/JDK-8172023
return;
}
if (!impl.isConcurrent())
return;
if (!testImplementationDetails)
return;
final ThreadLocalRandom rnd = ThreadLocalRandom.current();
final Consumer<?> alwaysThrows = e -> {
throw new AssertionError();
};
final Collection c = impl.emptyCollection();
final Spliterator s = Spliterators.spliterator(c);
if (rnd.nextBoolean()) {
assertFalse(s.tryAdvance(alwaysThrows));
} else {
s.forEachRemaining(alwaysThrows);
}
final Object one = impl.makeElement(1);
// Spliterator should not notice added element
c.add(one);
if (rnd.nextBoolean()) {
assertFalse(s.tryAdvance(alwaysThrows));
} else {
s.forEachRemaining(alwaysThrows);
}
}
use of java8.util.concurrent.ThreadLocalRandom in project streamsupport by stefan-zobel.
the class Collection8Test method testRemoveAfterForEachRemaining.
/**
* Calling Iterator#remove() after Iterator#forEachRemaining
* should (maybe) remove last element
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
@Test(dataProvider = "Source")
public void testRemoveAfterForEachRemaining(String description, Supplier<CollectionImplementation> sci) {
CollectionImplementation impl = sci.get();
Collection c = impl.emptyCollection();
ThreadLocalRandom rnd = ThreadLocalRandom.current();
testCollection: {
int n = 3 + rnd.nextInt(2);
for (int i = 0; i < n; i++) c.add(impl.makeElement(i));
Iterator<?> it = c.iterator();
assertTrue(it.hasNext());
assertEquals(impl.makeElement(0), it.next());
assertTrue(it.hasNext());
assertEquals(impl.makeElement(1), it.next());
Iterators.forEachRemaining(it, e -> assertTrue(c.contains(e)));
if (testImplementationDetails) {
if (c instanceof java.util.concurrent.ArrayBlockingQueue) {
assertIteratorExhausted(it);
} else {
try {
it.remove();
} catch (UnsupportedOperationException ok) {
break testCollection;
}
assertEquals(n - 1, c.size());
for (int i = 0; i < n - 1; i++) assertTrue(c.contains(impl.makeElement(i)));
assertFalse(c.contains(impl.makeElement(n - 1)));
}
}
}
if (c instanceof Deque) {
Deque d = (Deque) impl.emptyCollection();
int n = 3 + rnd.nextInt(2);
for (int i = 0; i < n; i++) d.add(impl.makeElement(i));
Iterator<?> it = d.descendingIterator();
assertTrue(it.hasNext());
assertEquals(impl.makeElement(n - 1), it.next());
assertTrue(it.hasNext());
assertEquals(impl.makeElement(n - 2), it.next());
Iterators.forEachRemaining(it, e -> assertTrue(c.contains(e)));
if (testImplementationDetails) {
it.remove();
assertEquals(n - 1, d.size());
for (int i = 1; i < n; i++) assertTrue(d.contains(impl.makeElement(i)));
assertFalse(d.contains(impl.makeElement(0)));
}
}
}
use of java8.util.concurrent.ThreadLocalRandom in project streamsupport by stefan-zobel.
the class RecursiveActionTest method testSortTaskDemo.
/**
* SortTask demo works as advertised
*/
public void testSortTaskDemo() {
ThreadLocalRandom rnd = ThreadLocalRandom.current();
long[] array = new long[1007];
for (int i = 0; i < array.length; i++) array[i] = rnd.nextLong();
long[] arrayClone = array.clone();
testInvokeOnPool(mainPool(), new SortTask(array));
Arrays.sort(arrayClone);
assertTrue(Arrays.equals(array, arrayClone));
}
Aggregations