github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/staking/types/commission_test.go (about)

     1  package types
     2  
     3  import (
     4  	"math"
     5  	"math/big"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/tendermint/go-amino"
    10  
    11  	"github.com/stretchr/testify/require"
    12  
    13  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    14  )
    15  
    16  func TestCommissionValidate(t *testing.T) {
    17  	testCases := []struct {
    18  		input     Commission
    19  		expectErr bool
    20  	}{
    21  		// invalid commission; max rate < 0%
    22  		{NewCommission(sdk.ZeroDec(), sdk.MustNewDecFromStr("-1.00"), sdk.ZeroDec()), true},
    23  		// invalid commission; max rate > 100%
    24  		{NewCommission(sdk.ZeroDec(), sdk.MustNewDecFromStr("2.00"), sdk.ZeroDec()), true},
    25  		// invalid commission; rate < 0%
    26  		{NewCommission(sdk.MustNewDecFromStr("-1.00"), sdk.ZeroDec(), sdk.ZeroDec()), true},
    27  		// invalid commission; rate > max rate
    28  		{NewCommission(sdk.MustNewDecFromStr("0.75"), sdk.MustNewDecFromStr("0.50"), sdk.ZeroDec()), true},
    29  		// invalid commission; max change rate < 0%
    30  		{NewCommission(sdk.OneDec(), sdk.OneDec(), sdk.MustNewDecFromStr("-1.00")), true},
    31  		// invalid commission; max change rate > max rate
    32  		{NewCommission(sdk.OneDec(), sdk.MustNewDecFromStr("0.75"), sdk.MustNewDecFromStr("0.90")), true},
    33  		// valid commission
    34  		{NewCommission(sdk.MustNewDecFromStr("0.20"), sdk.OneDec(), sdk.MustNewDecFromStr("0.10")), false},
    35  	}
    36  
    37  	for i, tc := range testCases {
    38  		err := tc.input.Validate()
    39  		require.Equal(t, tc.expectErr, err != nil, "unexpected result; tc #%d, input: %v", i, tc.input)
    40  	}
    41  }
    42  
    43  func TestCommissionValidateNewRate(t *testing.T) {
    44  	now := time.Now().UTC()
    45  	c1 := NewCommission(sdk.MustNewDecFromStr("0.40"), sdk.MustNewDecFromStr("0.80"), sdk.MustNewDecFromStr("0.10"))
    46  	c1.UpdateTime = now
    47  
    48  	//maxChangeRate 0.8
    49  	testCases := []struct {
    50  		input     Commission
    51  		newRate   sdk.Dec
    52  		blockTime time.Time
    53  		expectErr bool
    54  	}{
    55  		// invalid new commission rate; last update < 24h ago
    56  		{c1, sdk.MustNewDecFromStr("0.50"), now, true},
    57  		// invalid new commission rate; new rate < 0%
    58  		{c1, sdk.MustNewDecFromStr("-1.00"), now.Add(48 * time.Hour), true},
    59  		// invalid commission
    60  		{c1, sdk.MustNewDecFromStr("0.81"), now.Add(48 * time.Hour), true},
    61  		// invalid new commission rate
    62  		{c1, sdk.MustNewDecFromStr("0.90"), now.Add(48 * time.Hour), true},
    63  		// invalid new commission rate;
    64  		{c1, sdk.MustNewDecFromStr("0.60"), now.Add(48 * time.Hour), false},
    65  		// valid commission
    66  		{c1, sdk.MustNewDecFromStr("0.50"), now.Add(48 * time.Hour), false},
    67  		// valid commission
    68  		{c1, sdk.MustNewDecFromStr("0.10"), now.Add(48 * time.Hour), false},
    69  		// valid commission, maxChangeRate 0.8
    70  		{c1, sdk.MustNewDecFromStr("0.80"), now.Add(48 * time.Hour), false},
    71  		// valid commission,
    72  		{c1, sdk.MustNewDecFromStr("0.00"), now.Add(48 * time.Hour), false},
    73  		// valid commission
    74  		{c1, sdk.MustNewDecFromStr("0.000000001"), now.Add(48 * time.Hour), false},
    75  		// valid commission
    76  		{c1, sdk.MustNewDecFromStr("-0.000000001"), now.Add(48 * time.Hour), true},
    77  		// valid commission, maxChangeRate 0.8
    78  		{c1, sdk.MustNewDecFromStr("0.8000000001"), now.Add(48 * time.Hour), true},
    79  	}
    80  
    81  	for i, tc := range testCases {
    82  		err := tc.input.ValidateNewRate(tc.newRate, tc.blockTime)
    83  		require.Equal(
    84  			t, tc.expectErr, err != nil,
    85  			"unexpected result; tc #%d, input: %v, newRate: %s, blockTime: %s",
    86  			i, tc.input, tc.newRate, tc.blockTime,
    87  		)
    88  	}
    89  }
    90  
    91  func TestCommissionAmino(t *testing.T) {
    92  	testCases := []Commission{
    93  		{},
    94  		{
    95  			CommissionRates{sdk.NewDec(1), sdk.NewDec(2), sdk.NewDec(3)}, time.Now(),
    96  		},
    97  	}
    98  	cdc := amino.NewCodec()
    99  	for _, commission := range testCases {
   100  		bz, err := cdc.MarshalBinaryBare(commission)
   101  		require.NoError(t, err)
   102  
   103  		var newCommission Commission
   104  		err = cdc.UnmarshalBinaryBare(bz, &newCommission)
   105  		require.NoError(t, err)
   106  
   107  		var newCommission2 Commission
   108  		err = newCommission2.UnmarshalFromAmino(cdc, bz)
   109  		require.NoError(t, err)
   110  
   111  		require.Equal(t, newCommission, newCommission2)
   112  	}
   113  }
   114  
   115  func TestCommissionRatesAmino(t *testing.T) {
   116  	testCases := []CommissionRates{
   117  		{},
   118  		{
   119  			sdk.Dec{new(big.Int)},
   120  			sdk.Dec{new(big.Int)},
   121  			sdk.Dec{new(big.Int)},
   122  		},
   123  		{
   124  			sdk.Dec{big.NewInt(1)},
   125  			sdk.Dec{big.NewInt(10)},
   126  			sdk.Dec{big.NewInt(100)},
   127  		},
   128  		{
   129  			sdk.Dec{big.NewInt(math.MinInt64)},
   130  			sdk.Dec{big.NewInt(math.MinInt64)},
   131  			sdk.Dec{big.NewInt(math.MinInt64)},
   132  		},
   133  		{
   134  			sdk.Dec{big.NewInt(math.MaxInt64)},
   135  			sdk.Dec{big.NewInt(math.MaxInt64)},
   136  			sdk.Dec{big.NewInt(math.MaxInt64)},
   137  		},
   138  		{
   139  			sdk.Dec{big.NewInt(0).Mul(big.NewInt(math.MaxInt64), big.NewInt(math.MaxInt64))},
   140  			sdk.Dec{big.NewInt(0).Add(big.NewInt(math.MaxInt64), big.NewInt(math.MaxInt64))},
   141  			sdk.Dec{big.NewInt(0).Mul(big.NewInt(math.MaxInt64), big.NewInt(2))},
   142  		},
   143  	}
   144  	cdc := amino.NewCodec()
   145  	for _, commission := range testCases {
   146  		bz, err := cdc.MarshalBinaryBare(commission)
   147  		require.NoError(t, err)
   148  
   149  		var newCommission CommissionRates
   150  		err = cdc.UnmarshalBinaryBare(bz, &newCommission)
   151  		require.NoError(t, err)
   152  
   153  		var newCommission2 CommissionRates
   154  		err = newCommission2.UnmarshalFromAmino(cdc, bz)
   155  		require.NoError(t, err)
   156  
   157  		require.Equal(t, newCommission, newCommission2)
   158  	}
   159  }