github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/src/pkg/encoding/ascii85/ascii85_test.go (about)

     1  // Copyright 2009 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 ascii85
     6  
     7  import (
     8  	"bytes"
     9  	"io"
    10  	"io/ioutil"
    11  	"testing"
    12  )
    13  
    14  type testpair struct {
    15  	decoded, encoded string
    16  }
    17  
    18  var pairs = []testpair{
    19  	// Wikipedia example
    20  	{
    21  		"Man is distinguished, not only by his reason, but by this singular passion from " +
    22  			"other animals, which is a lust of the mind, that by a perseverance of delight in " +
    23  			"the continued and indefatigable generation of knowledge, exceeds the short " +
    24  			"vehemence of any carnal pleasure.",
    25  		"9jqo^BlbD-BleB1DJ+*+F(f,q/0JhKF<GL>Cj@.4Gp$d7F!,L7@<6@)/0JDEF<G%<+EV:2F!,\n" +
    26  			"O<DJ+*.@<*K0@<6L(Df-\\0Ec5e;DffZ(EZee.Bl.9pF\"AGXBPCsi+DGm>@3BB/F*&OCAfu2/AKY\n" +
    27  			"i(DIb:@FD,*)+C]U=@3BN#EcYf8ATD3s@q?d$AftVqCh[NqF<G:8+EV:.+Cf>-FD5W8ARlolDIa\n" +
    28  			"l(DId<j@<?3r@:F%a+D58'ATD4$Bl@l3De:,-DJs`8ARoFb/0JMK@qB4^F!,R<AKZ&-DfTqBG%G\n" +
    29  			">uD.RTpAKYo'+CT/5+Cei#DII?(E,9)oF*2M7/c\n",
    30  	},
    31  	// Special case when shortening !!!!! to z.
    32  	{
    33  		"\000\000\000\000",
    34  		"z",
    35  	},
    36  }
    37  
    38  var bigtest = pairs[len(pairs)-1]
    39  
    40  func testEqual(t *testing.T, msg string, args ...interface{}) bool {
    41  	if args[len(args)-2] != args[len(args)-1] {
    42  		t.Errorf(msg, args...)
    43  		return false
    44  	}
    45  	return true
    46  }
    47  
    48  func strip85(s string) string {
    49  	t := make([]byte, len(s))
    50  	w := 0
    51  	for r := 0; r < len(s); r++ {
    52  		c := s[r]
    53  		if c > ' ' {
    54  			t[w] = c
    55  			w++
    56  		}
    57  	}
    58  	return string(t[0:w])
    59  }
    60  
    61  func TestEncode(t *testing.T) {
    62  	for _, p := range pairs {
    63  		buf := make([]byte, MaxEncodedLen(len(p.decoded)))
    64  		n := Encode(buf, []byte(p.decoded))
    65  		buf = buf[0:n]
    66  		testEqual(t, "Encode(%q) = %q, want %q", p.decoded, strip85(string(buf)), strip85(p.encoded))
    67  	}
    68  }
    69  
    70  func TestEncoder(t *testing.T) {
    71  	for _, p := range pairs {
    72  		bb := &bytes.Buffer{}
    73  		encoder := NewEncoder(bb)
    74  		encoder.Write([]byte(p.decoded))
    75  		encoder.Close()
    76  		testEqual(t, "Encode(%q) = %q, want %q", p.decoded, strip85(bb.String()), strip85(p.encoded))
    77  	}
    78  }
    79  
    80  func TestEncoderBuffering(t *testing.T) {
    81  	input := []byte(bigtest.decoded)
    82  	for bs := 1; bs <= 12; bs++ {
    83  		bb := &bytes.Buffer{}
    84  		encoder := NewEncoder(bb)
    85  		for pos := 0; pos < len(input); pos += bs {
    86  			end := pos + bs
    87  			if end > len(input) {
    88  				end = len(input)
    89  			}
    90  			n, err := encoder.Write(input[pos:end])
    91  			testEqual(t, "Write(%q) gave error %v, want %v", input[pos:end], err, error(nil))
    92  			testEqual(t, "Write(%q) gave length %v, want %v", input[pos:end], n, end-pos)
    93  		}
    94  		err := encoder.Close()
    95  		testEqual(t, "Close gave error %v, want %v", err, error(nil))
    96  		testEqual(t, "Encoding/%d of %q = %q, want %q", bs, bigtest.decoded, strip85(bb.String()), strip85(bigtest.encoded))
    97  	}
    98  }
    99  
   100  func TestDecode(t *testing.T) {
   101  	for _, p := range pairs {
   102  		dbuf := make([]byte, 4*len(p.encoded))
   103  		ndst, nsrc, err := Decode(dbuf, []byte(p.encoded), true)
   104  		testEqual(t, "Decode(%q) = error %v, want %v", p.encoded, err, error(nil))
   105  		testEqual(t, "Decode(%q) = nsrc %v, want %v", p.encoded, nsrc, len(p.encoded))
   106  		testEqual(t, "Decode(%q) = ndst %v, want %v", p.encoded, ndst, len(p.decoded))
   107  		testEqual(t, "Decode(%q) = %q, want %q", p.encoded, string(dbuf[0:ndst]), p.decoded)
   108  	}
   109  }
   110  
   111  func TestDecoder(t *testing.T) {
   112  	for _, p := range pairs {
   113  		decoder := NewDecoder(bytes.NewBufferString(p.encoded))
   114  		dbuf, err := ioutil.ReadAll(decoder)
   115  		if err != nil {
   116  			t.Fatal("Read failed", err)
   117  		}
   118  		testEqual(t, "Read from %q = length %v, want %v", p.encoded, len(dbuf), len(p.decoded))
   119  		testEqual(t, "Decoding of %q = %q, want %q", p.encoded, string(dbuf), p.decoded)
   120  		if err != nil {
   121  			testEqual(t, "Read from %q = %v, want %v", p.encoded, err, io.EOF)
   122  		}
   123  	}
   124  }
   125  
   126  func TestDecoderBuffering(t *testing.T) {
   127  	for bs := 1; bs <= 12; bs++ {
   128  		decoder := NewDecoder(bytes.NewBufferString(bigtest.encoded))
   129  		buf := make([]byte, len(bigtest.decoded)+12)
   130  		var total int
   131  		for total = 0; total < len(bigtest.decoded); {
   132  			n, err := decoder.Read(buf[total : total+bs])
   133  			testEqual(t, "Read from %q at pos %d = %d, %v, want _, %v", bigtest.encoded, total, n, err, error(nil))
   134  			total += n
   135  		}
   136  		testEqual(t, "Decoding/%d of %q = %q, want %q", bs, bigtest.encoded, string(buf[0:total]), bigtest.decoded)
   137  	}
   138  }
   139  
   140  func TestDecodeCorrupt(t *testing.T) {
   141  	type corrupt struct {
   142  		e string
   143  		p int
   144  	}
   145  	examples := []corrupt{
   146  		{"v", 0},
   147  		{"!z!!!!!!!!!", 1},
   148  	}
   149  
   150  	for _, e := range examples {
   151  		dbuf := make([]byte, 4*len(e.e))
   152  		_, _, err := Decode(dbuf, []byte(e.e), true)
   153  		switch err := err.(type) {
   154  		case CorruptInputError:
   155  			testEqual(t, "Corruption in %q at offset %v, want %v", e.e, int(err), e.p)
   156  		default:
   157  			t.Error("Decoder failed to detect corruption in", e)
   158  		}
   159  	}
   160  }
   161  
   162  func TestBig(t *testing.T) {
   163  	n := 3*1000 + 1
   164  	raw := make([]byte, n)
   165  	const alpha = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
   166  	for i := 0; i < n; i++ {
   167  		raw[i] = alpha[i%len(alpha)]
   168  	}
   169  	encoded := new(bytes.Buffer)
   170  	w := NewEncoder(encoded)
   171  	nn, err := w.Write(raw)
   172  	if nn != n || err != nil {
   173  		t.Fatalf("Encoder.Write(raw) = %d, %v want %d, nil", nn, err, n)
   174  	}
   175  	err = w.Close()
   176  	if err != nil {
   177  		t.Fatalf("Encoder.Close() = %v want nil", err)
   178  	}
   179  	decoded, err := ioutil.ReadAll(NewDecoder(encoded))
   180  	if err != nil {
   181  		t.Fatalf("io.ReadAll(NewDecoder(...)): %v", err)
   182  	}
   183  
   184  	if !bytes.Equal(raw, decoded) {
   185  		var i int
   186  		for i = 0; i < len(decoded) && i < len(raw); i++ {
   187  			if decoded[i] != raw[i] {
   188  				break
   189  			}
   190  		}
   191  		t.Errorf("Decode(Encode(%d-byte string)) failed at offset %d", n, i)
   192  	}
   193  }