package org.greencheek.util;
import org.junit.Test;
import java.io.IOException;
import java.nio.BufferOverflowException;
import java.nio.BufferUnderflowException;
import java.nio.ByteBuffer;
import static junit.framework.Assert.assertNotNull;
import static org.junit.Assert.*;
/**
* Created by dominictootell on 29/03/2014.
*/
public class ResizableByteBufferNoBoundsCheckingBackedOutputStreamTest
{
public ResizableByteBufferNoBoundsCheckingBackedOutputStream getResizeableByteBuffer(int min, int max) {
return new ResizableByteBufferNoBoundsCheckingBackedOutputStream(min,max);
}
public ResizableByteBufferNoBoundsCheckingBackedOutputStream getResizeableByteBuffer(int min) {
return new ResizableByteBufferNoBoundsCheckingBackedOutputStream(min);
}
@Test
public void testCanWriteAByte() throws IOException {
ResizableByteBufferNoBoundsCheckingBackedOutputStream buffer = getResizeableByteBuffer(1);
buffer.write(88);
ByteBuffer b = buffer.toByteBuffer();
assertEquals(1, b.limit());
assertEquals(88,b.get());
try {
b.get();
fail("should not be able to get another byte");
} catch(BufferUnderflowException e) {
}
byte[] byteArray = buffer.toByteArray();
assertEquals(1,byteArray.length);
assertEquals(88,byteArray[0]);
}
@Test
public void testCanWriteBytes() throws IOException {
ResizableByteBufferNoBoundsCheckingBackedOutputStream buffer = getResizeableByteBuffer(256);
buffer.write((byte) 88);
buffer.write(new byte[]{1, 2, 3, 4});
buffer.write((byte) 6);
byte[] byteArray = buffer.toByteArray();
assertEquals(6,byteArray.length);
assertEquals(88,byteArray[0]);
assertArrayEquals(new byte[]{88,1,2,3,4,6},byteArray);
}
@Test
public void testCanWriteByteSubSet() throws IOException {
ResizableByteBufferNoBoundsCheckingBackedOutputStream buffer = getResizeableByteBuffer(256);
buffer.write((byte) 88);
buffer.write(new byte[]{1, 2, 3, 4});
buffer.write(new byte[]{1, 2, 3, 4},1,2);
buffer.write((byte) 6);
byte[] byteArray = buffer.toByteArray();
assertEquals(8,byteArray.length);
assertEquals(88,byteArray[0]);
assertArrayEquals(new byte[]{88,1,2,3,4,2,3,6},byteArray);
}
@Test
public void testCanAppend() {
ResizableByteBufferNoBoundsCheckingBackedOutputStream buffer = getResizeableByteBuffer(1,2);
buffer.append((byte)88);
ByteBuffer b = buffer.toByteBuffer();
assertEquals(1, b.limit());
assertEquals(88,b.get());
try {
b.get();
fail("should not be able to get another byte");
} catch(BufferUnderflowException e) {
}
}
@Test
public void testCanAppendSizeAndMultipleBytes() {
ResizableByteBufferNoBoundsCheckingBackedOutputStream buffer = getResizeableByteBuffer(1,16);
buffer.append((byte)88);
buffer.append(new byte[]{1,2,3,4});
buffer.append((byte)6);
ByteBuffer b = buffer.toByteBuffer();
assertEquals(6, b.limit());
assertEquals(88,b.get());
assertEquals(1,b.get());
assertEquals(2,b.get());
assertEquals(3,b.get());
assertEquals(4,b.get());
assertEquals(6,b.get());
}
@Test
public void testCanGetUnderlyingByteArray() {
ResizableByteBufferNoBoundsCheckingBackedOutputStream buffer = getResizeableByteBuffer(1,4);
buffer.append((byte)88);
buffer.append((byte)88);
buffer.append((byte)88);
assertNotNull(buffer.getBuf());
assertTrue(buffer.getBuf().length>2);
}
@Test
public void testCanGrow() {
ResizableByteBufferNoBoundsCheckingBackedOutputStream buffer = getResizeableByteBuffer(1,2);
buffer.append((byte)88);
buffer.append((byte)89);
ByteBuffer b = buffer.toByteBuffer();
assertEquals(2,b.limit());
assertEquals(88,b.get());
assertEquals(89,b.get());
try {
b.get();
fail("should not be able to get another byte");
} catch(BufferUnderflowException e) {
}
}
@Test
public void testSizeIsCorrect() {
ResizableByteBufferNoBoundsCheckingBackedOutputStream buffer = getResizeableByteBuffer(1, 2);
buffer.append((byte)88);
buffer.append((byte)89);
assertEquals(2, buffer.size());
buffer = getResizeableByteBuffer(1, 4);
buffer.append((byte)88);
buffer.append((byte)89);
buffer.append((byte)89);
assertEquals(3,buffer.size());
}
@Test
public void testCannotGrowOverMaxSize() {
ResizableByteBufferNoBoundsCheckingBackedOutputStream buffer = getResizeableByteBuffer(1,2);
buffer.append((byte)88);
buffer.append((byte)89);
try {
buffer.append((byte)90);
fail("should not be able to append more than the maximum");
} catch(BufferOverflowException e) {
}
ByteBuffer b = buffer.toByteBuffer();
assertEquals(2,b.limit());
assertEquals(88,b.get());
assertEquals(89,b.get());
try {
b.get();
fail("should not be able to get another byte");
} catch(BufferUnderflowException e) {
}
}
@Test
public void testCannotGrowOverMaxSizeWithSameMinMaxInitialisation() {
ResizableByteBufferNoBoundsCheckingBackedOutputStream buffer = getResizeableByteBuffer(2,2);
buffer.append((byte)88);
buffer.append((byte)89);
try {
buffer.append((byte)90);
fail("should not be able to append more than the maximum");
} catch(BufferOverflowException e) {
}
ByteBuffer b = buffer.toByteBuffer();
assertEquals(2,b.limit());
assertEquals(88,b.get());
assertEquals(89,b.get());
try {
b.get();
fail("should not be able to get another byte");
} catch(BufferUnderflowException e) {
}
}
@Test
public void testCannotGrowOverMaxSizeWithByteArrayAppend() {
ResizableByteBufferNoBoundsCheckingBackedOutputStream buffer = getResizeableByteBuffer(1,2);
buffer.append((byte)88);
try {
buffer.append(new byte[]{89,90});
fail("should not be able to append more than the maximum");
} catch(BufferOverflowException e) {
}
ByteBuffer b = buffer.toByteBuffer();
assertEquals(1,b.limit());
assertEquals(88,b.get());
try {
b.get();
fail("should not be able to get another byte");
} catch(BufferUnderflowException e) {
}
}
@Test
public void testCanResetBuffer() {
ResizableByteBufferNoBoundsCheckingBackedOutputStream buffer = getResizeableByteBuffer(1,10);
buffer.append((byte)90);
buffer.append(new byte[]{91,92,93,94,95,96,97,98,99});
try {
buffer.append((byte)100);
fail("should not be able to add another byte");
} catch(BufferOverflowException e) {
}
buffer.reset();
buffer.append(new byte[]{1,2,3,4,5,6,7,8,9,10});
try {
buffer.append((byte)11);
fail("should not be able to add another byte");
} catch(BufferOverflowException e) {
}
ByteBuffer b = buffer.toByteBuffer();
assertEquals(10,b.limit());
assertEquals(1,b.get());
assertEquals(2,b.get());
assertEquals(3,b.get());
assertEquals(4,b.get());
assertEquals(5,b.get());
assertEquals(6,b.get());
assertEquals(7,b.get());
assertEquals(8,b.get());
assertEquals(9,b.get());
assertEquals(10,b.get());
try {
b.get();
fail("should not be able to get another byte");
} catch(BufferUnderflowException e) {
}
}
@Test
public void testCanResetBufferWithPartialByteArrayAppend() {
ResizableByteBufferNoBoundsCheckingBackedOutputStream buffer = getResizeableByteBuffer(1,10);
buffer.append((byte)90);
buffer.append(new byte[]{91,92,93,94,95,96,97,98,99});
try {
buffer.append((byte)100);
fail("should not be able to add another byte");
} catch(BufferOverflowException e) {
}
buffer.reset();
buffer.append(new byte[]{1,2,3,4,5,6,7,8,9,10},0,5);
buffer.append(new byte[]{1,2,3,4,5,6,7,8,9,10},6,4);
try {
buffer.append((byte)6);
} catch(BufferOverflowException e) {
fail("should be able to add another byte");
}
try {
buffer.append((byte)11);
fail("should not be able to add another byte");
} catch(BufferOverflowException e) {
}
ByteBuffer b = buffer.toByteBuffer();
assertEquals(10,b.limit());
assertEquals(1,b.get());
assertEquals(2,b.get());
assertEquals(3,b.get());
assertEquals(4,b.get());
assertEquals(5,b.get());
assertEquals(7,b.get());
assertEquals(8,b.get());
assertEquals(9,b.get());
assertEquals(10,b.get());
assertEquals(6,b.get());
try {
b.get();
fail("should not be able to get another byte");
} catch(BufferUnderflowException e) {
}
}
}