blob: 2d1255f3ca09b4835c64bbcdb7b6cb56e035f5ac [file] [log] [blame]
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// This test tests some internals of the flate package.
// The tests in package compress/gzip serve as the
// end-to-end test of the inflater.
package flate
import (
"bytes";
"reflect";
"testing";
)
// The Huffman code lengths used by the fixed-format Huffman blocks.
var fixedHuffmanBits = [...]int {
// 0-143 length 8
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
// 144-255 length 9
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
// 256-279 length 7
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
7, 7, 7, 7, 7, 7, 7, 7,
// 280-287 length 8
8, 8, 8, 8, 8, 8, 8, 8,
}
type InitDecoderTest struct {
in []int;
out huffmanDecoder;
ok bool;
}
var initDecoderTests = []*InitDecoderTest{
// Example from Connell 1973,
&InitDecoderTest{
[]int{ 3, 5, 2, 4, 3, 5, 5, 4, 4, 3, 4, 5 },
huffmanDecoder {
2, 5,
[maxCodeLen+1]int{ 2: 0, 4, 13, 31 },
[maxCodeLen+1]int{ 2: 0, 1, 6, 20 },
// Paper used different code assignment:
// 2, 9, 4, 0, 10, 8, 3, 7, 1, 5, 11, 6
// Reordered here so that codes of same length
// are assigned to increasing numbers.
[]int{ 2, 0, 4, 9, 3, 7, 8, 10, 1, 5, 6, 11 },
},
true,
},
// Example from RFC 1951 section 3.2.2
&InitDecoderTest{
[]int{ 2, 1, 3, 3 },
huffmanDecoder {
1, 3,
[maxCodeLen+1]int{ 1: 0, 2, 7, },
[maxCodeLen+1]int{ 1: 0, 1, 4, },
[]int{ 1, 0, 2, 3 },
},
true,
},
// Second example from RFC 1951 section 3.2.2
&InitDecoderTest{
[]int{ 3, 3, 3, 3, 3, 2, 4, 4 },
huffmanDecoder{
2, 4,
[maxCodeLen+1]int{ 2: 0, 6, 15, },
[maxCodeLen+1]int{ 2: 0, 1, 8, },
[]int{ 5, 0, 1, 2, 3, 4, 6, 7 },
},
true,
},
// Static Huffman codes (RFC 1951 section 3.2.6)
&InitDecoderTest{
&fixedHuffmanBits,
fixedHuffmanDecoder,
true,
},
// Illegal input.
&InitDecoderTest{
[]int{ },
huffmanDecoder{ },
false,
},
// Illegal input.
&InitDecoderTest{
[]int{ 0, 0, 0, 0, 0, 0, 0, },
huffmanDecoder{ },
false,
},
}
func TestInitDecoder(t *testing.T) {
for i, tt := range initDecoderTests {
var h huffmanDecoder;
if h.init(tt.in) != tt.ok {
t.Errorf("test %d: init = %v", i, !tt.ok);
continue;
}
if !reflect.DeepEqual(&h, &tt.out) {
t.Errorf("test %d:\nhave %v\nwant %v", i, h, tt.out);
}
}
}
func TestUncompressedSource(t *testing.T) {
decoder := NewInflater(bytes.NewBuffer(
[]byte{ 0x01, 0x01, 0x00, 0xfe, 0xff, 0x11 }));
output := make([]byte, 1);
n, error := decoder.Read(output);
if n != 1 || error != nil {
t.Fatalf("decoder.Read() = %d, %v, want 1, nil", n, error);
}
if output[0] != 0x11 {
t.Errorf("output[0] = %x, want 0x11", output[0]);
}
}