package xapi.test.collect;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
import xapi.collect.api.Fifo;
import xapi.collect.impl.SimpleFifo;
public class FifoTest {
@Test public void testAdd() {
Fifo<String> fifo = new SimpleFifo<String>();
ArrayList<String> list = new ArrayList<String>();
doAdd(fifo, list, "one");
doAdd(fifo, list, "two");
doAdd(fifo, list, "three");
Assert.assertEquals(fifo.take(), list.get(0));
Assert.assertEquals(fifo.take(), list.get(1));
Assert.assertEquals(fifo.take(), list.get(2));
Assert.assertTrue(fifo.isEmpty());
for (String item : fifo.forEach()) {
assert false : "Fifo not empty: "+item+" was leftover";
}
}
@Test public void testRemove() {
Fifo<String> fifo = new SimpleFifo<String>();
ArrayList<String> list = new ArrayList<String>();
fifo.give("four");
doAdd(fifo, list, "one");
doAdd(fifo, list, "two");
doAdd(fifo, list, "three");
doAdd(fifo, list, "four");
doRemove(fifo, list, "three");
doRemove(fifo, list, "four");
int pos = 0;
for (String item : fifo.forEach()) {
String other = list.get(pos);
Assert.assertEquals(item, other);
pos++;
}
Assert.assertEquals(fifo.take(), list.get(0));
Assert.assertEquals(fifo.take(), list.get(1));
Assert.assertTrue(fifo.isEmpty());
for (String item : fifo.forEach()) {
assert false : "Fifo not empty: "+item+" was leftover";
}
}
@SuppressWarnings("unused")
private void dump(Fifo<String> fifo) {
for (String item : fifo.forEach())
System.out.println(item);
}
@Test public void testIterate() {
Fifo<String> fifo = new SimpleFifo<String>();
ArrayList<String> list = new ArrayList<String>();
doAdd(fifo, list, "one");
doAdd(fifo, list, "two");
doAdd(fifo, list, "three");
doAdd(fifo, list, "four");
doRemove(fifo, list, "three");
doAdd(fifo, list, "five");
int pos = 0;
for (String item : fifo.forEach()) {
String other = list.get(pos);
Assert.assertEquals(item, other);
pos++;
}
Assert.assertEquals(fifo.size(), list.size());
}
@Test public void testIterateRemove() {
Fifo<String> fifo = new SimpleFifo<String>();
LinkedList<String> list = new LinkedList<String>();
doAdd(fifo, list, "one");
doAdd(fifo, list, "two");
doAdd(fifo, list, "three");
doAdd(fifo, list, "four");
doAdd(fifo, list, "five");
list.remove("four");
list.remove("five");
Iterator<String> iter = fifo.iterator();
while(iter.hasNext()) {
String next = iter.next();
if ("four".equals(next))
iter.remove();
if ("five".equals(next))
iter.remove();
}
int pos = 0;
for (String item : fifo.forEach()) {
String other = list.get(pos);
Assert.assertEquals(item, other);
pos++;
}
Assert.assertEquals(fifo.size(), list.size());
}
@Test public void testIterateRemoveAll() {
Fifo<String> fifo = new SimpleFifo<String>();
fifo.give("one").give("two").give("three").give("four");
Iterator<String> iter = fifo.iterator();
while(iter.hasNext()) {
iter.next();
iter.remove();
}
Assert.assertEquals(0, fifo.size());
if(fifo.iterator().hasNext()) {
throw new RuntimeException("Fifo not empty");
}
if(fifo.take()!=null) {
throw new RuntimeException("Fifo not empty");
}
}
private <X> void doAdd(Fifo<X> fifo, List<X> list, X value) {
fifo.give(value);
list.add(value);
}
private <X> void doRemove(Fifo<X> fifo, List<X> list, X value) {
fifo.remove(value);
list.remove(value);
}
}