/**
 * A test class for HuffmanCode.
 * @author Dr. Jody Paul
 */
public class HuffmanCodeTest extends junit.framework.TestCase {
    public void testEncodeDecode() {
        String sample4 = "abcdefgfghi";
        HuffmanCode huffmanC4 = new HuffmanCode(sample4);
        assertEquals(sample4, huffmanC4.decode(huffmanC4.encode(sample4)));
        java.util.Map<Character,String> map4 = huffmanC4.getCodeMap();
        for (Character c : sample4.toCharArray()) {
            assertTrue(map4.get(c) != null);
        }
        for (Character c : huffmanC4.encode(sample4).toCharArray()) {
            assertTrue(c.equals('0') || c.equals('1'));
        }
        String sample3 = "ab cd e ab cd ab c ab a";
        HuffmanCode huffmanC3 = new HuffmanCode(sample3);
        java.lang.String encoded3 = huffmanC3.encode(sample3);
        assertEquals(sample3, huffmanC3.decode(encoded3));
        String sample2 = "abcdeabcdabcaba";
        assertEquals(sample2, huffmanC3.decode(huffmanC3.encode(sample2)));
        HuffmanCode huffmanC2 = new HuffmanCode(sample2);
        java.lang.String encoded2 = huffmanC2.encode(sample2);
        assertEquals(sample2, huffmanC2.decode(encoded2));
        String sample1 = "abracadabra";
        HuffmanCode huffmanC1 = new HuffmanCode(sample1);
        java.lang.String encoded1 = huffmanC1.encode(sample1);
        assertEquals(sample1, huffmanC1.decode(encoded1));
        String sample5 = "what light through yonder window breaks";
        HuffmanCode huffmanC5 = new HuffmanCode(sample5);
        assertEquals(sample5, huffmanC5.decode(huffmanC5.encode(sample5)));
        String sample6 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
                         + "0123456789.,?"
                         + "This is some text to provide a bias to the frequency"
                         + "values for the code. although the intent is to ensure"
                         + "that any message using alphanumerics is encodable, "
                         + "it would still be nice if the code reflected some "
                         + "characteristics of the English language.";
        HuffmanCode huffmanC6 = new HuffmanCode(sample6);
        java.util.Map<Character,String> map6 = huffmanC6.getCodeMap();
        for (Character c : sample6.toCharArray()) {
            assertTrue(map6.get(c) != null);
        }
        for (Character c : huffmanC6.encode(sample6).toCharArray()) {
            assertTrue(c.equals('0') || c.equals('1'));
        }
        assertEquals(sample6, huffmanC6.decode(huffmanC6.encode(sample6)));
        for (Character c : huffmanC6.encode(sample5).toCharArray()) {
            assertTrue(c.equals('0') || c.equals('1'));
        }
        assertEquals(sample5, huffmanC6.decode(huffmanC6.encode(sample5)));
        assertEquals(sample4, huffmanC6.decode(huffmanC6.encode(sample4)));
        assertEquals(sample3, huffmanC6.decode(huffmanC6.encode(sample3)));
        assertEquals(sample2, huffmanC6.decode(huffmanC6.encode(sample2)));
        assertEquals(sample1, huffmanC6.decode(huffmanC6.encode(sample1)));
    }
}
