@ -394,6 +394,7 @@ func TestBytes(t *testing.T) {
}
}
}
}
/ *
func TestReturn ( t * testing . T ) {
func TestReturn ( t * testing . T ) {
const definition = ` [
const definition = ` [
{ "type" : "function" , "name" : "balance" , "const" : true , "inputs" : [ ] , "outputs" : [ { "name" : "" , "type" : "hash" } ] } ,
{ "type" : "function" , "name" : "balance" , "const" : true , "inputs" : [ ] , "outputs" : [ { "name" : "" , "type" : "hash" } ] } ,
@ -422,6 +423,7 @@ func TestReturn(t *testing.T) {
t . Errorf ( "expected type common.Address, got %T" , r )
t . Errorf ( "expected type common.Address, got %T" , r )
}
}
}
}
* /
func TestDefaultFunctionParsing ( t * testing . T ) {
func TestDefaultFunctionParsing ( t * testing . T ) {
const definition = ` [ { "name" : "balance" }] `
const definition = ` [ { "name" : "balance" }] `
@ -458,3 +460,234 @@ func TestBareEvents(t *testing.T) {
t . Error ( "expected 'name' event to be present" )
t . Error ( "expected 'name' event to be present" )
}
}
}
}
func TestMultiReturnWithStruct ( t * testing . T ) {
const definition = ` [
{ "name" : "multi" , "const" : false , "outputs" : [ { "name" : "Int" , "type" : "uint256" } , { "name" : "String" , "type" : "string" } ] } ] `
abi , err := JSON ( strings . NewReader ( definition ) )
if err != nil {
t . Fatal ( err )
}
// using buff to make the code readable
buff := new ( bytes . Buffer )
buff . Write ( common . Hex2Bytes ( "0000000000000000000000000000000000000000000000000000000000000001" ) )
buff . Write ( common . Hex2Bytes ( "0000000000000000000000000000000000000000000000000000000000000040" ) )
buff . Write ( common . Hex2Bytes ( "0000000000000000000000000000000000000000000000000000000000000005" ) )
stringOut := "hello"
buff . Write ( common . RightPadBytes ( [ ] byte ( stringOut ) , 32 ) )
var inter struct {
Int * big . Int
String string
}
err = abi . unmarshal ( & inter , "multi" , buff . Bytes ( ) )
if err != nil {
t . Error ( err )
}
if inter . Int == nil || inter . Int . Cmp ( big . NewInt ( 1 ) ) != 0 {
t . Error ( "expected Int to be 1 got" , inter . Int )
}
if inter . String != stringOut {
t . Error ( "expected String to be" , stringOut , "got" , inter . String )
}
var reversed struct {
String string
Int * big . Int
}
err = abi . unmarshal ( & reversed , "multi" , buff . Bytes ( ) )
if err != nil {
t . Error ( err )
}
if reversed . Int == nil || reversed . Int . Cmp ( big . NewInt ( 1 ) ) != 0 {
t . Error ( "expected Int to be 1 got" , reversed . Int )
}
if reversed . String != stringOut {
t . Error ( "expected String to be" , stringOut , "got" , reversed . String )
}
}
func TestMultiReturnWithSlice ( t * testing . T ) {
const definition = ` [
{ "name" : "multi" , "const" : false , "outputs" : [ { "name" : "Int" , "type" : "uint256" } , { "name" : "String" , "type" : "string" } ] } ] `
abi , err := JSON ( strings . NewReader ( definition ) )
if err != nil {
t . Fatal ( err )
}
// using buff to make the code readable
buff := new ( bytes . Buffer )
buff . Write ( common . Hex2Bytes ( "0000000000000000000000000000000000000000000000000000000000000001" ) )
buff . Write ( common . Hex2Bytes ( "0000000000000000000000000000000000000000000000000000000000000040" ) )
buff . Write ( common . Hex2Bytes ( "0000000000000000000000000000000000000000000000000000000000000005" ) )
stringOut := "hello"
buff . Write ( common . RightPadBytes ( [ ] byte ( stringOut ) , 32 ) )
var inter [ ] interface { }
err = abi . unmarshal ( & inter , "multi" , buff . Bytes ( ) )
if err != nil {
t . Error ( err )
}
if len ( inter ) != 2 {
t . Fatal ( "expected 2 results got" , len ( inter ) )
}
if num , ok := inter [ 0 ] . ( * big . Int ) ; ! ok || num . Cmp ( big . NewInt ( 1 ) ) != 0 {
t . Error ( "expected index 0 to be 1 got" , num )
}
if str , ok := inter [ 1 ] . ( string ) ; ! ok || str != stringOut {
t . Error ( "expected index 1 to be" , stringOut , "got" , str )
}
}
func TestUnmarshal ( t * testing . T ) {
const definition = ` [
{ "name" : "int" , "const" : false , "outputs" : [ { "type" : "uint256" } ] } ,
{ "name" : "bool" , "const" : false , "outputs" : [ { "type" : "bool" } ] } ,
{ "name" : "bytes" , "const" : false , "outputs" : [ { "type" : "bytes" } ] } ,
{ "name" : "multi" , "const" : false , "outputs" : [ { "type" : "bytes" } , { "type" : "bytes" } ] } ,
{ "name" : "mixedBytes" , "const" : true , "outputs" : [ { "name" : "a" , "type" : "bytes" } , { "name" : "b" , "type" : "bytes32" } ] } ] `
abi , err := JSON ( strings . NewReader ( definition ) )
if err != nil {
t . Fatal ( err )
}
// marshal int
var Int * big . Int
err = abi . unmarshal ( & Int , "int" , common . Hex2Bytes ( "0000000000000000000000000000000000000000000000000000000000000001" ) )
if err != nil {
t . Error ( err )
}
if Int == nil || Int . Cmp ( big . NewInt ( 1 ) ) != 0 {
t . Error ( "expected Int to be 1 got" , Int )
}
// marshal bool
var Bool bool
err = abi . unmarshal ( & Bool , "bool" , common . Hex2Bytes ( "0000000000000000000000000000000000000000000000000000000000000001" ) )
if err != nil {
t . Error ( err )
}
if ! Bool {
t . Error ( "expected Bool to be true" )
}
// marshal dynamic bytes max length 32
buff := new ( bytes . Buffer )
buff . Write ( common . Hex2Bytes ( "0000000000000000000000000000000000000000000000000000000000000020" ) )
buff . Write ( common . Hex2Bytes ( "0000000000000000000000000000000000000000000000000000000000000020" ) )
bytesOut := common . RightPadBytes ( [ ] byte ( "hello" ) , 32 )
buff . Write ( bytesOut )
var Bytes [ ] byte
err = abi . unmarshal ( & Bytes , "bytes" , buff . Bytes ( ) )
if err != nil {
t . Error ( err )
}
if ! bytes . Equal ( Bytes , bytesOut ) {
t . Errorf ( "expected %x got %x" , bytesOut , Bytes )
}
// marshall dynamic bytes max length 64
buff . Reset ( )
buff . Write ( common . Hex2Bytes ( "0000000000000000000000000000000000000000000000000000000000000020" ) )
buff . Write ( common . Hex2Bytes ( "0000000000000000000000000000000000000000000000000000000000000040" ) )
bytesOut = common . RightPadBytes ( [ ] byte ( "hello" ) , 64 )
buff . Write ( bytesOut )
err = abi . unmarshal ( & Bytes , "bytes" , buff . Bytes ( ) )
if err != nil {
t . Error ( err )
}
if ! bytes . Equal ( Bytes , bytesOut ) {
t . Errorf ( "expected %x got %x" , bytesOut , Bytes )
}
// marshall dynamic bytes max length 63
buff . Reset ( )
buff . Write ( common . Hex2Bytes ( "0000000000000000000000000000000000000000000000000000000000000020" ) )
buff . Write ( common . Hex2Bytes ( "000000000000000000000000000000000000000000000000000000000000003f" ) )
bytesOut = common . RightPadBytes ( [ ] byte ( "hello" ) , 63 )
buff . Write ( bytesOut )
err = abi . unmarshal ( & Bytes , "bytes" , buff . Bytes ( ) )
if err != nil {
t . Error ( err )
}
if ! bytes . Equal ( Bytes , bytesOut ) {
t . Errorf ( "expected %x got %x" , bytesOut , Bytes )
}
// marshal dynamic bytes output empty
err = abi . unmarshal ( & Bytes , "bytes" , nil )
if err == nil {
t . Error ( "expected error" )
}
// marshal dynamic bytes length 5
buff . Reset ( )
buff . Write ( common . Hex2Bytes ( "0000000000000000000000000000000000000000000000000000000000000020" ) )
buff . Write ( common . Hex2Bytes ( "0000000000000000000000000000000000000000000000000000000000000005" ) )
buff . Write ( common . RightPadBytes ( [ ] byte ( "hello" ) , 32 ) )
err = abi . unmarshal ( & Bytes , "bytes" , buff . Bytes ( ) )
if err != nil {
t . Error ( err )
}
if ! bytes . Equal ( Bytes , [ ] byte ( "hello" ) ) {
t . Errorf ( "expected %x got %x" , bytesOut , Bytes )
}
// marshal error
buff . Reset ( )
buff . Write ( common . Hex2Bytes ( "0000000000000000000000000000000000000000000000000000000000000020" ) )
err = abi . unmarshal ( & Bytes , "bytes" , buff . Bytes ( ) )
if err == nil {
t . Error ( "expected error" )
}
err = abi . unmarshal ( & Bytes , "multi" , make ( [ ] byte , 64 ) )
if err == nil {
t . Error ( "expected error" )
}
// marshal mixed bytes
buff . Reset ( )
buff . Write ( common . Hex2Bytes ( "0000000000000000000000000000000000000000000000000000000000000040" ) )
fixed := common . Hex2Bytes ( "0000000000000000000000000000000000000000000000000000000000000001" )
buff . Write ( fixed )
buff . Write ( common . Hex2Bytes ( "0000000000000000000000000000000000000000000000000000000000000020" ) )
bytesOut = common . RightPadBytes ( [ ] byte ( "hello" ) , 32 )
buff . Write ( bytesOut )
var out [ ] interface { }
err = abi . unmarshal ( & out , "mixedBytes" , buff . Bytes ( ) )
if err != nil {
t . Fatal ( "didn't expect error:" , err )
}
if ! bytes . Equal ( bytesOut , out [ 0 ] . ( [ ] byte ) ) {
t . Errorf ( "expected %x, got %x" , bytesOut , out [ 0 ] )
}
if ! bytes . Equal ( fixed , out [ 1 ] . ( [ ] byte ) ) {
t . Errorf ( "expected %x, got %x" , fixed , out [ 1 ] )
}
}