7a04f298d2
- update to latest telegram layer - remove some references to fields in tg.Entities that don't exist in the schema - originally added here: https://github.com/beeper/td/commit/820929062a2ba0104397bc01235ab58a9cff780e - referenced here - https://github.com/mautrix/telegramgo/commit/124f0967ed195b5a380c9bd02e170ada9710dde3 - https://github.com/mautrix/telegramgo/commit/4205047aab2e0639217148b5d125bfaab668bd8e
207 lines
4.6 KiB
Go
207 lines
4.6 KiB
Go
package bin
|
|
|
|
import (
|
|
"fmt"
|
|
"math"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func BenchmarkBuffer_PutString(b *testing.B) {
|
|
b.ReportAllocs()
|
|
buf := new(Buffer)
|
|
for i := 0; i < b.N; i++ {
|
|
buf.PutString("Foo bar baz")
|
|
buf.Reset()
|
|
}
|
|
}
|
|
|
|
func BenchmarkBuffer_PutID(b *testing.B) {
|
|
b.ReportAllocs()
|
|
buf := new(Buffer)
|
|
for i := 0; i < b.N; i++ {
|
|
buf.PutID(TypeStringID)
|
|
buf.Reset()
|
|
}
|
|
}
|
|
|
|
func BenchmarkBufferMultiplePuts(b *testing.B) {
|
|
b.ReportAllocs()
|
|
buf := new(Buffer)
|
|
for i := 0; i < b.N; i++ {
|
|
buf.PutID(0xbadbad)
|
|
buf.PutBool(true)
|
|
buf.PutString("foo")
|
|
buf.PutLong(12345)
|
|
buf.PutDouble(10.55)
|
|
buf.PutInt(10)
|
|
buf.PutVectorHeader(2)
|
|
buf.PutInt(1)
|
|
buf.PutInt(2)
|
|
buf.Reset()
|
|
}
|
|
}
|
|
|
|
func BenchmarkBuffer_Put(b *testing.B) {
|
|
b.ReportAllocs()
|
|
buf := new(Buffer)
|
|
for i := 0; i < b.N; i++ {
|
|
raw := []byte{1, 2, 3}
|
|
buf.PutID(0xbadbad)
|
|
buf.Put(raw)
|
|
buf.Reset()
|
|
}
|
|
}
|
|
|
|
func TestBuffer_PutInt32(t *testing.T) {
|
|
for _, tt := range []struct {
|
|
Integer int32
|
|
Value []byte
|
|
}{
|
|
{Integer: 0, Value: []byte{0x00, 0x00, 0x00, 0x00}},
|
|
{Integer: 1, Value: []byte{0x01, 0x00, 0x00, 0x00}},
|
|
{Integer: -1, Value: []byte{0xff, 0xff, 0xff, 0xff}},
|
|
{Integer: math.MaxInt32, Value: []byte{0xff, 0xff, 0xff, 0x7f}},
|
|
{Integer: math.MinInt32, Value: []byte{0x00, 0x00, 0x00, 0x80}},
|
|
} {
|
|
t.Run(fmt.Sprintf("%d", tt.Integer), func(t *testing.T) {
|
|
var b Buffer
|
|
b.PutInt32(tt.Integer)
|
|
require.Equal(t, tt.Value, b.Buf)
|
|
|
|
t.Run("Int", func(t *testing.T) {
|
|
b.Reset()
|
|
b.PutInt(int(tt.Integer))
|
|
require.Equal(t, tt.Value, b.Buf)
|
|
})
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestBuffer_PutUint32(t *testing.T) {
|
|
for _, tt := range []struct {
|
|
Integer uint32
|
|
Value []byte
|
|
}{
|
|
{Integer: 0, Value: []byte{0x00, 0x00, 0x00, 0x00}},
|
|
{Integer: 1, Value: []byte{0x01, 0x00, 0x00, 0x00}},
|
|
{Integer: math.MaxUint32, Value: []byte{0xff, 0xff, 0xff, 0xff}},
|
|
} {
|
|
t.Run(fmt.Sprintf("%d", tt.Integer), func(t *testing.T) {
|
|
var b Buffer
|
|
b.PutUint32(tt.Integer)
|
|
require.Equal(t, tt.Value, b.Buf)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestBuffer_PutLong(t *testing.T) {
|
|
for _, tt := range []struct {
|
|
Integer int64
|
|
Value []byte
|
|
}{
|
|
{Integer: 0, Value: []byte{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}},
|
|
{Integer: 1, Value: []byte{0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}},
|
|
{Integer: -1, Value: []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}},
|
|
{Integer: math.MaxInt64, Value: []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f}},
|
|
{Integer: math.MinInt64, Value: []byte{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80}},
|
|
} {
|
|
t.Run(fmt.Sprintf("%d", tt.Integer), func(t *testing.T) {
|
|
var b Buffer
|
|
b.PutLong(tt.Integer)
|
|
require.Equal(t, tt.Value, b.Buf)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestBuffer_PutDouble(t *testing.T) {
|
|
for _, tt := range []struct {
|
|
Float float64
|
|
Value []byte
|
|
}{
|
|
{Float: 0, Value: []byte{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}},
|
|
{Float: 1.5, Value: []byte{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0x3f}},
|
|
{Float: -1.5, Value: []byte{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf8, 0xbf}},
|
|
{Float: math.Inf(1), Value: []byte{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0x7f}},
|
|
{Float: math.Inf(-1), Value: []byte{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf0, 0xff}},
|
|
} {
|
|
t.Run(fmt.Sprintf("%f", tt.Float), func(t *testing.T) {
|
|
var b Buffer
|
|
b.PutDouble(tt.Float)
|
|
require.Equal(t, tt.Value, b.Buf)
|
|
})
|
|
}
|
|
}
|
|
|
|
func typeIDToBytes(id uint32) []byte {
|
|
b := Buffer{}
|
|
b.PutID(id)
|
|
return b.Buf
|
|
}
|
|
|
|
func TestBuffer_PutBool(t *testing.T) {
|
|
for _, tt := range []struct {
|
|
Bool bool
|
|
Value []byte
|
|
}{
|
|
{Bool: true, Value: typeIDToBytes(TypeTrue)},
|
|
{Bool: false, Value: typeIDToBytes(TypeFalse)},
|
|
} {
|
|
t.Run(fmt.Sprintf("%t", tt.Bool), func(t *testing.T) {
|
|
var b Buffer
|
|
b.PutBool(tt.Bool)
|
|
require.Equal(t, tt.Value, b.Buf)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestBuffer_PutUint16(t *testing.T) {
|
|
for _, tt := range []struct {
|
|
Integer uint16
|
|
Value []byte
|
|
}{
|
|
{Integer: 0, Value: []byte{0x00, 0x00}},
|
|
{Integer: 1, Value: []byte{0x01, 0x00}},
|
|
{Integer: math.MaxUint16, Value: []byte{0xff, 0xff}},
|
|
} {
|
|
t.Run(fmt.Sprintf("%d", tt.Integer), func(t *testing.T) {
|
|
var b Buffer
|
|
b.PutUint16(tt.Integer)
|
|
require.Equal(t, tt.Value, b.Buf)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestBuffer_PutVectorHeader(t *testing.T) {
|
|
for _, tt := range []struct {
|
|
Len int
|
|
Value []byte
|
|
}{
|
|
{
|
|
Len: 0,
|
|
Value: []byte{0x15, 0xc4, 0xb5, 0x1c, 0x0, 0x0, 0x0, 0x0},
|
|
},
|
|
} {
|
|
t.Run(fmt.Sprintf("Vec[%d]", tt.Len), func(t *testing.T) {
|
|
var b Buffer
|
|
b.PutVectorHeader(tt.Len)
|
|
require.Equal(t, tt.Value, b.Buf)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestBuffer_Put(t *testing.T) {
|
|
a := require.New(t)
|
|
b := Buffer{Buf: []byte{1, 2, 3}}
|
|
|
|
b.Put(nil)
|
|
a.Len(b.Buf, 3)
|
|
|
|
b.Put([]byte{})
|
|
a.Len(b.Buf, 3)
|
|
|
|
b.Put([]byte{4})
|
|
a.Equal([]byte{1, 2, 3, 4}, b.Buf)
|
|
}
|