safing-structures/varint/varint_test.go
2024-06-24 09:01:16 +02:00

141 lines
4.7 KiB
Go

//nolint:gocognit
package varint
import (
"bytes"
"testing"
)
func TestConversion(t *testing.T) {
t.Parallel()
subjects := []struct {
intType uint8
bytes []byte
integer uint64
}{
{8, []byte{0x00}, 0},
{8, []byte{0x01}, 1},
{8, []byte{0x7F}, 127},
{8, []byte{0x80, 0x01}, 128},
{8, []byte{0xFF, 0x01}, 255},
{16, []byte{0x80, 0x02}, 256},
{16, []byte{0xFF, 0x7F}, 16383},
{16, []byte{0x80, 0x80, 0x01}, 16384},
{16, []byte{0xFF, 0xFF, 0x03}, 65535},
{32, []byte{0x80, 0x80, 0x04}, 65536},
{32, []byte{0xFF, 0xFF, 0x7F}, 2097151},
{32, []byte{0x80, 0x80, 0x80, 0x01}, 2097152},
{32, []byte{0xFF, 0xFF, 0xFF, 0x07}, 16777215},
{32, []byte{0x80, 0x80, 0x80, 0x08}, 16777216},
{32, []byte{0xFF, 0xFF, 0xFF, 0x7F}, 268435455},
{32, []byte{0x80, 0x80, 0x80, 0x80, 0x01}, 268435456},
{32, []byte{0xFF, 0xFF, 0xFF, 0xFF, 0x0F}, 4294967295},
{64, []byte{0x80, 0x80, 0x80, 0x80, 0x10}, 4294967296},
{64, []byte{0xFF, 0xFF, 0xFF, 0xFF, 0x7F}, 34359738367},
{64, []byte{0x80, 0x80, 0x80, 0x80, 0x80, 0x01}, 34359738368},
{64, []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x1F}, 1099511627775},
{64, []byte{0x80, 0x80, 0x80, 0x80, 0x80, 0x20}, 1099511627776},
{64, []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F}, 4398046511103},
{64, []byte{0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01}, 4398046511104},
{64, []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x3F}, 281474976710655},
{64, []byte{0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40}, 281474976710656},
{64, []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F}, 562949953421311},
{64, []byte{0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01}, 562949953421312},
{64, []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F}, 72057594037927935},
{64, []byte{0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01}, 72057594037927936},
{64, []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F}, 9223372036854775807},
{64, []byte{0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x01}, 9223372036854775808},
{64, []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01}, 18446744073709551615},
}
for _, subject := range subjects {
actualInteger, _, err := Unpack64(subject.bytes)
if err != nil || actualInteger != subject.integer {
t.Errorf("Unpack64 %d: expected %d, actual %d", subject.bytes, subject.integer, actualInteger)
}
actualBytes := Pack64(subject.integer)
if err != nil || !bytes.Equal(actualBytes, subject.bytes) {
t.Errorf("Pack64 %d: expected %d, actual %d", subject.integer, subject.bytes, actualBytes)
}
if subject.intType <= 32 {
actualInteger, _, err := Unpack32(subject.bytes)
if err != nil || actualInteger != uint32(subject.integer) {
t.Errorf("Unpack32 %d: expected %d, actual %d", subject.bytes, subject.integer, actualInteger)
}
actualBytes := Pack32(uint32(subject.integer))
if err != nil || !bytes.Equal(actualBytes, subject.bytes) {
t.Errorf("Pack32 %d: expected %d, actual %d", subject.integer, subject.bytes, actualBytes)
}
}
if subject.intType <= 16 {
actualInteger, _, err := Unpack16(subject.bytes)
if err != nil || actualInteger != uint16(subject.integer) {
t.Errorf("Unpack16 %d: expected %d, actual %d", subject.bytes, subject.integer, actualInteger)
}
actualBytes := Pack16(uint16(subject.integer))
if err != nil || !bytes.Equal(actualBytes, subject.bytes) {
t.Errorf("Pack16 %d: expected %d, actual %d", subject.integer, subject.bytes, actualBytes)
}
}
if subject.intType <= 8 {
actualInteger, _, err := Unpack8(subject.bytes)
if err != nil || actualInteger != uint8(subject.integer) {
t.Errorf("Unpack8 %d: expected %d, actual %d", subject.bytes, subject.integer, actualInteger)
}
actualBytes := Pack8(uint8(subject.integer))
if err != nil || !bytes.Equal(actualBytes, subject.bytes) {
t.Errorf("Pack8 %d: expected %d, actual %d", subject.integer, subject.bytes, actualBytes)
}
}
}
}
func TestFails(t *testing.T) {
t.Parallel()
subjects := []struct {
intType uint8
bytes []byte
}{
{32, []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01}},
{64, []byte{0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x02}},
{64, []byte{0xFF}},
}
for _, subject := range subjects {
if subject.intType == 64 {
_, _, err := Unpack64(subject.bytes)
if err == nil {
t.Errorf("Unpack64 %d: expected error while unpacking.", subject.bytes)
}
}
_, _, err := Unpack32(subject.bytes)
if err == nil {
t.Errorf("Unpack32 %d: expected error while unpacking.", subject.bytes)
}
_, _, err = Unpack16(subject.bytes)
if err == nil {
t.Errorf("Unpack16 %d: expected error while unpacking.", subject.bytes)
}
_, _, err = Unpack8(subject.bytes)
if err == nil {
t.Errorf("Unpack8 %d: expected error while unpacking.", subject.bytes)
}
}
}