ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/test/tck/LinkedListTest.java
Revision: 1.50
Committed: Tue Jan 26 13:33:06 2021 UTC (3 years, 3 months ago) by dl
Branch: MAIN
Changes since 1.49: +155 -159 lines
Log Message:
Replace Integer with Item class

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     LinkedList<Item> q = new LinkedList<Item>(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 dl 1.50 LinkedList<Item> q = new LinkedList<Item>();
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 dl 1.50 LinkedList<Item> q = new LinkedList<Item>();
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 dl 1.50 LinkedList<Item> q = new LinkedList<Item>();
136     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 dl 1.50 LinkedList<Item> q = new LinkedList<Item>();
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 dl 1.50 LinkedList<Item> q = new LinkedList<Item>();
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     LinkedList<Item> q = new LinkedList<Item>();
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 dl 1.50 LinkedList<Item> l = new LinkedList<Item>();
180     l.add(zero);
181     LinkedList<Item> m = new LinkedList<Item>();
182     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 dl 1.50 LinkedList<Item> l = new LinkedList<Item>();
194     l.add(zero);
195     LinkedList<Item> m = new LinkedList<Item>();
196     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     LinkedList<Item> p = new LinkedList<Item>();
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 dl 1.50 LinkedList<Item> l = new LinkedList<Item>();
382     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     public void testToArray1_BadArg() {
393 dl 1.50 LinkedList<Item> l = new LinkedList<Item>();
394     l.add(five);
395 jsr166 1.13 try {
396 jsr166 1.21 l.toArray(new String[10]);
397 jsr166 1.13 shouldThrow();
398 jsr166 1.14 } catch (ArrayStoreException success) {}
399 dl 1.5 }
400 jsr166 1.10
401 dl 1.4 /**
402 jsr166 1.20 * iterator iterates through all elements
403 dl 1.4 */
404     public void testIterator() {
405 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
406     Iterator<? extends Item> it = q.iterator();
407 jsr166 1.35 int i;
408     for (i = 0; it.hasNext(); i++)
409 dl 1.50 mustContain(q, it.next());
410     mustEqual(i, SIZE);
411 jsr166 1.35 assertIteratorExhausted(it);
412     }
413    
414     /**
415     * iterator of empty collection has no elements
416     */
417     public void testEmptyIterator() {
418 dl 1.50 assertIteratorExhausted(new LinkedList<Item>().iterator());
419 dl 1.1 }
420    
421 dl 1.4 /**
422 jsr166 1.20 * iterator ordering is FIFO
423 dl 1.4 */
424 dl 1.1 public void testIteratorOrdering() {
425 dl 1.50 final LinkedList<Item> q = new LinkedList<Item>();
426     q.add(one);
427     q.add(two);
428     q.add(three);
429 dl 1.1 int k = 0;
430 dl 1.50 for (Iterator<? extends Item> it = q.iterator(); it.hasNext();) {
431     mustEqual(++k, it.next());
432 dl 1.1 }
433    
434 dl 1.50 mustEqual(3, k);
435 dl 1.1 }
436    
437 dl 1.4 /**
438 dl 1.5 * iterator.remove removes current element
439 dl 1.4 */
440 jsr166 1.19 public void testIteratorRemove() {
441 dl 1.50 final LinkedList<Item> q = new LinkedList<Item>();
442     q.add(one);
443     q.add(two);
444     q.add(three);
445     Iterator<? extends Item> it = q.iterator();
446     mustEqual(1, it.next());
447 dl 1.1 it.remove();
448     it = q.iterator();
449 dl 1.50 mustEqual(2, it.next());
450     mustEqual(3, it.next());
451 dl 1.1 assertFalse(it.hasNext());
452     }
453    
454 dl 1.9 /**
455 jsr166 1.20 * Descending iterator iterates through all elements
456 dl 1.9 */
457     public void testDescendingIterator() {
458 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
459 dl 1.9 int i = 0;
460 dl 1.50 Iterator<? extends Item> it = q.descendingIterator();
461 jsr166 1.11 while (it.hasNext()) {
462 dl 1.50 mustContain(q, it.next());
463 dl 1.9 ++i;
464     }
465 dl 1.50 mustEqual(i, SIZE);
466 dl 1.9 assertFalse(it.hasNext());
467     try {
468     it.next();
469 jsr166 1.14 shouldThrow();
470     } catch (NoSuchElementException success) {}
471 dl 1.9 }
472    
473     /**
474 jsr166 1.20 * Descending iterator ordering is reverse FIFO
475 dl 1.9 */
476     public void testDescendingIteratorOrdering() {
477 dl 1.50 final LinkedList<Item> q = new LinkedList<Item>();
478     q.add(three);
479     q.add(two);
480     q.add(one);
481 dl 1.9 int k = 0;
482 dl 1.50 for (Iterator<? extends Item> it = q.descendingIterator(); it.hasNext();) {
483     mustEqual(++k, it.next());
484 dl 1.9 }
485    
486 dl 1.50 mustEqual(3, k);
487 dl 1.9 }
488    
489     /**
490     * descendingIterator.remove removes current element
491     */
492 jsr166 1.19 public void testDescendingIteratorRemove() {
493 dl 1.50 final LinkedList<Item> q = new LinkedList<Item>();
494 jsr166 1.17 q.add(three);
495     q.add(two);
496     q.add(one);
497 dl 1.50 Iterator<? extends Item> it = q.descendingIterator();
498 dl 1.9 it.next();
499     it.remove();
500     it = q.descendingIterator();
501 jsr166 1.17 assertSame(it.next(), two);
502     assertSame(it.next(), three);
503 dl 1.9 assertFalse(it.hasNext());
504     }
505    
506 dl 1.4 /**
507 dl 1.5 * toString contains toStrings of elements
508 dl 1.4 */
509     public void testToString() {
510 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
511 dl 1.1 String s = q.toString();
512 dl 1.3 for (int i = 0; i < SIZE; ++i) {
513 jsr166 1.27 assertTrue(s.contains(String.valueOf(i)));
514 dl 1.1 }
515 jsr166 1.10 }
516 dl 1.1
517 dl 1.4 /**
518 dl 1.5 * peek returns element inserted with addFirst
519 dl 1.4 */
520     public void testAddFirst() {
521 dl 1.50 LinkedList<Item> q = populatedQueue(3);
522 jsr166 1.13 q.addFirst(four);
523 jsr166 1.17 assertSame(four, q.peek());
524 jsr166 1.10 }
525 dl 1.1
526 dl 1.8 /**
527     * peekFirst returns element inserted with push
528     */
529     public void testPush() {
530 dl 1.50 LinkedList<Item> q = populatedQueue(3);
531 jsr166 1.13 q.push(four);
532 jsr166 1.17 assertSame(four, q.peekFirst());
533 jsr166 1.10 }
534 dl 1.8
535     /**
536 jsr166 1.20 * pop removes next element, or throws NSEE if empty
537 dl 1.8 */
538     public void testPop() {
539 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
540 dl 1.8 for (int i = 0; i < SIZE; ++i) {
541 dl 1.50 mustEqual(i, q.pop());
542 dl 1.8 }
543     try {
544     q.pop();
545     shouldThrow();
546 jsr166 1.14 } catch (NoSuchElementException success) {}
547 dl 1.8 }
548    
549     /**
550 jsr166 1.10 * OfferFirst succeeds
551 dl 1.8 */
552     public void testOfferFirst() {
553 dl 1.50 LinkedList<Item> q = new LinkedList<Item>();
554     assertTrue(q.offerFirst(zero));
555     assertTrue(q.offerFirst(one));
556 dl 1.8 }
557    
558     /**
559 jsr166 1.10 * OfferLast succeeds
560 dl 1.8 */
561     public void testOfferLast() {
562 dl 1.50 LinkedList<Item> q = new LinkedList<Item>();
563     assertTrue(q.offerLast(zero));
564     assertTrue(q.offerLast(one));
565 dl 1.8 }
566    
567     /**
568 jsr166 1.20 * pollLast succeeds unless empty
569 dl 1.8 */
570     public void testPollLast() {
571 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
572 jsr166 1.39 for (int i = SIZE - 1; i >= 0; --i) {
573 dl 1.50 mustEqual(i, q.pollLast());
574 dl 1.8 }
575 jsr166 1.13 assertNull(q.pollLast());
576 dl 1.8 }
577    
578     /**
579 jsr166 1.20 * peekFirst returns next element, or null if empty
580 dl 1.8 */
581     public void testPeekFirst() {
582 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
583 dl 1.8 for (int i = 0; i < SIZE; ++i) {
584 dl 1.50 mustEqual(i, q.peekFirst());
585     mustEqual(i, q.pollFirst());
586 dl 1.8 assertTrue(q.peekFirst() == null ||
587 jsr166 1.16 !q.peekFirst().equals(i));
588 dl 1.8 }
589 jsr166 1.13 assertNull(q.peekFirst());
590 dl 1.8 }
591    
592     /**
593 jsr166 1.20 * peekLast returns next element, or null if empty
594 dl 1.8 */
595     public void testPeekLast() {
596 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
597 jsr166 1.39 for (int i = SIZE - 1; i >= 0; --i) {
598 dl 1.50 mustEqual(i, q.peekLast());
599     mustEqual(i, q.pollLast());
600 dl 1.8 assertTrue(q.peekLast() == null ||
601 jsr166 1.16 !q.peekLast().equals(i));
602 dl 1.8 }
603 jsr166 1.13 assertNull(q.peekLast());
604 dl 1.8 }
605    
606     public void testFirstElement() {
607 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
608 dl 1.8 for (int i = 0; i < SIZE; ++i) {
609 dl 1.50 mustEqual(i, q.getFirst());
610     mustEqual(i, q.pollFirst());
611 dl 1.8 }
612     try {
613     q.getFirst();
614     shouldThrow();
615 jsr166 1.14 } catch (NoSuchElementException success) {}
616 dl 1.8 }
617    
618     /**
619 jsr166 1.20 * getLast returns next element, or throws NSEE if empty
620 dl 1.8 */
621     public void testLastElement() {
622 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
623 jsr166 1.39 for (int i = SIZE - 1; i >= 0; --i) {
624 dl 1.50 mustEqual(i, q.getLast());
625     mustEqual(i, q.pollLast());
626 dl 1.8 }
627     try {
628     q.getLast();
629     shouldThrow();
630 jsr166 1.14 } catch (NoSuchElementException success) {}
631 jsr166 1.13 assertNull(q.peekLast());
632 dl 1.8 }
633    
634     /**
635     * removeFirstOccurrence(x) removes x and returns true if present
636     */
637     public void testRemoveFirstOccurrence() {
638 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
639 jsr166 1.33 for (int i = 1; i < SIZE; i += 2) {
640 dl 1.50 assertTrue(q.removeFirstOccurrence(itemFor(i)));
641 dl 1.8 }
642 jsr166 1.33 for (int i = 0; i < SIZE; i += 2) {
643 dl 1.50 assertTrue(q.removeFirstOccurrence(itemFor(i)));
644     assertFalse(q.removeFirstOccurrence(itemFor(i + 1)));
645 dl 1.8 }
646     assertTrue(q.isEmpty());
647     }
648    
649     /**
650     * removeLastOccurrence(x) removes x and returns true if present
651     */
652     public void testRemoveLastOccurrence() {
653 dl 1.50 LinkedList<Item> q = populatedQueue(SIZE);
654 jsr166 1.33 for (int i = 1; i < SIZE; i += 2) {
655 dl 1.50 assertTrue(q.removeLastOccurrence(itemFor(i)));
656 dl 1.8 }
657 jsr166 1.33 for (int i = 0; i < SIZE; i += 2) {
658 dl 1.50 assertTrue(q.removeLastOccurrence(itemFor(i)));
659     assertFalse(q.removeLastOccurrence(itemFor(i + 1)));
660 dl 1.8 }
661     assertTrue(q.isEmpty());
662     }
663    
664 dl 1.1 }