// 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]);
	}
}
