ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/Collection8Test.java
(Generate patch)

Comparing jsr166/src/test/tck/Collection8Test.java (file contents):
Revision 1.4 by jsr166, Mon Oct 17 01:55:48 2016 UTC vs.
Revision 1.17 by jsr166, Sun Nov 6 18:51:53 2016 UTC

# Line 5 | Line 5
5   * http://creativecommons.org/publicdomain/zero/1.0/
6   */
7  
8 + import static java.util.concurrent.TimeUnit.HOURS;
9   import static java.util.concurrent.TimeUnit.MILLISECONDS;
10  
11   import java.util.ArrayList;
12   import java.util.Collection;
13   import java.util.Collections;
14 + import java.util.Deque;
15 + import java.util.HashSet;
16 + import java.util.Iterator;
17 + import java.util.List;
18 + import java.util.NoSuchElementException;
19 + import java.util.Queue;
20 + import java.util.Spliterator;
21 + import java.util.concurrent.BlockingDeque;
22 + import java.util.concurrent.BlockingQueue;
23   import java.util.concurrent.CountDownLatch;
24   import java.util.concurrent.Executors;
25   import java.util.concurrent.ExecutorService;
26   import java.util.concurrent.Future;
27 + import java.util.concurrent.ThreadLocalRandom;
28   import java.util.concurrent.atomic.AtomicBoolean;
29   import java.util.concurrent.atomic.AtomicLong;
30 + import java.util.concurrent.atomic.AtomicReference;
31   import java.util.function.Consumer;
32 + import java.util.function.Predicate;
33  
34   import junit.framework.Test;
35  
# Line 39 | Line 52 | public class Collection8Test extends JSR
52                                        impl);
53      }
54  
55 +    Object bomb() {
56 +        return new Object() {
57 +                public boolean equals(Object x) { throw new AssertionError(); }
58 +                public int hashCode() { throw new AssertionError(); }
59 +            };
60 +    }
61 +
62 +    /** Checks properties of empty collections. */
63 +    public void testEmptyMeansEmpty() throws InterruptedException {
64 +        Collection c = impl.emptyCollection();
65 +        emptyMeansEmpty(c);
66 +
67 +        if (c instanceof java.io.Serializable)
68 +            emptyMeansEmpty(serialClone(c));
69 +
70 +        Collection clone = cloneableClone(c);
71 +        if (clone != null)
72 +            emptyMeansEmpty(clone);
73 +    }
74 +
75 +    void emptyMeansEmpty(Collection c) throws InterruptedException {
76 +        assertTrue(c.isEmpty());
77 +        assertEquals(0, c.size());
78 +        assertEquals("[]", c.toString());
79 +        {
80 +            Object[] a = c.toArray();
81 +            assertEquals(0, a.length);
82 +            assertSame(Object[].class, a.getClass());
83 +        }
84 +        {
85 +            Object[] a = new Object[0];
86 +            assertSame(a, c.toArray(a));
87 +        }
88 +        {
89 +            Integer[] a = new Integer[0];
90 +            assertSame(a, c.toArray(a));
91 +        }
92 +        {
93 +            Integer[] a = { 1, 2, 3};
94 +            assertSame(a, c.toArray(a));
95 +            assertNull(a[0]);
96 +            assertSame(2, a[1]);
97 +            assertSame(3, a[2]);
98 +        }
99 +        assertIteratorExhausted(c.iterator());
100 +        Consumer alwaysThrows = (e) -> { throw new AssertionError(); };
101 +        c.forEach(alwaysThrows);
102 +        c.iterator().forEachRemaining(alwaysThrows);
103 +        c.spliterator().forEachRemaining(alwaysThrows);
104 +        assertFalse(c.spliterator().tryAdvance(alwaysThrows));
105 +        if (c.spliterator().hasCharacteristics(Spliterator.SIZED))
106 +            assertEquals(0, c.spliterator().estimateSize());
107 +        assertFalse(c.contains(bomb()));
108 +        assertFalse(c.remove(bomb()));
109 +        if (c instanceof Queue) {
110 +            Queue q = (Queue) c;
111 +            assertNull(q.peek());
112 +            assertNull(q.poll());
113 +        }
114 +        if (c instanceof Deque) {
115 +            Deque d = (Deque) c;
116 +            assertNull(d.peekFirst());
117 +            assertNull(d.peekLast());
118 +            assertNull(d.pollFirst());
119 +            assertNull(d.pollLast());
120 +            assertIteratorExhausted(d.descendingIterator());
121 +            d.descendingIterator().forEachRemaining(alwaysThrows);
122 +            assertFalse(d.removeFirstOccurrence(bomb()));
123 +            assertFalse(d.removeLastOccurrence(bomb()));
124 +        }
125 +        if (c instanceof BlockingQueue) {
126 +            BlockingQueue q = (BlockingQueue) c;
127 +            assertNull(q.poll(0L, MILLISECONDS));
128 +        }
129 +        if (c instanceof BlockingDeque) {
130 +            BlockingDeque q = (BlockingDeque) c;
131 +            assertNull(q.pollFirst(0L, MILLISECONDS));
132 +            assertNull(q.pollLast(0L, MILLISECONDS));
133 +        }
134 +    }
135 +
136 +    public void testNullPointerExceptions() throws InterruptedException {
137 +        Collection c = impl.emptyCollection();
138 +        assertThrows(
139 +            NullPointerException.class,
140 +            () -> c.addAll(null),
141 +            () -> c.containsAll(null),
142 +            () -> c.retainAll(null),
143 +            () -> c.removeAll(null),
144 +            () -> c.removeIf(null),
145 +            () -> c.forEach(null),
146 +            () -> c.iterator().forEachRemaining(null),
147 +            () -> c.spliterator().forEachRemaining(null),
148 +            () -> c.spliterator().tryAdvance(null),
149 +            () -> c.toArray(null));
150 +
151 +        if (!impl.permitsNulls()) {
152 +            assertThrows(
153 +                NullPointerException.class,
154 +                () -> c.add(null));
155 +        }
156 +        if (!impl.permitsNulls() && c instanceof Queue) {
157 +            Queue q = (Queue) c;
158 +            assertThrows(
159 +                NullPointerException.class,
160 +                () -> q.offer(null));
161 +        }
162 +        if (!impl.permitsNulls() && c instanceof Deque) {
163 +            Deque d = (Deque) c;
164 +            assertThrows(
165 +                NullPointerException.class,
166 +                () -> d.addFirst(null),
167 +                () -> d.addLast(null),
168 +                () -> d.offerFirst(null),
169 +                () -> d.offerLast(null),
170 +                () -> d.push(null),
171 +                () -> d.descendingIterator().forEachRemaining(null));
172 +        }
173 +        if (c instanceof BlockingQueue) {
174 +            BlockingQueue q = (BlockingQueue) c;
175 +            assertThrows(
176 +                NullPointerException.class,
177 +                () -> {
178 +                    try { q.offer(null, 1L, HOURS); }
179 +                    catch (InterruptedException ex) {
180 +                        throw new AssertionError(ex);
181 +                    }},
182 +                () -> {
183 +                    try { q.put(null); }
184 +                    catch (InterruptedException ex) {
185 +                        throw new AssertionError(ex);
186 +                    }});
187 +        }
188 +        if (c instanceof BlockingDeque) {
189 +            BlockingDeque q = (BlockingDeque) c;
190 +            assertThrows(
191 +                NullPointerException.class,
192 +                () -> {
193 +                    try { q.offerFirst(null, 1L, HOURS); }
194 +                    catch (InterruptedException ex) {
195 +                        throw new AssertionError(ex);
196 +                    }},
197 +                () -> {
198 +                    try { q.offerLast(null, 1L, HOURS); }
199 +                    catch (InterruptedException ex) {
200 +                        throw new AssertionError(ex);
201 +                    }},
202 +                () -> {
203 +                    try { q.putFirst(null); }
204 +                    catch (InterruptedException ex) {
205 +                        throw new AssertionError(ex);
206 +                    }},
207 +                () -> {
208 +                    try { q.putLast(null); }
209 +                    catch (InterruptedException ex) {
210 +                        throw new AssertionError(ex);
211 +                    }});
212 +        }
213 +    }
214 +
215 +    public void testNoSuchElementExceptions() {
216 +        Collection c = impl.emptyCollection();
217 +        assertThrows(
218 +            NoSuchElementException.class,
219 +            () -> c.iterator().next());
220 +
221 +        if (c instanceof Queue) {
222 +            Queue q = (Queue) c;
223 +            assertThrows(
224 +                NoSuchElementException.class,
225 +                () -> q.element(),
226 +                () -> q.remove());
227 +        }
228 +        if (c instanceof Deque) {
229 +            Deque d = (Deque) c;
230 +            assertThrows(
231 +                NoSuchElementException.class,
232 +                () -> d.getFirst(),
233 +                () -> d.getLast(),
234 +                () -> d.removeFirst(),
235 +                () -> d.removeLast(),
236 +                () -> d.pop(),
237 +                () -> d.descendingIterator().next());
238 +        }
239 +    }
240 +
241 +    public void testRemoveIf() {
242 +        Collection c = impl.emptyCollection();
243 +        ThreadLocalRandom rnd = ThreadLocalRandom.current();
244 +        int n = rnd.nextInt(6);
245 +        for (int i = 0; i < n; i++) c.add(impl.makeElement(i));
246 +        AtomicReference threwAt = new AtomicReference(null);
247 +        ArrayList survivors = new ArrayList(c);
248 +        ArrayList accepts = new ArrayList();
249 +        ArrayList rejects = new ArrayList();
250 +        Predicate randomPredicate = (e) -> {
251 +            assertNull(threwAt.get());
252 +            switch (rnd.nextInt(3)) {
253 +            case 0: accepts.add(e); return true;
254 +            case 1: rejects.add(e); return false;
255 +            case 2: threwAt.set(e); throw new ArithmeticException();
256 +            default: throw new AssertionError();
257 +            }
258 +        };
259 +        try {
260 +            try {
261 +                boolean modified = c.removeIf(randomPredicate);
262 +                if (!modified) {
263 +                    assertNull(threwAt.get());
264 +                    assertEquals(n, rejects.size());
265 +                    assertEquals(0, accepts.size());
266 +                }
267 +            } catch (ArithmeticException ok) {}
268 +            survivors.removeAll(accepts);
269 +            assertEquals(n - accepts.size(), c.size());
270 +            assertTrue(c.containsAll(survivors));
271 +            assertTrue(survivors.containsAll(rejects));
272 +            for (Object x : accepts) assertFalse(c.contains(x));
273 +            if (threwAt.get() == null)
274 +                assertEquals(accepts.size() + rejects.size(), n);
275 +        } catch (Throwable ex) {
276 +            System.err.println(impl.klazz());
277 +            System.err.printf("c=%s%n", c);
278 +            System.err.printf("n=%d%n", n);
279 +            System.err.printf("accepts=%s%n", accepts);
280 +            System.err.printf("rejects=%s%n", rejects);
281 +            System.err.printf("survivors=%s%n", survivors);
282 +            System.err.printf("threw=%s%n", threwAt.get());
283 +            throw ex;
284 +        }
285 +    }
286 +
287 +    /**
288 +     * Various ways of traversing a collection yield same elements
289 +     */
290 +    public void testIteratorEquivalence() {
291 +        Collection c = impl.emptyCollection();
292 +        ThreadLocalRandom rnd = ThreadLocalRandom.current();
293 +        int n = rnd.nextInt(6);
294 +        for (int i = 0; i < n; i++) c.add(impl.makeElement(i));
295 +        ArrayList iterated = new ArrayList();
296 +        ArrayList iteratedForEachRemaining = new ArrayList();
297 +        ArrayList tryAdvanced = new ArrayList();
298 +        ArrayList spliterated = new ArrayList();
299 +        ArrayList forEached = new ArrayList();
300 +        ArrayList removeIfed = new ArrayList();
301 +        for (Object x : c) iterated.add(x);
302 +        c.iterator().forEachRemaining(e -> iteratedForEachRemaining.add(e));
303 +        for (Spliterator s = c.spliterator();
304 +             s.tryAdvance(e -> tryAdvanced.add(e)); ) {}
305 +        c.spliterator().forEachRemaining(e -> spliterated.add(e));
306 +        c.forEach(e -> forEached.add(e));
307 +        c.removeIf(e -> { removeIfed.add(e); return false; });
308 +        boolean ordered =
309 +            c.spliterator().hasCharacteristics(Spliterator.ORDERED);
310 +        if (c instanceof List || c instanceof Deque)
311 +            assertTrue(ordered);
312 +        if (ordered) {
313 +            assertEquals(iterated, iteratedForEachRemaining);
314 +            assertEquals(iterated, tryAdvanced);
315 +            assertEquals(iterated, spliterated);
316 +            assertEquals(iterated, forEached);
317 +            assertEquals(iterated, removeIfed);
318 +        } else {
319 +            HashSet cset = new HashSet(c);
320 +            assertEquals(cset, new HashSet(iterated));
321 +            assertEquals(cset, new HashSet(iteratedForEachRemaining));
322 +            assertEquals(cset, new HashSet(tryAdvanced));
323 +            assertEquals(cset, new HashSet(spliterated));
324 +            assertEquals(cset, new HashSet(forEached));
325 +            assertEquals(cset, new HashSet(removeIfed));
326 +        }
327 +        if (c instanceof Deque) {
328 +            Deque d = (Deque) c;
329 +            ArrayList descending = new ArrayList();
330 +            ArrayList descendingForEachRemaining = new ArrayList();
331 +            for (Iterator it = d.descendingIterator(); it.hasNext(); )
332 +                descending.add(it.next());
333 +            d.descendingIterator().forEachRemaining(
334 +                e -> descendingForEachRemaining.add(e));
335 +            Collections.reverse(descending);
336 +            Collections.reverse(descendingForEachRemaining);
337 +            assertEquals(iterated, descending);
338 +            assertEquals(iterated, descendingForEachRemaining);
339 +        }
340 +    }
341 +
342 +    /**
343 +     * Calling Iterator#remove() after Iterator#forEachRemaining
344 +     * should remove last element
345 +     */
346 +    public void testRemoveAfterForEachRemaining() {
347 +        Collection c = impl.emptyCollection();
348 +        ThreadLocalRandom rnd = ThreadLocalRandom.current();
349 +        {
350 +            int n = 3 + rnd.nextInt(2);
351 +            for (int i = 0; i < n; i++) c.add(impl.makeElement(i));
352 +            Iterator it = c.iterator();
353 +            assertTrue(it.hasNext());
354 +            assertEquals(impl.makeElement(0), it.next());
355 +            assertTrue(it.hasNext());
356 +            assertEquals(impl.makeElement(1), it.next());
357 +            it.forEachRemaining((e) -> {});
358 +            it.remove();
359 +            assertEquals(n - 1, c.size());
360 +            for (int i = 0; i < n - 1; i++)
361 +                assertTrue(c.contains(impl.makeElement(i)));
362 +            assertFalse(c.contains(impl.makeElement(n - 1)));
363 +        }
364 +        if (c instanceof Deque) {
365 +            Deque d = (Deque) impl.emptyCollection();
366 +            int n = 3 + rnd.nextInt(2);
367 +            for (int i = 0; i < n; i++) d.add(impl.makeElement(i));
368 +            Iterator it = d.descendingIterator();
369 +            assertTrue(it.hasNext());
370 +            assertEquals(impl.makeElement(n - 1), it.next());
371 +            assertTrue(it.hasNext());
372 +            assertEquals(impl.makeElement(n - 2), it.next());
373 +            it.forEachRemaining((e) -> {});
374 +            it.remove();
375 +            assertEquals(n - 1, d.size());
376 +            for (int i = 1; i < n; i++)
377 +                assertTrue(d.contains(impl.makeElement(i)));
378 +            assertFalse(d.contains(impl.makeElement(0)));
379 +        }
380 +    }
381 +
382      /**
383       * stream().forEach returns elements in the collection
384       */

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines