github.com/lino-network/lino@v0.6.11/x/account/manager/event_test.go (about)

     1  package manager
     2  
     3  import (
     4  	"testing"
     5  	"time"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  
     9  	"github.com/lino-network/lino/types"
    10  	"github.com/lino-network/lino/x/account/model"
    11  )
    12  
    13  func TestCreateCoinReturnEvents(t *testing.T) {
    14  	assert := assert.New(t)
    15  	testCases := []struct {
    16  		testName     string
    17  		username     types.AccountKey
    18  		start        int64
    19  		times        int64
    20  		interval     int64
    21  		returnAmount types.Coin
    22  		returnType   types.TransferDetailType
    23  		pool         types.PoolName
    24  	}{
    25  		{
    26  			testName:     "normal return coin event",
    27  			username:     "user1",
    28  			start:        0,
    29  			times:        100,
    30  			interval:     100,
    31  			returnAmount: types.NewCoinFromInt64(100),
    32  			returnType:   types.DelegationReturnCoin,
    33  			pool:         types.AccountVestingPool,
    34  		},
    35  		{
    36  			testName:     "return coin is insufficient for each round",
    37  			username:     "user1",
    38  			start:        0,
    39  			times:        100,
    40  			interval:     100,
    41  			returnAmount: types.NewCoinFromInt64(1000),
    42  			returnType:   types.DelegationReturnCoin,
    43  			pool:         types.AccountVestingPool,
    44  		},
    45  		{
    46  			testName:     "only one return event",
    47  			username:     "user1",
    48  			start:        0,
    49  			times:        1,
    50  			interval:     100,
    51  			returnAmount: types.NewCoinFromInt64(1000),
    52  			returnType:   types.DelegationReturnCoin,
    53  			pool:         types.AccountVestingPool,
    54  		},
    55  		{
    56  			testName:     "no return interval",
    57  			username:     "user1",
    58  			start:        0,
    59  			times:        100,
    60  			interval:     0,
    61  			returnAmount: types.NewCoinFromInt64(1000),
    62  			pool:         types.AccountVestingPool,
    63  		},
    64  		{
    65  			testName:     "if return time is zero",
    66  			username:     "user1",
    67  			start:        0,
    68  			times:        0,
    69  			interval:     0,
    70  			returnAmount: types.NewCoinFromInt64(1000),
    71  			returnType:   types.DelegationReturnCoin,
    72  			pool:         types.AccountVestingPool,
    73  		},
    74  		{
    75  			testName:     "return to different user",
    76  			username:     "user2",
    77  			start:        0,
    78  			times:        1,
    79  			interval:     0,
    80  			returnAmount: types.NewCoinFromInt64(1000),
    81  			returnType:   types.DelegationReturnCoin,
    82  			pool:         types.AccountVestingPool,
    83  		},
    84  		{
    85  			testName:     "different return type",
    86  			username:     "user2",
    87  			start:        0,
    88  			times:        1,
    89  			interval:     0,
    90  			returnAmount: types.NewCoinFromInt64(1000),
    91  			returnType:   types.VoteReturnCoin,
    92  			pool:         types.InflationValidatorPool,
    93  		},
    94  	}
    95  
    96  	for _, tc := range testCases {
    97  		events := CreateCoinReturnEvents(
    98  			tc.username, tc.start, tc.interval, tc.times, tc.returnAmount, tc.returnType, tc.pool)
    99  		expectEvents := []ReturnCoinEvent{}
   100  		for i := int64(0); i < tc.times; i++ {
   101  			returnAmount, _ := tc.returnAmount.ToInt64()
   102  			returnCoin := types.DecToCoin(types.NewDecFromRat(returnAmount, tc.times-i))
   103  
   104  			event := ReturnCoinEvent{
   105  				Username:   tc.username,
   106  				Amount:     returnCoin,
   107  				ReturnType: tc.returnType,
   108  				FromPool:   tc.pool,
   109  				At:         tc.start + (i+1)*tc.interval,
   110  			}
   111  			tc.returnAmount = tc.returnAmount.Minus(returnCoin)
   112  			expectEvents = append(expectEvents, event)
   113  		}
   114  
   115  		if !assert.Equal(expectEvents, events) {
   116  			t.Errorf("%s: diff events, got %v, want %v", tc.testName, events, expectEvents)
   117  		}
   118  	}
   119  }
   120  
   121  func TestReturnCoinEvent(t *testing.T) {
   122  	ctx, am := setupTest(t, 1)
   123  	am.storage.SetPool(ctx, &model.Pool{
   124  		Name:    types.AccountVestingPool,
   125  		Balance: types.MustLinoToCoin("10000000000"),
   126  	})
   127  	accParam := am.paramHolder.GetAccountParam(ctx)
   128  
   129  	createTestAccount(ctx, am, "user1")
   130  
   131  	// Get the minimum time of this history slot
   132  	baseTime := time.Now().Unix()
   133  	testCases := []struct {
   134  		testName     string
   135  		event        ReturnCoinEvent
   136  		atWhen       int64
   137  		expectSaving types.Coin
   138  	}{
   139  		{
   140  			testName: "normal return case",
   141  			event: ReturnCoinEvent{
   142  				Username:   "user1",
   143  				Amount:     types.NewCoinFromInt64(100),
   144  				ReturnType: types.DelegationReturnCoin,
   145  				FromPool:   types.AccountVestingPool,
   146  			},
   147  			atWhen:       baseTime,
   148  			expectSaving: types.NewCoinFromInt64(100).Plus(accParam.RegisterFee),
   149  		},
   150  		{
   151  			testName: "return zero coin",
   152  			event: ReturnCoinEvent{
   153  				Username:   "user1",
   154  				Amount:     types.NewCoinFromInt64(0),
   155  				ReturnType: types.VoteReturnCoin,
   156  				FromPool:   types.AccountVestingPool,
   157  			},
   158  			atWhen:       baseTime,
   159  			expectSaving: types.NewCoinFromInt64(100).Plus(accParam.RegisterFee),
   160  		},
   161  	}
   162  
   163  	for _, tc := range testCases {
   164  		err := tc.event.Execute(ctx, am)
   165  		if err != nil {
   166  			t.Errorf("%s: failed to execute event, got err %v", tc.testName, err)
   167  		}
   168  		saving, err := am.GetSavingFromUsername(ctx, tc.event.Username)
   169  		if err != nil {
   170  			t.Errorf("%s: failed to get saving from bank, got err %v", tc.testName, err)
   171  		}
   172  		if !saving.IsEqual(tc.expectSaving) {
   173  			t.Errorf("%s: diff saving, got %v, want %v", tc.testName, saving, tc.expectSaving)
   174  		}
   175  	}
   176  }