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

Comparing jsr166/src/test/tck/ArrayDequeTest.java (file contents):
Revision 1.15 by jsr166, Wed Dec 23 00:49:44 2009 UTC vs.
Revision 1.27 by jsr166, Wed Feb 20 12:07:45 2013 UTC

# Line 1 | Line 1
1   /*
2   * 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 < * http://creativecommons.org/licenses/publicdomain
4 > * http://creativecommons.org/publicdomain/zero/1.0/
5   */
6  
7   import junit.framework.*;
8 < import java.util.*;
9 < import java.util.concurrent.*;
8 > import java.util.Arrays;
9 > import java.util.ArrayDeque;
10 > import java.util.Collection;
11 > import java.util.Deque;
12 > import java.util.Iterator;
13 > import java.util.NoSuchElementException;
14 > import java.util.Queue;
15 > import java.util.Random;
16  
17   public class ArrayDequeTest extends JSR166TestCase {
18      public static void main(String[] args) {
19 <        junit.textui.TestRunner.run (suite());
19 >        junit.textui.TestRunner.run(suite());
20      }
21  
22      public static Test suite() {
# Line 18 | Line 24 | public class ArrayDequeTest extends JSR1
24      }
25  
26      /**
27 <     * Create a queue of given size containing consecutive
27 >     * Returns a new deque of given size containing consecutive
28       * Integers 0 ... n.
29       */
30 <    private ArrayDeque populatedDeque(int n) {
31 <        ArrayDeque q = new ArrayDeque();
30 >    private ArrayDeque<Integer> populatedDeque(int n) {
31 >        ArrayDeque<Integer> q = new ArrayDeque<Integer>();
32          assertTrue(q.isEmpty());
33          for (int i = 0; i < n; ++i)
34              assertTrue(q.offerLast(new Integer(i)));
# Line 32 | Line 38 | public class ArrayDequeTest extends JSR1
38      }
39  
40      /**
41 <     * new queue is empty
41 >     * new deque is empty
42       */
43      public void testConstructor1() {
44          assertEquals(0, new ArrayDeque().size());
# Line 49 | Line 55 | public class ArrayDequeTest extends JSR1
55      }
56  
57      /**
58 <     * Queue contains all elements of collection used to initialize
58 >     * Initializing from Collection of null elements throws NPE
59 >     */
60 >    public void testConstructor4() {
61 >        try {
62 >            Integer[] ints = new Integer[SIZE];
63 >            ArrayDeque q = new ArrayDeque(Arrays.asList(ints));
64 >            shouldThrow();
65 >        } catch (NullPointerException success) {}
66 >    }
67 >
68 >    /**
69 >     * Initializing from Collection with some null elements throws NPE
70 >     */
71 >    public void testConstructor5() {
72 >        try {
73 >            Integer[] ints = new Integer[SIZE];
74 >            for (int i = 0; i < SIZE-1; ++i)
75 >                ints[i] = new Integer(i);
76 >            ArrayDeque q = new ArrayDeque(Arrays.asList(ints));
77 >            shouldThrow();
78 >        } catch (NullPointerException success) {}
79 >    }
80  
81 +    /**
82 +     * Deque contains all elements of collection used to initialize
83       */
84      public void testConstructor6() {
85          Integer[] ints = new Integer[SIZE];
# Line 102 | Line 131 | public class ArrayDequeTest extends JSR1
131      }
132  
133      /**
134 <     * peekFirst returns element inserted with push
134 >     * peekFirst() returns element inserted with push
135       */
136      public void testPush() {
137          ArrayDeque q = populatedDeque(3);
# Line 112 | Line 141 | public class ArrayDequeTest extends JSR1
141      }
142  
143      /**
144 <     *  pop removes next element, or throws NSEE if empty
144 >     * pop() removes next element, or throws NSEE if empty
145       */
146      public void testPop() {
147          ArrayDeque q = populatedDeque(SIZE);
# Line 128 | Line 157 | public class ArrayDequeTest extends JSR1
157      /**
158       * offer(null) throws NPE
159       */
160 +    public void testOfferNull() {
161 +        try {
162 +            ArrayDeque q = new ArrayDeque();
163 +            q.offer(null);
164 +            shouldThrow();
165 +        } catch (NullPointerException success) {}
166 +    }
167 +
168 +    /**
169 +     * offerFirst(null) throws NPE
170 +     */
171      public void testOfferFirstNull() {
172          try {
173              ArrayDeque q = new ArrayDeque();
# Line 137 | Line 177 | public class ArrayDequeTest extends JSR1
177      }
178  
179      /**
180 <     * OfferFirst succeeds
180 >     * offerLast(null) throws NPE
181 >     */
182 >    public void testOfferLastNull() {
183 >        try {
184 >            ArrayDeque q = new ArrayDeque();
185 >            q.offerLast(null);
186 >            shouldThrow();
187 >        } catch (NullPointerException success) {}
188 >    }
189 >
190 >    /**
191 >     * offer(x) succeeds
192 >     */
193 >    public void testOffer() {
194 >        ArrayDeque q = new ArrayDeque();
195 >        assertTrue(q.offer(zero));
196 >        assertTrue(q.offer(one));
197 >        assertSame(zero, q.peekFirst());
198 >        assertSame(one, q.peekLast());
199 >    }
200 >
201 >    /**
202 >     * offerFirst(x) succeeds
203       */
204      public void testOfferFirst() {
205          ArrayDeque q = new ArrayDeque();
206 <        assertTrue(q.offerFirst(new Integer(0)));
207 <        assertTrue(q.offerFirst(new Integer(1)));
206 >        assertTrue(q.offerFirst(zero));
207 >        assertTrue(q.offerFirst(one));
208 >        assertSame(one, q.peekFirst());
209 >        assertSame(zero, q.peekLast());
210      }
211  
212      /**
213 <     * OfferLast succeeds
213 >     * offerLast(x) succeeds
214       */
215      public void testOfferLast() {
216          ArrayDeque q = new ArrayDeque();
217 <        assertTrue(q.offerLast(new Integer(0)));
218 <        assertTrue(q.offerLast(new Integer(1)));
217 >        assertTrue(q.offerLast(zero));
218 >        assertTrue(q.offerLast(one));
219 >        assertSame(zero, q.peekFirst());
220 >        assertSame(one, q.peekLast());
221      }
222  
223      /**
224 <     * add succeeds
224 >     * add(null) throws NPE
225 >     */
226 >    public void testAddNull() {
227 >        try {
228 >            ArrayDeque q = new ArrayDeque();
229 >            q.add(null);
230 >            shouldThrow();
231 >        } catch (NullPointerException success) {}
232 >    }
233 >
234 >    /**
235 >     * addFirst(null) throws NPE
236 >     */
237 >    public void testAddFirstNull() {
238 >        try {
239 >            ArrayDeque q = new ArrayDeque();
240 >            q.addFirst(null);
241 >            shouldThrow();
242 >        } catch (NullPointerException success) {}
243 >    }
244 >
245 >    /**
246 >     * addLast(null) throws NPE
247 >     */
248 >    public void testAddLastNull() {
249 >        try {
250 >            ArrayDeque q = new ArrayDeque();
251 >            q.addLast(null);
252 >            shouldThrow();
253 >        } catch (NullPointerException success) {}
254 >    }
255 >
256 >    /**
257 >     * add(x) succeeds
258       */
259      public void testAdd() {
260          ArrayDeque q = new ArrayDeque();
261 <        for (int i = 0; i < SIZE; ++i) {
262 <            assertEquals(i, q.size());
263 <            assertTrue(q.add(new Integer(i)));
264 <        }
261 >        assertTrue(q.add(zero));
262 >        assertTrue(q.add(one));
263 >        assertSame(zero, q.peekFirst());
264 >        assertSame(one, q.peekLast());
265 >    }
266 >
267 >    /**
268 >     * addFirst(x) succeeds
269 >     */
270 >    public void testAddFirst() {
271 >        ArrayDeque q = new ArrayDeque();
272 >        q.addFirst(zero);
273 >        q.addFirst(one);
274 >        assertSame(one, q.peekFirst());
275 >        assertSame(zero, q.peekLast());
276 >    }
277 >
278 >    /**
279 >     * addLast(x) succeeds
280 >     */
281 >    public void testAddLast() {
282 >        ArrayDeque q = new ArrayDeque();
283 >        q.addLast(zero);
284 >        q.addLast(one);
285 >        assertSame(zero, q.peekFirst());
286 >        assertSame(one, q.peekLast());
287      }
288  
289      /**
# Line 177 | Line 298 | public class ArrayDequeTest extends JSR1
298      }
299  
300      /**
301 <     * Queue contains all elements, in traversal order, of successful addAll
301 >     * addAll of a collection with null elements throws NPE
302 >     */
303 >    public void testAddAll2() {
304 >        try {
305 >            ArrayDeque q = new ArrayDeque();
306 >            Integer[] ints = new Integer[SIZE];
307 >            q.addAll(Arrays.asList(ints));
308 >            shouldThrow();
309 >        } catch (NullPointerException success) {}
310 >    }
311 >
312 >    /**
313 >     * addAll of a collection with any null elements throws NPE after
314 >     * possibly adding some elements
315 >     */
316 >    public void testAddAll3() {
317 >        try {
318 >            ArrayDeque q = new ArrayDeque();
319 >            Integer[] ints = new Integer[SIZE];
320 >            for (int i = 0; i < SIZE-1; ++i)
321 >                ints[i] = new Integer(i);
322 >            q.addAll(Arrays.asList(ints));
323 >            shouldThrow();
324 >        } catch (NullPointerException success) {}
325 >    }
326 >
327 >    /**
328 >     * Deque contains all elements, in traversal order, of successful addAll
329       */
330      public void testAddAll5() {
331          Integer[] empty = new Integer[0];
# Line 192 | Line 340 | public class ArrayDequeTest extends JSR1
340      }
341  
342      /**
343 <     *  pollFirst succeeds unless empty
343 >     * pollFirst() succeeds unless empty
344       */
345      public void testPollFirst() {
346          ArrayDeque q = populatedDeque(SIZE);
# Line 203 | Line 351 | public class ArrayDequeTest extends JSR1
351      }
352  
353      /**
354 <     *  pollLast succeeds unless empty
354 >     * pollLast() succeeds unless empty
355       */
356      public void testPollLast() {
357          ArrayDeque q = populatedDeque(SIZE);
# Line 214 | Line 362 | public class ArrayDequeTest extends JSR1
362      }
363  
364      /**
365 <     *  poll succeeds unless empty
365 >     * poll() succeeds unless empty
366       */
367      public void testPoll() {
368          ArrayDeque q = populatedDeque(SIZE);
# Line 225 | Line 373 | public class ArrayDequeTest extends JSR1
373      }
374  
375      /**
376 <     *  remove removes next element, or throws NSEE if empty
376 >     * remove() removes next element, or throws NSEE if empty
377       */
378      public void testRemove() {
379          ArrayDeque q = populatedDeque(SIZE);
# Line 239 | Line 387 | public class ArrayDequeTest extends JSR1
387      }
388  
389      /**
390 <     *  peekFirst returns next element, or null if empty
390 >     * remove(x) removes x and returns true if present
391 >     */
392 >    public void testRemoveElement() {
393 >        ArrayDeque q = populatedDeque(SIZE);
394 >        for (int i = 1; i < SIZE; i+=2) {
395 >            assertTrue(q.contains(i));
396 >            assertTrue(q.remove(i));
397 >            assertFalse(q.contains(i));
398 >            assertTrue(q.contains(i-1));
399 >        }
400 >        for (int i = 0; i < SIZE; i+=2) {
401 >            assertTrue(q.contains(i));
402 >            assertTrue(q.remove(i));
403 >            assertFalse(q.contains(i));
404 >            assertFalse(q.remove(i+1));
405 >            assertFalse(q.contains(i+1));
406 >        }
407 >        assertTrue(q.isEmpty());
408 >    }
409 >
410 >    /**
411 >     * peekFirst() returns next element, or null if empty
412       */
413      public void testPeekFirst() {
414          ArrayDeque q = populatedDeque(SIZE);
# Line 253 | Line 422 | public class ArrayDequeTest extends JSR1
422      }
423  
424      /**
425 <     *  peek returns next element, or null if empty
425 >     * peek() returns next element, or null if empty
426       */
427      public void testPeek() {
428          ArrayDeque q = populatedDeque(SIZE);
# Line 267 | Line 436 | public class ArrayDequeTest extends JSR1
436      }
437  
438      /**
439 <     *  peekLast returns next element, or null if empty
439 >     * peekLast() returns next element, or null if empty
440       */
441      public void testPeekLast() {
442          ArrayDeque q = populatedDeque(SIZE);
# Line 281 | Line 450 | public class ArrayDequeTest extends JSR1
450      }
451  
452      /**
453 <     * getFirst returns next getFirst, or throws NSEE if empty
453 >     * element() returns first element, or throws NSEE if empty
454 >     */
455 >    public void testElement() {
456 >        ArrayDeque q = populatedDeque(SIZE);
457 >        for (int i = 0; i < SIZE; ++i) {
458 >            assertEquals(i, q.element());
459 >            assertEquals(i, q.poll());
460 >        }
461 >        try {
462 >            q.element();
463 >            shouldThrow();
464 >        } catch (NoSuchElementException success) {}
465 >    }
466 >
467 >    /**
468 >     * getFirst() returns first element, or throws NSEE if empty
469       */
470      public void testFirstElement() {
471          ArrayDeque q = populatedDeque(SIZE);
# Line 296 | Line 480 | public class ArrayDequeTest extends JSR1
480      }
481  
482      /**
483 <     *  getLast returns next element, or throws NSEE if empty
483 >     * getLast() returns last element, or throws NSEE if empty
484       */
485      public void testLastElement() {
486          ArrayDeque q = populatedDeque(SIZE);
# Line 311 | Line 495 | public class ArrayDequeTest extends JSR1
495          assertNull(q.peekLast());
496      }
497  
314
498      /**
499 <     *  removeFirst removes next element, or throws NSEE if empty
499 >     * removeFirst() removes first element, or throws NSEE if empty
500       */
501      public void testRemoveFirst() {
502          ArrayDeque q = populatedDeque(SIZE);
# Line 324 | Line 507 | public class ArrayDequeTest extends JSR1
507              q.removeFirst();
508              shouldThrow();
509          } catch (NoSuchElementException success) {}
510 +        assertNull(q.peekFirst());
511 +    }
512 +
513 +    /**
514 +     * removeLast() removes last element, or throws NSEE if empty
515 +     */
516 +    public void testRemoveLast() {
517 +        ArrayDeque q = populatedDeque(SIZE);
518 +        for (int i = SIZE - 1; i >= 0; --i) {
519 +            assertEquals(i, q.removeLast());
520 +        }
521 +        try {
522 +            q.removeLast();
523 +            shouldThrow();
524 +        } catch (NoSuchElementException success) {}
525 +        assertNull(q.peekLast());
526      }
527  
528      /**
# Line 426 | Line 625 | public class ArrayDequeTest extends JSR1
625          }
626      }
627  
628 +    void checkToArray(ArrayDeque q) {
629 +        int size = q.size();
630 +        Object[] o = q.toArray();
631 +        assertEquals(size, o.length);
632 +        Iterator it = q.iterator();
633 +        for (int i = 0; i < size; i++) {
634 +            Integer x = (Integer) it.next();
635 +            assertEquals((Integer)o[0] + i, (int) x);
636 +            assertSame(o[i], x);
637 +        }
638 +    }
639 +
640      /**
641 <     *  toArray contains all elements
641 >     * toArray() contains all elements in FIFO order
642       */
643      public void testToArray() {
644 <        ArrayDeque q = populatedDeque(SIZE);
645 <        Object[] o = q.toArray();
646 <        Arrays.sort(o);
647 <        for (int i = 0; i < o.length; i++)
648 <            assertEquals(o[i], q.pollFirst());
644 >        ArrayDeque q = new ArrayDeque();
645 >        for (int i = 0; i < SIZE; i++) {
646 >            checkToArray(q);
647 >            q.addLast(i);
648 >        }
649 >        // Provoke wraparound
650 >        for (int i = 0; i < SIZE; i++) {
651 >            checkToArray(q);
652 >            assertEquals(i, q.poll());
653 >            q.addLast(SIZE+i);
654 >        }
655 >        for (int i = 0; i < SIZE; i++) {
656 >            checkToArray(q);
657 >            assertEquals(SIZE+i, q.poll());
658 >        }
659 >    }
660 >
661 >    void checkToArray2(ArrayDeque q) {
662 >        int size = q.size();
663 >        Integer[] a1 = size == 0 ? null : new Integer[size-1];
664 >        Integer[] a2 = new Integer[size];
665 >        Integer[] a3 = new Integer[size+2];
666 >        if (size > 0) Arrays.fill(a1, 42);
667 >        Arrays.fill(a2, 42);
668 >        Arrays.fill(a3, 42);
669 >        Integer[] b1 = size == 0 ? null : (Integer[]) q.toArray(a1);
670 >        Integer[] b2 = (Integer[]) q.toArray(a2);
671 >        Integer[] b3 = (Integer[]) q.toArray(a3);
672 >        assertSame(a2, b2);
673 >        assertSame(a3, b3);
674 >        Iterator it = q.iterator();
675 >        for (int i = 0; i < size; i++) {
676 >            Integer x = (Integer) it.next();
677 >            assertSame(b1[i], x);
678 >            assertEquals(b1[0] + i, (int) x);
679 >            assertSame(b2[i], x);
680 >            assertSame(b3[i], x);
681 >        }
682 >        assertNull(a3[size]);
683 >        assertEquals(42, (int) a3[size+1]);
684 >        if (size > 0) {
685 >            assertNotSame(a1, b1);
686 >            assertEquals(size, b1.length);
687 >            for (int i = 0; i < a1.length; i++) {
688 >                assertEquals(42, (int) a1[i]);
689 >            }
690 >        }
691      }
692  
693      /**
694 <     *  toArray(a) contains all elements
694 >     * toArray(a) contains all elements in FIFO order
695       */
696      public void testToArray2() {
697 <        ArrayDeque q = populatedDeque(SIZE);
698 <        Integer[] ints = new Integer[SIZE];
699 <        ints = (Integer[])q.toArray(ints);
700 <        Arrays.sort(ints);
701 <        for (int i = 0; i < ints.length; i++)
702 <            assertEquals(ints[i], q.pollFirst());
697 >        ArrayDeque q = new ArrayDeque();
698 >        for (int i = 0; i < SIZE; i++) {
699 >            checkToArray2(q);
700 >            q.addLast(i);
701 >        }
702 >        // Provoke wraparound
703 >        for (int i = 0; i < SIZE; i++) {
704 >            checkToArray2(q);
705 >            assertEquals(i, q.poll());
706 >            q.addLast(SIZE+i);
707 >        }
708 >        for (int i = 0; i < SIZE; i++) {
709 >            checkToArray2(q);
710 >            assertEquals(SIZE+i, q.poll());
711 >        }
712      }
713  
714      /**
715 <     * toArray(null) throws NPE
715 >     * toArray(null) throws NullPointerException
716       */
717 <    public void testToArray_BadArg() {
717 >    public void testToArray_NullArg() {
718          ArrayDeque l = new ArrayDeque();
719          l.add(new Object());
720          try {
721 <            Object o[] = l.toArray(null);
721 >            l.toArray(null);
722              shouldThrow();
723          } catch (NullPointerException success) {}
724      }
725  
726      /**
727 <     * toArray with incompatible array type throws CCE
727 >     * toArray(incompatible array type) throws ArrayStoreException
728       */
729      public void testToArray1_BadArg() {
730          ArrayDeque l = new ArrayDeque();
731          l.add(new Integer(5));
732          try {
733 <            Object o[] = l.toArray(new String[10]);
733 >            l.toArray(new String[10]);
734              shouldThrow();
735          } catch (ArrayStoreException success) {}
736      }
737  
738      /**
739 <     *  iterator iterates through all elements
739 >     * Iterator iterates through all elements
740       */
741      public void testIterator() {
742          ArrayDeque q = populatedDeque(SIZE);
# Line 488 | Line 750 | public class ArrayDequeTest extends JSR1
750      }
751  
752      /**
753 <     *  iterator ordering is FIFO
753 >     * Iterator ordering is FIFO
754       */
755      public void testIteratorOrdering() {
756          final ArrayDeque q = new ArrayDeque();
757 <        q.add(new Integer(1));
758 <        q.add(new Integer(2));
759 <        q.add(new Integer(3));
757 >        q.add(one);
758 >        q.add(two);
759 >        q.add(three);
760          int k = 0;
761          for (Iterator it = q.iterator(); it.hasNext();) {
762              assertEquals(++k, it.next());
# Line 504 | Line 766 | public class ArrayDequeTest extends JSR1
766      }
767  
768      /**
769 <     * iterator.remove removes current element
769 >     * iterator.remove() removes current element
770       */
771 <    public void testIteratorRemove () {
771 >    public void testIteratorRemove() {
772          final ArrayDeque q = new ArrayDeque();
773          final Random rng = new Random();
774          for (int iters = 0; iters < 100; ++iters) {
# Line 532 | Line 794 | public class ArrayDequeTest extends JSR1
794      }
795  
796      /**
797 <     *  Descending iterator iterates through all elements
797 >     * Descending iterator iterates through all elements
798       */
799      public void testDescendingIterator() {
800          ArrayDeque q = populatedDeque(SIZE);
# Line 551 | Line 813 | public class ArrayDequeTest extends JSR1
813      }
814  
815      /**
816 <     *  Descending iterator ordering is reverse FIFO
816 >     * Descending iterator ordering is reverse FIFO
817       */
818      public void testDescendingIteratorOrdering() {
819          final ArrayDeque q = new ArrayDeque();
# Line 572 | Line 834 | public class ArrayDequeTest extends JSR1
834      }
835  
836      /**
837 <     * descendingIterator.remove removes current element
837 >     * descendingIterator.remove() removes current element
838       */
839 <    public void testDescendingIteratorRemove () {
839 >    public void testDescendingIteratorRemove() {
840          final ArrayDeque q = new ArrayDeque();
841          final Random rng = new Random();
842          for (int iters = 0; iters < 100; ++iters) {
# Line 599 | Line 861 | public class ArrayDequeTest extends JSR1
861          }
862      }
863  
602
864      /**
865 <     * toString contains toStrings of elements
865 >     * toString() contains toStrings of elements
866       */
867      public void testToString() {
868          ArrayDeque q = populatedDeque(SIZE);
869          String s = q.toString();
870          for (int i = 0; i < SIZE; ++i) {
871 <            assertTrue(s.indexOf(String.valueOf(i)) >= 0);
871 >            assertTrue(s.contains(String.valueOf(i)));
872          }
873      }
874  
875      /**
876 <     * peekFirst returns element inserted with addFirst
876 >     * A deserialized serialized deque has same elements in same order
877       */
878 <    public void testAddFirst() {
879 <        ArrayDeque q = populatedDeque(3);
880 <        q.addFirst(four);
620 <        assertSame(four, q.peekFirst());
621 <    }
878 >    public void testSerialization() throws Exception {
879 >        Queue x = populatedDeque(SIZE);
880 >        Queue y = serialClone(x);
881  
882 <    /**
883 <     * peekLast returns element inserted with addLast
884 <     */
885 <    public void testAddLast() {
886 <        ArrayDeque q = populatedDeque(3);
887 <        q.addLast(four);
888 <        assertSame(four, q.peekLast());
882 >        assertTrue(x != y);
883 >        assertEquals(x.size(), y.size());
884 >        assertEquals(x.toString(), y.toString());
885 >        assertTrue(Arrays.equals(x.toArray(), y.toArray()));
886 >        while (!x.isEmpty()) {
887 >            assertFalse(y.isEmpty());
888 >            assertEquals(x.remove(), y.remove());
889 >        }
890 >        assertTrue(y.isEmpty());
891      }
892  
893   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines