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)); } } }