unipdf/pdf/core/encoding_test.go

247 lines
6.7 KiB
Go
Raw Normal View History

/*
* This file is subject to the terms and conditions defined in
* file 'LICENSE.md', which is part of this source code package.
*/
package core
import (
2017-02-23 15:25:23 +00:00
"encoding/base64"
"testing"
"github.com/unidoc/unidoc/common"
)
func init() {
common.SetLogger(common.ConsoleLogger{})
}
// Test flate encoding.
func TestFlateEncoding(t *testing.T) {
rawStream := []byte("this is a dummy text with some \x01\x02\x03 binary data")
encoder := NewFlateEncoder()
encoder.Predictor = 1
encoded, err := encoder.EncodeBytes(rawStream)
if err != nil {
t.Errorf("Failed to encode data: %v", err)
return
}
decoded, err := encoder.DecodeBytes(encoded)
if err != nil {
t.Errorf("Failed to decode data: %v", err)
return
}
if !compareSlices(decoded, rawStream) {
t.Errorf("Slices not matching")
t.Errorf("Decoded (%d): % x", len(encoded), encoded)
t.Errorf("Raw (%d): % x", len(rawStream), rawStream)
return
}
}
// Test LZW encoding.
func TestLZWEncoding(t *testing.T) {
rawStream := []byte("this is a dummy text with some \x01\x02\x03 binary data")
encoder := NewLZWEncoder()
// Only supporitng early change 0 for encoding at the moment.
encoder.EarlyChange = 0
encoded, err := encoder.EncodeBytes(rawStream)
if err != nil {
t.Errorf("Failed to encode data: %v", err)
return
}
decoded, err := encoder.DecodeBytes(encoded)
if err != nil {
t.Errorf("Failed to decode data: %v", err)
return
}
if !compareSlices(decoded, rawStream) {
t.Errorf("Slices not matching")
t.Errorf("Decoded (%d): % x", len(encoded), encoded)
t.Errorf("Raw (%d): % x", len(rawStream), rawStream)
return
}
}
// Test run length encoding.
func TestRunLengthEncoding(t *testing.T) {
rawStream := []byte("this is a dummy text with some \x01\x02\x03 binary data")
encoder := NewRunLengthEncoder()
encoded, err := encoder.EncodeBytes(rawStream)
if err != nil {
t.Errorf("Failed to RunLength encode data: %v", err)
return
}
decoded, err := encoder.DecodeBytes(encoded)
if err != nil {
t.Errorf("Failed to RunLength decode data: %v", err)
return
}
if !compareSlices(decoded, rawStream) {
t.Errorf("Slices not matching. RunLength")
t.Errorf("Decoded (%d): % x", len(encoded), encoded)
t.Errorf("Raw (%d): % x", len(rawStream), rawStream)
return
}
}
// Test ASCII hex encoding.
func TestASCIIHexEncoding(t *testing.T) {
byteData := []byte{0xDE, 0xAD, 0xBE, 0xEF}
expected := []byte("DE AD BE EF >")
encoder := NewASCIIHexEncoder()
encoded, err := encoder.EncodeBytes(byteData)
if err != nil {
t.Errorf("Failed to encode data: %v", err)
return
}
if !compareSlices(encoded, expected) {
t.Errorf("Slices not matching")
t.Errorf("Expected (%d): %s", len(expected), expected)
t.Errorf("Encoded (%d): %s", len(encoded), encoded)
return
}
}
2017-02-23 15:25:23 +00:00
// ASCII85.
func TestASCII85EncodingWikipediaExample(t *testing.T) {
expected := `Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure.`
// Base 64 encoded, Ascii85 encoded version (wikipedia).
encodedInBase64 := `OWpxb15CbGJELUJsZUIxREorKitGKGYscS8wSmhLRjxHTD5DakAuNEdwJGQ3RiEsTDdAPDZAKS8wSkRFRjxHJTwrRVY6MkYhLE88REorKi5APCpLMEA8NkwoRGYtXDBFYzVlO0RmZlooRVplZS5CbC45cEYiQUdYQlBDc2krREdtPkAzQkIvRiomT0NBZnUyL0FLWWkoREliOkBGRCwqKStDXVU9QDNCTiNFY1lmOEFURDNzQHE/ZCRBZnRWcUNoW05xRjxHOjgrRVY6LitDZj4tRkQ1VzhBUmxvbERJYWwoRElkPGpAPD8zckA6RiVhK0Q1OCdBVEQ0JEJsQGwzRGU6LC1ESnNgOEFSb0ZiLzBKTUtAcUI0XkYhLFI8QUtaJi1EZlRxQkclRz51RC5SVHBBS1lvJytDVC81K0NlaSNESUk/KEUsOSlvRioyTTcvY34+`
encoded, _ := base64.StdEncoding.DecodeString(encodedInBase64)
encoder := NewASCII85Encoder()
enc1, err := encoder.EncodeBytes([]byte(expected))
if err != nil {
t.Errorf("Fail")
return
}
if string(enc1) != string(encoded) {
t.Errorf("ASCII85 encoding wiki example fail")
return
}
decoded, err := encoder.DecodeBytes([]byte(encoded))
if err != nil {
t.Errorf("Fail, error: %v", err)
return
}
if expected != string(decoded) {
t.Errorf("Mismatch! '%s' vs '%s'", decoded, expected)
return
}
}
func TestASCII85Encoding(t *testing.T) {
encoded := `FD,B0+EVmJAKYo'+D#G#De*R"B-:o0+E_a:A0>T(+AbuZ@;]Tu:ddbqAnc'mEr~>`
expected := "this type of encoding is used in PS and PDF files"
encoder := NewASCII85Encoder()
enc1, err := encoder.EncodeBytes([]byte(expected))
if err != nil {
t.Errorf("Fail")
return
}
if encoded != string(enc1) {
t.Errorf("Encoding error")
return
}
decoded, err := encoder.DecodeBytes([]byte(encoded))
if err != nil {
t.Errorf("Fail, error: %v", err)
return
}
if expected != string(decoded) {
t.Errorf("Mismatch! '%s' vs '%s'", decoded, expected)
return
}
}
type TestASCII85DecodingTestCase struct {
Encoded string
Expected string
}
func TestASCII85Decoding(t *testing.T) {
// Map encoded -> Decoded
testcases := []TestASCII85DecodingTestCase{
{"z~>", "\x00\x00\x00\x00"},
{"z ~>", "\x00\x00\x00\x00"},
{"zz~>", "\x00\x00\x00\x00\x00\x00\x00\x00"},
{" zz~>", "\x00\x00\x00\x00\x00\x00\x00\x00"},
{" z z~>", "\x00\x00\x00\x00\x00\x00\x00\x00"},
{" z z ~>", "\x00\x00\x00\x00\x00\x00\x00\x00"},
{"+T~>", `!`},
{"+`d~>", `!s`},
{"+`hr~>", `!sz`},
{"+`hsS~>", `!szx`},
{"+`hsS+T~>", `!szx!`},
{"+ `hs S +T ~>", `!szx!`},
}
encoder := NewASCII85Encoder()
for _, testcase := range testcases {
encoded := testcase.Encoded
expected := testcase.Expected
decoded, err := encoder.DecodeBytes([]byte(encoded))
if err != nil {
t.Errorf("Fail, error: %v", err)
return
}
if expected != string(decoded) {
t.Errorf("Mismatch! '%s' vs '%s'", decoded, expected)
return
}
}
}
// Test multi encoder with FlateDecode and ASCIIHexDecode.
func TestMultiEncoder(t *testing.T) {
rawStream := []byte("this is a dummy text with some \x01\x02\x03 binary data")
encoder := NewMultiEncoder()
enc1 := NewFlateEncoder()
enc1.Predictor = 1
encoder.AddEncoder(enc1)
enc2 := NewASCIIHexEncoder()
encoder.AddEncoder(enc2)
encoded, err := encoder.EncodeBytes(rawStream)
if err != nil {
t.Errorf("Failed to encode data: %v", err)
return
}
common.Log.Debug("Multi Encoded: %s", encoded)
// Multi Encoded: 78 9C 2A C9 C8 2C 56 00 A2 44 85 94 D2 DC DC 4A 85 92 D4 8A 12 85 F2
// CC 92 0C 85 E2 FC DC 54 05 46 26 66 85 A4CC BC C4 A2 4A 85 94 C4 92 44 40 00 00 00
// FF FF 78 87 0F 9C >
// Looks fine..
decoded, err := encoder.DecodeBytes(encoded)
if err != nil {
t.Errorf("Failed to decode data: %v", err)
return
}
if !compareSlices(decoded, rawStream) {
t.Errorf("Slices not matching")
t.Errorf("Decoded (%d): % x", len(encoded), encoded)
t.Errorf("Raw (%d): % x", len(rawStream), rawStream)
return
}
}