package keeper_test

import (
	"github.com/evmos/ethermint/x/evm/types"
	"reflect"
)

func (suite *KeeperTestSuite) TestParams() {
	params := suite.app.EvmKeeper.GetParams(suite.ctx)
	suite.app.EvmKeeper.SetParams(suite.ctx, params)
	testCases := []struct {
		name      string
		paramsFun func() interface{}
		getFun    func() interface{}
		expected  bool
	}{
		{
			"success - Checks if the default params are set correctly",
			func() interface{} {
				return types.DefaultParams()
			},
			func() interface{} {
				return suite.app.EvmKeeper.GetParams(suite.ctx)
			},
			true,
		},
		{
			"success - EvmDenom param is set to \"inj\" and can be retrieved correctly",
			func() interface{} {
				params.EvmDenom = "inj"
				suite.app.EvmKeeper.SetParams(suite.ctx, params)
				return params.EvmDenom
			},
			func() interface{} {
				return suite.app.EvmKeeper.GetEVMDenom(suite.ctx)
			},
			true,
		},
		{
			"success - Check EnableCreate param is set to false and can be retrieved correctly",
			func() interface{} {
				params.EnableCreate = false
				suite.app.EvmKeeper.SetParams(suite.ctx, params)
				return params.EnableCreate
			},
			func() interface{} {
				return suite.app.EvmKeeper.GetEnableCreate(suite.ctx)
			},
			true,
		},
		{
			"success - Check EnableCall param is set to false and can be retrieved correctly",
			func() interface{} {
				params.EnableCall = false
				suite.app.EvmKeeper.SetParams(suite.ctx, params)
				return params.EnableCall
			},
			func() interface{} {
				return suite.app.EvmKeeper.GetEnableCall(suite.ctx)
			},
			true,
		},
		{
			"success - Check AllowUnprotectedTxs param is set to false and can be retrieved correctly",
			func() interface{} {
				params.AllowUnprotectedTxs = false
				suite.app.EvmKeeper.SetParams(suite.ctx, params)
				return params.AllowUnprotectedTxs
			},
			func() interface{} {
				return suite.app.EvmKeeper.GetAllowUnprotectedTxs(suite.ctx)
			},
			true,
		},
		{
			"success - Check ChainConfig param is set to the default value and can be retrieved correctly",
			func() interface{} {
				params.ChainConfig = types.DefaultChainConfig()
				suite.app.EvmKeeper.SetParams(suite.ctx, params)
				return params.ChainConfig
			},
			func() interface{} {
				return suite.app.EvmKeeper.GetChainConfig(suite.ctx)
			},
			true,
		},
	}
	for _, tc := range testCases {
		suite.Run(tc.name, func() {
			outcome := reflect.DeepEqual(tc.paramsFun(), tc.getFun())
			suite.Require().Equal(tc.expected, outcome)
		})
	}

}
