refactor
This commit is contained in:
118
varn/varn_test.go
Normal file
118
varn/varn_test.go
Normal file
@@ -0,0 +1,118 @@
|
||||
package varn_test
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/hex"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"git.intruders.space/public/opentimestamps/varn"
|
||||
)
|
||||
|
||||
// Helper functions for decoding (to verify encoding)
|
||||
func readVarUint(t *testing.T, data []byte) (uint64, int) {
|
||||
t.Helper()
|
||||
require.NotZero(t, data, "empty buffer")
|
||||
|
||||
if data[0] == 0 {
|
||||
return 0, 1
|
||||
}
|
||||
|
||||
var value uint64
|
||||
var bytesRead int
|
||||
|
||||
for i, b := range data {
|
||||
bytesRead = i + 1
|
||||
value |= uint64(b&0x7F) << uint(7*i)
|
||||
if b&0x80 == 0 {
|
||||
break
|
||||
}
|
||||
require.Less(t, i, 9, "varint too long") // 9 is max bytes needed for uint64
|
||||
}
|
||||
|
||||
return value, bytesRead
|
||||
}
|
||||
|
||||
func readVarBytes(t *testing.T, data []byte) ([]byte, int) {
|
||||
t.Helper()
|
||||
length, bytesRead := readVarUint(t, data)
|
||||
|
||||
require.GreaterOrEqual(t, uint64(len(data)-bytesRead), length, "buffer too short")
|
||||
|
||||
end := bytesRead + int(length)
|
||||
return data[bytesRead:end], end
|
||||
}
|
||||
|
||||
func TestAppendVarUint(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
value uint64
|
||||
expected string // hex representation of expected bytes
|
||||
}{
|
||||
{"zero", 0, "00"},
|
||||
{"small value", 42, "2a"},
|
||||
{"value below 128", 127, "7f"},
|
||||
{"value requiring 2 bytes", 128, "8001"},
|
||||
{"medium value", 300, "ac02"},
|
||||
{"large value", 1234567890, "d285d8cc04"}, // Updated from "d2a6e58e07" to correct encoding
|
||||
{"max uint64", 18446744073709551615, "ffffffffffffffffff01"},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
var buf []byte
|
||||
result := varn.AppendVarUint(buf, tt.value)
|
||||
|
||||
// Check encoding
|
||||
expected, err := hex.DecodeString(tt.expected)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, expected, result)
|
||||
|
||||
// Verify by decoding
|
||||
decoded, _ := readVarUint(t, result)
|
||||
assert.Equal(t, tt.value, decoded)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestAppendVarBytes(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
value []byte
|
||||
}{
|
||||
{"empty", []byte{}},
|
||||
{"small", []byte{0x01, 0x02, 0x03}},
|
||||
{"medium", bytes.Repeat([]byte{0xAA}, 127)},
|
||||
{"large", bytes.Repeat([]byte{0xBB}, 256)},
|
||||
}
|
||||
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
var buf []byte
|
||||
result := varn.AppendVarBytes(buf, tt.value)
|
||||
|
||||
// Verify by decoding
|
||||
decoded, _ := readVarBytes(t, result)
|
||||
assert.Equal(t, tt.value, decoded)
|
||||
|
||||
// Check that length is properly encoded
|
||||
lenEncoded, _ := readVarUint(t, result)
|
||||
assert.Equal(t, uint64(len(tt.value)), lenEncoded)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestAppendingToExistingBuffer(t *testing.T) {
|
||||
existing := []byte{0xFF, 0xFF}
|
||||
|
||||
// Test AppendVarUint
|
||||
result := varn.AppendVarUint(existing, 42)
|
||||
assert.Equal(t, []byte{0xFF, 0xFF, 0x2A}, result)
|
||||
|
||||
// Test AppendVarBytes
|
||||
data := []byte{0x01, 0x02, 0x03}
|
||||
result = varn.AppendVarBytes(existing, data)
|
||||
assert.Equal(t, []byte{0xFF, 0xFF, 0x03, 0x01, 0x02, 0x03}, result)
|
||||
}
|
||||
Reference in New Issue
Block a user