| // Copyright 2017 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package catmsg |
| |
| import ( |
| "fmt" |
| "testing" |
| ) |
| |
| func TestEncodeUint(t *testing.T) { |
| testCases := []struct { |
| x uint64 |
| enc string |
| }{ |
| {0, "\x00"}, |
| {1, "\x01"}, |
| {2, "\x02"}, |
| {0x7f, "\x7f"}, |
| {0x80, "\x80\x01"}, |
| {1 << 14, "\x80\x80\x01"}, |
| {0xffffffff, "\xff\xff\xff\xff\x0f"}, |
| {0xffffffffffffffff, "\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01"}, |
| } |
| for _, tc := range testCases { |
| buf := [maxVarintBytes]byte{} |
| got := string(buf[:encodeUint(buf[:], tc.x)]) |
| if got != tc.enc { |
| t.Errorf("EncodeUint(%#x) = %q; want %q", tc.x, got, tc.enc) |
| } |
| } |
| } |
| |
| func TestDecodeUint(t *testing.T) { |
| testCases := []struct { |
| x uint64 |
| size int |
| enc string |
| err error |
| }{{ |
| x: 0, |
| size: 0, |
| enc: "", |
| err: errIllegalVarint, |
| }, { |
| x: 0, |
| size: 1, |
| enc: "\x80", |
| err: errIllegalVarint, |
| }, { |
| x: 0, |
| size: 3, |
| enc: "\x80\x80\x80", |
| err: errIllegalVarint, |
| }, { |
| x: 0, |
| size: 1, |
| enc: "\x00", |
| }, { |
| x: 1, |
| size: 1, |
| enc: "\x01", |
| }, { |
| x: 2, |
| size: 1, |
| enc: "\x02", |
| }, { |
| x: 0x7f, |
| size: 1, |
| enc: "\x7f", |
| }, { |
| x: 0x80, |
| size: 2, |
| enc: "\x80\x01", |
| }, { |
| x: 1 << 14, |
| size: 3, |
| enc: "\x80\x80\x01", |
| }, { |
| x: 0xffffffff, |
| size: 5, |
| enc: "\xff\xff\xff\xff\x0f", |
| }, { |
| x: 0xffffffffffffffff, |
| size: 10, |
| enc: "\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01", |
| }, { |
| x: 0xffffffffffffffff, |
| size: 10, |
| enc: "\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01\x00", |
| }, { |
| x: 0, |
| size: 10, |
| enc: "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x01", |
| err: errVarintTooLarge, |
| }} |
| forms := []struct { |
| name string |
| decode func(s string) (x uint64, size int, err error) |
| }{ |
| {"decode", func(s string) (x uint64, size int, err error) { |
| return decodeUint([]byte(s)) |
| }}, |
| {"decodeString", decodeUintString}, |
| } |
| for _, f := range forms { |
| for _, tc := range testCases { |
| t.Run(fmt.Sprintf("%s:%q", f.name, tc.enc), func(t *testing.T) { |
| x, size, err := f.decode(tc.enc) |
| if err != tc.err { |
| t.Errorf("err = %q; want %q", err, tc.err) |
| } |
| if size != tc.size { |
| t.Errorf("size = %d; want %d", size, tc.size) |
| } |
| if x != tc.x { |
| t.Errorf("decode = %#x; want %#x", x, tc.x) |
| } |
| }) |
| } |
| } |
| } |