github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/types/denom_test.go (about)

     1  package types
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/require"
     7  )
     8  
     9  var (
    10  	atom  = "atom"  // 1 (base denom unit)
    11  	matom = "matom" // 10^-3 (milli)
    12  	uatom = "uatom" // 10^-6 (micro)
    13  	natom = "natom" // 10^-9 (nano)
    14  )
    15  
    16  func TestRegisterDenom(t *testing.T) {
    17  	atomUnit := OneDec() // 1 (base denom unit)
    18  
    19  	require.NoError(t, RegisterDenom(atom, atomUnit))
    20  	require.Error(t, RegisterDenom(atom, atomUnit))
    21  
    22  	res, ok := GetDenomUnit(atom)
    23  	require.True(t, ok)
    24  	require.Equal(t, atomUnit, res)
    25  
    26  	res, ok = GetDenomUnit(matom)
    27  	require.False(t, ok)
    28  	require.Equal(t, ZeroDec(), res)
    29  
    30  	// reset registration
    31  	denomUnits = map[string]Dec{}
    32  }
    33  
    34  func TestConvertCoins(t *testing.T) {
    35  	atomUnit := OneDec() // 1 (base denom unit)
    36  	require.NoError(t, RegisterDenom(atom, atomUnit))
    37  
    38  	matomUnit := NewDecWithPrec(1, 3) // 10^-3 (milli)
    39  	require.NoError(t, RegisterDenom(matom, matomUnit))
    40  
    41  	uatomUnit := NewDecWithPrec(1, 6) // 10^-6 (micro)
    42  	require.NoError(t, RegisterDenom(uatom, uatomUnit))
    43  
    44  	natomUnit := NewDecWithPrec(1, 9) // 10^-9 (nano)
    45  	require.NoError(t, RegisterDenom(natom, natomUnit))
    46  
    47  	testCases := []struct {
    48  		input  Coin
    49  		denom  string
    50  		result Coin
    51  		expErr bool
    52  	}{
    53  		{NewCoin("foo", ZeroInt()), atom, Coin{}, true},
    54  		{NewCoin(atom, ZeroInt()), "foo", Coin{}, true},
    55  		{NewCoin(atom, ZeroInt()), "FOO", Coin{}, true},
    56  
    57  		{NewCoin(atom, NewInt(5)), matom, NewCoin(matom, NewInt(5000)), false},       // atom => matom
    58  		{NewCoin(atom, NewInt(5)), uatom, NewCoin(uatom, NewInt(5000000)), false},    // atom => uatom
    59  		{NewCoin(atom, NewInt(5)), natom, NewCoin(natom, NewInt(5000000000)), false}, // atom => natom
    60  
    61  		{NewCoin(uatom, NewInt(5000000)), matom, NewCoin(matom, NewInt(5000)), false},       // uatom => matom
    62  		{NewCoin(uatom, NewInt(5000000)), natom, NewCoin(natom, NewInt(5000000000)), false}, // uatom => natom
    63  		{NewCoin(uatom, NewInt(5000000)), atom, NewCoin(atom, NewInt(5)), false},            // uatom => atom
    64  
    65  		{NewCoin(matom, NewInt(5000)), natom, NewCoin(natom, NewInt(5000000000)), false}, // matom => natom
    66  		{NewCoin(matom, NewInt(5000)), uatom, NewCoin(uatom, NewInt(5000000)), false},    // matom => uatom
    67  	}
    68  
    69  	for i, tc := range testCases {
    70  		res, err := ConvertCoin(tc.input, tc.denom)
    71  		require.Equal(
    72  			t, tc.expErr, err != nil,
    73  			"unexpected error; tc: #%d, input: %s, denom: %s", i+1, tc.input, tc.denom,
    74  		)
    75  		require.Equal(
    76  			t, tc.result, res,
    77  			"invalid result; tc: #%d, input: %s, denom: %s", i+1, tc.input, tc.denom,
    78  		)
    79  	}
    80  
    81  	// reset registration
    82  	denomUnits = map[string]Dec{}
    83  }