package org.itadaki.bzip2;
import static org.junit.Assert.*;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.util.Arrays;
import org.itadaki.bzip2.HuffmanAllocator;
import org.junit.Test;
/**
* Tests HuffmanAllocator
*/
public class TestHuffmanAllocator {
/**
* Fibonacci sequence
*/
private static int[] fibonacci = { 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368,
75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352 };
/**
* @throws IOException
*/
@Test
public void testShort1() throws IOException {
int[] expectedLengths = new int[] { 1 };
int[] frequencies = new int[] { 1 };
HuffmanAllocator.allocateHuffmanCodeLengths(frequencies, 32);
assertArrayEquals(expectedLengths, frequencies);
}
/**
* @throws IOException
*/
@Test
public void testShort2() throws IOException {
int[] expectedLengths = new int[] { 1, 1 };
int[] frequencies = new int[] { 1, 1 };
HuffmanAllocator.allocateHuffmanCodeLengths(frequencies, 32);
assertArrayEquals(expectedLengths, frequencies);
}
/**
* @throws IOException
*/
@Test
public void testRegular1() throws IOException {
int[] expectedLengths = new int[] { 3, 3, 2, 2, 2 };
int[] frequencies = new int[] { 1, 1, 1, 1, 1 };
HuffmanAllocator.allocateHuffmanCodeLengths(frequencies, 32);
assertArrayEquals(expectedLengths, frequencies);
}
/**
* @throws IOException
*/
@Test
public void testBoundary1() throws IOException {
int[] expectedLengths = new int[] { 3, 3, 3, 3, 2, 2 };
int[] frequencies = new int[] { 0, 0, 1, 1, 1, 1 };
HuffmanAllocator.allocateHuffmanCodeLengths(frequencies, 3);
assertArrayEquals(expectedLengths, frequencies);
}
/**
* @throws IOException
*/
@Test
public void testFibonacci1() throws IOException {
int[] expectedLengths = new int[] { 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 19, 19, 18, 17, 16, 16, 14, 13, 12, 11, 10, 9, 8,
7, 6, 5, 4, 3, 2, 1 };
int[] frequencies = Arrays.copyOf(fibonacci, 36);
HuffmanAllocator.allocateHuffmanCodeLengths(frequencies, 20);
assertArrayEquals(expectedLengths, frequencies);
}
/**
* @throws IOException
*/
@Test
public void testFibonacci2() throws IOException {
int[] expectedLengths = new int[] { 20, 20, 19, 19, 19, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, };
int[] frequencies = Arrays.copyOf(fibonacci, 22);
HuffmanAllocator.allocateHuffmanCodeLengths(frequencies, 20);
assertArrayEquals(expectedLengths, frequencies);
}
/**
* @throws IOException
*/
@Test
public void testFibonacci3() throws IOException {
int[] expectedLengths = new int[] { 20, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, };
int[] frequencies = Arrays.copyOf(fibonacci, 21);
HuffmanAllocator.allocateHuffmanCodeLengths(frequencies, 20);
assertArrayEquals(expectedLengths, frequencies);
}
/**
* @throws IOException
*/
@Test
public void testFibonacci4() throws IOException {
int[] expectedLengths = new int[] { 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 4, 3, 2 };
int[] frequencies = Arrays.copyOf(fibonacci, 36);
HuffmanAllocator.allocateHuffmanCodeLengths(frequencies, 6);
assertArrayEquals(expectedLengths, frequencies);
}
/**
* Pointless test to bump coverage to 100%
*
* @throws Exception
*/
@Test
public void testPointlessConstructorTestCoverage() throws Exception {
Constructor<?> c[] = HuffmanAllocator.class.getDeclaredConstructors();
c[0].setAccessible(true);
c[0].newInstance((Object[]) null);
}
}