github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/common/syscoin_test.go (about) 1 package common 2 3 import ( 4 "github.com/stretchr/testify/require" 5 "strings" 6 "testing" 7 8 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 9 ) 10 11 // ---------------------------------------------------------------------------- 12 // SysCoin tests 13 14 var ( 15 syscoinTestDenom1 = "eos" 16 syscoinTestDenom2 = "fibo" 17 ) 18 19 func TestCoin(t *testing.T) { 20 require.Panics(t, func() { sdk.NewInt64Coin(syscoinTestDenom1, -1) }) 21 require.Panics(t, func() { sdk.NewCoin(syscoinTestDenom1, sdk.NewInt(-1)) }) 22 require.Panics(t, func() { sdk.NewInt64Coin(strings.ToUpper(syscoinTestDenom1), 10) }) 23 require.Panics(t, func() { sdk.NewCoin(strings.ToUpper(syscoinTestDenom1), sdk.NewInt(10)) }) 24 require.Equal(t, sdk.NewDec(5), sdk.NewInt64Coin(syscoinTestDenom1, 5).Amount) 25 require.Equal(t, sdk.NewDec(5), sdk.NewCoin(syscoinTestDenom1, sdk.NewInt(5)).Amount) 26 } 27 28 func TestNewDecCoinFromDec(t *testing.T) { 29 require.NotPanics(t, func() { 30 sdk.NewDecCoinFromDec(syscoinTestDenom1, sdk.NewDec(5)) 31 }) 32 require.NotPanics(t, func() { 33 sdk.NewDecCoinFromDec(syscoinTestDenom1, sdk.ZeroDec()) 34 }) 35 require.Panics(t, func() { 36 sdk.NewDecCoinFromDec(strings.ToUpper(syscoinTestDenom1), sdk.NewDec(5)) 37 }) 38 require.Panics(t, func() { 39 sdk.NewDecCoinFromDec(syscoinTestDenom1, sdk.NewDec(-5)) 40 }) 41 } 42 43 func TestDecCoinIsPositive(t *testing.T) { 44 dc := sdk.NewInt64DecCoin(syscoinTestDenom1, 5) 45 require.True(t, dc.IsPositive()) 46 47 dc = sdk.NewInt64DecCoin(syscoinTestDenom1, 0) 48 require.False(t, dc.IsPositive()) 49 } 50 51 func TestIsEqualCoin(t *testing.T) { 52 cases := []struct { 53 inputOne sdk.SysCoin 54 inputTwo sdk.SysCoin 55 expected bool 56 panics bool 57 }{ 58 {sdk.NewInt64Coin(syscoinTestDenom1, 1), sdk.NewInt64Coin(syscoinTestDenom1, 1), true, false}, 59 {sdk.NewInt64Coin(syscoinTestDenom1, 1), sdk.NewInt64Coin(syscoinTestDenom2, 1), false, true}, 60 {sdk.NewInt64Coin("stake", 1), sdk.NewInt64Coin("stake", 10), false, false}, 61 } 62 63 for tcIndex, tc := range cases { 64 tc := tc 65 if tc.panics { 66 require.Panics(t, func() { tc.inputOne.IsEqual(tc.inputTwo) }) 67 } else { 68 res := tc.inputOne.IsEqual(tc.inputTwo) 69 require.Equal(t, tc.expected, res, "coin equality relation is incorrect, tc #%d", tcIndex) 70 } 71 } 72 } 73 74 func TestCoinIsValid(t *testing.T) { 75 cases := []struct { 76 coin sdk.SysCoin 77 expectPass bool 78 }{ 79 {sdk.SysCoin{Denom: syscoinTestDenom1, Amount: sdk.NewDec(-1)}, false}, 80 {sdk.SysCoin{Denom: syscoinTestDenom1, Amount: sdk.NewDec(0)}, true}, 81 {sdk.SysCoin{Denom: syscoinTestDenom1, Amount: sdk.NewDec(1)}, true}, 82 {sdk.SysCoin{Denom: "Atom", Amount: sdk.NewDec(1)}, false}, 83 {sdk.SysCoin{Denom: "a", Amount: sdk.NewDec(1)}, true}, 84 {sdk.SysCoin{Denom: "a very long coin denom", Amount: sdk.NewDec(1)}, false}, 85 {sdk.SysCoin{Denom: "atOm", Amount: sdk.NewDec(1)}, false}, 86 {sdk.SysCoin{Denom: " ", Amount: sdk.NewDec(1)}, false}, 87 } 88 89 for i, tc := range cases { 90 require.Equal(t, tc.expectPass, tc.coin.IsValid(), "unexpected result for IsValid, tc #%d", i) 91 } 92 } 93 94 func TestAddCoin(t *testing.T) { 95 cases := []struct { 96 inputOne sdk.SysCoin 97 inputTwo sdk.SysCoin 98 expected sdk.SysCoin 99 shouldPanic bool 100 }{ 101 {sdk.NewInt64Coin(syscoinTestDenom1, 1), sdk.NewInt64Coin(syscoinTestDenom1, 1), sdk.NewInt64Coin(syscoinTestDenom1, 2), false}, 102 {sdk.NewInt64Coin(syscoinTestDenom1, 1), sdk.NewInt64Coin(syscoinTestDenom1, 0), sdk.NewInt64Coin(syscoinTestDenom1, 1), false}, 103 {sdk.NewInt64Coin(syscoinTestDenom1, 1), sdk.NewInt64Coin(syscoinTestDenom2, 1), sdk.NewInt64Coin(syscoinTestDenom1, 1), true}, 104 } 105 106 for tcIndex, tc := range cases { 107 tc := tc 108 if tc.shouldPanic { 109 require.Panics(t, func() { tc.inputOne.Add(tc.inputTwo) }) 110 } else { 111 res := tc.inputOne.Add(tc.inputTwo) 112 require.Equal(t, tc.expected, res, "sum of coins is incorrect, tc #%d", tcIndex) 113 } 114 } 115 } 116 117 func TestSubCoin(t *testing.T) { 118 cases := []struct { 119 inputOne sdk.SysCoin 120 inputTwo sdk.SysCoin 121 expected sdk.SysCoin 122 shouldPanic bool 123 }{ 124 {sdk.NewInt64Coin(syscoinTestDenom1, 1), sdk.NewInt64Coin(syscoinTestDenom2, 1), sdk.NewInt64Coin(syscoinTestDenom1, 1), true}, 125 {sdk.NewInt64Coin(syscoinTestDenom1, 10), sdk.NewInt64Coin(syscoinTestDenom1, 1), sdk.NewInt64Coin(syscoinTestDenom1, 9), false}, 126 {sdk.NewInt64Coin(syscoinTestDenom1, 5), sdk.NewInt64Coin(syscoinTestDenom1, 3), sdk.NewInt64Coin(syscoinTestDenom1, 2), false}, 127 {sdk.NewInt64Coin(syscoinTestDenom1, 5), sdk.NewInt64Coin(syscoinTestDenom1, 0), sdk.NewInt64Coin(syscoinTestDenom1, 5), false}, 128 {sdk.NewInt64Coin(syscoinTestDenom1, 1), sdk.NewInt64Coin(syscoinTestDenom1, 5), sdk.SysCoin{}, true}, 129 } 130 131 for tcIndex, tc := range cases { 132 tc := tc 133 if tc.shouldPanic { 134 require.Panics(t, func() { tc.inputOne.Sub(tc.inputTwo) }) 135 } else { 136 res := tc.inputOne.Sub(tc.inputTwo) 137 require.Equal(t, tc.expected, res, "difference of coins is incorrect, tc #%d", tcIndex) 138 } 139 } 140 141 tc := struct { 142 inputOne sdk.SysCoin 143 inputTwo sdk.SysCoin 144 expected int64 145 }{sdk.NewInt64Coin(syscoinTestDenom1, 1), sdk.NewInt64Coin(syscoinTestDenom1, 1), 0} 146 res := tc.inputOne.Sub(tc.inputTwo) 147 require.Equal(t, tc.expected, res.Amount.Int64()) 148 } 149 150 func TestIsGTECoin(t *testing.T) { 151 cases := []struct { 152 inputOne sdk.SysCoin 153 inputTwo sdk.SysCoin 154 expected bool 155 panics bool 156 }{ 157 {sdk.NewInt64Coin(syscoinTestDenom1, 1), sdk.NewInt64Coin(syscoinTestDenom1, 1), true, false}, 158 {sdk.NewInt64Coin(syscoinTestDenom1, 2), sdk.NewInt64Coin(syscoinTestDenom1, 1), true, false}, 159 {sdk.NewInt64Coin(syscoinTestDenom1, 1), sdk.NewInt64Coin(syscoinTestDenom2, 1), false, true}, 160 } 161 162 for tcIndex, tc := range cases { 163 tc := tc 164 if tc.panics { 165 require.Panics(t, func() { tc.inputOne.IsGTE(tc.inputTwo) }) 166 } else { 167 res := tc.inputOne.IsGTE(tc.inputTwo) 168 require.Equal(t, tc.expected, res, "coin GTE relation is incorrect, tc #%d", tcIndex) 169 } 170 } 171 } 172 173 func TestIsLTCoin(t *testing.T) { 174 cases := []struct { 175 inputOne sdk.SysCoin 176 inputTwo sdk.SysCoin 177 expected bool 178 panics bool 179 }{ 180 {sdk.NewInt64Coin(syscoinTestDenom1, 1), sdk.NewInt64Coin(syscoinTestDenom1, 1), false, false}, 181 {sdk.NewInt64Coin(syscoinTestDenom1, 2), sdk.NewInt64Coin(syscoinTestDenom1, 1), false, false}, 182 {sdk.NewInt64Coin(syscoinTestDenom1, 0), sdk.NewInt64Coin(syscoinTestDenom2, 1), false, true}, 183 {sdk.NewInt64Coin(syscoinTestDenom1, 1), sdk.NewInt64Coin(syscoinTestDenom2, 1), false, true}, 184 {sdk.NewInt64Coin(syscoinTestDenom1, 1), sdk.NewInt64Coin(syscoinTestDenom1, 1), false, false}, 185 {sdk.NewInt64Coin(syscoinTestDenom1, 1), sdk.NewInt64Coin(syscoinTestDenom1, 2), true, false}, 186 } 187 188 for tcIndex, tc := range cases { 189 tc := tc 190 if tc.panics { 191 require.Panics(t, func() { tc.inputOne.IsLT(tc.inputTwo) }) 192 } else { 193 res := tc.inputOne.IsLT(tc.inputTwo) 194 require.Equal(t, tc.expected, res, "coin LT relation is incorrect, tc #%d", tcIndex) 195 } 196 } 197 } 198 199 func TestCoinIsZero(t *testing.T) { 200 coin := sdk.NewInt64Coin(syscoinTestDenom1, 0) 201 res := coin.IsZero() 202 require.True(t, res) 203 204 coin = sdk.NewInt64Coin(syscoinTestDenom1, 1) 205 res = coin.IsZero() 206 require.False(t, res) 207 }