You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: query_test.go
    path of file: ./repos/evmos/precompiles/erc20
    
    the code of the file until where you have to start completion: // Copyright Tharsis Labs Ltd.(Evmos)
// SPDX-License-Identifier:ENCL-1.0(https://github.com/evmos/evmos/blob
    
func (s *PrecompileTestSuite) TestDecimals() {
	DecimalsMethod := s.precompile.Methods[erc20.DecimalsMethod]

	testcases := []struct {
		name        string
		denom       string
		malleate    func(sdk.Context, *app.Evmos)
		expPass     bool
		errContains string
		expDecimals uint8
	}{
		{
			name:        "fail - empty denom",
			denom:       "",
			errContains: vm.ErrExecutionReverted.Error(),
		},
		{
			name:        "fail - invalid denom trace",
			denom:       tooShortTrace.IBCDenom()[:len(tooShortTrace.IBCDenom())-1],
			errContains: "odd length hex string",
		},
		{
			name:        "fail - denom not found",
			denom:       types.DenomTrace{Path: "channel-0", BaseDenom: "notfound"}.IBCDenom(),
			errContains: vm.ErrExecutionReverted.Error(),
		},
		{
			name:        "fail - denom without metadata and not an IBC voucher",
			denom:       "noIBCvoucher",
			errContains: vm.ErrExecutionReverted.Error(),
		},
		{
			name:  "fail - valid ibc denom without metadata and neither atto nor micro prefix",
			denom: validTraceDenomNoMicroAtto.IBCDenom(),
			malleate: func(ctx sdk.Context, app *app.Evmos) {
				app.TransferKeeper.SetDenomTrace(ctx, validTraceDenomNoMicroAtto)
			},
			errContains: vm.ErrExecutionReverted.Error(),
		},
		{
			name:  "pass - invalid denom (too short < 3 chars)",
			denom: tooShortTrace.IBCDenom(),
			malleate: func(ctx sdk.Context, app *app.Evmos) {
				app.TransferKeeper.SetDenomTrace(ctx, tooShortTrace)
			},
			expPass:     true, // TODO: do we want to check in decimals query for the above error?
			expDecimals: 18,   // expect 18 decimals here because of "a" prefix
		},
		{
			name:  "pass - valid denom with metadata",
			denom: validMetadataDenom,
			malleate: func(ctx sdk.Context, app *app.Evmos) {
				// NOTE: we mint some coins to the inflation module address to be able to set denom metadata
				err := app.BankKeeper.MintCoins(ctx, inflationtypes.ModuleName, sdk.Coins{sdk.NewInt64Coin(validMetadata.Base, 1)})
				s.Require().NoError(err)

				// NOTE: we set the denom metadata for the coin
				app.BankKeeper.SetDenomMetaData(ctx, validMetadata)
			},
			expPass:     true,
			expDecimals: 6,
		},
		{
			name:  "pass - valid ibc denom without metadata",
			denom: validTraceDenom.IBCDenom(),
			malleate: func(ctx sdk.Context, app *app.Evmos) {
				app.TransferKeeper.SetDenomTrace(ctx, validTraceDenom)
			},
			expPass:     true,
			expDecimals: 6,
		},
		{
			name:  "pass - valid ibc denom without metadata and 18 decimals",
			denom: validAttoTraceDenom.IBCDenom(),
			malleate: func(ctx sdk.Context, app *app.Evmos) {
				app.TransferKeeper.SetDenomTrace(ctx, validAttoTraceDenom)
			},
			expPass:     true,
			expDecimals: 18,
		},
		{
			name:  "pass - valid denom with metadata but decimals overflow",
			denom: validMetadataDenom,
			malleate: func(ctx sdk.Context, app *app.Evmos) {
				// NOTE: we mint some coins to the inflation module address to be able to set denom metadata
				err := app.BankKeeper.MintCoins(ctx, inflationtypes.ModuleName, sdk.Coins{sdk.NewInt64Coin(validMetadata.Base, 1)})
				s.Require().NoError(err)

				// NOTE: we set the denom metadata for the coin
				app.BankKeeper.SetDenomMetaData(s.network.GetContext(), overflowMetadata)
			},
			errContains: vm.ErrExecutionReverted.Error(),
		},
		{
			name:  "pass - valid ibc denom with metadata but no display denom",
			denom: validMetadataDenom,
			malleate: func(ctx sdk.Context, app *app.Evmos) {
				// NOTE: we mint some coins to the inflation module address to be able to set denom metadata
				err := app.BankKeeper.MintCoins(ctx, inflationtypes.ModuleName, sdk.Coins{sdk.NewInt64Coin(validMetadata.Base, 1)})
				s.Require().NoError(err)

				// NOTE: we set the denom metadata for the coin
				app.BankKeeper.SetDenomMetaData(ctx, noDisplayMetadata)
			},
			errContains: vm.ErrExecutionReverted.Error(),
		},
	}

	for _, tc := range testcases {
		tc := tc

		s.Run(tc.name, func() {
			s.SetupTest()

			if tc.malleate != nil {
				tc.malleate(s.network.GetContext(), s.network.App)
			}

			precompile := s.setupERC20Precompile(tc.denom)

			bz, err := precompile.Decimals(
				s.network.GetContext(),
				nil,
				nil,
				&DecimalsMethod,
				[]interface{}{},
			)

			// NOTE: all output and error checking happens in here
			s.requireOut(bz, err, DecimalsMethod, tc.expPass, tc.errContains, tc.expDecimals)
		})
	}
}