|
|
@@ -330,3 +330,39 @@ func TestInternalType(t *testing.T) {
|
|
|
t.Errorf("type %q: parsed type mismatch:\nGOT %s\nWANT %s ", blob, spew.Sdump(typeWithoutStringer(typ)), spew.Sdump(typeWithoutStringer(kind)))
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+func TestGetTypeSize(t *testing.T) {
|
|
|
+ var testCases = []struct {
|
|
|
+ typ string
|
|
|
+ components []ArgumentMarshaling
|
|
|
+ typSize int
|
|
|
+ }{
|
|
|
+ // simple array
|
|
|
+ {"uint256[2]", nil, 32 * 2},
|
|
|
+ {"address[3]", nil, 32 * 3},
|
|
|
+ {"bytes32[4]", nil, 32 * 4},
|
|
|
+ // array array
|
|
|
+ {"uint256[2][3][4]", nil, 32 * (2 * 3 * 4)},
|
|
|
+ // array tuple
|
|
|
+ {"tuple[2]", []ArgumentMarshaling{{Name: "x", Type: "bytes32"}, {Name: "y", Type: "bytes32"}}, (32 * 2) * 2},
|
|
|
+ // simple tuple
|
|
|
+ {"tuple", []ArgumentMarshaling{{Name: "x", Type: "uint256"}, {Name: "y", Type: "uint256"}}, 32 * 2},
|
|
|
+ // tuple array
|
|
|
+ {"tuple", []ArgumentMarshaling{{Name: "x", Type: "bytes32[2]"}}, 32 * 2},
|
|
|
+ // tuple tuple
|
|
|
+ {"tuple", []ArgumentMarshaling{{Name: "x", Type: "tuple", Components: []ArgumentMarshaling{{Name: "x", Type: "bytes32"}}}}, 32},
|
|
|
+ {"tuple", []ArgumentMarshaling{{Name: "x", Type: "tuple", Components: []ArgumentMarshaling{{Name: "x", Type: "bytes32[2]"}, {Name: "y", Type: "uint256"}}}}, 32 * (2 + 1)},
|
|
|
+ }
|
|
|
+
|
|
|
+ for i, data := range testCases {
|
|
|
+ typ, err := NewType(data.typ, "", data.components)
|
|
|
+ if err != nil {
|
|
|
+ t.Errorf("type %q: failed to parse type string: %v", data.typ, err)
|
|
|
+ }
|
|
|
+
|
|
|
+ result := getTypeSize(typ)
|
|
|
+ if result != data.typSize {
|
|
|
+ t.Errorf("case %d type %q: get type size error: actual: %d expected: %d", i, data.typ, result, data.typSize)
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|