...
1 package blackmagic_test
2
3 import (
4 "testing"
5
6 "github.com/lestrrat-go/blackmagic"
7 "github.com/stretchr/testify/assert"
8 "github.com/stretchr/testify/require"
9 )
10
11 func TestAssignment(t *testing.T) {
12 testcases := []struct {
13 Name string
14 Error bool
15 Value interface{}
16 Destination func() interface{}
17 }{
18 {
19 Name: `empty struct`,
20 Error: false,
21 Value: struct{}{},
22 Destination: func() interface{} {
23 var v interface{}
24 return &v
25 },
26 },
27 {
28 Name: `non pointer destination`,
29 Error: true,
30 Value: &struct{}{},
31 },
32 {
33 Name: `assign empty struct to int`,
34 Error: true,
35 Value: &struct{}{},
36 Destination: func() interface{} {
37 var v int
38 return &v
39 },
40 },
41 }
42
43 for _, tc := range testcases {
44 tc := tc
45 t.Run(tc.Name, func(t *testing.T) {
46 var dst interface{}
47 if dstFunc := tc.Destination; dstFunc != nil {
48 dst = dstFunc()
49 }
50 err := blackmagic.AssignIfCompatible(dst, tc.Value)
51 if tc.Error {
52 if !assert.Error(t, err, `blackmagic.AssignIfCompatible should fail`) {
53 return
54 }
55 } else {
56 if !assert.NoError(t, err, `blackmagic.AssignIfCompatible should succeed`) {
57 return
58 }
59 }
60 })
61 }
62 }
63
64 func TestAssignOptionalField(t *testing.T) {
65 var f struct {
66 Foo *string
67 Bar *int
68 }
69
70 require.NoError(t, blackmagic.AssignOptionalField(&f.Foo, "Hello"), `blackmagic.AssignOptionalField should succeed`)
71 require.Equal(t, *(f.Foo), "Hello")
72 require.NoError(t, blackmagic.AssignOptionalField(&f.Bar, 1), `blackmagic.AssignOptionalField should succeed`)
73 require.Equal(t, *(f.Bar), 1)
74 }
75
View as plain text