decode_test.go (3785B)
1 package msgpack 2 3 import ( 4 "bytes" 5 "fmt" 6 "io" 7 "reflect" 8 "testing" 9 "time" 10 ) 11 12 func TestRead(t *testing.T) { 13 var in = bytes.Repeat([]byte{'_'}, 256) 14 15 testfn := func(useReader bool) func(t *testing.T) { 16 var d *Decoder 17 if useReader { 18 d = NewDecoder(bytes.NewReader(in), make([]byte, 0, 128)) 19 } else { 20 d = NewDecoder(nil, in) 21 } 22 23 return func(t *testing.T) { 24 // up to 16 bytes (total 136 bytes) 25 for i := 1; i <= 16; i++ { 26 buf := make([]byte, i) 27 n, err := d.read(buf) 28 if err != nil { 29 t.Errorf("d.read(%d bytes buffer) returns an error: %s", i, err.Error()) 30 return 31 } 32 if n != i || !bytes.Equal(buf, bytes.Repeat([]byte{'_'}, i)) { 33 t.Errorf("d.read() returns %v, want: %v", buf, bytes.Repeat([]byte{'_'}, i)) 34 return 35 } 36 } 37 38 // big buffer 39 buf := make([]byte, 256) 40 n, err := d.read(buf) 41 if err != nil { 42 t.Errorf("d.read() returns an error: %s", err.Error()) 43 return 44 } 45 if n != 120 || !bytes.Equal(buf[:120], bytes.Repeat([]byte{'_'}, 120)) { 46 t.Errorf("d.read() returns %d, %v, want: %d, %v", n, buf, 120, bytes.Repeat([]byte{'_'}, 120)) 47 return 48 } 49 50 _, err = d.read(buf) 51 if err != io.EOF { 52 t.Errorf("d.read() returns an error: %s, want: io.Nil", err.Error()) 53 return 54 } 55 } 56 } 57 58 t.Run("buffer-only", testfn(false)) 59 t.Run("with-reader", testfn(true)) 60 } 61 62 func TestDecodeNil(t *testing.T) { 63 d := NewDecoder(nil, []byte{0xc0, '_'}) 64 65 isNil, err := d.NextIsNil() 66 if err != nil { 67 t.Errorf("d.NextIsNil() returns an error: %s", err.Error()) 68 return 69 } 70 if !isNil { 71 t.Errorf("d.NextIsNil() returns false, want: true") 72 return 73 } 74 75 if err := d.Nil(); err != nil { 76 t.Errorf("d.Nil() returns error: %s", err.Error()) 77 } 78 79 var p = make([]byte, 1) 80 if err := d.Raw(p); err != nil { 81 t.Errorf("d.Raw() returns error: %s", err.Error()) 82 } 83 if !bytes.Equal(p, []byte{'_'}) { 84 t.Errorf("d.Nil() does not skip nil byte") 85 } 86 } 87 88 func TestDecode(t *testing.T) { 89 d := NewDecoder(nil, []byte{' '}) 90 91 for _, test := range testCases { 92 d.Reset(nil, test.encoded) 93 94 var err error 95 var got interface{} 96 switch test.decoded.(type) { 97 case bool: 98 var v bool 99 err = d.Bool(&v) 100 got = v 101 case int: 102 var v int 103 err = d.Int(&v) 104 got = v 105 case int8: 106 var v int8 107 err = d.Int8(&v) 108 got = v 109 case int16: 110 var v int16 111 err = d.Int16(&v) 112 got = v 113 case int32: 114 var v int32 115 err = d.Int32(&v) 116 got = v 117 case int64: 118 var v int64 119 err = d.Int64(&v) 120 got = v 121 case uint: 122 var v uint 123 err = d.Uint(&v) 124 got = v 125 case uint8: 126 var v uint8 127 err = d.Uint8(&v) 128 got = v 129 case uint16: 130 var v uint16 131 err = d.Uint16(&v) 132 got = v 133 case uint32: 134 var v uint32 135 err = d.Uint32(&v) 136 got = v 137 case uint64: 138 var v uint64 139 err = d.Uint64(&v) 140 got = v 141 case float32: 142 var v float32 143 err = d.Float32(&v) 144 got = v 145 case float64: 146 var v float64 147 err = d.Float64(&v) 148 got = v 149 case string: 150 var v string 151 err = d.String(&v) 152 got = v 153 case []byte: 154 var v []byte 155 err = d.Binary(&v) 156 got = v 157 case Array: 158 var v testArray 159 err = d.Array(&v) 160 got = &v 161 case Map: 162 var v testMap 163 err = d.Map(&v) 164 got = &v 165 case Extension: 166 var v testExt 167 err = d.Ext(&v) 168 got = &v 169 case time.Time: 170 var v Timestamp 171 err = d.Ext(&v) 172 got = (&v).Time() 173 default: 174 panic(fmt.Sprintf("invalid test input type: %s", reflect.TypeOf(test.decoded).Name())) 175 } 176 177 if err != nil { 178 t.Errorf("d.%s(%v) returns error: %s", reflect.TypeOf(test.decoded).Name(), test.encoded, err.Error()) 179 t.FailNow() 180 } 181 182 if !reflect.DeepEqual(got, test.decoded) { 183 fmt.Println(test, got) 184 t.Errorf("d.%s(%v) returns %v, want: %v", reflect.TypeOf(test.decoded).Name(), test.encoded, got, test.decoded) 185 t.FailNow() 186 } 187 } 188 }