git.lucas.co / go_mono
git clone https://git.lucas.co/go_mono.git

ccitt/writer_test.go (1.5K)

 1 // Copyright 2019 The Go Authors. 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 
 5 package ccitt
 6 
 7 import (
 8 	"bytes"
 9 	"reflect"
10 	"testing"
11 )
12 
13 func testEncode(t *testing.T, o Order) {
14 	t.Helper()
15 	values := []uint32{0, 1, 256, 7, 128, 3, 2560, 2240, 2368, 2048}
16 
17 	decTable := whiteDecodeTable[:]
18 	encTableSmall := whiteEncodeTable2[:]
19 	encTableBig := whiteEncodeTable3[:]
20 
21 	// Encode values to bit stream.
22 	var bb bytes.Buffer
23 	w := &bitWriter{w: &bb, order: o}
24 	for _, v := range values {
25 		encTable := encTableSmall
26 		if v < 64 {
27 			// No-op.
28 		} else if v&63 != 0 {
29 			t.Fatalf("writeCode: cannot encode %d: large but not a multiple of 64", v)
30 		} else {
31 			encTable = encTableBig
32 			v = v/64 - 1
33 		}
34 		if err := w.writeCode(encTable[v]); err != nil {
35 			t.Fatalf("writeCode: %v", err)
36 		}
37 	}
38 	if err := w.close(); err != nil {
39 		t.Fatalf("close: %v", err)
40 	}
41 
42 	// Decode bit stream to values.
43 	got := []uint32(nil)
44 	r := &bitReader{
45 		r:     bytes.NewReader(bb.Bytes()),
46 		order: o,
47 	}
48 	finalValue := values[len(values)-1]
49 	for {
50 		v, err := decode(r, decTable)
51 		if err != nil {
52 			t.Fatalf("after got=%d: %v", got, err)
53 		}
54 		got = append(got, v)
55 		if v == finalValue {
56 			break
57 		}
58 	}
59 
60 	// Check that the round-tripped values were unchanged.
61 	if !reflect.DeepEqual(got, values) {
62 		t.Fatalf("\ngot:  %v\nwant: %v", got, values)
63 	}
64 }
65 
66 func TestEncodeLSB(t *testing.T) { testEncode(t, LSB) }
67 func TestEncodeMSB(t *testing.T) { testEncode(t, MSB) }