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 }