laconicd/x/evm/types/state_object_test.go

136 lines
3.2 KiB
Go

package types_test
import (
"math/big"
ethcmn "github.com/ethereum/go-ethereum/common"
)
func (suite *StateDBTestSuite) TestStateObject_State() {
testCase := []struct {
name string
key ethcmn.Hash
expValue ethcmn.Hash
malleate func()
}{
{
"no set value, load from KVStore",
ethcmn.BytesToHash([]byte("key")),
ethcmn.Hash{},
func() {},
},
{
"no-op SetState",
ethcmn.BytesToHash([]byte("key")),
ethcmn.Hash{},
func() {
suite.stateObject.SetState(nil, ethcmn.BytesToHash([]byte("key")), ethcmn.Hash{})
},
},
{
"cached value",
ethcmn.BytesToHash([]byte("key1")),
ethcmn.BytesToHash([]byte("value1")),
func() {
suite.stateObject.SetState(nil, ethcmn.BytesToHash([]byte("key1")), ethcmn.BytesToHash([]byte("value1")))
},
},
{
"update value",
ethcmn.BytesToHash([]byte("key1")),
ethcmn.BytesToHash([]byte("value2")),
func() {
suite.stateObject.SetState(nil, ethcmn.BytesToHash([]byte("key1")), ethcmn.BytesToHash([]byte("value2")))
},
},
{
"update various keys",
ethcmn.BytesToHash([]byte("key1")),
ethcmn.BytesToHash([]byte("value1")),
func() {
suite.stateObject.SetState(nil, ethcmn.BytesToHash([]byte("key1")), ethcmn.BytesToHash([]byte("value1")))
suite.stateObject.SetState(nil, ethcmn.BytesToHash([]byte("key2")), ethcmn.BytesToHash([]byte("value2")))
suite.stateObject.SetState(nil, ethcmn.BytesToHash([]byte("key3")), ethcmn.BytesToHash([]byte("value3")))
},
},
}
for _, tc := range testCase {
tc.malleate()
value := suite.stateObject.GetState(nil, tc.key)
suite.Require().Equal(tc.expValue, value, tc.name)
}
}
func (suite *StateDBTestSuite) TestStateObject_AddBalance() {
testCase := []struct {
name string
amount *big.Int
expBalance *big.Int
}{
{"zero amount", big.NewInt(0), big.NewInt(0)},
{"positive amount", big.NewInt(10), big.NewInt(10)},
{"negative amount", big.NewInt(-1), big.NewInt(9)},
}
for _, tc := range testCase {
suite.stateObject.AddBalance(tc.amount)
suite.Require().Equal(tc.expBalance, suite.stateObject.Balance(), tc.name)
}
}
func (suite *StateDBTestSuite) TestStateObject_SubBalance() {
testCase := []struct {
name string
amount *big.Int
expBalance *big.Int
}{
{"zero amount", big.NewInt(0), big.NewInt(0)},
{"negative amount", big.NewInt(-10), big.NewInt(10)},
{"positive amount", big.NewInt(1), big.NewInt(9)},
}
for _, tc := range testCase {
suite.stateObject.SubBalance(tc.amount)
suite.Require().Equal(tc.expBalance, suite.stateObject.Balance(), tc.name)
}
}
func (suite *StateDBTestSuite) TestStateObject_Code() {
testCase := []struct {
name string
expCode []byte
malleate func()
}{
{
"cached code",
[]byte("code"),
func() {
suite.stateObject.SetCode(ethcmn.BytesToHash([]byte("code_hash")), []byte("code"))
},
},
{
"empty code hash",
nil,
func() {
suite.stateObject.SetCode(ethcmn.Hash{}, nil)
},
},
{
"empty code",
nil,
func() {
suite.stateObject.SetCode(ethcmn.BytesToHash([]byte("code_hash")), nil)
},
},
}
for _, tc := range testCase {
tc.malleate()
code := suite.stateObject.Code(nil)
suite.Require().Equal(tc.expCode, code, tc.name)
}
}