/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.activemq.artemis.core.list;
import org.apache.activemq.artemis.utils.collections.LinkedListIterator;
import org.apache.activemq.artemis.utils.collections.PriorityLinkedListImpl;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public final class PriorityLinkedListTest extends Assert {
protected Wibble a;
protected Wibble b;
protected Wibble c;
protected Wibble d;
protected Wibble e;
protected Wibble f;
protected Wibble g;
protected Wibble h;
protected Wibble i;
protected Wibble j;
protected Wibble k;
protected Wibble l;
protected Wibble m;
protected Wibble n;
protected Wibble o;
protected Wibble p;
protected Wibble q;
protected Wibble r;
protected Wibble s;
protected Wibble t;
protected Wibble u;
protected Wibble v;
protected Wibble w;
protected Wibble x;
protected Wibble y;
protected Wibble z;
private PriorityLinkedListImpl<Wibble> list;
protected PriorityLinkedListImpl<Wibble> getList() {
return new PriorityLinkedListImpl<>(10);
}
@Before
public void setUp() throws Exception {
list = getList();
a = new Wibble("a");
b = new Wibble("b");
c = new Wibble("c");
d = new Wibble("d");
e = new Wibble("e");
f = new Wibble("f");
g = new Wibble("g");
h = new Wibble("h");
i = new Wibble("i");
j = new Wibble("j");
k = new Wibble("k");
l = new Wibble("l");
m = new Wibble("m");
n = new Wibble("n");
o = new Wibble("o");
p = new Wibble("p");
q = new Wibble("q");
r = new Wibble("r");
s = new Wibble("s");
t = new Wibble("t");
u = new Wibble("u");
v = new Wibble("v");
w = new Wibble("w");
x = new Wibble("x");
y = new Wibble("y");
z = new Wibble("z");
}
@Test
public void testEmpty() throws Exception {
Assert.assertTrue(list.isEmpty());
list.addHead(a, 0);
Assert.assertFalse(list.isEmpty());
Wibble w1 = list.poll();
Assert.assertEquals(a, w1);
Assert.assertTrue(list.isEmpty());
assertEquals(0, list.size());
}
@Test
public void testaddHead() throws Exception {
list.addHead(a, 0);
list.addHead(b, 0);
list.addHead(c, 0);
list.addHead(d, 0);
list.addHead(e, 0);
assertEquals(5, list.size());
Assert.assertEquals(e, list.poll());
Assert.assertEquals(d, list.poll());
Assert.assertEquals(c, list.poll());
Assert.assertEquals(b, list.poll());
Assert.assertEquals(a, list.poll());
Assert.assertNull(list.poll());
assertEquals(0, list.size());
}
@Test
public void testaddTail() throws Exception {
list.addTail(a, 0);
list.addTail(b, 0);
list.addTail(c, 0);
list.addTail(d, 0);
list.addTail(e, 0);
assertEquals(5, list.size());
Assert.assertEquals(a, list.poll());
Assert.assertEquals(b, list.poll());
Assert.assertEquals(c, list.poll());
Assert.assertEquals(d, list.poll());
Assert.assertEquals(e, list.poll());
Assert.assertNull(list.poll());
assertEquals(0, list.size());
}
@Test
public void testAddLastAndFirst() throws Exception {
list.addTail(a, 0);
list.addTail(b, 0);
list.addTail(c, 0);
list.addTail(d, 0);
list.addTail(e, 0);
list.addTail(f, 0);
list.addTail(g, 0);
list.addTail(h, 0);
list.addTail(i, 0);
list.addTail(j, 0);
list.addHead(k, 0);
list.addHead(l, 0);
list.addHead(m, 0);
list.addHead(n, 0);
list.addHead(o, 0);
list.addHead(p, 0);
list.addHead(q, 0);
list.addHead(r, 0);
list.addHead(s, 0);
list.addHead(t, 0);
assertEquals(t, list.poll());
assertEquals(s, list.poll());
assertEquals(r, list.poll());
assertEquals(q, list.poll());
assertEquals(p, list.poll());
assertEquals(o, list.poll());
assertEquals(n, list.poll());
assertEquals(m, list.poll());
assertEquals(l, list.poll());
assertEquals(k, list.poll());
assertEquals(a, list.poll());
assertEquals(b, list.poll());
assertEquals(c, list.poll());
assertEquals(d, list.poll());
assertEquals(e, list.poll());
assertEquals(f, list.poll());
assertEquals(g, list.poll());
assertEquals(h, list.poll());
assertEquals(i, list.poll());
assertEquals(j, list.poll());
}
@Test
public void testAddLastAndFirstWithIterator() throws Exception {
list.addTail(a, 0);
list.addTail(b, 0);
list.addTail(c, 0);
list.addTail(d, 0);
list.addTail(e, 0);
list.addTail(f, 0);
list.addTail(g, 0);
list.addTail(h, 0);
list.addTail(i, 0);
list.addTail(j, 0);
list.addHead(k, 0);
list.addHead(l, 0);
list.addHead(m, 0);
list.addHead(n, 0);
list.addHead(o, 0);
list.addHead(p, 0);
list.addHead(q, 0);
list.addHead(r, 0);
list.addHead(s, 0);
list.addHead(t, 0);
LinkedListIterator<Wibble> iter = list.iterator();
assertTrue(iter.hasNext());
assertEquals(t, iter.next());
assertTrue(iter.hasNext());
assertEquals(s, iter.next());
assertTrue(iter.hasNext());
assertEquals(r, iter.next());
assertTrue(iter.hasNext());
assertEquals(q, iter.next());
assertTrue(iter.hasNext());
assertEquals(p, iter.next());
assertTrue(iter.hasNext());
assertEquals(o, iter.next());
assertTrue(iter.hasNext());
assertEquals(n, iter.next());
assertTrue(iter.hasNext());
assertEquals(m, iter.next());
assertTrue(iter.hasNext());
assertEquals(l, iter.next());
assertTrue(iter.hasNext());
assertEquals(k, iter.next());
assertTrue(iter.hasNext());
assertEquals(a, iter.next());
assertTrue(iter.hasNext());
assertEquals(b, iter.next());
assertTrue(iter.hasNext());
assertEquals(c, iter.next());
assertTrue(iter.hasNext());
assertEquals(d, iter.next());
assertTrue(iter.hasNext());
assertEquals(e, iter.next());
assertTrue(iter.hasNext());
assertEquals(f, iter.next());
assertTrue(iter.hasNext());
assertEquals(g, iter.next());
assertTrue(iter.hasNext());
assertEquals(h, iter.next());
assertTrue(iter.hasNext());
assertEquals(i, iter.next());
assertTrue(iter.hasNext());
assertEquals(j, iter.next());
}
@Test
public void testPoll() throws Exception {
list.addTail(a, 0);
list.addTail(b, 1);
list.addTail(c, 2);
list.addTail(d, 3);
list.addTail(e, 4);
list.addTail(f, 5);
list.addTail(g, 6);
list.addTail(h, 7);
list.addTail(i, 8);
list.addTail(j, 9);
Assert.assertEquals(j, list.poll());
Assert.assertEquals(i, list.poll());
Assert.assertEquals(h, list.poll());
Assert.assertEquals(g, list.poll());
Assert.assertEquals(f, list.poll());
Assert.assertEquals(e, list.poll());
Assert.assertEquals(d, list.poll());
Assert.assertEquals(c, list.poll());
Assert.assertEquals(b, list.poll());
Assert.assertEquals(a, list.poll());
Assert.assertNull(list.poll());
list.addTail(a, 9);
list.addTail(b, 8);
list.addTail(c, 7);
list.addTail(d, 6);
list.addTail(e, 5);
list.addTail(f, 4);
list.addTail(g, 3);
list.addTail(h, 2);
list.addTail(i, 1);
list.addTail(j, 0);
Assert.assertEquals(a, list.poll());
Assert.assertEquals(b, list.poll());
Assert.assertEquals(c, list.poll());
Assert.assertEquals(d, list.poll());
Assert.assertEquals(e, list.poll());
Assert.assertEquals(f, list.poll());
Assert.assertEquals(g, list.poll());
Assert.assertEquals(h, list.poll());
Assert.assertEquals(i, list.poll());
Assert.assertEquals(j, list.poll());
Assert.assertNull(list.poll());
list.addTail(a, 9);
list.addTail(b, 0);
list.addTail(c, 8);
list.addTail(d, 1);
list.addTail(e, 7);
list.addTail(f, 2);
list.addTail(g, 6);
list.addTail(h, 3);
list.addTail(i, 5);
list.addTail(j, 4);
Assert.assertEquals(a, list.poll());
Assert.assertEquals(c, list.poll());
Assert.assertEquals(e, list.poll());
Assert.assertEquals(g, list.poll());
Assert.assertEquals(i, list.poll());
Assert.assertEquals(j, list.poll());
Assert.assertEquals(h, list.poll());
Assert.assertEquals(f, list.poll());
Assert.assertEquals(d, list.poll());
Assert.assertEquals(b, list.poll());
Assert.assertNull(list.poll());
list.addTail(a, 0);
list.addTail(b, 3);
list.addTail(c, 3);
list.addTail(d, 3);
list.addTail(e, 6);
list.addTail(f, 6);
list.addTail(g, 6);
list.addTail(h, 9);
list.addTail(i, 9);
list.addTail(j, 9);
Assert.assertEquals(h, list.poll());
Assert.assertEquals(i, list.poll());
Assert.assertEquals(j, list.poll());
Assert.assertEquals(e, list.poll());
Assert.assertEquals(f, list.poll());
Assert.assertEquals(g, list.poll());
Assert.assertEquals(b, list.poll());
Assert.assertEquals(c, list.poll());
Assert.assertEquals(d, list.poll());
Assert.assertEquals(a, list.poll());
Assert.assertNull(list.poll());
list.addTail(a, 5);
list.addTail(b, 5);
list.addTail(c, 5);
list.addTail(d, 5);
list.addTail(e, 5);
list.addTail(f, 5);
list.addTail(g, 5);
list.addTail(h, 5);
list.addTail(i, 5);
list.addTail(j, 5);
Assert.assertEquals(a, list.poll());
Assert.assertEquals(b, list.poll());
Assert.assertEquals(c, list.poll());
Assert.assertEquals(d, list.poll());
Assert.assertEquals(e, list.poll());
Assert.assertEquals(f, list.poll());
Assert.assertEquals(g, list.poll());
Assert.assertEquals(h, list.poll());
Assert.assertEquals(i, list.poll());
Assert.assertEquals(j, list.poll());
Assert.assertNull(list.poll());
list.addTail(j, 5);
list.addTail(i, 5);
list.addTail(h, 5);
list.addTail(g, 5);
list.addTail(f, 5);
list.addTail(e, 5);
list.addTail(d, 5);
list.addTail(c, 5);
list.addTail(b, 5);
list.addTail(a, 5);
Assert.assertEquals(j, list.poll());
Assert.assertEquals(i, list.poll());
Assert.assertEquals(h, list.poll());
Assert.assertEquals(g, list.poll());
Assert.assertEquals(f, list.poll());
Assert.assertEquals(e, list.poll());
Assert.assertEquals(d, list.poll());
Assert.assertEquals(c, list.poll());
Assert.assertEquals(b, list.poll());
Assert.assertEquals(a, list.poll());
Assert.assertNull(list.poll());
assertEquals(0, list.size());
}
@Test
public void testIterator() {
list.addTail(a, 9);
list.addTail(b, 9);
list.addTail(c, 8);
list.addTail(d, 8);
list.addTail(e, 7);
list.addTail(f, 7);
list.addTail(g, 7);
list.addTail(h, 6);
list.addTail(i, 6);
list.addTail(j, 6);
list.addTail(k, 5);
list.addTail(l, 5);
list.addTail(m, 4);
list.addTail(n, 4);
list.addTail(o, 4);
list.addTail(p, 3);
list.addTail(q, 3);
list.addTail(r, 3);
list.addTail(s, 2);
list.addTail(t, 2);
list.addTail(u, 2);
list.addTail(v, 1);
list.addTail(w, 1);
list.addTail(x, 1);
list.addTail(y, 0);
list.addTail(z, 0);
LinkedListIterator<Wibble> iter = list.iterator();
int count = 0;
Wibble w1;
while (iter.hasNext()) {
w1 = iter.next();
count++;
}
Assert.assertEquals(26, count);
Assert.assertEquals(26, list.size());
iter = list.iterator();
assertTrue(iter.hasNext());
w1 = iter.next();
assertTrue(iter.hasNext());
Assert.assertEquals("a", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
assertTrue(iter.hasNext());
Assert.assertEquals("b", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("c", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("d", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("e", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("f", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("g", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("h", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("i", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("j", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("k", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("l", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("m", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("n", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("o", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("p", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("q", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("r", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("s", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("t", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("u", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("v", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("w", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("x", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("y", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("z", w1.s1);
assertFalse(iter.hasNext());
iter = list.iterator();
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("a", w1.s1);
iter.remove();
Assert.assertEquals(25, list.size());
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("b", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("c", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("d", w1.s1);
iter.remove();
Assert.assertEquals(24, list.size());
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("c", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("e", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("f", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("g", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("h", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("i", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("j", w1.s1);
iter.remove();
Assert.assertEquals(23, list.size());
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("i", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("k", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("l", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("m", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("n", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("o", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("p", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("q", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("r", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("s", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("t", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("u", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("v", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("w", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("x", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("y", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("z", w1.s1);
iter.remove();
iter = list.iterator();
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("b", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("c", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("e", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("f", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("g", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("h", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("i", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("k", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("l", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("m", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("n", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("o", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("p", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("q", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("r", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("s", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("t", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("u", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("v", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("w", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("x", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("y", w1.s1);
assertFalse(iter.hasNext());
assertFalse(iter.hasNext());
// Test the elements added after iter created are seen
list.addTail(a, 4);
list.addTail(b, 4);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("a", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("b", w1.s1);
assertFalse(iter.hasNext());
list.addTail(c, 4);
list.addTail(d, 4);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("c", w1.s1);
assertTrue(iter.hasNext());
w1 = iter.next();
Assert.assertEquals("d", w1.s1);
assertFalse(iter.hasNext());
}
@Test
public void testIteratorPicksUpHigherPriorities() {
list.addTail(a, 4);
list.addTail(b, 4);
list.addTail(c, 4);
LinkedListIterator<Wibble> iter = list.iterator();
assertTrue(iter.hasNext());
assertEquals(a, iter.next());
assertTrue(iter.hasNext());
assertEquals(b, iter.next());
list.addTail(d, 5);
list.addTail(e, 5);
assertTrue(iter.hasNext());
assertEquals(d, iter.next());
assertTrue(iter.hasNext());
assertEquals(e, iter.next());
assertTrue(iter.hasNext());
assertEquals(c, iter.next());
list.addTail(f, 1);
list.addTail(g, 9);
assertTrue(iter.hasNext());
assertEquals(g, iter.next());
assertTrue(iter.hasNext());
assertEquals(f, iter.next());
}
@Test
public void testClear() {
list.addTail(a, 0);
list.addTail(b, 3);
list.addTail(c, 3);
list.addTail(d, 3);
list.addTail(e, 6);
list.addTail(f, 6);
list.addTail(g, 6);
list.addTail(h, 9);
list.addTail(i, 9);
list.addTail(j, 9);
list.clear();
Assert.assertNull(list.poll());
}
@Test
public void testMixupIterator() {
list.addTail(c, 5);
list.addTail(a, 4);
list.addTail(b, 4);
LinkedListIterator<Wibble> iter = list.iterator();
assertTrue(iter.hasNext());
assertEquals(c, iter.next());
assertTrue(iter.hasNext());
assertEquals(a, iter.next());
assertTrue(iter.hasNext());
assertEquals(b, iter.next());
list.addTail(d, 5);
assertTrue(iter.hasNext());
assertEquals(d, iter.next());
}
@Test
public void testMixupIterator2() {
list.addTail(c, 5);
list.addTail(k, 0);
list.addTail(a, 2);
list.addTail(b, 2);
LinkedListIterator<Wibble> iter = list.iterator();
assertTrue(iter.hasNext());
assertEquals(c, iter.next());
iter.remove();
assertTrue(iter.hasNext());
assertEquals(a, iter.next());
iter.remove();
assertTrue(iter.hasNext());
assertEquals(b, iter.next());
iter.remove();
assertTrue(iter.hasNext());
assertEquals(k, iter.next());
iter.remove();
list.addTail(d, 2);
assertTrue(iter.hasNext());
assertEquals(d, iter.next());
iter.remove();
}
static class Wibble {
String s1;
Wibble(final String s) {
this.s1 = s;
}
@Override
public String toString() {
return s1;
}
}
}