| package tests |
| |
| import ( |
| "github.com/modern-go/reflect2" |
| "github.com/modern-go/test" |
| "testing" |
| |
| "context" |
| "github.com/modern-go/test/must" |
| "unsafe" |
| ) |
| |
| func Test_struct(t *testing.T) { |
| type TestObject struct { |
| Field1 int |
| Field2 int |
| } |
| var pInt = func(val int) *int { |
| return &val |
| } |
| t.Run("New", testOp(func(api reflect2.API) interface{} { |
| valType := api.TypeOf(TestObject{}) |
| obj := valType.New() |
| obj.(*TestObject).Field1 = 20 |
| obj.(*TestObject).Field2 = 100 |
| return obj |
| })) |
| t.Run("PackEFace", test.Case(func(ctx context.Context) { |
| valType := reflect2.TypeOf(TestObject{}) |
| ptr := valType.UnsafeNew() |
| must.Equal(&TestObject{}, valType.PackEFace(ptr)) |
| })) |
| t.Run("Indirect", test.Case(func(ctx context.Context) { |
| valType := reflect2.TypeOf(TestObject{}) |
| must.Equal(TestObject{}, valType.Indirect(&TestObject{})) |
| })) |
| t.Run("SetIndex", testOp(func(api reflect2.API) interface{} { |
| valType := api.TypeOf(TestObject{}).(reflect2.StructType) |
| field1 := valType.FieldByName("Field1") |
| obj := TestObject{} |
| field1.Set(&obj, pInt(100)) |
| return obj |
| })) |
| t.Run("UnsafeSetIndex", test.Case(func(ctx context.Context) { |
| valType := reflect2.TypeOf(TestObject{}).(reflect2.StructType) |
| field1 := valType.FieldByName("Field1") |
| obj := TestObject{} |
| field1.UnsafeSet(unsafe.Pointer(&obj), reflect2.PtrOf(100)) |
| must.Equal(100, obj.Field1) |
| })) |
| t.Run("GetIndex", testOp(func(api reflect2.API) interface{} { |
| obj := TestObject{Field1: 100} |
| valType := api.TypeOf(obj).(reflect2.StructType) |
| field1 := valType.FieldByName("Field1") |
| return field1.Get(&obj) |
| })) |
| t.Run("UnsafeGetIndex", test.Case(func(ctx context.Context) { |
| obj := TestObject{Field1: 100} |
| valType := reflect2.TypeOf(obj).(reflect2.StructType) |
| field1 := valType.FieldByName("Field1") |
| value := field1.UnsafeGet(unsafe.Pointer(&obj)) |
| must.Equal(100, *(*int)(value)) |
| })) |
| } |