/*******************************************************************************
* Copyright 2014 Analog Devices, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
********************************************************************************/
package com.analog.lyric.collect.tests;
import static org.junit.Assert.*;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.Random;
import java.util.TreeSet;
import org.junit.Test;
import com.analog.lyric.collect.UniquePriorityQueue;
import com.google.common.collect.Ordering;
public class TestKeyedPriorityQueue
{
private static class NotComparable
{
}
@Test
public void test()
{
UniquePriorityQueue<Integer> uiq = new UniquePriorityQueue<Integer>();
assertInvariants(uiq);
assertTrue(uiq.isEmpty());
assertNull(uiq.comparator());
assertTrue(uiq.offer(42));
assertTrue(uiq.offer(23));
assertFalse(uiq.offer(42));
assertEquals(2, uiq.size());
assertInvariants(uiq);
assertTrue(uiq.add(64));
assertFalse(uiq.add(64));
assertEquals(3, uiq.size());
assertEquals((Integer)23, uiq.peek());
assertEquals((Integer)23, uiq.remove());
assertEquals((Integer)42, uiq.element());
assertEquals((Integer)42, uiq.poll());
assertEquals(1, uiq.size());
assertEquals((Integer)64, uiq.poll());
assertTrue(uiq.isEmpty());
for (int i = 20; --i >= 0;)
{
assertTrue(uiq.add(i));
}
assertInvariants(uiq);
assertEquals(20, uiq.size());
for (int i = 0; i < 20; i += 2)
{
assertTrue(uiq.remove(i));
assertFalse(uiq.remove(i));
}
assertEquals(10, uiq.size());
uiq.clear();
assertTrue(uiq.isEmpty());
Random rand = new Random(42);
int count = 0;
for (int i = 0; i < 100; ++i)
{
if (uiq.offer(rand.nextInt(Integer.MAX_VALUE)))
{
++count;
}
}
assertEquals(count, uiq.size());
assertInvariants(uiq);
int prev = -1;
for (Integer val = null; (val = uiq.poll()) != null; prev = val.intValue())
{
assertTrue(val.intValue() > prev);
}
assertTrue(uiq.isEmpty());
Collection<Integer> ic = new TreeSet<Integer>(Collections.reverseOrder());
for (int i = 0; i < 100; ++i)
{
ic.add(i);
}
uiq = new UniquePriorityQueue<Integer>(ic);
assertEquals(ic.size(), uiq.size());
assertTrue(ic.containsAll(ic));
assertNotNull(uiq.comparator());
assertInvariants(uiq);
prev = Integer.MAX_VALUE;
for (Integer val = null; (val = uiq.poll()) != null; prev = val.intValue())
{
assertTrue(val.intValue() < prev);
}
assertTrue(uiq.isEmpty());
uiq.addAll(ic);
for (int i = 0; i < 100; ++i)
{
if (uiq.offer(rand.nextInt(Integer.MAX_VALUE)))
{
++count;
}
}
assertTrue(uiq.size() > ic.size());
assertTrue(uiq.containsAll(ic));
assertInvariants(uiq);
count = uiq.size();
assertTrue(uiq.removeAll(ic));
assertFalse(uiq.removeAll(ic));
assertEquals(count - ic.size(), uiq.size());
for (Integer i : ic)
{
assertFalse(uiq.contains(i));
}
Iterator<Integer> iteri = uiq.iterator();
while (iteri.hasNext())
{
Integer i = iteri.next();
assertNotNull(i);
iteri.remove();
assertFalse(uiq.contains(i));
}
try
{
iteri.remove();
fail("expected IllegalStateException");
}
catch (IllegalStateException ex)
{
}
assertTrue(uiq.isEmpty());
// Turn of normal ordering and ensure that values come out in FIFO order
uiq = new UniquePriorityQueue<Integer>(10, Ordering.allEqual());
int[] values = new int[100];
for (int i = 0; i < 100; ++i)
{
values[i] = rand.nextInt(Integer.MAX_VALUE);
if (uiq.offer(values[i]))
{
++count;
}
}
assertInvariants(uiq);
for (int value : values)
{
assertEquals(value, uiq.remove().intValue());
}
assertTrue(uiq.isEmpty());
UniquePriorityQueue<Object> uoq = new UniquePriorityQueue<Object>(3);
try
{
uoq.add(new NotComparable());
fail("ClassCastException expected");
}
catch (ClassCastException ex)
{
}
uoq.add(4.2);
uoq.add(2.3);
assertEquals(2.3, uoq.remove());
assertTrue(uoq.remove(4.2));
assertTrue(uoq.isEmpty());
}
public static <E> void assertInvariants(UniquePriorityQueue<E> queue)
{
QueueTester<E> tester = new QueueTester<E>();
tester.validateQueue(queue);
}
}