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 }