// Copyright 2019 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. package ccitt import ( "bytes" "reflect" "testing" ) func testEncode(t *testing.T, o Order) { t.Helper() values := []uint32{0, 1, 256, 7, 128, 3, 2560, 2240, 2368, 2048} decTable := whiteDecodeTable[:] encTableSmall := whiteEncodeTable2[:] encTableBig := whiteEncodeTable3[:] // Encode values to bit stream. var bb bytes.Buffer w := &bitWriter{w: &bb, order: o} for _, v := range values { encTable := encTableSmall if v < 64 { // No-op. } else if v&63 != 0 { t.Fatalf("writeCode: cannot encode %d: large but not a multiple of 64", v) } else { encTable = encTableBig v = v/64 - 1 } if err := w.writeCode(encTable[v]); err != nil { t.Fatalf("writeCode: %v", err) } } if err := w.close(); err != nil { t.Fatalf("close: %v", err) } // Decode bit stream to values. got := []uint32(nil) r := &bitReader{ r: bytes.NewReader(bb.Bytes()), order: o, } finalValue := values[len(values)-1] for { v, err := decode(r, decTable) if err != nil { t.Fatalf("after got=%d: %v", got, err) } got = append(got, v) if v == finalValue { break } } // Check that the round-tripped values were unchanged. if !reflect.DeepEqual(got, values) { t.Fatalf("\ngot: %v\nwant: %v", got, values) } } func TestEncodeLSB(t *testing.T) { testEncode(t, LSB) } func TestEncodeMSB(t *testing.T) { testEncode(t, MSB) }