51 lines
1.5 KiB
Go
51 lines
1.5 KiB
Go
package simulation
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/cosmos/cosmos-sdk/baseapp"
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
"github.com/cosmos/cosmos-sdk/x/auth"
|
|
"github.com/cosmos/cosmos-sdk/x/mock"
|
|
"github.com/cosmos/cosmos-sdk/x/mock/simulation"
|
|
abci "github.com/tendermint/tendermint/abci/types"
|
|
)
|
|
|
|
// NonnegativeBalanceInvariant checks that all accounts in the application have non-negative balances
|
|
func NonnegativeBalanceInvariant(mapper auth.AccountMapper) simulation.Invariant {
|
|
return func(t *testing.T, app *baseapp.BaseApp, log string) {
|
|
ctx := app.NewContext(false, abci.Header{})
|
|
accts := mock.GetAllAccounts(mapper, ctx)
|
|
for _, acc := range accts {
|
|
coins := acc.GetCoins()
|
|
require.True(t, coins.IsNotNegative(),
|
|
fmt.Sprintf("%s has a negative denomination of %s\n%s",
|
|
acc.GetAddress().String(),
|
|
coins.String(),
|
|
log),
|
|
)
|
|
}
|
|
}
|
|
}
|
|
|
|
// TotalCoinsInvariant checks that the sum of the coins across all accounts
|
|
// is what is expected
|
|
func TotalCoinsInvariant(mapper auth.AccountMapper, totalSupplyFn func() sdk.Coins) simulation.Invariant {
|
|
return func(t *testing.T, app *baseapp.BaseApp, log string) {
|
|
ctx := app.NewContext(false, abci.Header{})
|
|
totalCoins := sdk.Coins{}
|
|
|
|
chkAccount := func(acc auth.Account) bool {
|
|
coins := acc.GetCoins()
|
|
totalCoins = totalCoins.Plus(coins)
|
|
return false
|
|
}
|
|
|
|
mapper.IterateAccounts(ctx, chkAccount)
|
|
require.Equal(t, totalSupplyFn(), totalCoins, log)
|
|
}
|
|
}
|