package org.itadaki.bzip2; import static org.junit.Assert.*; import java.io.ByteArrayOutputStream; import java.io.IOException; import org.itadaki.bzip2.BZip2BitOutputStream; import org.junit.Test; /** * Tests BitOutputStream */ public class TestBZip2BitOutputStream { // Boolean /** * Test writing 8 zeroes * * @throws IOException */ @Test public void testBooleanFalse8() throws IOException { byte[] expected = { 0 }; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); BZip2BitOutputStream outputStream = new BZip2BitOutputStream(byteArrayOutputStream); for (int i = 0; i < 8; i++) { outputStream.writeBoolean(false); } outputStream.flush(); assertArrayEquals(expected, byteArrayOutputStream.toByteArray()); } /** * Test writing 8 ones * * @throws IOException */ @Test public void testBooleanTrue8() throws IOException { byte[] expected = { (byte) 0xff }; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); BZip2BitOutputStream outputStream = new BZip2BitOutputStream(byteArrayOutputStream); for (int i = 0; i < 8; i++) { outputStream.writeBoolean(true); } outputStream.flush(); assertArrayEquals(expected, byteArrayOutputStream.toByteArray()); } /** * Test writing a single 1 in any position as a boolean * * @throws IOException */ @Test public void testBooleanSingleOne() throws IOException { for (int i = 0; i < 8; i++) { byte[] expected = { (byte) (1 << (7 - i)) }; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); BZip2BitOutputStream outputStream = new BZip2BitOutputStream(byteArrayOutputStream); for (int j = 0; j < 8; j++) { outputStream.writeBoolean(j == i); } outputStream.flush(); assertArrayEquals(expected, byteArrayOutputStream.toByteArray()); } } // Unary /** * Test writing unary 0 * * @throws IOException */ @Test public void testUnaryZero() throws IOException { byte[] expected = { 0x00 }; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); BZip2BitOutputStream outputStream = new BZip2BitOutputStream(byteArrayOutputStream); outputStream.writeUnary(0); outputStream.flush(); assertArrayEquals(expected, byteArrayOutputStream.toByteArray()); } /** * Test writing unary 0 * * @throws IOException */ @Test public void testUnaryOne() throws IOException { byte[] expected = { (byte) (1 << 7) }; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); BZip2BitOutputStream outputStream = new BZip2BitOutputStream(byteArrayOutputStream); outputStream.writeUnary(1); outputStream.flush(); assertArrayEquals(expected, byteArrayOutputStream.toByteArray()); } /** * Test writing unary 0 * * @throws IOException */ @Test public void testUnary31() throws IOException { byte[] expected = { (byte) 0xff, (byte) 0xff, (byte) 0xff, (byte) 0xfe }; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); BZip2BitOutputStream outputStream = new BZip2BitOutputStream(byteArrayOutputStream); outputStream.writeUnary(31); outputStream.flush(); assertArrayEquals(expected, byteArrayOutputStream.toByteArray()); } // Bits /** * Test writing a single 0 as bits * * @throws IOException */ @Test public void testBits1_0() throws IOException { byte[] expected = { (byte) 0x00 }; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); BZip2BitOutputStream outputStream = new BZip2BitOutputStream(byteArrayOutputStream); outputStream.writeBits(1, 0); outputStream.flush(); assertArrayEquals(expected, byteArrayOutputStream.toByteArray()); } /** * Test writing a single 1 as bits * * @throws IOException */ @Test public void testBits1_1() throws IOException { byte[] expected = { (byte) (1 << 7) }; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); BZip2BitOutputStream outputStream = new BZip2BitOutputStream(byteArrayOutputStream); outputStream.writeBits(1, 1); outputStream.flush(); assertArrayEquals(expected, byteArrayOutputStream.toByteArray()); } /** * Test writing 23 bits * * @throws IOException */ @Test public void testBits23() throws IOException { byte[] expected = { 0x02, 0x03, 0x04 }; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); BZip2BitOutputStream outputStream = new BZip2BitOutputStream(byteArrayOutputStream); outputStream.writeBits(23, 0x020304 >> 1); outputStream.flush(); assertArrayEquals(expected, byteArrayOutputStream.toByteArray()); } /** * Test writing 24 bits * * @throws IOException */ @Test public void testBits24() throws IOException { byte[] expected = { (byte) 0xff, (byte) 0xff, (byte) 0xff }; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); BZip2BitOutputStream outputStream = new BZip2BitOutputStream(byteArrayOutputStream); outputStream.writeBits(24, 0xffffff); outputStream.flush(); assertArrayEquals(expected, byteArrayOutputStream.toByteArray()); } /** * Test write masking * * @throws IOException */ @Test public void testBitsWriteMasking() throws IOException { byte[] expected = { 0x01, (byte) 0xff, (byte) 0xff }; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); BZip2BitOutputStream outputStream = new BZip2BitOutputStream(byteArrayOutputStream); outputStream.writeBits(7, 0); outputStream.writeBits(17, 0xfffff); outputStream.flush(); assertArrayEquals(expected, byteArrayOutputStream.toByteArray()); } // Integer /** * Test writing an integer * * @throws IOException */ @Test public void testInteger() throws IOException { byte[] expected = { 0x12, 0x34, 0x56, 0x78 }; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); BZip2BitOutputStream outputStream = new BZip2BitOutputStream(byteArrayOutputStream); outputStream.writeInteger(0x12345678); outputStream.flush(); assertArrayEquals(expected, byteArrayOutputStream.toByteArray()); } }