github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/order/keeper/invariant_test.go (about) 1 //go:build ignore 2 3 package keeper 4 5 import ( 6 "fmt" 7 "testing" 8 9 token "github.com/fibonacci-chain/fbc/x/token/types" 10 11 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 12 "github.com/fibonacci-chain/fbc/x/dex" 13 "github.com/fibonacci-chain/fbc/x/order/types" 14 "github.com/stretchr/testify/require" 15 ) 16 17 func TestModuleAccountInvariant(t *testing.T) { 18 testInput := CreateTestInput(t) 19 keeper := testInput.OrderKeeper 20 ctx := testInput.Ctx.WithBlockHeight(10) 21 invariant := ModuleAccountInvariant(keeper) 22 23 tokenPair := dex.GetBuiltInTokenPair() 24 err := testInput.DexKeeper.SaveTokenPair(ctx, tokenPair) 25 require.NoError(t, err) 26 27 order1 := mockOrder("", types.TestTokenPair, types.BuyOrder, "10.0", "1.0") 28 order1.Sender = testInput.TestAddrs[0] 29 err = keeper.PlaceOrder(ctx, order1) 30 require.NoError(t, err) 31 32 msg, broken := invariant(ctx) 33 require.False(t, broken) 34 expectedLockCoins := order1.NeedLockCoins().Add2(GetOrderNewFee(order1)) 35 require.Equal(t, invariantMsg(expectedLockCoins), msg) 36 37 order2 := mockOrder("", types.TestTokenPair, types.SellOrder, "20.0", "3.0") 38 order2.Sender = testInput.TestAddrs[0] 39 err = keeper.PlaceOrder(ctx, order2) 40 require.False(t, broken) 41 require.NoError(t, err) 42 43 msg, broken = invariant(ctx) 44 require.False(t, broken) 45 expectedLockCoins = expectedLockCoins.Add2(order2.NeedLockCoins()).Add2(GetOrderNewFee(order2)) 46 require.Equal(t, invariantMsg(expectedLockCoins), msg) 47 48 // cancel order 49 ctx.SetBlockHeight(11) 50 keeper.CancelOrder(ctx, order1, ctx.Logger()) 51 52 msg, broken = invariant(ctx) 53 require.False(t, broken) 54 expectedLockCoins = expectedLockCoins.Sub(order1.NeedLockCoins()).Sub(GetOrderNewFee(order1)) 55 require.Equal(t, invariantMsg(expectedLockCoins), msg) 56 57 // expire order 58 ctx.SetBlockHeight(12) 59 keeper.ExpireOrder(ctx, order2, ctx.Logger()) 60 61 msg, broken = invariant(ctx) 62 require.False(t, broken) 63 expectedLockCoins = expectedLockCoins.Sub(order2.NeedLockCoins()).Sub(GetOrderNewFee(order2)) 64 require.Equal(t, invariantMsg(expectedLockCoins), msg) 65 66 // lock LockCoinsTypeQuantity 67 lockCoins := sdk.MustParseCoins(sdk.DefaultBondDenom, "1") 68 err = keeper.tokenKeeper.LockCoins(ctx, testInput.TestAddrs[1], lockCoins, token.LockCoinsTypeQuantity) 69 require.NoError(t, err) 70 msg, broken = invariant(ctx) 71 require.False(t, broken) 72 expectedLockCoins = expectedLockCoins.Add2(lockCoins) 73 require.Equal(t, invariantMsg(expectedLockCoins), msg) 74 75 // error case: lock LockCoinsTypeFee 76 err = keeper.tokenKeeper.LockCoins(ctx, testInput.TestAddrs[1], expectedLockCoins, token.LockCoinsTypeFee) 77 require.NoError(t, err) 78 _, broken = invariant(ctx) 79 require.True(t, broken) 80 81 err = keeper.tokenKeeper.UnlockCoins(ctx, testInput.TestAddrs[1], expectedLockCoins, token.LockCoinsTypeFee) 82 require.NoError(t, err) 83 msg, broken = invariant(ctx) 84 require.False(t, broken) 85 require.Equal(t, invariantMsg(expectedLockCoins), msg) 86 87 // error case 88 err = keeper.supplyKeeper.SendCoinsFromAccountToModule(ctx, testInput.TestAddrs[1], token.ModuleName, sdk.MustParseCoins(sdk.DefaultBondDenom, "11.11")) 89 require.NoError(t, err) 90 _, broken = invariant(ctx) 91 require.True(t, broken) 92 } 93 94 func invariantMsg(lockCoins sdk.SysCoins) string { 95 return sdk.FormatInvariant(types.ModuleName, "locks", 96 fmt.Sprintf("\ttoken ModuleAccount coins: %s\n\tsum of locks amounts: %s\n", 97 lockCoins, lockCoins)) 98 }