unipdf/pdf/core/ccittfaxdecode/decoding_tree_test.go
2019-02-07 15:00:20 +03:00

701 lines
11 KiB
Go

package ccittfaxdecode
import (
"testing"
)
func formTestCodes(code uint16, bitsWritten int) []uint16 {
var codes []uint16
currentCombination := code
for {
codes = append(codes, currentCombination)
i := 15
for i >= bitsWritten {
bit := bitFromUint16(currentCombination, i)
if bit == 0 {
currentCombination = setBitToUint16(currentCombination, 1, i)
break
} else {
currentCombination = setBitToUint16(currentCombination, 0, i)
}
i--
}
if i < bitsWritten {
break
}
}
return codes
}
func TestFormCodes(t *testing.T) {
tests := []struct {
Code uint16
BitsWritten int
Want []uint16
}{
{
Code: 65520,
BitsWritten: 12,
Want: []uint16{
65520,
65521,
65522,
65523,
65524,
65525,
65526,
65527,
65528,
65529,
65530,
65531,
65532,
65533,
65534,
65535,
},
},
{
Code: 65529,
BitsWritten: 12,
Want: []uint16{
65529,
65530,
65531,
65532,
65533,
65534,
65535,
},
},
{
Code: 65531,
BitsWritten: 12,
Want: []uint16{
65531,
65532,
65533,
65534,
65535,
},
},
}
for _, test := range tests {
gotCodes := formTestCodes(test.Code, test.BitsWritten)
if len(gotCodes) != len(test.Want) {
t.Errorf("Wrong codes len. Got %v, want %v\n", len(gotCodes), len(test.Want))
} else {
for i := range gotCodes {
if gotCodes[i] != test.Want[i] {
t.Errorf("Slices differ in %v. Got %v, want %v\n", i, gotCodes[i], test.Want[i])
break
}
}
}
}
}
func setBitToUint16(num uint16, val byte, pos int) uint16 {
mask := uint16(0xFFFE)<<uint8(15-pos) | uint16(0x7FFF)>>uint(pos)
shiftedVal := uint16(val) << uint8(15-pos)
return num&mask | shiftedVal
}
func TestSetBitToUint16(t *testing.T) {
tests := []struct {
Num uint16
Want uint16
}{
{
Num: 0,
Want: 1,
},
{
Num: 1,
Want: 3,
},
{
Num: 3,
Want: 7,
},
{
Num: 7,
Want: 15,
},
{
Num: 15,
Want: 31,
},
{
Num: 31,
Want: 63,
},
{
Num: 63,
Want: 127,
},
{
Num: 127,
Want: 255,
},
{
Num: 255,
Want: 511,
},
{
Num: 511,
Want: 1023,
},
{
Num: 1023,
Want: 2047,
},
{
Num: 2047,
Want: 4095,
},
{
Num: 4095,
Want: 8191,
},
{
Num: 8191,
Want: 16383,
},
{
Num: 16383,
Want: 32767,
},
{
Num: 32767,
Want: 65535,
},
}
for i, test := range tests {
gotNum := setBitToUint16(test.Num, 1, 15-i)
if gotNum != test.Want {
t.Errorf("Wrong value. Got %v, want %v\n", gotNum, test.Want)
}
}
for i := len(tests) - 1; i >= 0; i-- {
gotNum := setBitToUint16(tests[i].Want, 0, 15-i)
if gotNum != tests[i].Num {
t.Errorf("Wrong value. Got %v, want %v\n", gotNum, tests[i].Want)
}
}
}
func TestFindRunLen(t *testing.T) {
for runLen, code := range WTerms {
addNode(whiteTree, code, 0, runLen)
}
for runLen, code := range WMakeups {
addNode(whiteTree, code, 0, runLen)
}
for runLen, code := range CommonMakeups {
addNode(whiteTree, code, 0, runLen)
addNode(blackTree, code, 0, runLen)
}
type testResult struct {
RunLen int
Code Code
}
type testData struct {
Codes []uint16
Want testResult
}
whiteTerminalTests := []testData{
{
Codes: formTestCodes(13568, 8),
Want: testResult{
RunLen: 0,
Code: WTerms[0],
},
},
{
Codes: formTestCodes(7168, 6),
Want: testResult{
RunLen: 1,
Code: WTerms[1],
},
},
{
Codes: formTestCodes(28672, 4),
Want: testResult{
RunLen: 2,
Code: WTerms[2],
},
},
{
Codes: formTestCodes(32768, 4),
Want: testResult{
RunLen: 3,
Code: WTerms[3],
},
},
{
Codes: formTestCodes(45056, 4),
Want: testResult{
RunLen: 4,
Code: WTerms[4],
},
},
{
Codes: formTestCodes(49152, 4),
Want: testResult{
RunLen: 5,
Code: WTerms[5],
},
},
{
Codes: formTestCodes(57344, 4),
Want: testResult{
RunLen: 6,
Code: WTerms[6],
},
},
{
Codes: formTestCodes(61440, 4),
Want: testResult{
RunLen: 7,
Code: WTerms[7],
},
},
{
Codes: formTestCodes(38912, 5),
Want: testResult{
RunLen: 8,
Code: WTerms[8],
},
},
{
Codes: formTestCodes(40960, 5),
Want: testResult{
RunLen: 9,
Code: WTerms[9],
},
},
{
Codes: formTestCodes(14336, 5),
Want: testResult{
RunLen: 10,
Code: WTerms[10],
},
},
{
Codes: formTestCodes(16384, 5),
Want: testResult{
RunLen: 11,
Code: WTerms[11],
},
},
{
Codes: formTestCodes(8192, 6),
Want: testResult{
RunLen: 12,
Code: WTerms[12],
},
},
{
Codes: formTestCodes(3072, 6),
Want: testResult{
RunLen: 13,
Code: WTerms[13],
},
},
{
Codes: formTestCodes(53248, 6),
Want: testResult{
RunLen: 14,
Code: WTerms[14],
},
},
{
Codes: formTestCodes(54272, 6),
Want: testResult{
RunLen: 15,
Code: WTerms[15],
},
},
{
Codes: formTestCodes(43008, 6),
Want: testResult{
RunLen: 16,
Code: WTerms[16],
},
},
{
Codes: formTestCodes(44032, 6),
Want: testResult{
RunLen: 17,
Code: WTerms[17],
},
},
{
Codes: formTestCodes(19968, 7),
Want: testResult{
RunLen: 18,
Code: WTerms[18],
},
},
{
Codes: formTestCodes(6144, 7),
Want: testResult{
RunLen: 19,
Code: WTerms[19],
},
},
{
Codes: formTestCodes(4096, 7),
Want: testResult{
RunLen: 20,
Code: WTerms[20],
},
},
{
Codes: formTestCodes(11776, 7),
Want: testResult{
RunLen: 21,
Code: WTerms[21],
},
},
{
Codes: formTestCodes(1536, 7),
Want: testResult{
RunLen: 22,
Code: WTerms[22],
},
},
{
Codes: formTestCodes(2048, 7),
Want: testResult{
RunLen: 23,
Code: WTerms[23],
},
},
{
Codes: formTestCodes(20480, 7),
Want: testResult{
RunLen: 24,
Code: WTerms[24],
},
},
{
Codes: formTestCodes(22016, 7),
Want: testResult{
RunLen: 25,
Code: WTerms[25],
},
},
{
Codes: formTestCodes(9728, 7),
Want: testResult{
RunLen: 26,
Code: WTerms[26],
},
},
{
Codes: formTestCodes(18432, 7),
Want: testResult{
RunLen: 27,
Code: WTerms[27],
},
},
{
Codes: formTestCodes(12288, 7),
Want: testResult{
RunLen: 28,
Code: WTerms[28],
},
},
{
Codes: formTestCodes(512, 8),
Want: testResult{
RunLen: 29,
Code: WTerms[29],
},
},
{
Codes: formTestCodes(768, 8),
Want: testResult{
RunLen: 30,
Code: WTerms[30],
},
},
{
Codes: formTestCodes(6656, 8),
Want: testResult{
RunLen: 31,
Code: WTerms[31],
},
},
{
Codes: formTestCodes(6912, 8),
Want: testResult{
RunLen: 32,
Code: WTerms[32],
},
},
{
Codes: formTestCodes(4608, 8),
Want: testResult{
RunLen: 33,
Code: WTerms[33],
},
},
{
Codes: formTestCodes(4864, 8),
Want: testResult{
RunLen: 34,
Code: WTerms[34],
},
},
{
Codes: formTestCodes(5120, 8),
Want: testResult{
RunLen: 35,
Code: WTerms[35],
},
},
{
Codes: formTestCodes(5376, 8),
Want: testResult{
RunLen: 36,
Code: WTerms[36],
},
},
{
Codes: formTestCodes(5632, 8),
Want: testResult{
RunLen: 37,
Code: WTerms[37],
},
},
{
Codes: formTestCodes(5888, 8),
Want: testResult{
RunLen: 38,
Code: WTerms[38],
},
},
{
Codes: formTestCodes(10240, 8),
Want: testResult{
RunLen: 39,
Code: WTerms[39],
},
},
{
Codes: formTestCodes(10496, 8),
Want: testResult{
RunLen: 40,
Code: WTerms[40],
},
},
{
Codes: formTestCodes(10752, 8),
Want: testResult{
RunLen: 41,
Code: WTerms[41],
},
},
{
Codes: formTestCodes(11008, 8),
Want: testResult{
RunLen: 42,
Code: WTerms[42],
},
},
{
Codes: formTestCodes(11264, 8),
Want: testResult{
RunLen: 43,
Code: WTerms[43],
},
},
{
Codes: formTestCodes(11520, 8),
Want: testResult{
RunLen: 44,
Code: WTerms[44],
},
},
{
Codes: formTestCodes(1024, 8),
Want: testResult{
RunLen: 45,
Code: WTerms[45],
},
},
{
Codes: formTestCodes(1280, 8),
Want: testResult{
RunLen: 46,
Code: WTerms[46],
},
},
{
Codes: formTestCodes(2560, 8),
Want: testResult{
RunLen: 47,
Code: WTerms[47],
},
},
{
Codes: formTestCodes(2816, 8),
Want: testResult{
RunLen: 48,
Code: WTerms[48],
},
},
{
Codes: formTestCodes(20992, 8),
Want: testResult{
RunLen: 49,
Code: WTerms[49],
},
},
{
Codes: formTestCodes(21248, 8),
Want: testResult{
RunLen: 50,
Code: WTerms[50],
},
},
{
Codes: formTestCodes(21504, 8),
Want: testResult{
RunLen: 51,
Code: WTerms[51],
},
},
{
Codes: formTestCodes(21760, 8),
Want: testResult{
RunLen: 52,
Code: WTerms[52],
},
},
{
Codes: formTestCodes(9216, 8),
Want: testResult{
RunLen: 53,
Code: WTerms[53],
},
},
{
Codes: formTestCodes(9472, 8),
Want: testResult{
RunLen: 54,
Code: WTerms[54],
},
},
{
Codes: formTestCodes(22528, 8),
Want: testResult{
RunLen: 55,
Code: WTerms[55],
},
},
{
Codes: formTestCodes(22784, 8),
Want: testResult{
RunLen: 56,
Code: WTerms[56],
},
},
{
Codes: formTestCodes(23040, 8),
Want: testResult{
RunLen: 57,
Code: WTerms[57],
},
},
{
Codes: formTestCodes(23296, 8),
Want: testResult{
RunLen: 58,
Code: WTerms[58],
},
},
{
Codes: formTestCodes(18944, 8),
Want: testResult{
RunLen: 59,
Code: WTerms[59],
},
},
{
Codes: formTestCodes(19200, 8),
Want: testResult{
RunLen: 60,
Code: WTerms[60],
},
},
{
Codes: formTestCodes(12800, 8),
Want: testResult{
RunLen: 61,
Code: WTerms[61],
},
},
{
Codes: formTestCodes(13056, 8),
Want: testResult{
RunLen: 62,
Code: WTerms[62],
},
},
{
Codes: formTestCodes(13312, 8),
Want: testResult{
RunLen: 63,
Code: WTerms[63],
},
},
}
for _, test := range whiteTerminalTests {
for _, code := range test.Codes {
gotRunLenPtr, gotCodePtr := findRunLen(whiteTree, code, 0)
if gotRunLenPtr == nil {
t.Errorf("Got nil value for run len for code %v\n", code)
} else if gotCodePtr == nil {
t.Errorf("Got nil value for code for code: %v\n", code)
} else {
if *gotRunLenPtr != test.Want.RunLen {
t.Errorf("Wrong run len for code: %v. Got %v, want %v\n",
code, *gotRunLenPtr, test.Want.RunLen)
}
if *gotCodePtr != test.Want.Code {
t.Errorf("Wrong code for code: %v. Got %v, want %v\n",
code, *gotCodePtr, test.Want.Code)
}
}
}
}
}