github.com/mavryk-network/mvgo@v1.19.9/contract/bind/unmarshal_test.go (about)

     1  package bind
     2  
     3  import (
     4  	"math/big"
     5  	"reflect"
     6  	"testing"
     7  
     8  	"github.com/mavryk-network/mvgo/mavryk"
     9  	"github.com/mavryk-network/mvgo/micheline"
    10  
    11  	"github.com/stretchr/testify/require"
    12  )
    13  
    14  var testAddress = mavryk.MustParseAddress("mv1CQJA6XDWcpVgVbxgSCTa69AW1y8iHbLx5")
    15  
    16  func TestUnmarshalPrim(t *testing.T) {
    17  	cases := map[string]struct {
    18  		prim micheline.Prim
    19  		dst  any
    20  		want any
    21  		wErr error
    22  	}{
    23  		"string":        {prim: micheline.NewString("hello"), dst: "", want: "hello"},
    24  		"bigInt":        {prim: micheline.NewInt64(42), dst: &big.Int{}, want: big.NewInt(42)},
    25  		"bytes":         {prim: micheline.NewBytes([]byte{4, 2}), dst: []byte{}, want: []byte{4, 2}},
    26  		"address":       {prim: micheline.NewString(testAddress.String()), dst: mavryk.Address{}, want: testAddress},
    27  		"string slice":  {prim: micheline.NewSeq(micheline.NewString("1"), micheline.NewString("2")), dst: []string{}, want: []string{"1", "2"}},
    28  		"struct":        {prim: micheline.NewPair(micheline.NewString("aaa"), micheline.NewPair(micheline.NewInt64(42), micheline.NewBytes([]byte{1, 2, 3}))), dst: (*unmarshaler)(nil), want: &unmarshaler{"aaa", big.NewInt(42), []byte{1, 2, 3}}},
    29  		"nested struct": {prim: micheline.NewPair(micheline.NewPair(micheline.NewString("aaa"), micheline.NewPair(micheline.NewInt64(42), micheline.NewBytes([]byte{1, 2, 3}))), micheline.NewString("uuu")), dst: (*nestedUnmarshaler)(nil), want: &nestedUnmarshaler{&unmarshaler{"aaa", big.NewInt(42), []byte{1, 2, 3}}, "uuu"}},
    30  	}
    31  
    32  	for name, c := range cases {
    33  		t.Run(name, func(t *testing.T) {
    34  			val := reflect.New(reflect.TypeOf(c.dst))
    35  			val.Elem().Set(reflect.ValueOf(c.dst))
    36  
    37  			err := UnmarshalPrim(c.prim, val.Interface())
    38  			if c.wErr != nil {
    39  				require.ErrorIs(t, err, c.wErr)
    40  				return
    41  			}
    42  			require.NoError(t, err)
    43  			require.Equal(t, c.want, val.Elem().Interface())
    44  		})
    45  	}
    46  }
    47  
    48  type unmarshaler struct {
    49  	A string
    50  	B *big.Int
    51  	C []byte
    52  }
    53  
    54  func (u *unmarshaler) UnmarshalPrim(prim micheline.Prim) error {
    55  	return UnmarshalPrimPaths(prim, map[string]any{"l": &u.A, "r/l": &u.B, "r/r": &u.C})
    56  }
    57  
    58  type nestedUnmarshaler struct {
    59  	U *unmarshaler
    60  	S string
    61  }
    62  
    63  func (u *nestedUnmarshaler) UnmarshalPrim(prim micheline.Prim) error {
    64  	return UnmarshalPrimPaths(prim, map[string]any{"l": &u.U, "r": &u.S})
    65  }