cosmos-sdk/math/dec_migrate_test.go
2025-03-31 16:43:47 +00:00

119 lines
3.1 KiB
Go

package math_test
import (
"testing"
"github.com/stretchr/testify/require"
"cosmossdk.io/math"
)
// TestDecFromLegacyDec verifies that converting a LegacyDec to a Dec via string round-trip works as expected.
func TestDecFromLegacyDec(t *testing.T) {
// Define test cases: a list of valid decimal string representations.
// Note: The legacy format always prints exactly 18 decimal places.
testCases := []struct {
name string
inputStr string
}{
{"Zero", "0"},
{"One", "1"},
{"NegativeOne", "-1"},
{"IntegerWithNoDecimals", "123456789012345678"},
{"SimpleDecimal", "123.456"},
{"NegativeDecimal", "-9876.543210"},
{"SmallestUnit", "0.000000000000000001"}, // 10^-18
{"LargeNumber", "12345678901234567890.123456789012345678"},
{"TrailingZeros", "100.000000000000000000"},
}
for _, tc := range testCases {
// capture range variable
t.Run(tc.name, func(t *testing.T) {
// Create a LegacyDec from the test input string.
legacyDec, err := math.LegacyNewDecFromStr(tc.inputStr)
require.NoError(t, err)
// Convert using our conversion function.
dec, err := math.DecFromLegacyDec(legacyDec)
require.NoError(t, err)
// Convert directly from the input string for a canonical value.
expectedDec, err := math.NewDecFromString(tc.inputStr)
require.NoError(t, err)
// Compare the two Dec values.
require.True(t, dec.Equal(expectedDec))
})
}
}
func TestDecFromLegacyDecDeterministic(t *testing.T) {
// List of test input strings in legacy format.
testInputs := []string{
"0",
"1",
"-1",
"123.456",
"-9876.543210",
"0.000000000000000001",
"100.000000000000000000",
"12345678901234567890.123456789012345678",
}
// For each input, convert the legacy string to LegacyDec and then run conversion multiple times.
for _, s := range testInputs {
legacyDec, err := math.LegacyNewDecFromStr(s)
require.NoError(t, err)
// Run the conversion multiple times.
dec1, err := math.DecFromLegacyDec(legacyDec)
require.NoError(t, err)
dec2, err := math.DecFromLegacyDec(legacyDec)
require.NoError(t, err)
dec3, err := math.DecFromLegacyDec(legacyDec)
require.NoError(t, err)
require.True(t, dec1.Equal(dec2) && dec2.Equal(dec3))
}
}
// FuzzDecFromLegacyDec fuzzes the conversion function from LegacyDec to Dec.
func FuzzDecFromLegacyDec(f *testing.F) {
// Seed the fuzzer with some valid input strings.
seedInputs := []string{
"0",
"1",
"-1",
"123.456",
"-9876.543210",
"0.000000000000000001",
"100.000000000000000000",
"12345678901234567890.123456789012345678",
}
for _, s := range seedInputs {
f.Add(s)
}
f.Fuzz(func(t *testing.T, inputStr string) {
// Attempt to create a LegacyDec from the fuzz input.
legacyDec, err := math.LegacyNewDecFromStr(inputStr)
if err != nil {
// Ignore inputs that do not form a valid LegacyDec.
return
}
// Convert using the conversion function.
dec, err := math.DecFromLegacyDec(legacyDec)
require.NoError(t, err)
// Convert directly from the legacy string output.
expectedDec, err := math.NewDecFromString(legacyDec.String())
require.NoError(t, err)
require.True(t, dec.Equal(expectedDec))
})
}