package common
|
|
|
|
import (
|
|
"math/big"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestConversionsFloat40(t *testing.T) {
|
|
testVector := map[Float40]string{
|
|
6*0x800000000 + 123: "123000000",
|
|
2*0x800000000 + 4545: "454500",
|
|
30*0x800000000 + 10235: "10235000000000000000000000000000000",
|
|
0x000000000: "0",
|
|
0x800000000: "0",
|
|
0x0001: "1",
|
|
0x0401: "1025",
|
|
0x800000000 + 1: "10",
|
|
0xFFFFFFFFFF: "343597383670000000000000000000000000000000",
|
|
}
|
|
|
|
for test := range testVector {
|
|
fix, err := test.BigInt()
|
|
require.NoError(t, err)
|
|
assert.Equal(t, fix.String(), testVector[test])
|
|
|
|
bi, ok := new(big.Int).SetString(testVector[test], 10)
|
|
require.True(t, ok)
|
|
|
|
fl, err := NewFloat40(bi)
|
|
assert.NoError(t, err)
|
|
|
|
fx2, err := fl.BigInt()
|
|
require.NoError(t, err)
|
|
assert.Equal(t, fx2.String(), testVector[test])
|
|
}
|
|
}
|
|
|
|
func TestExpectError(t *testing.T) {
|
|
testVector := map[string]error{
|
|
"9922334455000000000000000000000000000000": nil,
|
|
"9922334455000000000000000000000000000001": ErrFloat40NotEnoughPrecission,
|
|
"9922334454999999999999999999999999999999": ErrFloat40NotEnoughPrecission,
|
|
"42949672950000000000000000000000000000000": nil,
|
|
"99223344556573838487575": ErrFloat40NotEnoughPrecission,
|
|
"992233445500000000000000000000000000000000": ErrFloat40E31,
|
|
"343597383670000000000000000000000000000000": nil,
|
|
"343597383680000000000000000000000000000000": ErrFloat40NotEnoughPrecission,
|
|
"343597383690000000000000000000000000000000": ErrFloat40NotEnoughPrecission,
|
|
"343597383700000000000000000000000000000000": ErrFloat40E31,
|
|
}
|
|
for test := range testVector {
|
|
bi, ok := new(big.Int).SetString(test, 10)
|
|
require.True(t, ok)
|
|
_, err := NewFloat40(bi)
|
|
assert.Equal(t, testVector[test], err)
|
|
}
|
|
}
|
|
|
|
func BenchmarkFloat40(b *testing.B) {
|
|
newBigInt := func(s string) *big.Int {
|
|
bigInt, ok := new(big.Int).SetString(s, 10)
|
|
if !ok {
|
|
panic("Can not convert string to *big.Int")
|
|
}
|
|
return bigInt
|
|
}
|
|
type pair struct {
|
|
Float40 Float40
|
|
BigInt *big.Int
|
|
}
|
|
testVector := []pair{
|
|
{6*0x800000000 + 123, newBigInt("123000000")},
|
|
{2*0x800000000 + 4545, newBigInt("454500")},
|
|
{30*0x800000000 + 10235, newBigInt("10235000000000000000000000000000000")},
|
|
{0x000000000, newBigInt("0")},
|
|
{0x800000000, newBigInt("0")},
|
|
{0x0001, newBigInt("1")},
|
|
{0x0401, newBigInt("1025")},
|
|
{0x800000000 + 1, newBigInt("10")},
|
|
{0xFFFFFFFFFF, newBigInt("343597383670000000000000000000000000000000")},
|
|
}
|
|
b.Run("NewFloat40()", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_, _ = NewFloat40(testVector[i%len(testVector)].BigInt)
|
|
}
|
|
})
|
|
b.Run("Float40.BigInt()", func(b *testing.B) {
|
|
for i := 0; i < b.N; i++ {
|
|
_, _ = testVector[i%len(testVector)].Float40.BigInt()
|
|
}
|
|
})
|
|
}
|