18f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle/*
28f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Written by Doug Lea with assistance from members of JCP JSR-166
38f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Expert Group and released to the public domain, as explained at
48f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * http://creativecommons.org/publicdomain/zero/1.0/
58f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Other contributors include Andrew Wright, Jeffrey Hayes,
68f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Pat Fisher, Mike Judd.
78f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */
88f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
98f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepackage jsr166;
108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
118e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport static java.util.concurrent.TimeUnit.MILLISECONDS;
128e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.ArrayList;
148e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.Arrays;
158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Collection;
168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Comparator;
178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Iterator;
188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.NoSuchElementException;
198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.Queue;
208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.BlockingQueue;
218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.CountDownLatch;
228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.Executors;
238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.ExecutorService;
248e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.PriorityBlockingQueue;
258e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
268e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.Test;
278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic class PriorityBlockingQueueTest extends JSR166TestCase {
298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
30e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    // android-note: These tests have been moved into their own separate
318e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // classes to work around CTS issues.
328e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //
338e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static class Generic extends BlockingQueueTest {
348e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     protected BlockingQueue emptyCollection() {
358e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //         return new PriorityBlockingQueue();
368e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     }
378e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
38e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
398e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static class InitialCapacity extends BlockingQueueTest {
408e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     protected BlockingQueue emptyCollection() {
418e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //         return new PriorityBlockingQueue(SIZE);
428e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     }
438e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
44e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
45e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    // android-note: Removed because the CTS runner does a bad job of
46e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    // retrying tests that have suite() declarations.
478e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //
488e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static void main(String[] args) {
498e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     main(suite(), args);
508e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
518e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static Test suite() {
528e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     return newTestSuite(PriorityBlockingQueueTest.class,
538e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //                         new Generic().testSuite(),
548e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //                         new InitialCapacity().testSuite());
558e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /** Sample Comparator */
588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    static class MyReverseComparator implements Comparator {
598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public int compare(Object x, Object y) {
608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            return ((Comparable)y).compareTo(x);
618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Returns a new queue of given size containing consecutive
668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Integers 0 ... n.
678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    private PriorityBlockingQueue<Integer> populatedQueue(int n) {
698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue<Integer> q =
708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new PriorityBlockingQueue<Integer>(n);
718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
72e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        for (int i = n - 1; i >= 0; i -= 2)
738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.offer(new Integer(i)));
748e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        for (int i = (n & 1); i < n; i += 2)
758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.offer(new Integer(i)));
768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.isEmpty());
778e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(n, q.size());
798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        return q;
808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A new queue has unbounded capacity
848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor1() {
868e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertEquals(Integer.MAX_VALUE,
878e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                     new PriorityBlockingQueue(SIZE).remainingCapacity());
888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructor throws IAE if capacity argument nonpositive
928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor2() {
948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new PriorityBlockingQueue(0);
968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Initializing from null Collection throws NPE
1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor3() {
1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new PriorityBlockingQueue(null);
1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
1088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Initializing from Collection of null elements throws NPE
1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor4() {
1148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Collection<Integer> elements = Arrays.asList(new Integer[SIZE]);
1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new PriorityBlockingQueue(elements);
1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Initializing from Collection with some null elements throws NPE
1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor5() {
1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] ints = new Integer[SIZE];
126e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        for (int i = 0; i < SIZE - 1; ++i)
1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ints[i] = i;
1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Collection<Integer> elements = Arrays.asList(ints);
1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new PriorityBlockingQueue(elements);
1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Queue contains all elements of collection used to initialize
1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor6() {
1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] ints = new Integer[SIZE];
1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i)
1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ints[i] = i;
1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue q = new PriorityBlockingQueue(Arrays.asList(ints));
1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i)
1448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(ints[i], q.poll());
1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * The comparator used in constructor is used
1498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor7() {
1518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        MyReverseComparator cmp = new MyReverseComparator();
1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE, cmp);
1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(cmp, q.comparator());
1548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] ints = new Integer[SIZE];
1558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i)
1568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ints[i] = new Integer(i);
1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.addAll(Arrays.asList(ints));
158e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        for (int i = SIZE - 1; i >= 0; --i)
1598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(ints[i], q.poll());
1608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * isEmpty is true before add, false after
1648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testEmpty() {
1668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue q = new PriorityBlockingQueue(2);
1678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
1688e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
1698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(one);
1708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.isEmpty());
1718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(two);
1728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.remove();
1738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.remove();
1748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
1758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1788e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     * remainingCapacity() always returns Integer.MAX_VALUE
1798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemainingCapacity() {
1818e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        BlockingQueue q = populatedQueue(SIZE);
1828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
1838e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
1848e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertEquals(SIZE - i, q.size());
1858e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertEquals(i, q.remove());
1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
1888e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertEquals(Integer.MAX_VALUE, q.remainingCapacity());
1898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.size());
1908e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertTrue(q.add(i));
1918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Offer of comparable element succeeds
1968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testOffer() {
1988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue q = new PriorityBlockingQueue(1);
1998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.offer(zero));
2008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.offer(one));
2018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Offer of non-Comparable throws CCE
2058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testOfferNonComparable() {
2078e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        PriorityBlockingQueue q = new PriorityBlockingQueue(1);
2088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.offer(new Object());
2108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.offer(new Object());
2118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (ClassCastException success) {}
2138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * add of comparable succeeds
2178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAdd() {
2198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
2208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
2218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.size());
2228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.add(new Integer(i)));
2238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * addAll(this) throws IAE
2288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAllSelf() {
230e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        PriorityBlockingQueue q = populatedQueue(SIZE);
2318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.addAll(q);
2338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
2358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * addAll of a collection with any null elements throws NPE after
2398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * possibly adding some elements
2408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAll3() {
242e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
243e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        Integer[] ints = new Integer[SIZE];
244e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        for (int i = 0; i < SIZE - 1; ++i)
245e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            ints[i] = new Integer(i);
2468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.addAll(Arrays.asList(ints));
2488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NullPointerException success) {}
2508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Queue contains all elements of successful addAll
2548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAddAll5() {
2568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] empty = new Integer[0];
2578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] ints = new Integer[SIZE];
258e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        for (int i = SIZE - 1; i >= 0; --i)
2598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ints[i] = new Integer(i);
2608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
2618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.addAll(Arrays.asList(empty)));
2628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.addAll(Arrays.asList(ints)));
2638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i)
2648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(ints[i], q.poll());
2658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * all elements successfully put are contained
2698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPut() {
2718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE);
2728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
2738e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            Integer x = new Integer(i);
2748e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            q.put(x);
2758e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertTrue(q.contains(x));
2768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(SIZE, q.size());
2788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * put doesn't block waiting for take
2828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPutWithTake() throws InterruptedException {
2848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
2858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final int size = 4;
2868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
2878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() {
2888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < size; i++)
2898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.put(new Integer(0));
2908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
2918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
2938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(size, q.size());
2948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.take();
2958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed offer does not time out
2998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedOffer() throws InterruptedException {
3018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
3028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
3038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() {
3048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.put(new Integer(0));
3058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                q.put(new Integer(0));
3068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(q.offer(new Integer(0), SHORT_DELAY_MS, MILLISECONDS));
3078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(q.offer(new Integer(0), LONG_DELAY_MS, MILLISECONDS));
3088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
3098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
3118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * take retrieves elements in priority order
3158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTake() throws InterruptedException {
3178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue q = populatedQueue(SIZE);
3188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
3198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.take());
3208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Take removes existing elements until empty, then blocks interruptibly
3258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testBlockingTake() throws InterruptedException {
3278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final PriorityBlockingQueue q = populatedQueue(SIZE);
3288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
3298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
3308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
3318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < SIZE; ++i) {
3328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(i, q.take());
3338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
3348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
3368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
3378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.take();
3388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
3398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
3408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
3418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
3438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
3448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.take();
3458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
3468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
3478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
3488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
3498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
3518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadStaysAlive(t);
3528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
3538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
3548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * poll succeeds unless empty
3588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPoll() {
3608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue q = populatedQueue(SIZE);
3618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
3628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.poll());
3638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.poll());
3658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed poll with zero timeout succeeds when non-empty, else times out
3698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPoll0() throws InterruptedException {
3718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue q = populatedQueue(SIZE);
3728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
3738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.poll(0, MILLISECONDS));
3748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.poll(0, MILLISECONDS));
3768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed poll with nonzero timeout succeeds when non-empty, else times out
3808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTimedPoll() throws InterruptedException {
3828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue<Integer> q = populatedQueue(SIZE);
3838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
3848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            long startTime = System.nanoTime();
3858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS));
3868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
3878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long startTime = System.nanoTime();
3898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.poll(timeoutMillis(), MILLISECONDS));
3908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
3918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        checkEmpty(q);
3928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Interrupted timed poll throws InterruptedException instead of
3968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * returning timeout status
3978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInterruptedTimedPoll() throws InterruptedException {
3998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final BlockingQueue<Integer> q = populatedQueue(SIZE);
4008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch aboutToWait = new CountDownLatch(1);
4018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
4028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
403e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                long startTime = System.nanoTime();
4048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < SIZE; ++i) {
4058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(i, (int) q.poll(LONG_DELAY_MS, MILLISECONDS));
4068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
4078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                aboutToWait.countDown();
4088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
4098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    q.poll(LONG_DELAY_MS, MILLISECONDS);
4108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
4118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {
412e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
4138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
4148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
4158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        aboutToWait.await();
417e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        waitForThreadToEnterWaitState(t, LONG_DELAY_MS);
4188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
419e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        awaitTermination(t);
4208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * peek returns next element, or null if empty
4248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPeek() {
4268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue q = populatedQueue(SIZE);
4278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
4288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.peek());
4298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.poll());
4308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.peek() == null ||
4318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                       !q.peek().equals(i));
4328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(q.peek());
4348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * element returns next element, or throws NSEE if empty
4388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testElement() {
4408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue q = populatedQueue(SIZE);
4418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
4428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.element());
4438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.poll());
4448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
4468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.element();
4478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
4488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NoSuchElementException success) {}
4498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * remove removes next element, or throws NSEE if empty
4538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemove() {
4558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue q = populatedQueue(SIZE);
4568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
4578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i, q.remove());
4588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
4608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.remove();
4618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
4628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (NoSuchElementException success) {}
4638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * contains(x) reports true when elements added but not yet removed
4678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testContains() {
4698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue q = populatedQueue(SIZE);
4708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
4718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.contains(new Integer(i)));
4728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.poll();
4738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(q.contains(new Integer(i)));
4748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * clear removes all elements
4798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testClear() {
4818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue q = populatedQueue(SIZE);
4828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.clear();
4838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
4848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.size());
4858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(one);
4868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.isEmpty());
4878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.contains(one));
4888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.clear();
4898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.isEmpty());
4908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * containsAll(c) is true when c contains a subset of elements
4948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testContainsAll() {
4968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue q = populatedQueue(SIZE);
4978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue p = new PriorityBlockingQueue(SIZE);
4988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
4998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.containsAll(p));
5008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(p.containsAll(q));
5018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.add(new Integer(i));
5028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(p.containsAll(q));
5048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * retainAll(c) retains only those elements of c and reports true if changed
5088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRetainAll() {
5108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue q = populatedQueue(SIZE);
5118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue p = populatedQueue(SIZE);
5128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
5138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            boolean changed = q.retainAll(p);
5148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            if (i == 0)
5158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(changed);
5168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            else
5178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(changed);
5188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.containsAll(p));
520e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            assertEquals(SIZE - i, q.size());
5218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            p.remove();
5228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * removeAll(c) removes only those elements of c and reports true if changed
5278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRemoveAll() {
5298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 1; i < SIZE; ++i) {
5308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            PriorityBlockingQueue q = populatedQueue(SIZE);
5318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            PriorityBlockingQueue p = populatedQueue(i);
5328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.removeAll(p));
533e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            assertEquals(SIZE - i, q.size());
5348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int j = 0; j < i; ++j) {
5358e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                Integer x = (Integer)(p.remove());
5368e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                assertFalse(q.contains(x));
5378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
5388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
5398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toArray contains all elements
5438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray() throws InterruptedException {
5458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue q = populatedQueue(SIZE);
5468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Object[] o = q.toArray();
5478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Arrays.sort(o);
5488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < o.length; i++)
5498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(o[i], q.take());
5508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toArray(a) contains all elements
5548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray2() throws InterruptedException {
5568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue<Integer> q = populatedQueue(SIZE);
5578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] ints = new Integer[SIZE];
5588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Integer[] array = q.toArray(ints);
5598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(ints, array);
5608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Arrays.sort(ints);
5618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < ints.length; i++)
5628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(ints[i], q.take());
5638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toArray(incompatible array type) throws ArrayStoreException
5678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToArray1_BadArg() {
5698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue q = populatedQueue(SIZE);
5708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
5718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.toArray(new String[10]);
5728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
5738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (ArrayStoreException success) {}
5748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * iterator iterates through all elements
5788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIterator() {
5808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue q = populatedQueue(SIZE);
5818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Iterator it = q.iterator();
5828e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        int i;
5838e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        for (i = 0; it.hasNext(); i++)
5848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(q.contains(it.next()));
5858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(i, SIZE);
5868e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertIteratorExhausted(it);
5878e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    }
5888e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
5898e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    /**
5908e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     * iterator of empty collection has no elements
5918e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     */
5928e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    public void testEmptyIterator() {
5938e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        assertIteratorExhausted(new PriorityBlockingQueue().iterator());
5948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * iterator.remove removes current element
5988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testIteratorRemove() {
6008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final PriorityBlockingQueue q = new PriorityBlockingQueue(3);
6018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(new Integer(2));
6028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(new Integer(1));
6038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(new Integer(3));
6048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Iterator it = q.iterator();
6068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        it.next();
6078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        it.remove();
6088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        it = q.iterator();
6108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(it.next(), new Integer(2));
6118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(it.next(), new Integer(3));
6128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(it.hasNext());
6138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * toString contains toStrings of elements
6178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testToString() {
6198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue q = populatedQueue(SIZE);
6208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        String s = q.toString();
6218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i) {
6228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(s.contains(String.valueOf(i)));
6238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed poll transfers elements across Executor tasks
6288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollInExecutor() {
6308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final PriorityBlockingQueue q = new PriorityBlockingQueue(2);
6318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CheckedBarrier threadsStarted = new CheckedBarrier(2);
632e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        final ExecutorService executor = Executors.newFixedThreadPool(2);
633e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(executor)) {
634e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            executor.execute(new CheckedRunnable() {
635e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                public void realRun() throws InterruptedException {
636e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    assertNull(q.poll());
637e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    threadsStarted.await();
638e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    assertSame(one, q.poll(LONG_DELAY_MS, MILLISECONDS));
639e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    checkEmpty(q);
640e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                }});
641e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak
642e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            executor.execute(new CheckedRunnable() {
643e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                public void realRun() throws InterruptedException {
644e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    threadsStarted.await();
645e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                    q.put(one);
646e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                }});
647e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        }
6488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A deserialized serialized queue has same elements
6528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSerialization() throws Exception {
6548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Queue x = populatedQueue(SIZE);
6558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Queue y = serialClone(x);
6568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNotSame(x, y);
6588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(x.size(), y.size());
6598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        while (!x.isEmpty()) {
6608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(y.isEmpty());
6618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(x.remove(), y.remove());
6628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(y.isEmpty());
6648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * drainTo(c) empties queue into another collection c
6688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainTo() {
6708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        PriorityBlockingQueue q = populatedQueue(SIZE);
6718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayList l = new ArrayList();
6728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.drainTo(l);
6738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.size());
6748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(SIZE, l.size());
6758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i)
6768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(l.get(i), new Integer(i));
6778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(zero);
6788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.add(one);
6798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(q.isEmpty());
6808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.contains(zero));
6818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.contains(one));
6828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        l.clear();
6838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.drainTo(l);
6848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, q.size());
6858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(2, l.size());
6868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < 2; ++i)
6878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(l.get(i), new Integer(i));
6888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * drainTo empties queue
6928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainToWithActivePut() throws InterruptedException {
6948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final PriorityBlockingQueue q = populatedQueue(SIZE);
6958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = new Thread(new CheckedRunnable() {
6968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() {
697e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                q.put(new Integer(SIZE + 1));
6988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
6998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.start();
7018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ArrayList l = new ArrayList();
7028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        q.drainTo(l);
7038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(l.size() >= SIZE);
7048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE; ++i)
7058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(l.get(i), new Integer(i));
7068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.join();
7078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(q.size() + l.size() >= SIZE);
7088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * drainTo(c, n) empties first min(n, size) elements of queue into c
7128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testDrainToN() {
714e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        PriorityBlockingQueue q = new PriorityBlockingQueue(SIZE * 2);
7158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < SIZE + 2; ++i) {
7168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int j = 0; j < SIZE; j++)
7178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(q.offer(new Integer(j)));
7188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            ArrayList l = new ArrayList();
7198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            q.drainTo(l, i);
7208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            int k = (i < SIZE) ? i : SIZE;
7218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(k, l.size());
722e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            assertEquals(SIZE - k, q.size());
7238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int j = 0; j < k; ++j)
7248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(l.get(j), new Integer(j));
7258e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            do {} while (q.poll() != null);
7268e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        }
7278e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    }
7288e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
7298e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    /**
7308e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     * remove(null), contains(null) always return false
7318e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath     */
7328e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    public void testNeverContainsNull() {
7338e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        Collection<?>[] qs = {
7348e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            new PriorityBlockingQueue<Object>(),
7358e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            populatedQueue(2),
7368e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        };
7378e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
7388e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath        for (Collection<?> q : qs) {
7398e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertFalse(q.contains(null));
7408e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath            assertFalse(q.remove(null));
7418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
7428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
745