diff options
Diffstat (limited to 'src/reflect/all_test.go')
-rw-r--r-- | src/reflect/all_test.go | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/src/reflect/all_test.go b/src/reflect/all_test.go index a886f9f64a..9eb01bde35 100644 --- a/src/reflect/all_test.go +++ b/src/reflect/all_test.go @@ -7823,3 +7823,159 @@ func TestNegativeKindString(t *testing.T) { t.Fatalf("Kind(-1).String() = %q, want %q", s, want) } } + +type ( + namedBool bool + namedBytes []byte +) + +var sourceAll = struct { + Bool Value + String Value + Bytes Value + NamedBytes Value + BytesArray Value + SliceAny Value + MapStringAny Value +}{ + Bool: ValueOf(new(bool)).Elem(), + String: ValueOf(new(string)).Elem(), + Bytes: ValueOf(new([]byte)).Elem(), + NamedBytes: ValueOf(new(namedBytes)).Elem(), + BytesArray: ValueOf(new([32]byte)).Elem(), + SliceAny: ValueOf(new([]any)).Elem(), + MapStringAny: ValueOf(new(map[string]any)).Elem(), +} + +var sinkAll struct { + RawBool bool + RawString string + RawBytes []byte + RawInt int +} + +func BenchmarkBool(b *testing.B) { + for i := 0; i < b.N; i++ { + sinkAll.RawBool = sourceAll.Bool.Bool() + } +} + +func BenchmarkString(b *testing.B) { + for i := 0; i < b.N; i++ { + sinkAll.RawString = sourceAll.String.String() + } +} + +func BenchmarkBytes(b *testing.B) { + for i := 0; i < b.N; i++ { + sinkAll.RawBytes = sourceAll.Bytes.Bytes() + } +} + +func BenchmarkNamedBytes(b *testing.B) { + for i := 0; i < b.N; i++ { + sinkAll.RawBytes = sourceAll.NamedBytes.Bytes() + } +} + +func BenchmarkBytesArray(b *testing.B) { + for i := 0; i < b.N; i++ { + sinkAll.RawBytes = sourceAll.BytesArray.Bytes() + } +} + +func BenchmarkSliceLen(b *testing.B) { + for i := 0; i < b.N; i++ { + sinkAll.RawInt = sourceAll.SliceAny.Len() + } +} + +func BenchmarkMapLen(b *testing.B) { + for i := 0; i < b.N; i++ { + sinkAll.RawInt = sourceAll.MapStringAny.Len() + } +} + +func BenchmarkStringLen(b *testing.B) { + for i := 0; i < b.N; i++ { + sinkAll.RawInt = sourceAll.String.Len() + } +} + +func BenchmarkArrayLen(b *testing.B) { + for i := 0; i < b.N; i++ { + sinkAll.RawInt = sourceAll.BytesArray.Len() + } +} + +func BenchmarkSliceCap(b *testing.B) { + for i := 0; i < b.N; i++ { + sinkAll.RawInt = sourceAll.SliceAny.Cap() + } +} + +func TestValue_Cap(t *testing.T) { + a := &[3]int{1, 2, 3} + v := ValueOf(a) + if v.Cap() != cap(a) { + t.Errorf("Cap = %d want %d", v.Cap(), cap(a)) + } + + a = nil + v = ValueOf(a) + if v.Cap() != cap(a) { + t.Errorf("Cap = %d want %d", v.Cap(), cap(a)) + } + + getError := func(f func()) (errorStr string) { + defer func() { + e := recover() + if str, ok := e.(string); ok { + errorStr = str + } + }() + f() + return + } + e := getError(func() { + var ptr *int + ValueOf(ptr).Cap() + }) + wantStr := "reflect: call of reflect.Value.Cap on ptr to non-array Value" + if e != wantStr { + t.Errorf("error is %q, want %q", e, wantStr) + } +} + +func TestValue_Len(t *testing.T) { + a := &[3]int{1, 2, 3} + v := ValueOf(a) + if v.Len() != len(a) { + t.Errorf("Len = %d want %d", v.Len(), len(a)) + } + + a = nil + v = ValueOf(a) + if v.Len() != len(a) { + t.Errorf("Len = %d want %d", v.Len(), len(a)) + } + + getError := func(f func()) (errorStr string) { + defer func() { + e := recover() + if str, ok := e.(string); ok { + errorStr = str + } + }() + f() + return + } + e := getError(func() { + var ptr *int + ValueOf(ptr).Len() + }) + wantStr := "reflect: call of reflect.Value.Len on ptr to non-array Value" + if e != wantStr { + t.Errorf("error is %q, want %q", e, wantStr) + } +} |