package org.ovirt.engine.ui.common.utils;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
import org.ovirt.engine.ui.common.utils.AddOnlyRingBuffer.LinearBuffer;
@RunWith(MockitoJUnitRunner.class)
public class AddOnlyRingBufferTest {
private class StringArrayBuffer implements LinearBuffer<String> {
private final String[] array = new String[CAPACITY];
@Override
public void write(int index, String element) {
array[index] = element;
}
@Override
public String read(int index) {
return array[index];
}
}
private static final int CAPACITY = 5;
private AddOnlyRingBuffer<String> tested;
@Before
public void setUp() {
tested = new AddOnlyRingBuffer<>(CAPACITY, new StringArrayBuffer());
}
String[] testedListToArray() {
return tested.list().toArray(new String[0]);
}
@Test
public void bufferEmpty() {
assertArrayEquals(testedListToArray(), new String[0]);
assertEquals(0, tested.head());
assertEquals(0, tested.size());
assertTrue(tested.isEmpty());
assertFalse(tested.isFull());
}
@Test
public void bufferBelowCapacity() {
assertNull(tested.add("A")); //$NON-NLS-1$
assertNull(tested.add("B")); //$NON-NLS-1$
assertArrayEquals(testedListToArray(), new String[] { "A", "B" }); //$NON-NLS-1$ //$NON-NLS-2$
assertEquals(0, tested.head());
assertEquals(2, tested.size());
assertFalse(tested.isEmpty());
assertFalse(tested.isFull());
}
@Test
public void bufferAtCapacity() {
assertNull(tested.add("A")); //$NON-NLS-1$
assertNull(tested.add("B")); //$NON-NLS-1$
assertNull(tested.add("C")); //$NON-NLS-1$
assertNull(tested.add("D")); //$NON-NLS-1$
assertNull(tested.add("E")); //$NON-NLS-1$
assertArrayEquals(testedListToArray(), new String[] { "A", "B", "C", "D", "E" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
assertEquals(0, tested.head());
assertEquals(5, tested.size());
assertFalse(tested.isEmpty());
assertTrue(tested.isFull());
}
@Test
public void bufferBeyondCapacity() {
assertNull(tested.add("A")); //$NON-NLS-1$
assertNull(tested.add("B")); //$NON-NLS-1$
assertNull(tested.add("C")); //$NON-NLS-1$
assertNull(tested.add("D")); //$NON-NLS-1$
assertNull(tested.add("E")); //$NON-NLS-1$
assertEquals("A", tested.add("F")); //$NON-NLS-1$ //$NON-NLS-2$
assertEquals("B", tested.add("G")); //$NON-NLS-1$ //$NON-NLS-2$
assertArrayEquals(testedListToArray(), new String[] { "C", "D", "E", "F", "G" }); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
assertEquals(2, tested.head());
assertEquals(5, tested.size());
assertFalse(tested.isEmpty());
assertTrue(tested.isFull());
}
@Test
public void bufferReset() {
assertNull(tested.add("A")); //$NON-NLS-1$
assertNull(tested.add("B")); //$NON-NLS-1$
assertNull(tested.add("C")); //$NON-NLS-1$
assertNull(tested.add("D")); //$NON-NLS-1$
tested.reset(1, 2);
assertArrayEquals(testedListToArray(), new String[] { "B", "C" }); //$NON-NLS-1$ //$NON-NLS-2$
assertEquals(1, tested.head());
assertEquals(2, tested.size());
assertFalse(tested.isEmpty());
assertFalse(tested.isFull());
}
@Test(expected = IllegalArgumentException.class)
public void bufferReset_headLowerBound() {
tested.reset(-1, 2);
}
@Test(expected = IllegalArgumentException.class)
public void bufferReset_headUpperBound() {
tested.reset(CAPACITY, 2);
}
@Test(expected = IllegalArgumentException.class)
public void bufferReset_sizeLowerBound() {
tested.reset(1, -1);
}
@Test(expected = IllegalArgumentException.class)
public void bufferReset_sizeUpperBound() {
tested.reset(1, CAPACITY + 1);
}
@Test(expected = IllegalArgumentException.class)
public void constructorInvariants_capacityLowerBound() {
new AddOnlyRingBuffer<>(0, new StringArrayBuffer());
}
@Test(expected = NullPointerException.class)
public void constructorInvariants_delegateNull() {
new AddOnlyRingBuffer<String>(CAPACITY, null);
}
}