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.16 by jsr166, Wed Aug 25 01:46:24 2010 UTC vs.
Revision 1.29 by jsr166, Sun Nov 23 22:27:06 2014 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.io.BufferedInputStream;
9 < import java.io.BufferedOutputStream;
10 < import java.io.ByteArrayInputStream;
11 < import java.io.ByteArrayOutputStream;
12 < import java.io.ObjectInputStream;
13 < import java.io.ObjectOutputStream;
14 < import java.util.*;
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) {
# Line 23 | Line 24 | public class ArrayDequeTest extends JSR1
24      }
25  
26      /**
27 <     * Create a deque 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 391 | Line 392 | public class ArrayDequeTest extends JSR1
392      public void testRemoveElement() {
393          ArrayDeque q = populatedDeque(SIZE);
394          for (int i = 1; i < SIZE; i+=2) {
395 <            assertTrue(q.remove(new Integer(i)));
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.remove(new Integer(i)));
402 <            assertFalse(q.remove(new Integer(i+1)));
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      }
# Line 488 | Line 495 | public class ArrayDequeTest extends JSR1
495          assertNull(q.peekLast());
496      }
497  
491
498      /**
499       * removeFirst() removes first element, or throws NSEE if empty
500       */
# Line 619 | 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      }
# Line 792 | Line 861 | public class ArrayDequeTest extends JSR1
861          }
862      }
863  
795
864      /**
865       * toString() contains toStrings of elements
866       */
# Line 800 | Line 868 | public class ArrayDequeTest extends JSR1
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  
# Line 808 | Line 876 | public class ArrayDequeTest extends JSR1
876       * A deserialized serialized deque has same elements in same order
877       */
878      public void testSerialization() throws Exception {
879 <        ArrayDeque q = populatedDeque(SIZE);
880 <        ByteArrayOutputStream bout = new ByteArrayOutputStream(10000);
881 <        ObjectOutputStream out = new ObjectOutputStream(new BufferedOutputStream(bout));
882 <        out.writeObject(q);
883 <        out.close();
884 <
885 <        ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
886 <        ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(bin));
887 <        ArrayDeque r = (ArrayDeque)in.readObject();
888 <        assertEquals(q.size(), r.size());
889 <        while (!q.isEmpty())
890 <            assertEquals(q.remove(), r.remove());
879 >        Queue x = populatedDeque(SIZE);
880 >        Queue y = serialClone(x);
881 >
882 >        assertNotSame(y, x);
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 >    /**
894 >     * remove(null), contains(null) always return false
895 >     */
896 >    public void testNeverContainsNull() {
897 >        Deque<?>[] qs = {
898 >            new ArrayDeque<Object>(),
899 >            populatedDeque(2),
900 >        };
901 >
902 >        for (Deque<?> q : qs) {
903 >            assertFalse(q.contains(null));
904 >            assertFalse(q.remove(null));
905 >            assertFalse(q.removeFirstOccurrence(null));
906 >            assertFalse(q.removeLastOccurrence(null));
907 >        }
908      }
909  
910   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines