...
1 package kbin
2
3 import (
4 "bytes"
5 "encoding/binary"
6 "fmt"
7 "testing"
8 "testing/quick"
9 )
10
11 func TestVarint(t *testing.T) {
12 if err := quick.Check(func(x int32) bool {
13 var expPut [10]byte
14 n := binary.PutVarint(expPut[:], int64(x))
15
16 gotPut := AppendVarint(nil, x)
17 if !bytes.Equal(expPut[:n], gotPut) {
18 return false
19 }
20 if len(gotPut) != n {
21 return false
22 }
23 if VarintLen(x) != n {
24 return false
25 }
26
27 expRead, expN := binary.Varint(expPut[:n])
28 gotRead, gotN := Varint(gotPut)
29
30 if expN != gotN || expRead != int64(gotRead) {
31 return false
32 }
33
34 return true
35 }, nil); err != nil {
36 t.Error(err)
37 }
38 }
39
40 func TestUvarint(t *testing.T) {
41 if err := quick.Check(func(u uint32) bool {
42 var expPut [10]byte
43 n := binary.PutUvarint(expPut[:], uint64(u))
44
45 gotPut := AppendUvarint(nil, u)
46 if !bytes.Equal(expPut[:n], gotPut) {
47 return false
48 }
49
50 expRead, expN := binary.Uvarint(expPut[:n])
51 gotRead, gotN := Uvarint(gotPut)
52
53 if expN != gotN || expRead != uint64(gotRead) {
54 return false
55 }
56
57 return true
58 }, nil); err != nil {
59 t.Error(err)
60 }
61 }
62
63 func TestVarlong(t *testing.T) {
64 if err := quick.Check(func(x int64) bool {
65 var expPut [10]byte
66 n := binary.PutVarint(expPut[:], x)
67
68 gotPut := AppendVarlong(nil, x)
69 if !bytes.Equal(expPut[:n], gotPut) {
70 return false
71 }
72 if len(gotPut) != n {
73 return false
74 }
75 if VarlongLen(x) != n {
76 return false
77 }
78
79 expRead, expN := binary.Varint(expPut[:n])
80 gotRead, gotN := Varlong(gotPut)
81
82 if expN != gotN || expRead != gotRead {
83 return false
84 }
85
86 return true
87 }, nil); err != nil {
88 t.Error(err)
89 }
90 }
91
92 func BenchmarkUvarint(b *testing.B) {
93 for _, u := range []uint32{
94 0,
95 128,
96 16384,
97 2097152,
98 268435456,
99 } {
100 b.Run(fmt.Sprintf("uvarint_len_%d", UvarintLen(u)), func(b *testing.B) {
101 s := AppendUvarint(nil, u)
102 for i := 0; i < b.N; i++ {
103 Uvarint(s)
104 }
105 })
106 }
107 }
108
View as plain text