slice_ptr_test.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package tests
  2. import (
  3. "testing"
  4. "github.com/modern-go/reflect2"
  5. "github.com/modern-go/test"
  6. "unsafe"
  7. "github.com/modern-go/test/must"
  8. "context"
  9. )
  10. func Test_slice_ptr(t *testing.T) {
  11. var pInt = func(val int) *int {
  12. return &val
  13. }
  14. t.Run("MakeSlice", testOp(func(api reflect2.API) interface{} {
  15. valType := api.TypeOf([]*int{}).(reflect2.SliceType)
  16. obj := valType.MakeSlice(5, 10)
  17. (*obj.(*[]*int))[0] = pInt(1)
  18. (*obj.(*[]*int))[4] = pInt(5)
  19. return obj
  20. }))
  21. t.Run("SetIndex", testOp(func(api reflect2.API) interface{} {
  22. obj := []*int{pInt(1), nil}
  23. valType := api.TypeOf(obj).(reflect2.SliceType)
  24. elem1 := pInt(2)
  25. valType.SetIndex(&obj, 0, &elem1)
  26. elem2 := pInt(3)
  27. valType.SetIndex(&obj, 1, &elem2)
  28. return obj
  29. }))
  30. t.Run("UnsafeSetIndex", test.Case(func(ctx context.Context) {
  31. obj := []*int{pInt(1), nil}
  32. valType := reflect2.TypeOf(obj).(reflect2.SliceType)
  33. elem1 := pInt(2)
  34. valType.UnsafeSetIndex(unsafe.Pointer(&obj), 0, unsafe.Pointer(&elem1))
  35. elem2 := pInt(1)
  36. valType.UnsafeSetIndex(unsafe.Pointer(&obj), 1, unsafe.Pointer(&elem2))
  37. must.Equal([]*int{pInt(2), pInt(1)}, obj)
  38. }))
  39. t.Run("GetIndex", testOp(func(api reflect2.API) interface{} {
  40. obj := []*int{pInt(1), nil}
  41. valType := api.TypeOf(obj).(reflect2.SliceType)
  42. return []interface{}{
  43. valType.GetIndex(&obj, 0),
  44. valType.GetIndex(&obj, 1),
  45. }
  46. }))
  47. t.Run("Append", testOp(func(api reflect2.API) interface{} {
  48. obj := make([]*int, 2, 3)
  49. obj[0] = pInt(1)
  50. obj[1] = pInt(2)
  51. valType := api.TypeOf(obj).(reflect2.SliceType)
  52. elem1 := pInt(3)
  53. valType.Append(&obj, &elem1)
  54. // will trigger grow
  55. elem2 := pInt(4)
  56. valType.Append(&obj, &elem2)
  57. return obj
  58. }))
  59. }