// 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) } }) } } }