forked from github/multus-cni
116 lines
3.3 KiB
Go
116 lines
3.3 KiB
Go
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
|
|
}))
|
|
}
|