241 |
|
|
242 |
|
public void testRemoveIf() { |
243 |
|
Collection c = impl.emptyCollection(); |
244 |
+ |
boolean ordered = |
245 |
+ |
c.spliterator().hasCharacteristics(Spliterator.ORDERED); |
246 |
|
ThreadLocalRandom rnd = ThreadLocalRandom.current(); |
247 |
|
int n = rnd.nextInt(6); |
248 |
|
for (int i = 0; i < n; i++) c.add(impl.makeElement(i)); |
274 |
|
assertEquals(modified, accepts.size() > 0); |
275 |
|
assertEquals(modified, rejects.size() != n); |
276 |
|
assertEquals(accepts.size() + rejects.size(), n); |
277 |
< |
assertEquals(rejects, Arrays.asList(c.toArray())); |
277 |
> |
if (ordered) { |
278 |
> |
assertEquals(rejects, |
279 |
> |
Arrays.asList(c.toArray())); |
280 |
> |
} else { |
281 |
> |
assertEquals(new HashSet(rejects), |
282 |
> |
new HashSet(Arrays.asList(c.toArray()))); |
283 |
> |
} |
284 |
|
} catch (ArithmeticException ok) { |
285 |
|
assertNotNull(threwAt.get()); |
286 |
|
assertTrue(c.contains(threwAt.get())); |
301 |
|
assertTrue(c.containsAll(rejects)); |
302 |
|
assertTrue(c.containsAll(survivors)); |
303 |
|
assertTrue(survivors.containsAll(rejects)); |
304 |
< |
assertEquals(n - accepts.size(), c.size()); |
305 |
< |
for (Object x : accepts) assertFalse(c.contains(x)); |
304 |
> |
if (threwAt.get() == null) { |
305 |
> |
assertEquals(n - accepts.size(), c.size()); |
306 |
> |
for (Object x : accepts) assertFalse(c.contains(x)); |
307 |
> |
} else { |
308 |
> |
// Two acceptable behaviors: entire removeIf call is one |
309 |
> |
// transaction, or each element processed is one transaction. |
310 |
> |
assertTrue(n == c.size() || n == c.size() + accepts.size()); |
311 |
> |
int k = 0; |
312 |
> |
for (Object x : accepts) if (c.contains(x)) k++; |
313 |
> |
assertTrue(k == accepts.size() || k == 0); |
314 |
> |
} |
315 |
|
} catch (Throwable ex) { |
316 |
|
System.err.println(impl.klazz()); |
317 |
< |
System.err.printf("c=%s%n", c); |
317 |
> |
// c is at risk of corruption if we got here, so be lenient |
318 |
> |
try { System.err.printf("c=%s%n", c); } |
319 |
> |
catch (Throwable t) { t.printStackTrace(); } |
320 |
|
System.err.printf("n=%d%n", n); |
321 |
|
System.err.printf("orig=%s%n", orig); |
322 |
|
System.err.printf("accepts=%s%n", accepts); |
384 |
|
|
385 |
|
/** |
386 |
|
* Calling Iterator#remove() after Iterator#forEachRemaining |
387 |
< |
* should remove last element |
387 |
> |
* should (maybe) remove last element |
388 |
|
*/ |
389 |
|
public void testRemoveAfterForEachRemaining() { |
390 |
|
Collection c = impl.emptyCollection(); |
397 |
|
assertEquals(impl.makeElement(0), it.next()); |
398 |
|
assertTrue(it.hasNext()); |
399 |
|
assertEquals(impl.makeElement(1), it.next()); |
400 |
< |
it.forEachRemaining(e -> {}); |
401 |
< |
it.remove(); |
402 |
< |
assertEquals(n - 1, c.size()); |
403 |
< |
for (int i = 0; i < n - 1; i++) |
404 |
< |
assertTrue(c.contains(impl.makeElement(i))); |
405 |
< |
assertFalse(c.contains(impl.makeElement(n - 1))); |
400 |
> |
it.forEachRemaining(e -> assertTrue(c.contains(e))); |
401 |
> |
if (testImplementationDetails) { |
402 |
> |
if (c instanceof java.util.concurrent.ArrayBlockingQueue) { |
403 |
> |
assertIteratorExhausted(it); |
404 |
> |
} else { |
405 |
> |
it.remove(); |
406 |
> |
assertEquals(n - 1, c.size()); |
407 |
> |
for (int i = 0; i < n - 1; i++) |
408 |
> |
assertTrue(c.contains(impl.makeElement(i))); |
409 |
> |
assertFalse(c.contains(impl.makeElement(n - 1))); |
410 |
> |
} |
411 |
> |
} |
412 |
|
} |
413 |
|
if (c instanceof Deque) { |
414 |
|
Deque d = (Deque) impl.emptyCollection(); |
419 |
|
assertEquals(impl.makeElement(n - 1), it.next()); |
420 |
|
assertTrue(it.hasNext()); |
421 |
|
assertEquals(impl.makeElement(n - 2), it.next()); |
422 |
< |
it.forEachRemaining(e -> {}); |
423 |
< |
it.remove(); |
424 |
< |
assertEquals(n - 1, d.size()); |
425 |
< |
for (int i = 1; i < n; i++) |
426 |
< |
assertTrue(d.contains(impl.makeElement(i))); |
427 |
< |
assertFalse(d.contains(impl.makeElement(0))); |
422 |
> |
it.forEachRemaining(e -> assertTrue(c.contains(e))); |
423 |
> |
if (testImplementationDetails) { |
424 |
> |
it.remove(); |
425 |
> |
assertEquals(n - 1, d.size()); |
426 |
> |
for (int i = 1; i < n; i++) |
427 |
> |
assertTrue(d.contains(impl.makeElement(i))); |
428 |
> |
assertFalse(d.contains(impl.makeElement(0))); |
429 |
> |
} |
430 |
|
} |
431 |
|
} |
432 |
|
|