--- /dev/null
+package net.sf.openrocket.logging;
+
+import static org.junit.Assert.*;
+
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Random;
+
+import org.junit.Test;
+
+
+public class CyclicBufferTest {
+
+ @Test
+ public void testBasic() {
+ CyclicBuffer<Integer> buffer = new CyclicBuffer<Integer>(5);
+ LinkedList<Integer> correct = new LinkedList<Integer>();
+
+ Random rnd = new Random();
+ for (int i=0; i<50; i++) {
+ int n = rnd.nextInt();
+ buffer.add(n);
+ correct.add(n);
+ if (correct.size() > 5)
+ correct.remove();
+ assertEquals(correct, buffer.asList());
+ }
+ }
+
+ @Test
+ public void testComplex() {
+ CyclicBuffer<Integer> buffer = new CyclicBuffer<Integer>(5);
+
+ testContents(buffer);
+ assertEquals(0, buffer.getOverwriteCount());
+
+ buffer.offer(1);
+ testContents(buffer, 1);
+ assertEquals(0, buffer.getOverwriteCount());
+
+ buffer.add(2);
+ testContents(buffer, 1, 2);
+ assertEquals(0, buffer.getOverwriteCount());
+
+ buffer.add(3);
+ testContents(buffer, 1, 2, 3);
+ assertEquals(0, buffer.getOverwriteCount());
+
+ assertEquals(1, (int)buffer.remove());
+ testContents(buffer, 2, 3);
+ assertEquals(0, buffer.getOverwriteCount());
+
+ assertEquals(2, (int)buffer.peek());
+ testContents(buffer, 2, 3);
+ assertEquals(0, buffer.getOverwriteCount());
+
+ buffer.offer(-2);
+ testContents(buffer, 2, 3, -2);
+ assertEquals(0, buffer.getOverwriteCount());
+
+ buffer.offer(-3);
+ testContents(buffer, 2, 3, -2, -3);
+ assertEquals(0, buffer.getOverwriteCount());
+
+ buffer.offer(-4);
+ testContents(buffer, 2, 3, -2, -3, -4);
+ assertEquals(0, buffer.getOverwriteCount());
+
+ buffer.offer(5);
+ testContents(buffer, 3, -2, -3, -4, 5);
+ assertEquals(1, buffer.getOverwriteCount());
+
+ buffer.offer(6);
+ testContents(buffer, -2, -3, -4, 5, 6);
+ assertEquals(2, buffer.getOverwriteCount());
+
+ assertEquals(-2, (int)buffer.peek());
+ testContents(buffer, -2, -3, -4, 5, 6);
+ assertEquals(2, buffer.getOverwriteCount());
+
+ assertEquals(-2, (int)buffer.remove());
+ testContents(buffer, -3, -4, 5, 6);
+ assertEquals(2, buffer.getOverwriteCount());
+
+ assertEquals(-3, (int)buffer.remove());
+ testContents(buffer, -4, 5, 6);
+ assertEquals(2, buffer.getOverwriteCount());
+
+ assertEquals(-4, (int)buffer.poll());
+ testContents(buffer, 5, 6);
+ assertEquals(2, buffer.getOverwriteCount());
+
+ assertEquals(5, (int)buffer.remove());
+ testContents(buffer, 6);
+ assertEquals(2, buffer.getOverwriteCount());
+
+ assertEquals(6, (int)buffer.poll());
+ testContents(buffer);
+ assertEquals(2, buffer.getOverwriteCount());
+
+ assertNull(buffer.peek());
+ assertNull(buffer.poll());
+ testContents(buffer);
+ assertEquals(2, buffer.getOverwriteCount());
+ }
+
+
+ @Test
+ public void testRandom() {
+ CyclicBuffer<Integer> buffer = new CyclicBuffer<Integer>(4);
+ LinkedList<Integer> correct = new LinkedList<Integer>();
+
+ Random rnd = new Random();
+ for (int i=0; i<500; i++) {
+
+ if (rnd.nextBoolean()) {
+ int n = rnd.nextInt();
+ buffer.add(n);
+ correct.add(n);
+ if (correct.size() > 4)
+ correct.remove();
+ } else {
+ Integer n = buffer.poll();
+ if (correct.size() > 0) {
+ assertEquals(correct.remove(), n);
+ } else {
+ assertNull(n);
+ }
+ }
+
+ assertEquals(correct, buffer.asList());
+ }
+ }
+
+
+ private void testContents(CyclicBuffer<Integer> buffer, int ... values) {
+
+ // Test using iterator
+ Iterator<Integer> iterator = buffer.iterator();
+ for (int v: values) {
+ assertTrue(iterator.hasNext());
+ assertEquals(v, (int)iterator.next());
+ }
+ assertFalse(iterator.hasNext());
+ try {
+ iterator.next();
+ fail();
+ } catch (NoSuchElementException ignore) { }
+
+ // Test using list
+ List<Integer> list = buffer.asList();
+ assertEquals("List: " + list, values.length, list.size());
+ for (int i=0; i<values.length; i++) {
+ assertEquals(values[i], (int)list.get(i));
+ }
+
+ }
+
+
+}