libgo: update to Go 1.11
[official-gcc.git] / libgo / go / encoding / binary / varint_test.go
blobca411ecbd65e8180d2bfcb0c819a561328d66f06
1 // Copyright 2011 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.
5 package binary
7 import (
8 "bytes"
9 "io"
10 "testing"
13 func testConstant(t *testing.T, w uint, max int) {
14 buf := make([]byte, MaxVarintLen64)
15 n := PutUvarint(buf, 1<<w-1)
16 if n != max {
17 t.Errorf("MaxVarintLen%d = %d; want %d", w, max, n)
21 func TestConstants(t *testing.T) {
22 testConstant(t, 16, MaxVarintLen16)
23 testConstant(t, 32, MaxVarintLen32)
24 testConstant(t, 64, MaxVarintLen64)
27 func testVarint(t *testing.T, x int64) {
28 buf := make([]byte, MaxVarintLen64)
29 n := PutVarint(buf, x)
30 y, m := Varint(buf[0:n])
31 if x != y {
32 t.Errorf("Varint(%d): got %d", x, y)
34 if n != m {
35 t.Errorf("Varint(%d): got n = %d; want %d", x, m, n)
38 y, err := ReadVarint(bytes.NewReader(buf))
39 if err != nil {
40 t.Errorf("ReadVarint(%d): %s", x, err)
42 if x != y {
43 t.Errorf("ReadVarint(%d): got %d", x, y)
47 func testUvarint(t *testing.T, x uint64) {
48 buf := make([]byte, MaxVarintLen64)
49 n := PutUvarint(buf, x)
50 y, m := Uvarint(buf[0:n])
51 if x != y {
52 t.Errorf("Uvarint(%d): got %d", x, y)
54 if n != m {
55 t.Errorf("Uvarint(%d): got n = %d; want %d", x, m, n)
58 y, err := ReadUvarint(bytes.NewReader(buf))
59 if err != nil {
60 t.Errorf("ReadUvarint(%d): %s", x, err)
62 if x != y {
63 t.Errorf("ReadUvarint(%d): got %d", x, y)
67 var tests = []int64{
68 -1 << 63,
69 -1<<63 + 1,
70 -1,
74 10,
75 20,
76 63,
77 64,
78 65,
79 127,
80 128,
81 129,
82 255,
83 256,
84 257,
85 1<<63 - 1,
88 func TestVarint(t *testing.T) {
89 for _, x := range tests {
90 testVarint(t, x)
91 testVarint(t, -x)
93 for x := int64(0x7); x != 0; x <<= 1 {
94 testVarint(t, x)
95 testVarint(t, -x)
99 func TestUvarint(t *testing.T) {
100 for _, x := range tests {
101 testUvarint(t, uint64(x))
103 for x := uint64(0x7); x != 0; x <<= 1 {
104 testUvarint(t, x)
108 func TestBufferTooSmall(t *testing.T) {
109 buf := []byte{0x80, 0x80, 0x80, 0x80}
110 for i := 0; i <= len(buf); i++ {
111 buf := buf[0:i]
112 x, n := Uvarint(buf)
113 if x != 0 || n != 0 {
114 t.Errorf("Uvarint(%v): got x = %d, n = %d", buf, x, n)
117 x, err := ReadUvarint(bytes.NewReader(buf))
118 if x != 0 || err != io.EOF {
119 t.Errorf("ReadUvarint(%v): got x = %d, err = %s", buf, x, err)
124 func testOverflow(t *testing.T, buf []byte, n0 int, err0 error) {
125 x, n := Uvarint(buf)
126 if x != 0 || n != n0 {
127 t.Errorf("Uvarint(%v): got x = %d, n = %d; want 0, %d", buf, x, n, n0)
130 x, err := ReadUvarint(bytes.NewReader(buf))
131 if x != 0 || err != err0 {
132 t.Errorf("ReadUvarint(%v): got x = %d, err = %s; want 0, %s", buf, x, err, err0)
136 func TestOverflow(t *testing.T) {
137 testOverflow(t, []byte{0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x2}, -10, overflow)
138 testOverflow(t, []byte{0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x1, 0, 0}, -13, overflow)
141 func TestNonCanonicalZero(t *testing.T) {
142 buf := []byte{0x80, 0x80, 0x80, 0}
143 x, n := Uvarint(buf)
144 if x != 0 || n != 4 {
145 t.Errorf("Uvarint(%v): got x = %d, n = %d; want 0, 4", buf, x, n)
150 func BenchmarkPutUvarint32(b *testing.B) {
151 buf := make([]byte, MaxVarintLen32)
152 b.SetBytes(4)
153 for i := 0; i < b.N; i++ {
154 for j := uint(0); j < MaxVarintLen32; j++ {
155 PutUvarint(buf, 1<<(j*7))
160 func BenchmarkPutUvarint64(b *testing.B) {
161 buf := make([]byte, MaxVarintLen64)
162 b.SetBytes(8)
163 for i := 0; i < b.N; i++ {
164 for j := uint(0); j < MaxVarintLen64; j++ {
165 PutUvarint(buf, 1<<(j*7))