1// Copyright 2014-2017 Ulrich Kunitz. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package lzma
6
7import (
8	"bufio"
9	"io"
10	"io/ioutil"
11	"os"
12	"testing"
13)
14
15func TestDecoder(t *testing.T) {
16	filename := "fox.lzma"
17	want := "The quick brown fox jumps over the lazy dog.\n"
18	for i := 0; i < 2; i++ {
19		f, err := os.Open(filename)
20		if err != nil {
21			t.Fatalf("os.Open(%q) error %s", filename, err)
22		}
23		p := make([]byte, 13)
24		_, err = io.ReadFull(f, p)
25		if err != nil {
26			t.Fatalf("io.ReadFull error %s", err)
27		}
28		props, err := PropertiesForCode(p[0])
29		if err != nil {
30			t.Fatalf("p[0] error %s", err)
31		}
32		state := newState(props)
33		const capacity = 0x800000
34		dict, err := newDecoderDict(capacity)
35		if err != nil {
36			t.Fatalf("newDecoderDict: error %s", err)
37		}
38		size := int64(-1)
39		if i > 0 {
40			size = int64(len(want))
41		}
42		br := bufio.NewReader(f)
43		r, err := newDecoder(br, state, dict, size)
44		if err != nil {
45			t.Fatalf("newDecoder error %s", err)
46		}
47		bytes, err := ioutil.ReadAll(r)
48		if err != nil {
49			t.Fatalf("[%d] ReadAll error %s", i, err)
50		}
51		if err = f.Close(); err != nil {
52			t.Fatalf("Close error %s", err)
53		}
54		got := string(bytes)
55		if got != want {
56			t.Fatalf("read %q; but want %q", got, want)
57		}
58	}
59}
60