ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedListTest.java
Revision: 1.52
Committed: Wed Jan 27 02:55:18 2021 UTC (3 years, 3 months ago) by jsr166
Branch: MAIN
CVS Tags: HEAD
Changes since 1.51: +2 -1 lines
Log Message:
Suppress all new errorprone "errors"

File Contents

# User Rev Content
1 dl 1.1 /*
2 dl 1.7 * Written by Doug Lea with assistance from members of JCP JSR-166
3     * Expert Group and released to the public domain, as explained at
4 jsr166 1.26 * http://creativecommons.org/publicdomain/zero/1.0/
5 jsr166 1.10 * Other contributors include Andrew Wright, Jeffrey Hayes,
6     * Pat Fisher, Mike Judd.
7 dl 1.1 */
8    
9 jsr166 1.28 import java.util.Arrays;
10     import java.util.Collection;
11     import java.util.Iterator;
12     import java.util.LinkedList;
13 jsr166 1.47 import java.util.List;
14 jsr166 1.28 import java.util.NoSuchElementException;
15 jsr166 1.47 import java.util.concurrent.ThreadLocalRandom;
16 dl 1.1
17 jsr166 1.32 import junit.framework.Test;
18    
19 dl 1.3 public class LinkedListTest extends JSR166TestCase {
20 dl 1.1 public static void main(String[] args) {
21 jsr166 1.37 main(suite(), args);
22 dl 1.1 }
23    
24     public static Test suite() {
25 jsr166 1.42 class Implementation implements CollectionImplementation {
26     public Class<?> klazz() { return LinkedList.class; }
27 jsr166 1.47 public List emptyCollection() { return new LinkedList(); }
28 dl 1.50 public Object makeElement(int i) { return JSR166TestCase.itemFor(i); }
29 jsr166 1.42 public boolean isConcurrent() { return false; }
30     public boolean permitsNulls() { return true; }
31     }
32 jsr166 1.43 class SubListImplementation extends Implementation {
33 dl 1.50 @SuppressWarnings("unchecked")
34 jsr166 1.47 public List emptyCollection() {
35     List list = super.emptyCollection();
36     ThreadLocalRandom rnd = ThreadLocalRandom.current();
37     if (rnd.nextBoolean())
38     list.add(makeElement(rnd.nextInt()));
39     int i = rnd.nextInt(list.size() + 1);
40     return list.subList(i, i);
41 jsr166 1.43 }
42     }
43     return newTestSuite(
44     LinkedListTest.class,
45     CollectionTest.testSuite(new Implementation()),
46     CollectionTest.testSuite(new SubListImplementation()));
47 dl 1.1 }
48    
49     /**
50 jsr166 1.31 * Returns a new queue of given size containing consecutive
51 dl 1.50 * Items 0 ... n - 1.
52 dl 1.1 */
53 dl 1.50 private static LinkedList<Item> populatedQueue(int n) {
54     LinkedList<Item> q = new LinkedList<>();
55 dl 1.1 assertTrue(q.isEmpty());
56 jsr166 1.13 for (int i = 0; i < n; ++i)
57 dl 1.50 mustOffer(q, i);
58 dl 1.1 assertFalse(q.isEmpty());
59 dl 1.50 mustEqual(n, q.size());
60     mustEqual(0, q.peekFirst());
61     mustEqual((n - 1), q.peekLast());
62 dl 1.1 return q;
63     }
64 jsr166 1.10
65 dl 1.4 /**
66 dl 1.5 * new queue is empty
67 dl 1.4 */
68     public void testConstructor1() {
69 dl 1.50 mustEqual(0, new LinkedList<Item>().size());
70 dl 1.1 }
71    
72 dl 1.4 /**
73 dl 1.5 * Initializing from null Collection throws NPE
74 dl 1.4 */
75 dl 1.1 public void testConstructor3() {
76     try {
77 dl 1.50 new LinkedList<Item>((Collection<Item>)null);
78 dl 1.4 shouldThrow();
79 jsr166 1.14 } catch (NullPointerException success) {}
80 dl 1.1 }
81    
82 dl 1.4 /**
83 dl 1.5 * Queue contains all elements of collection used to initialize
84 dl 1.4 */
85     public void testConstructor6() {
86 dl 1.50 Item[] items = defaultItems;
87 jsr166 1.51 LinkedList<Item> q = new LinkedList<>(Arrays.asList(items));
88 jsr166 1.14 for (int i = 0; i < SIZE; ++i)
89 dl 1.50 mustEqual(items[i], q.poll());
90 dl 1.1 }
91    
92 dl 1.4 /**
93 dl 1.5 * isEmpty is true before add, false after
94 dl 1.4 */
95 dl 1.1 public void testEmpty() {
96 jsr166 1.51 LinkedList<Item> q = new LinkedList<>();
97 dl 1.1 assertTrue(q.isEmpty());
98 dl 1.50 q.add(one);
99 dl 1.1 assertFalse(q.isEmpty());
100 dl 1.50 q.add(two);
101 dl 1.1 q.remove();
102     q.remove();
103     assertTrue(q.isEmpty());
104     }
105    
106 dl 1.4 /**
107 dl 1.5 * size changes when elements added and removed
108 dl 1.4 */
109 dl 1.1 public void testSize() {
110 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
111 dl 1.3 for (int i = 0; i < SIZE; ++i) {
112 dl 1.50 mustEqual(SIZE - i, q.size());
113 dl 1.1 q.remove();
114     }
115 dl 1.3 for (int i = 0; i < SIZE; ++i) {
116 dl 1.50 mustEqual(i, q.size());
117     mustAdd(q, i);
118 dl 1.1 }
119     }
120    
121 dl 1.4 /**
122 dl 1.5 * offer(null) succeeds
123 dl 1.4 */
124     public void testOfferNull() {
125 jsr166 1.51 LinkedList<Item> q = new LinkedList<>();
126 jsr166 1.14 q.offer(null);
127 jsr166 1.38 assertNull(q.get(0));
128     assertTrue(q.contains(null));
129 dl 1.1 }
130    
131 dl 1.4 /**
132 jsr166 1.10 * Offer succeeds
133 dl 1.4 */
134 dl 1.1 public void testOffer() {
135 jsr166 1.51 LinkedList<Item> q = new LinkedList<>();
136 dl 1.50 mustOffer(q, zero);
137     mustOffer(q, one);
138 dl 1.1 }
139    
140 dl 1.4 /**
141 dl 1.5 * add succeeds
142 dl 1.4 */
143     public void testAdd() {
144 jsr166 1.51 LinkedList<Item> q = new LinkedList<>();
145 dl 1.3 for (int i = 0; i < SIZE; ++i) {
146 dl 1.50 mustEqual(i, q.size());
147     mustAdd(q, i);
148 dl 1.1 }
149     }
150    
151 dl 1.4 /**
152 dl 1.5 * addAll(null) throws NPE
153 dl 1.4 */
154     public void testAddAll1() {
155 jsr166 1.51 LinkedList<Item> q = new LinkedList<>();
156 dl 1.1 try {
157     q.addAll(null);
158 dl 1.4 shouldThrow();
159 jsr166 1.14 } catch (NullPointerException success) {}
160 dl 1.1 }
161    
162 dl 1.4 /**
163 dl 1.5 * Queue contains all elements, in traversal order, of successful addAll
164 dl 1.4 */
165     public void testAddAll5() {
166 dl 1.50 Item[] empty = new Item[0];
167     Item[] items = defaultItems;
168 jsr166 1.51 LinkedList<Item> q = new LinkedList<>();
169 jsr166 1.14 assertFalse(q.addAll(Arrays.asList(empty)));
170 dl 1.50 assertTrue(q.addAll(Arrays.asList(items)));
171 jsr166 1.14 for (int i = 0; i < SIZE; ++i)
172 dl 1.50 mustEqual(items[i], q.poll());
173 dl 1.1 }
174    
175 dl 1.4 /**
176 dl 1.5 * addAll with too large an index throws IOOBE
177     */
178     public void testAddAll2_IndexOutOfBoundsException() {
179 jsr166 1.51 LinkedList<Item> l = new LinkedList<>();
180 dl 1.50 l.add(zero);
181 jsr166 1.51 LinkedList<Item> m = new LinkedList<>();
182 dl 1.50 m.add(one);
183 jsr166 1.13 try {
184     l.addAll(4,m);
185     shouldThrow();
186 jsr166 1.15 } catch (IndexOutOfBoundsException success) {}
187 dl 1.5 }
188    
189     /**
190     * addAll with negative index throws IOOBE
191     */
192     public void testAddAll4_BadIndex() {
193 jsr166 1.51 LinkedList<Item> l = new LinkedList<>();
194 dl 1.50 l.add(zero);
195 jsr166 1.51 LinkedList<Item> m = new LinkedList<>();
196 dl 1.50 m.add(one);
197 jsr166 1.13 try {
198     l.addAll(-1,m);
199     shouldThrow();
200 jsr166 1.15 } catch (IndexOutOfBoundsException success) {}
201 dl 1.5 }
202    
203     /**
204 jsr166 1.20 * poll succeeds unless empty
205 dl 1.4 */
206     public void testPoll() {
207 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
208 dl 1.3 for (int i = 0; i < SIZE; ++i) {
209 dl 1.50 mustEqual(i, q.poll());
210 dl 1.1 }
211 jsr166 1.13 assertNull(q.poll());
212 dl 1.1 }
213    
214 dl 1.4 /**
215 jsr166 1.20 * peek returns next element, or null if empty
216 dl 1.4 */
217     public void testPeek() {
218 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
219 dl 1.3 for (int i = 0; i < SIZE; ++i) {
220 dl 1.50 mustEqual(i, q.peek());
221     mustEqual(i, q.poll());
222 dl 1.1 assertTrue(q.peek() == null ||
223 jsr166 1.16 !q.peek().equals(i));
224 dl 1.1 }
225 jsr166 1.13 assertNull(q.peek());
226 dl 1.1 }
227    
228 dl 1.4 /**
229 dl 1.6 * element returns next element, or throws NSEE if empty
230 dl 1.4 */
231     public void testElement() {
232 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
233 dl 1.3 for (int i = 0; i < SIZE; ++i) {
234 dl 1.50 mustEqual(i, q.element());
235     mustEqual(i, q.poll());
236 dl 1.1 }
237     try {
238     q.element();
239 dl 1.4 shouldThrow();
240 jsr166 1.14 } catch (NoSuchElementException success) {}
241 dl 1.1 }
242    
243 dl 1.4 /**
244 jsr166 1.20 * remove removes next element, or throws NSEE if empty
245 dl 1.4 */
246     public void testRemove() {
247 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
248 dl 1.3 for (int i = 0; i < SIZE; ++i) {
249 dl 1.50 mustEqual(i, q.remove());
250 dl 1.1 }
251     try {
252     q.remove();
253 dl 1.4 shouldThrow();
254 jsr166 1.14 } catch (NoSuchElementException success) {}
255 dl 1.1 }
256    
257 dl 1.4 /**
258 dl 1.5 * remove(x) removes x and returns true if present
259 dl 1.4 */
260     public void testRemoveElement() {
261 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
262 jsr166 1.33 for (int i = 1; i < SIZE; i += 2) {
263 dl 1.50 mustContain(q, i);
264     mustRemove(q, i);
265     mustNotContain(q, i);
266     mustContain(q, i - 1);
267 dl 1.1 }
268 jsr166 1.33 for (int i = 0; i < SIZE; i += 2) {
269 dl 1.50 mustContain(q, i);
270     mustRemove(q, i);
271     mustNotContain(q, i);
272     mustNotRemove(q, i + 1);
273     mustNotContain(q, i + 1);
274 dl 1.1 }
275 dl 1.2 assertTrue(q.isEmpty());
276 dl 1.1 }
277 jsr166 1.10
278 dl 1.4 /**
279 dl 1.5 * contains(x) reports true when elements added but not yet removed
280 dl 1.4 */
281     public void testContains() {
282 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
283 dl 1.3 for (int i = 0; i < SIZE; ++i) {
284 dl 1.50 mustContain(q, i);
285 dl 1.1 q.poll();
286 dl 1.50 mustNotContain(q, i);
287 dl 1.1 }
288     }
289    
290 dl 1.4 /**
291 dl 1.5 * clear removes all elements
292 dl 1.4 */
293     public void testClear() {
294 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
295 dl 1.1 q.clear();
296     assertTrue(q.isEmpty());
297 dl 1.50 mustEqual(0, q.size());
298     mustAdd(q, one);
299 dl 1.1 assertFalse(q.isEmpty());
300     q.clear();
301     assertTrue(q.isEmpty());
302     }
303    
304 dl 1.4 /**
305 dl 1.5 * containsAll(c) is true when c contains a subset of elements
306 dl 1.4 */
307     public void testContainsAll() {
308 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
309 jsr166 1.51 LinkedList<Item> p = new LinkedList<>();
310 dl 1.3 for (int i = 0; i < SIZE; ++i) {
311 dl 1.1 assertTrue(q.containsAll(p));
312     assertFalse(p.containsAll(q));
313 dl 1.50 mustAdd(p, i);
314 dl 1.1 }
315     assertTrue(p.containsAll(q));
316     }
317    
318 dl 1.4 /**
319 dl 1.5 * retainAll(c) retains only those elements of c and reports true if changed
320 dl 1.4 */
321     public void testRetainAll() {
322 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
323     LinkedList<Item> p = populatedQueue(SIZE);
324 dl 1.3 for (int i = 0; i < SIZE; ++i) {
325 dl 1.1 boolean changed = q.retainAll(p);
326     if (i == 0)
327     assertFalse(changed);
328     else
329     assertTrue(changed);
330    
331     assertTrue(q.containsAll(p));
332 dl 1.50 mustEqual(SIZE - i, q.size());
333 dl 1.1 p.remove();
334     }
335     }
336    
337 dl 1.4 /**
338 dl 1.6 * removeAll(c) removes only those elements of c and reports true if changed
339 dl 1.4 */
340     public void testRemoveAll() {
341 dl 1.3 for (int i = 1; i < SIZE; ++i) {
342 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
343     LinkedList<Item> p = populatedQueue(i);
344 dl 1.1 assertTrue(q.removeAll(p));
345 dl 1.50 mustEqual(SIZE - i, q.size());
346 dl 1.1 for (int j = 0; j < i; ++j) {
347 dl 1.50 mustNotContain(q, p.remove());
348 dl 1.1 }
349     }
350     }
351    
352 dl 1.4 /**
353 jsr166 1.23 * toArray contains all elements in FIFO order
354 dl 1.4 */
355     public void testToArray() {
356 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
357 jsr166 1.48 Object[] a = q.toArray();
358     assertSame(Object[].class, a.getClass());
359     for (Object o : a)
360     assertSame(o, q.poll());
361     assertTrue(q.isEmpty());
362 dl 1.1 }
363    
364 dl 1.4 /**
365 jsr166 1.23 * toArray(a) contains all elements in FIFO order
366 dl 1.4 */
367     public void testToArray2() {
368 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
369     Item[] items = new Item[SIZE];
370     Item[] array = q.toArray(items);
371     assertSame(items, array);
372     for (Item o : items)
373 jsr166 1.48 assertSame(o, q.poll());
374     assertTrue(q.isEmpty());
375 dl 1.1 }
376 dl 1.5
377     /**
378 jsr166 1.22 * toArray(null) throws NullPointerException
379 dl 1.5 */
380 jsr166 1.22 public void testToArray_NullArg() {
381 jsr166 1.51 LinkedList<Item> l = new LinkedList<>();
382 dl 1.50 l.add(zero);
383 jsr166 1.13 try {
384 dl 1.50 l.toArray((Item[])null);
385 jsr166 1.13 shouldThrow();
386     } catch (NullPointerException success) {}
387 dl 1.5 }
388    
389     /**
390 jsr166 1.21 * toArray(incompatible array type) throws ArrayStoreException
391 dl 1.5 */
392 jsr166 1.52 @SuppressWarnings("CollectionToArraySafeParameter")
393     public void testToArray_incompatibleArrayType() {
394 jsr166 1.51 LinkedList<Item> l = new LinkedList<>();
395 dl 1.50 l.add(five);
396 jsr166 1.13 try {
397 jsr166 1.21 l.toArray(new String[10]);
398 jsr166 1.13 shouldThrow();
399 jsr166 1.14 } catch (ArrayStoreException success) {}
400 dl 1.5 }
401 jsr166 1.10
402 dl 1.4 /**
403 jsr166 1.20 * iterator iterates through all elements
404 dl 1.4 */
405     public void testIterator() {
406 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
407     Iterator<? extends Item> it = q.iterator();
408 jsr166 1.35 int i;
409     for (i = 0; it.hasNext(); i++)
410 dl 1.50 mustContain(q, it.next());
411     mustEqual(i, SIZE);
412 jsr166 1.35 assertIteratorExhausted(it);
413     }
414    
415     /**
416     * iterator of empty collection has no elements
417     */
418     public void testEmptyIterator() {
419 jsr166 1.51 assertIteratorExhausted(new LinkedList<>().iterator());
420 dl 1.1 }
421    
422 dl 1.4 /**
423 jsr166 1.20 * iterator ordering is FIFO
424 dl 1.4 */
425 dl 1.1 public void testIteratorOrdering() {
426 jsr166 1.51 final LinkedList<Item> q = new LinkedList<>();
427 dl 1.50 q.add(one);
428     q.add(two);
429     q.add(three);
430 dl 1.1 int k = 0;
431 dl 1.50 for (Iterator<? extends Item> it = q.iterator(); it.hasNext();) {
432     mustEqual(++k, it.next());
433 dl 1.1 }
434    
435 dl 1.50 mustEqual(3, k);
436 dl 1.1 }
437    
438 dl 1.4 /**
439 dl 1.5 * iterator.remove removes current element
440 dl 1.4 */
441 jsr166 1.19 public void testIteratorRemove() {
442 jsr166 1.51 final LinkedList<Item> q = new LinkedList<>();
443 dl 1.50 q.add(one);
444     q.add(two);
445     q.add(three);
446     Iterator<? extends Item> it = q.iterator();
447     mustEqual(1, it.next());
448 dl 1.1 it.remove();
449     it = q.iterator();
450 dl 1.50 mustEqual(2, it.next());
451     mustEqual(3, it.next());
452 dl 1.1 assertFalse(it.hasNext());
453     }
454    
455 dl 1.9 /**
456 jsr166 1.20 * Descending iterator iterates through all elements
457 dl 1.9 */
458     public void testDescendingIterator() {
459 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
460 dl 1.9 int i = 0;
461 dl 1.50 Iterator<? extends Item> it = q.descendingIterator();
462 jsr166 1.11 while (it.hasNext()) {
463 dl 1.50 mustContain(q, it.next());
464 dl 1.9 ++i;
465     }
466 dl 1.50 mustEqual(i, SIZE);
467 dl 1.9 assertFalse(it.hasNext());
468     try {
469     it.next();
470 jsr166 1.14 shouldThrow();
471     } catch (NoSuchElementException success) {}
472 dl 1.9 }
473    
474     /**
475 jsr166 1.20 * Descending iterator ordering is reverse FIFO
476 dl 1.9 */
477     public void testDescendingIteratorOrdering() {
478 jsr166 1.51 final LinkedList<Item> q = new LinkedList<>();
479 dl 1.50 q.add(three);
480     q.add(two);
481     q.add(one);
482 dl 1.9 int k = 0;
483 dl 1.50 for (Iterator<? extends Item> it = q.descendingIterator(); it.hasNext();) {
484     mustEqual(++k, it.next());
485 dl 1.9 }
486    
487 dl 1.50 mustEqual(3, k);
488 dl 1.9 }
489    
490     /**
491     * descendingIterator.remove removes current element
492     */
493 jsr166 1.19 public void testDescendingIteratorRemove() {
494 jsr166 1.51 final LinkedList<Item> q = new LinkedList<>();
495 jsr166 1.17 q.add(three);
496     q.add(two);
497     q.add(one);
498 dl 1.50 Iterator<? extends Item> it = q.descendingIterator();
499 dl 1.9 it.next();
500     it.remove();
501     it = q.descendingIterator();
502 jsr166 1.17 assertSame(it.next(), two);
503     assertSame(it.next(), three);
504 dl 1.9 assertFalse(it.hasNext());
505     }
506    
507 dl 1.4 /**
508 dl 1.5 * toString contains toStrings of elements
509 dl 1.4 */
510     public void testToString() {
511 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
512 dl 1.1 String s = q.toString();
513 dl 1.3 for (int i = 0; i < SIZE; ++i) {
514 jsr166 1.27 assertTrue(s.contains(String.valueOf(i)));
515 dl 1.1 }
516 jsr166 1.10 }
517 dl 1.1
518 dl 1.4 /**
519 dl 1.5 * peek returns element inserted with addFirst
520 dl 1.4 */
521     public void testAddFirst() {
522 dl 1.50 LinkedList<Item> q = populatedQueue(3);
523 jsr166 1.13 q.addFirst(four);
524 jsr166 1.17 assertSame(four, q.peek());
525 jsr166 1.10 }
526 dl 1.1
527 dl 1.8 /**
528     * peekFirst returns element inserted with push
529     */
530     public void testPush() {
531 dl 1.50 LinkedList<Item> q = populatedQueue(3);
532 jsr166 1.13 q.push(four);
533 jsr166 1.17 assertSame(four, q.peekFirst());
534 jsr166 1.10 }
535 dl 1.8
536     /**
537 jsr166 1.20 * pop removes next element, or throws NSEE if empty
538 dl 1.8 */
539     public void testPop() {
540 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
541 dl 1.8 for (int i = 0; i < SIZE; ++i) {
542 dl 1.50 mustEqual(i, q.pop());
543 dl 1.8 }
544     try {
545     q.pop();
546     shouldThrow();
547 jsr166 1.14 } catch (NoSuchElementException success) {}
548 dl 1.8 }
549    
550     /**
551 jsr166 1.10 * OfferFirst succeeds
552 dl 1.8 */
553     public void testOfferFirst() {
554 jsr166 1.51 LinkedList<Item> q = new LinkedList<>();
555 dl 1.50 assertTrue(q.offerFirst(zero));
556     assertTrue(q.offerFirst(one));
557 dl 1.8 }
558    
559     /**
560 jsr166 1.10 * OfferLast succeeds
561 dl 1.8 */
562     public void testOfferLast() {
563 jsr166 1.51 LinkedList<Item> q = new LinkedList<>();
564 dl 1.50 assertTrue(q.offerLast(zero));
565     assertTrue(q.offerLast(one));
566 dl 1.8 }
567    
568     /**
569 jsr166 1.20 * pollLast succeeds unless empty
570 dl 1.8 */
571     public void testPollLast() {
572 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
573 jsr166 1.39 for (int i = SIZE - 1; i >= 0; --i) {
574 dl 1.50 mustEqual(i, q.pollLast());
575 dl 1.8 }
576 jsr166 1.13 assertNull(q.pollLast());
577 dl 1.8 }
578    
579     /**
580 jsr166 1.20 * peekFirst returns next element, or null if empty
581 dl 1.8 */
582     public void testPeekFirst() {
583 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
584 dl 1.8 for (int i = 0; i < SIZE; ++i) {
585 dl 1.50 mustEqual(i, q.peekFirst());
586     mustEqual(i, q.pollFirst());
587 dl 1.8 assertTrue(q.peekFirst() == null ||
588 jsr166 1.16 !q.peekFirst().equals(i));
589 dl 1.8 }
590 jsr166 1.13 assertNull(q.peekFirst());
591 dl 1.8 }
592    
593     /**
594 jsr166 1.20 * peekLast returns next element, or null if empty
595 dl 1.8 */
596     public void testPeekLast() {
597 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
598 jsr166 1.39 for (int i = SIZE - 1; i >= 0; --i) {
599 dl 1.50 mustEqual(i, q.peekLast());
600     mustEqual(i, q.pollLast());
601 dl 1.8 assertTrue(q.peekLast() == null ||
602 jsr166 1.16 !q.peekLast().equals(i));
603 dl 1.8 }
604 jsr166 1.13 assertNull(q.peekLast());
605 dl 1.8 }
606    
607     public void testFirstElement() {
608 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
609 dl 1.8 for (int i = 0; i < SIZE; ++i) {
610 dl 1.50 mustEqual(i, q.getFirst());
611     mustEqual(i, q.pollFirst());
612 dl 1.8 }
613     try {
614     q.getFirst();
615     shouldThrow();
616 jsr166 1.14 } catch (NoSuchElementException success) {}
617 dl 1.8 }
618    
619     /**
620 jsr166 1.20 * getLast returns next element, or throws NSEE if empty
621 dl 1.8 */
622     public void testLastElement() {
623 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
624 jsr166 1.39 for (int i = SIZE - 1; i >= 0; --i) {
625 dl 1.50 mustEqual(i, q.getLast());
626     mustEqual(i, q.pollLast());
627 dl 1.8 }
628     try {
629     q.getLast();
630     shouldThrow();
631 jsr166 1.14 } catch (NoSuchElementException success) {}
632 jsr166 1.13 assertNull(q.peekLast());
633 dl 1.8 }
634    
635     /**
636     * removeFirstOccurrence(x) removes x and returns true if present
637     */
638     public void testRemoveFirstOccurrence() {
639 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
640 jsr166 1.33 for (int i = 1; i < SIZE; i += 2) {
641 dl 1.50 assertTrue(q.removeFirstOccurrence(itemFor(i)));
642 dl 1.8 }
643 jsr166 1.33 for (int i = 0; i < SIZE; i += 2) {
644 dl 1.50 assertTrue(q.removeFirstOccurrence(itemFor(i)));
645     assertFalse(q.removeFirstOccurrence(itemFor(i + 1)));
646 dl 1.8 }
647     assertTrue(q.isEmpty());
648     }
649    
650     /**
651     * removeLastOccurrence(x) removes x and returns true if present
652     */
653     public void testRemoveLastOccurrence() {
654 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
655 jsr166 1.33 for (int i = 1; i < SIZE; i += 2) {
656 dl 1.50 assertTrue(q.removeLastOccurrence(itemFor(i)));
657 dl 1.8 }
658 jsr166 1.33 for (int i = 0; i < SIZE; i += 2) {
659 dl 1.50 assertTrue(q.removeLastOccurrence(itemFor(i)));
660     assertFalse(q.removeLastOccurrence(itemFor(i + 1)));
661 dl 1.8 }
662     assertTrue(q.isEmpty());
663     }
664    
665 dl 1.1 }