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 }