slice_iface_test.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package test
  2. import (
  3. "testing"
  4. "github.com/modern-go/reflect2"
  5. "errors"
  6. "github.com/v2pro/plz/test"
  7. "github.com/v2pro/plz/countlog"
  8. "unsafe"
  9. "github.com/v2pro/plz/test/must"
  10. )
  11. func Test_slice_iface(t *testing.T) {
  12. var pError = func(msg string) *error {
  13. err := errors.New(msg)
  14. return &err
  15. }
  16. t.Run("MakeSlice", testOp(func(api reflect2.API) interface{} {
  17. valType := api.TypeOf([]error{}).(reflect2.SliceType)
  18. obj := *(valType.MakeSlice(5, 10).(*[]error))
  19. obj[0] = errors.New("hello")
  20. obj[4] = errors.New("world")
  21. return obj
  22. }))
  23. t.Run("SetIndex", testOp(func(api reflect2.API) interface{} {
  24. obj := []error{errors.New("hello"), nil}
  25. valType := api.TypeOf(obj).(reflect2.SliceType)
  26. valType.SetIndex(&obj, 0, pError("hi"))
  27. valType.SetIndex(&obj, 1, pError("world"))
  28. return obj
  29. }))
  30. t.Run("UnsafeSetIndex", test.Case(func(ctx *countlog.Context) {
  31. obj := []error{errors.New("hello"), nil}
  32. valType := reflect2.TypeOf(obj).(reflect2.SliceType)
  33. elem0 := errors.New("hi")
  34. valType.UnsafeSetIndex(reflect2.PtrOf(obj), 0, unsafe.Pointer(&elem0))
  35. elem1 := errors.New("world")
  36. valType.UnsafeSetIndex(reflect2.PtrOf(obj), 1, unsafe.Pointer(&elem1))
  37. must.Equal([]error{elem0, elem1}, obj)
  38. }))
  39. t.Run("GetIndex", testOp(func(api reflect2.API) interface{} {
  40. obj := []error{errors.New("hello"), 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("UnsafeGetIndex", test.Case(func(ctx *countlog.Context) {
  48. obj := []error{errors.New("hello"), nil}
  49. valType := reflect2.TypeOf(obj).(reflect2.SliceType)
  50. elem0 := valType.UnsafeGetIndex(reflect2.PtrOf(obj), 0)
  51. must.Equal(errors.New("hello"), *(*error)(elem0))
  52. }))
  53. t.Run("Append", testOp(func(api reflect2.API) interface{} {
  54. obj := make([]error, 2, 3)
  55. obj[0] = errors.New("1")
  56. obj[1] = errors.New("2")
  57. valType := api.TypeOf(obj).(reflect2.SliceType)
  58. ptr := &obj
  59. valType.Append(ptr, pError("3"))
  60. // will trigger grow
  61. valType.Append(ptr, pError("4"))
  62. return ptr
  63. }))
  64. t.Run("UnsafeAppend", test.Case(func(ctx *countlog.Context) {
  65. obj := make([]error, 2, 3)
  66. obj[0] = errors.New("1")
  67. obj[1] = errors.New("2")
  68. valType := reflect2.TypeOf(obj).(reflect2.SliceType)
  69. ptr := reflect2.PtrOf(obj)
  70. elem2 := errors.New("3")
  71. valType.UnsafeAppend(ptr, unsafe.Pointer(&elem2))
  72. elem3 := errors.New("4")
  73. valType.UnsafeAppend(ptr, unsafe.Pointer(&elem3))
  74. must.Equal(&[]error{
  75. obj[0], obj[1], elem2, elem3,
  76. }, valType.PackEFace(ptr))
  77. }))
  78. }