package org.greencheek.util; import org.junit.Test; import java.io.IOException; import java.io.OutputStream; import java.nio.BufferOverflowException; import java.nio.BufferUnderflowException; import java.nio.ByteBuffer; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertNotNull; import static org.junit.Assert.*; /** * Created by dominictootell on 29/03/2014. */ public class ResizeableByteBufferTest { public ResizeableByteBuffer getResizeableByteBuffer(int max) { return new ResizeableByteBuffer(max); } public ResizeableByteBuffer getResizeableByteBuffer(int min,int max) { return new ResizeableByteBuffer(min,max); } @Test public void testCanWriteAByte() throws IOException { ResizeableByteBuffer 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 { ResizeableByteBuffer 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 { ResizeableByteBuffer 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() { ResizeableByteBuffer buffer = getResizeableByteBuffer(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 xtestCanAppendSizeAndMultipleBytes() { ResizeableByteBuffer buffer = getResizeableByteBuffer(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() { ResizeableByteBuffer buffer = getResizeableByteBuffer(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() { ResizeableByteBuffer 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() { ResizeableByteBuffer buffer = getResizeableByteBuffer(2); buffer.append((byte)88); buffer.append((byte)89); assertEquals(2, buffer.size()); buffer = getResizeableByteBuffer(4); buffer.append((byte)88); buffer.append((byte)89); buffer.append((byte)89); assertEquals(3,buffer.size()); } @Test public void testCannotGrowOverMaxSize() { ResizeableByteBuffer buffer = getResizeableByteBuffer(2); buffer.append((byte)88); buffer.append((byte)89); try { buffer.append((byte)90); assertFalse("should not be able to append more than the maximum",buffer.canWrite()); assertEquals("should not be able to append more than the maximum",2,buffer.size()); } 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() { ResizeableByteBuffer buffer = getResizeableByteBuffer(2); buffer.append((byte)88); buffer.append((byte)89); try { buffer.append((byte)90); assertFalse("should not be able to append more than the maximum",buffer.canWrite()); assertEquals("should not be able to append more than the maximum",2,buffer.size()); } 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() { ResizeableByteBuffer buffer = getResizeableByteBuffer(2); buffer.append((byte)88); buffer.append(new byte[]{89,90}); assertFalse("should not be able to append more than the maximum",buffer.canWrite()); assertEquals("should not be able to append more than the maximum",1,buffer.size()); 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() { ResizeableByteBuffer buffer = getResizeableByteBuffer(10); buffer.append((byte)90); buffer.append(new byte[]{91,92,93,94,95,96,97,98,99}); try { buffer.append((byte) 100); assertFalse("should not be able to add another byte",buffer.canWrite()); assertEquals(10, buffer.size()); } catch(BufferOverflowException e) { } buffer.reset(); buffer.append(new byte[]{1,2,3,4,5,6,7,8,9,10}); try { buffer.append((byte) 11); assertFalse("should not be able to add another byte", buffer.canWrite()); } 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() { ResizeableByteBuffer buffer = getResizeableByteBuffer(10); buffer.append((byte)90); buffer.append(new byte[]{91,92,93,94,95,96,97,98,99}); buffer.append((byte)100); assertFalse("should not be able to append more than the maximum",buffer.canWrite()); assertEquals("should not be able to append more than the maximum",10,buffer.size()); 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); assertTrue(buffer.canWrite()); } catch(BufferOverflowException e) { fail("should be able to add another byte"); } try { buffer.append((byte)11); assertFalse("should not be able to add another byte",buffer.canWrite()); } 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) { } } @Test public void testCapacityExpansion() throws IOException { ResizeableByteBuffer buffer = getResizeableByteBuffer(1,4); buffer.write(new byte[]{88,89,99},0,3); ByteBuffer b = buffer.toByteBuffer(); assertEquals(3, b.limit()); assertEquals(88,b.get()); assertEquals(89,b.get()); assertEquals(99,b.get()); try { b.get(); fail("should not be able to get another byte"); } catch(BufferUnderflowException e) { } byte[] byteArray = buffer.toByteArray(); assertEquals(3,byteArray.length); assertEquals(88,byteArray[0]); } @Test public void testPosition() throws IOException { ResizeableByteBuffer buffer = getResizeableByteBuffer(1,3); buffer.write(new byte[]{88,89,99},0,3); ByteBuffer b = buffer.toByteBuffer(); assertEquals(3, b.limit()); assertEquals(88,b.get()); assertEquals(89,b.get()); assertEquals(99,b.get()); try { b.get(); fail("should not be able to get another byte"); } catch(BufferUnderflowException e) { } assertEquals(3,buffer.position()); buffer.write(new byte[]{88,89,99},0,3); buffer.write(new byte[]{88,89,99},0,3); assertEquals(3,buffer.position()); } @Test public void testAppendAfterFull() throws IOException { ResizeableByteBuffer buffer = getResizeableByteBuffer(1,2); buffer.write(new byte[]{88,89},0,2); 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) { } byte[] byteArray = buffer.toByteArray(); assertEquals(2,byteArray.length); assertEquals(88,byteArray[0]); buffer.write(new byte[]{88,89},0,2); assertFalse(buffer.canWrite()); buffer.write(new byte[]{88,89},0,2); } @Test public void testCloseForWrites() throws IOException { ResizeableByteBuffer buffer = getResizeableByteBuffer(1,10); buffer.write(new byte[]{88,89},0,2); ByteBuffer b = buffer.toByteBuffer(); assertEquals(2, b.limit()); assertEquals(88,b.get()); assertEquals(89,b.get()); buffer.append((byte)100); buffer.closeForWrites(); buffer.append((byte)1); buffer.append((byte)2); byte[] byteArray = buffer.toByteArray(); assertEquals(3,byteArray.length); assertEquals(88,byteArray[0]); assertEquals(100,byteArray[2]); } }