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