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  }