| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- package tests
- import (
- "github.com/modern-go/reflect2"
- "github.com/modern-go/test"
- "testing"
- "context"
- "github.com/modern-go/test/must"
- )
- func Test_slice(t *testing.T) {
- var pInt = func(val int) *int {
- return &val
- }
- t.Run("New", testOp(func(api reflect2.API) interface{} {
- valType := api.TypeOf([]int{})
- obj := *valType.New().(*[]int)
- obj = append(obj, 1)
- return obj
- }))
- t.Run("IsNil", testOp(func(api reflect2.API) interface{} {
- valType := api.TypeOf([]int{})
- var nilSlice []int
- s := []int{}
- return []interface{}{
- valType.IsNil(&nilSlice),
- valType.IsNil(&s),
- valType.IsNil(nil),
- }
- }))
- t.Run("SetNil", testOp(func(api reflect2.API) interface{} {
- valType := api.TypeOf([]int{}).(reflect2.SliceType)
- s := []int{1}
- valType.SetNil(&s)
- return s
- }))
- t.Run("Set", testOp(func(api reflect2.API) interface{} {
- valType := api.TypeOf([]int{}).(reflect2.SliceType)
- s1 := []int{1}
- s2 := []int{2}
- valType.Set(&s1, &s2)
- return s1
- }))
- t.Run("MakeSlice", testOp(func(api reflect2.API) interface{} {
- valType := api.TypeOf([]int{}).(reflect2.SliceType)
- obj := *(valType.MakeSlice(5, 10).(*[]int))
- obj[0] = 100
- obj[4] = 20
- return obj
- }))
- t.Run("UnsafeMakeSlice", test.Case(func(ctx context.Context) {
- valType := reflect2.TypeOf([]int{}).(reflect2.SliceType)
- obj := valType.UnsafeMakeSlice(5, 10)
- must.Equal(&[]int{0, 0, 0, 0, 0}, valType.PackEFace(obj))
- }))
- t.Run("SetIndex", testOp(func(api reflect2.API) interface{} {
- obj := []int{1, 2}
- valType := api.TypeOf(obj).(reflect2.SliceType)
- valType.SetIndex(&obj, 0, pInt(100))
- valType.SetIndex(&obj, 1, pInt(20))
- return obj
- }))
- t.Run("UnsafeSetIndex", test.Case(func(ctx context.Context) {
- obj := []int{1, 2}
- valType := reflect2.TypeOf(obj).(reflect2.SliceType)
- valType.UnsafeSetIndex(reflect2.PtrOf(obj), 0, reflect2.PtrOf(100))
- valType.UnsafeSetIndex(reflect2.PtrOf(obj), 1, reflect2.PtrOf(10))
- must.Equal([]int{100, 10}, obj)
- }))
- t.Run("GetIndex", testOp(func(api reflect2.API) interface{} {
- obj := []int{1, 2}
- valType := api.TypeOf(obj).(reflect2.SliceType)
- return []interface{}{
- valType.GetIndex(&obj, 1).(*int),
- }
- }))
- t.Run("UnsafeGetIndex", test.Case(func(ctx context.Context) {
- obj := []int{1, 2}
- valType := reflect2.TypeOf(obj).(reflect2.SliceType)
- elem0 := valType.UnsafeGetIndex(reflect2.PtrOf(obj), 0)
- must.Equal(1, *(*int)(elem0))
- elem1 := valType.UnsafeGetIndex(reflect2.PtrOf(obj), 1)
- must.Equal(2, *(*int)(elem1))
- }))
- t.Run("Append", testOp(func(api reflect2.API) interface{} {
- obj := make([]int, 2, 3)
- obj[0] = 1
- obj[1] = 2
- valType := api.TypeOf(obj).(reflect2.SliceType)
- ptr := &obj
- valType.Append(ptr, pInt(3))
- // will trigger grow
- valType.Append(ptr, pInt(4))
- return ptr
- }))
- t.Run("UnsafeAppend", test.Case(func(ctx context.Context) {
- obj := make([]int, 2, 3)
- obj[0] = 1
- obj[1] = 2
- valType := reflect2.TypeOf(obj).(reflect2.SliceType)
- ptr := reflect2.PtrOf(obj)
- valType.UnsafeAppend(ptr, reflect2.PtrOf(3))
- valType.UnsafeAppend(ptr, reflect2.PtrOf(4))
- must.Equal(&[]int{1, 2, 3, 4}, valType.PackEFace(ptr))
- }))
- t.Run("Grow", testOp(func(api reflect2.API) interface{} {
- obj := make([]int, 2, 3)
- obj[0] = 1
- obj[1] = 2
- valType := reflect2.TypeOf(obj).(reflect2.SliceType)
- valType.Grow(&obj, 4)
- return obj
- }))
- }
|