frostfs-contract/tests/common_test.go
Evgenii Stratonikov 1ebeff7f6f [#42] common: Add routines for fixed-width uint64 marshaling
Signed-off-by: Evgenii Stratonikov <e.stratonikov@yadro.com>
2023-10-05 15:10:04 +03:00

61 lines
1.4 KiB
Go

package tests
import (
"math"
"math/big"
"path"
"testing"
"github.com/nspcc-dev/neo-go/pkg/neotest"
"github.com/stretchr/testify/require"
)
const testdataPath = "./testdata"
func newTestdataInvoker(t *testing.T) *neotest.ContractInvoker {
e := newExecutor(t)
ctr := neotest.CompileFile(t, e.CommitteeHash, testdataPath, path.Join(testdataPath, "config.yml"))
e.DeployContract(t, ctr, nil)
return e.CommitteeInvoker(ctr.Hash)
}
func TestEncodeU64(t *testing.T) {
// Let's check boundary values for all bit sizes:
var nums []uint64
for i := 0; i < 64; i++ {
if i != 0 {
nums = append(nums, (1<<i)-1)
}
nums = append(nums, 1<<i)
if i != 63 {
nums = append(nums, (1<<i)+1)
}
}
c := newTestdataInvoker(t)
for _, n := range nums {
v, err := c.TestInvoke(t, "encode", n)
require.NoError(t, err)
require.Equal(t, 1, v.Len())
r := v.Pop().Bytes()
require.Equal(t, 9, len(r), "got: %x", r)
v, err = c.TestInvoke(t, "encodeDecode", n)
require.NoError(t, err)
require.Equal(t, 1, v.Len())
require.Equal(t, n, v.Pop().BigInt().Uint64())
}
t.Run("bad cases should be handled", func(t *testing.T) {
x := new(big.Int).SetUint64(math.MaxUint64)
x.Add(x, big.NewInt(1))
nums := []*big.Int{x, big.NewInt(-1), big.NewInt(-128)}
for _, n := range nums {
v, err := c.TestInvoke(t, "encodeDecode", n)
require.NoError(t, err)
require.Equal(t, 0, v.Pop().BigInt().Cmp(n))
}
})
}