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	"bytes"
9	"io"
10	"math/rand"
11	"strings"
12	"testing"
13
14	"github.com/ulikunitz/xz/internal/randtxt"
15)
16
17func TestBinTree_Find(t *testing.T) {
18	bt, err := newBinTree(30)
19	if err != nil {
20		t.Fatal(err)
21	}
22	const s = "Klopp feiert mit Liverpool seinen hoechsten SiegSieg"
23	n, err := io.WriteString(bt, s)
24	if err != nil {
25		t.Fatalf("WriteString error %s", err)
26	}
27	if n != len(s) {
28		t.Fatalf("WriteString returned %d; want %d", n, len(s))
29	}
30
31	/* dump info writes the complete tree
32	if err = bt.dump(os.Stdout); err != nil {
33		t.Fatalf("bt.dump error %s", err)
34	}
35	*/
36
37	tests := []string{"Sieg", "Sieb", "Simu"}
38	for _, c := range tests {
39		x := xval([]byte(c))
40		a, b := bt.search(bt.root, x)
41		t.Logf("%q: a, b == %d, %d", c, a, b)
42	}
43}
44
45func TestBinTree_PredSucc(t *testing.T) {
46	bt, err := newBinTree(30)
47	if err != nil {
48		t.Fatal(err)
49	}
50	const s = "Klopp feiert mit Liverpool seinen hoechsten Sieg."
51	n, err := io.WriteString(bt, s)
52	if err != nil {
53		t.Fatalf("WriteString error %s", err)
54	}
55	if n != len(s) {
56		t.Fatalf("WriteString returned %d; want %d", n, len(s))
57	}
58	for v := bt.min(bt.root); v != null; v = bt.succ(v) {
59		t.Log(dumpX(bt.node[v].x))
60	}
61	t.Log("")
62	for v := bt.max(bt.root); v != null; v = bt.pred(v) {
63		t.Log(dumpX(bt.node[v].x))
64	}
65}
66
67func TestBinTree_Cycle(t *testing.T) {
68	buf := new(bytes.Buffer)
69	w, err := Writer2Config{
70		DictCap: 4096,
71		Matcher: BinaryTree,
72	}.NewWriter2(buf)
73	if err != nil {
74		t.Fatalf("NewWriter error %s", err)
75	}
76	// const txtlen = 1024
77	const txtlen = 10000
78	io.CopyN(buf, randtxt.NewReader(rand.NewSource(42)), txtlen)
79	txt := buf.String()
80	buf.Reset()
81	n, err := io.Copy(w, strings.NewReader(txt))
82	if err != nil {
83		t.Fatalf("Compressing copy error %s", err)
84	}
85	if n != txtlen {
86		t.Fatalf("Compressing data length %d; want %d", n, txtlen)
87	}
88	if err = w.Close(); err != nil {
89		t.Fatalf("w.Close error %s", err)
90	}
91	t.Logf("buf.Len() %d", buf.Len())
92	r, err := Reader2Config{DictCap: 4096}.NewReader2(buf)
93	if err != nil {
94		t.Fatalf("NewReader error %s", err)
95	}
96	out := new(bytes.Buffer)
97	n, err = io.Copy(out, r)
98	if err != nil {
99		t.Fatalf("Decompressing copy error %s after %d bytes", err, n)
100	}
101	if n != txtlen {
102		t.Fatalf("Decompression data length %d; want %d", n, txtlen)
103	}
104	if txt != out.String() {
105		t.Fatal("decompressed data differs from original")
106	}
107}
108