github.com/Finschia/finschia-sdk@v0.48.1/types/denom_internal_test.go (about)

     1  package types
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/suite"
     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  type internalDenomTestSuite struct {
    17  	suite.Suite
    18  }
    19  
    20  func TestInternalDenomTestSuite(t *testing.T) {
    21  	suite.Run(t, new(internalDenomTestSuite))
    22  }
    23  
    24  func (s *internalDenomTestSuite) TestRegisterDenom() {
    25  	atomUnit := OneDec() // 1 (base denom unit)
    26  
    27  	s.Require().NoError(RegisterDenom(atom, atomUnit))
    28  	s.Require().Error(RegisterDenom(atom, atomUnit))
    29  
    30  	res, ok := GetDenomUnit(atom)
    31  	s.Require().True(ok)
    32  	s.Require().Equal(atomUnit, res)
    33  
    34  	res, ok = GetDenomUnit(matom)
    35  	s.Require().False(ok)
    36  	s.Require().Equal(ZeroDec(), res)
    37  
    38  	// reset registration
    39  	baseDenom = ""
    40  	denomUnits = map[string]Dec{}
    41  }
    42  
    43  func (s *internalDenomTestSuite) TestConvertCoins() {
    44  	atomUnit := OneDec() // 1 (base denom unit)
    45  	s.Require().NoError(RegisterDenom(atom, atomUnit))
    46  
    47  	matomUnit := NewDecWithPrec(1, 3) // 10^-3 (milli)
    48  	s.Require().NoError(RegisterDenom(matom, matomUnit))
    49  
    50  	uatomUnit := NewDecWithPrec(1, 6) // 10^-6 (micro)
    51  	s.Require().NoError(RegisterDenom(uatom, uatomUnit))
    52  
    53  	natomUnit := NewDecWithPrec(1, 9) // 10^-9 (nano)
    54  	s.Require().NoError(RegisterDenom(natom, natomUnit))
    55  
    56  	res, err := GetBaseDenom()
    57  	s.Require().NoError(err)
    58  	s.Require().Equal(res, natom)
    59  	s.Require().Equal(NormalizeCoin(NewCoin(uatom, NewInt(1))), NewCoin(natom, NewInt(1000)))
    60  	s.Require().Equal(NormalizeCoin(NewCoin(matom, NewInt(1))), NewCoin(natom, NewInt(1000000)))
    61  	s.Require().Equal(NormalizeCoin(NewCoin(atom, NewInt(1))), NewCoin(natom, NewInt(1000000000)))
    62  
    63  	coins, err := ParseCoinsNormalized("1atom,1matom,1uatom")
    64  	s.Require().NoError(err)
    65  	s.Require().Equal(coins, Coins{
    66  		Coin{natom, NewInt(1000000000)},
    67  		Coin{natom, NewInt(1000000)},
    68  		Coin{natom, NewInt(1000)},
    69  	})
    70  
    71  	testCases := []struct {
    72  		input  Coin
    73  		denom  string
    74  		result Coin
    75  		expErr bool
    76  	}{
    77  		{NewCoin("foo", ZeroInt()), atom, Coin{}, true},
    78  		{NewCoin(atom, ZeroInt()), "foo", Coin{}, true},
    79  		{NewCoin(atom, ZeroInt()), "FOO", Coin{}, true},
    80  
    81  		{NewCoin(atom, NewInt(5)), matom, NewCoin(matom, NewInt(5000)), false},       // atom => matom
    82  		{NewCoin(atom, NewInt(5)), uatom, NewCoin(uatom, NewInt(5000000)), false},    // atom => uatom
    83  		{NewCoin(atom, NewInt(5)), natom, NewCoin(natom, NewInt(5000000000)), false}, // atom => natom
    84  
    85  		{NewCoin(uatom, NewInt(5000000)), matom, NewCoin(matom, NewInt(5000)), false},       // uatom => matom
    86  		{NewCoin(uatom, NewInt(5000000)), natom, NewCoin(natom, NewInt(5000000000)), false}, // uatom => natom
    87  		{NewCoin(uatom, NewInt(5000000)), atom, NewCoin(atom, NewInt(5)), false},            // uatom => atom
    88  
    89  		{NewCoin(matom, NewInt(5000)), natom, NewCoin(natom, NewInt(5000000000)), false}, // matom => natom
    90  		{NewCoin(matom, NewInt(5000)), uatom, NewCoin(uatom, NewInt(5000000)), false},    // matom => uatom
    91  	}
    92  
    93  	for i, tc := range testCases {
    94  		res, err := ConvertCoin(tc.input, tc.denom)
    95  		s.Require().Equal(
    96  			tc.expErr, err != nil,
    97  			"unexpected error; tc: #%d, input: %s, denom: %s", i+1, tc.input, tc.denom,
    98  		)
    99  		s.Require().Equal(
   100  			tc.result, res,
   101  			"invalid result; tc: #%d, input: %s, denom: %s", i+1, tc.input, tc.denom,
   102  		)
   103  	}
   104  
   105  	// reset registration
   106  	baseDenom = ""
   107  	denomUnits = map[string]Dec{}
   108  }
   109  
   110  func (s *internalDenomTestSuite) TestConvertDecCoins() {
   111  	atomUnit := OneDec() // 1 (base denom unit)
   112  	s.Require().NoError(RegisterDenom(atom, atomUnit))
   113  
   114  	matomUnit := NewDecWithPrec(1, 3) // 10^-3 (milli)
   115  	s.Require().NoError(RegisterDenom(matom, matomUnit))
   116  
   117  	uatomUnit := NewDecWithPrec(1, 6) // 10^-6 (micro)
   118  	s.Require().NoError(RegisterDenom(uatom, uatomUnit))
   119  
   120  	natomUnit := NewDecWithPrec(1, 9) // 10^-9 (nano)
   121  	s.Require().NoError(RegisterDenom(natom, natomUnit))
   122  
   123  	res, err := GetBaseDenom()
   124  	s.Require().NoError(err)
   125  	s.Require().Equal(res, natom)
   126  	s.Require().Equal(NormalizeDecCoin(NewDecCoin(uatom, NewInt(1))), NewDecCoin(natom, NewInt(1000)))
   127  	s.Require().Equal(NormalizeDecCoin(NewDecCoin(matom, NewInt(1))), NewDecCoin(natom, NewInt(1000000)))
   128  	s.Require().Equal(NormalizeDecCoin(NewDecCoin(atom, NewInt(1))), NewDecCoin(natom, NewInt(1000000000)))
   129  
   130  	coins, err := ParseCoinsNormalized("0.1atom,0.1matom,0.1uatom")
   131  	s.Require().NoError(err)
   132  	s.Require().Equal(coins, Coins{
   133  		Coin{natom, NewInt(100000000)},
   134  		Coin{natom, NewInt(100000)},
   135  		Coin{natom, NewInt(100)},
   136  	})
   137  
   138  	testCases := []struct {
   139  		input  DecCoin
   140  		denom  string
   141  		result DecCoin
   142  		expErr bool
   143  	}{
   144  		{NewDecCoin("foo", ZeroInt()), atom, DecCoin{}, true},
   145  		{NewDecCoin(atom, ZeroInt()), "foo", DecCoin{}, true},
   146  		{NewDecCoin(atom, ZeroInt()), "FOO", DecCoin{}, true},
   147  
   148  		// 0.5atom
   149  		{NewDecCoinFromDec(atom, NewDecWithPrec(5, 1)), matom, NewDecCoin(matom, NewInt(500)), false},       // atom => matom
   150  		{NewDecCoinFromDec(atom, NewDecWithPrec(5, 1)), uatom, NewDecCoin(uatom, NewInt(500000)), false},    // atom => uatom
   151  		{NewDecCoinFromDec(atom, NewDecWithPrec(5, 1)), natom, NewDecCoin(natom, NewInt(500000000)), false}, // atom => natom
   152  
   153  		{NewDecCoin(uatom, NewInt(5000000)), matom, NewDecCoin(matom, NewInt(5000)), false},       // uatom => matom
   154  		{NewDecCoin(uatom, NewInt(5000000)), natom, NewDecCoin(natom, NewInt(5000000000)), false}, // uatom => natom
   155  		{NewDecCoin(uatom, NewInt(5000000)), atom, NewDecCoin(atom, NewInt(5)), false},            // uatom => atom
   156  
   157  		{NewDecCoin(matom, NewInt(5000)), natom, NewDecCoin(natom, NewInt(5000000000)), false}, // matom => natom
   158  		{NewDecCoin(matom, NewInt(5000)), uatom, NewDecCoin(uatom, NewInt(5000000)), false},    // matom => uatom
   159  	}
   160  
   161  	for i, tc := range testCases {
   162  		res, err := ConvertDecCoin(tc.input, tc.denom)
   163  		s.Require().Equal(
   164  			tc.expErr, err != nil,
   165  			"unexpected error; tc: #%d, input: %s, denom: %s", i+1, tc.input, tc.denom,
   166  		)
   167  		s.Require().Equal(
   168  			tc.result, res,
   169  			"invalid result; tc: #%d, input: %s, denom: %s", i+1, tc.input, tc.denom,
   170  		)
   171  	}
   172  
   173  	// reset registration
   174  	baseDenom = ""
   175  	denomUnits = map[string]Dec{}
   176  }
   177  
   178  func (s *internalDenomTestSuite) TestDecOperationOrder() {
   179  	dec, err := NewDecFromStr("11")
   180  	s.Require().NoError(err)
   181  	s.Require().NoError(RegisterDenom("unit1", dec))
   182  	dec, err = NewDecFromStr("100000011")
   183  	s.Require().NoError(RegisterDenom("unit2", dec))
   184  
   185  	coin, err := ConvertCoin(NewCoin("unit1", NewInt(100000011)), "unit2")
   186  	s.Require().NoError(err)
   187  	s.Require().Equal(coin, NewCoin("unit2", NewInt(11)))
   188  
   189  	// reset registration
   190  	baseDenom = ""
   191  	denomUnits = map[string]Dec{}
   192  }