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 }