|
|
@@ -17,6 +17,7 @@
|
|
|
package bind
|
|
|
|
|
|
import (
|
|
|
+ "math/big"
|
|
|
"reflect"
|
|
|
"testing"
|
|
|
|
|
|
@@ -55,27 +56,44 @@ func TestMakeTopics(t *testing.T) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func TestParseTopics(t *testing.T) {
|
|
|
- type bytesStruct struct {
|
|
|
- StaticBytes [5]byte
|
|
|
- }
|
|
|
+type args struct {
|
|
|
+ createObj func() interface{}
|
|
|
+ resultObj func() interface{}
|
|
|
+ resultMap func() map[string]interface{}
|
|
|
+ fields abi.Arguments
|
|
|
+ topics []common.Hash
|
|
|
+}
|
|
|
+
|
|
|
+type bytesStruct struct {
|
|
|
+ StaticBytes [5]byte
|
|
|
+}
|
|
|
+type int8Struct struct {
|
|
|
+ Int8Value int8
|
|
|
+}
|
|
|
+type int256Struct struct {
|
|
|
+ Int256Value *big.Int
|
|
|
+}
|
|
|
+
|
|
|
+type topicTest struct {
|
|
|
+ name string
|
|
|
+ args args
|
|
|
+ wantErr bool
|
|
|
+}
|
|
|
+
|
|
|
+func setupTopicsTests() []topicTest {
|
|
|
bytesType, _ := abi.NewType("bytes5", "", nil)
|
|
|
- type args struct {
|
|
|
- createObj func() interface{}
|
|
|
- resultObj func() interface{}
|
|
|
- fields abi.Arguments
|
|
|
- topics []common.Hash
|
|
|
- }
|
|
|
- tests := []struct {
|
|
|
- name string
|
|
|
- args args
|
|
|
- wantErr bool
|
|
|
- }{
|
|
|
+ int8Type, _ := abi.NewType("int8", "", nil)
|
|
|
+ int256Type, _ := abi.NewType("int256", "", nil)
|
|
|
+
|
|
|
+ tests := []topicTest{
|
|
|
{
|
|
|
name: "support fixed byte types, right padded to 32 bytes",
|
|
|
args: args{
|
|
|
createObj: func() interface{} { return &bytesStruct{} },
|
|
|
resultObj: func() interface{} { return &bytesStruct{StaticBytes: [5]byte{1, 2, 3, 4, 5}} },
|
|
|
+ resultMap: func() map[string]interface{} {
|
|
|
+ return map[string]interface{}{"staticBytes": [5]byte{1, 2, 3, 4, 5}}
|
|
|
+ },
|
|
|
fields: abi.Arguments{abi.Argument{
|
|
|
Name: "staticBytes",
|
|
|
Type: bytesType,
|
|
|
@@ -87,7 +105,54 @@ func TestParseTopics(t *testing.T) {
|
|
|
},
|
|
|
wantErr: false,
|
|
|
},
|
|
|
+ {
|
|
|
+ name: "int8 with negative value",
|
|
|
+ args: args{
|
|
|
+ createObj: func() interface{} { return &int8Struct{} },
|
|
|
+ resultObj: func() interface{} { return &int8Struct{Int8Value: -1} },
|
|
|
+ resultMap: func() map[string]interface{} {
|
|
|
+ return map[string]interface{}{"int8Value": int8(-1)}
|
|
|
+ },
|
|
|
+ fields: abi.Arguments{abi.Argument{
|
|
|
+ Name: "int8Value",
|
|
|
+ Type: int8Type,
|
|
|
+ Indexed: true,
|
|
|
+ }},
|
|
|
+ topics: []common.Hash{
|
|
|
+ {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
|
|
+ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ wantErr: false,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ name: "int256 with negative value",
|
|
|
+ args: args{
|
|
|
+ createObj: func() interface{} { return &int256Struct{} },
|
|
|
+ resultObj: func() interface{} { return &int256Struct{Int256Value: big.NewInt(-1)} },
|
|
|
+ resultMap: func() map[string]interface{} {
|
|
|
+ return map[string]interface{}{"int256Value": big.NewInt(-1)}
|
|
|
+ },
|
|
|
+ fields: abi.Arguments{abi.Argument{
|
|
|
+ Name: "int256Value",
|
|
|
+ Type: int256Type,
|
|
|
+ Indexed: true,
|
|
|
+ }},
|
|
|
+ topics: []common.Hash{
|
|
|
+ {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
|
|
|
+ 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
|
|
|
+ },
|
|
|
+ },
|
|
|
+ wantErr: false,
|
|
|
+ },
|
|
|
}
|
|
|
+
|
|
|
+ return tests
|
|
|
+}
|
|
|
+
|
|
|
+func TestParseTopics(t *testing.T) {
|
|
|
+ tests := setupTopicsTests()
|
|
|
+
|
|
|
for _, tt := range tests {
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
createObj := tt.args.createObj()
|
|
|
@@ -101,3 +166,20 @@ func TestParseTopics(t *testing.T) {
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+func TestParseTopicsIntoMap(t *testing.T) {
|
|
|
+ tests := setupTopicsTests()
|
|
|
+
|
|
|
+ for _, tt := range tests {
|
|
|
+ t.Run(tt.name, func(t *testing.T) {
|
|
|
+ outMap := make(map[string]interface{})
|
|
|
+ if err := parseTopicsIntoMap(outMap, tt.args.fields, tt.args.topics); (err != nil) != tt.wantErr {
|
|
|
+ t.Errorf("parseTopicsIntoMap() error = %v, wantErr %v", err, tt.wantErr)
|
|
|
+ }
|
|
|
+ resultMap := tt.args.resultMap()
|
|
|
+ if !reflect.DeepEqual(outMap, resultMap) {
|
|
|
+ t.Errorf("parseTopicsIntoMap() = %v, want %v", outMap, resultMap)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|