mirror of
https://github.com/golang/go.git
synced 2025-10-20 03:23:18 +00:00
281 lines
5.9 KiB
Go
281 lines
5.9 KiB
Go
![]() |
// Copyright 2024 The Go Authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style
|
||
|
// license that can be found in the LICENSE file.
|
||
|
|
||
|
package reflect_test
|
||
|
|
||
|
import (
|
||
|
"iter"
|
||
|
"maps"
|
||
|
. "reflect"
|
||
|
"testing"
|
||
|
)
|
||
|
|
||
|
func TestValueSeq(t *testing.T) {
|
||
|
m := map[string]int{
|
||
|
"1": 1,
|
||
|
"2": 2,
|
||
|
"3": 3,
|
||
|
"4": 4,
|
||
|
}
|
||
|
c := make(chan int, 3)
|
||
|
for i := range 3 {
|
||
|
c <- i
|
||
|
}
|
||
|
close(c)
|
||
|
tests := []struct {
|
||
|
name string
|
||
|
val Value
|
||
|
check func(*testing.T, iter.Seq[Value])
|
||
|
}{
|
||
|
{"int", ValueOf(4), func(t *testing.T, s iter.Seq[Value]) {
|
||
|
i := int64(0)
|
||
|
for v := range s {
|
||
|
if v.Int() != i {
|
||
|
t.Fatalf("got %d, want %d", v.Int(), i)
|
||
|
}
|
||
|
i++
|
||
|
}
|
||
|
if i != 4 {
|
||
|
t.Fatalf("should loop four times")
|
||
|
}
|
||
|
}},
|
||
|
{"uint", ValueOf(uint64(4)), func(t *testing.T, s iter.Seq[Value]) {
|
||
|
i := uint64(0)
|
||
|
for v := range s {
|
||
|
if v.Uint() != i {
|
||
|
t.Fatalf("got %d, want %d", v.Uint(), i)
|
||
|
}
|
||
|
i++
|
||
|
}
|
||
|
if i != 4 {
|
||
|
t.Fatalf("should loop four times")
|
||
|
}
|
||
|
}},
|
||
|
{"*[4]int", ValueOf(&[4]int{1, 2, 3, 4}), func(t *testing.T, s iter.Seq[Value]) {
|
||
|
i := int64(0)
|
||
|
for v := range s {
|
||
|
if v.Int() != i {
|
||
|
t.Fatalf("got %d, want %d", v.Int(), i)
|
||
|
}
|
||
|
i++
|
||
|
}
|
||
|
if i != 4 {
|
||
|
t.Fatalf("should loop four times")
|
||
|
}
|
||
|
}},
|
||
|
{"[4]int", ValueOf([4]int{1, 2, 3, 4}), func(t *testing.T, s iter.Seq[Value]) {
|
||
|
i := int64(0)
|
||
|
for v := range s {
|
||
|
if v.Int() != i {
|
||
|
t.Fatalf("got %d, want %d", v.Int(), i)
|
||
|
}
|
||
|
i++
|
||
|
}
|
||
|
if i != 4 {
|
||
|
t.Fatalf("should loop four times")
|
||
|
}
|
||
|
}},
|
||
|
{"[]int", ValueOf([]int{1, 2, 3, 4}), func(t *testing.T, s iter.Seq[Value]) {
|
||
|
i := int64(0)
|
||
|
for v := range s {
|
||
|
if v.Int() != i {
|
||
|
t.Fatalf("got %d, want %d", v.Int(), i)
|
||
|
}
|
||
|
i++
|
||
|
}
|
||
|
if i != 4 {
|
||
|
t.Fatalf("should loop four times")
|
||
|
}
|
||
|
}},
|
||
|
{"string", ValueOf("12语言"), func(t *testing.T, s iter.Seq[Value]) {
|
||
|
i := int64(0)
|
||
|
indexs := []int64{0, 1, 2, 5}
|
||
|
for v := range s {
|
||
|
if v.Int() != indexs[i] {
|
||
|
t.Fatalf("got %d, want %d", v.Int(), indexs[i])
|
||
|
}
|
||
|
i++
|
||
|
}
|
||
|
if i != 4 {
|
||
|
t.Fatalf("should loop four times")
|
||
|
}
|
||
|
}},
|
||
|
{"map[string]int", ValueOf(m), func(t *testing.T, s iter.Seq[Value]) {
|
||
|
i := int64(0)
|
||
|
copy := maps.Clone(m)
|
||
|
for v := range s {
|
||
|
if _, ok := copy[v.String()]; !ok {
|
||
|
t.Fatalf("unexpected %v", v.Interface())
|
||
|
}
|
||
|
delete(copy, v.String())
|
||
|
i++
|
||
|
}
|
||
|
if len(copy) != 0 {
|
||
|
t.Fatalf("should loop four times")
|
||
|
}
|
||
|
}},
|
||
|
{"chan int", ValueOf(c), func(t *testing.T, s iter.Seq[Value]) {
|
||
|
i := 0
|
||
|
m := map[int64]bool{
|
||
|
0: false,
|
||
|
1: false,
|
||
|
2: false,
|
||
|
}
|
||
|
for v := range s {
|
||
|
if b, ok := m[v.Int()]; !ok || b {
|
||
|
t.Fatalf("unexpected %v", v.Interface())
|
||
|
}
|
||
|
m[v.Int()] = true
|
||
|
i++
|
||
|
}
|
||
|
if i != 3 {
|
||
|
t.Fatalf("should loop three times")
|
||
|
}
|
||
|
}},
|
||
|
{"func", ValueOf(func(yield func(int) bool) {
|
||
|
for i := range 4 {
|
||
|
if !yield(i) {
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
}), func(t *testing.T, s iter.Seq[Value]) {
|
||
|
i := int64(0)
|
||
|
for v := range s {
|
||
|
if v.Int() != i {
|
||
|
t.Fatalf("got %d, want %d", v.Int(), i)
|
||
|
}
|
||
|
i++
|
||
|
}
|
||
|
if i != 4 {
|
||
|
t.Fatalf("should loop four times")
|
||
|
}
|
||
|
}},
|
||
|
}
|
||
|
for _, tc := range tests {
|
||
|
seq := tc.val.Seq()
|
||
|
tc.check(t, seq)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestValueSeq2(t *testing.T) {
|
||
|
m := map[string]int{
|
||
|
"1": 1,
|
||
|
"2": 2,
|
||
|
"3": 3,
|
||
|
"4": 4,
|
||
|
}
|
||
|
tests := []struct {
|
||
|
name string
|
||
|
val Value
|
||
|
check func(*testing.T, iter.Seq2[Value, Value])
|
||
|
}{
|
||
|
{"*[4]int", ValueOf(&[4]int{1, 2, 3, 4}), func(t *testing.T, s iter.Seq2[Value, Value]) {
|
||
|
i := int64(0)
|
||
|
for v1, v2 := range s {
|
||
|
if v1.Int() != i {
|
||
|
t.Fatalf("got %d, want %d", v1.Int(), i)
|
||
|
}
|
||
|
i++
|
||
|
if v2.Int() != i {
|
||
|
t.Fatalf("got %d, want %d", v2.Int(), i)
|
||
|
}
|
||
|
}
|
||
|
if i != 4 {
|
||
|
t.Fatalf("should loop four times")
|
||
|
}
|
||
|
}},
|
||
|
{"[4]int", ValueOf([4]int{1, 2, 3, 4}), func(t *testing.T, s iter.Seq2[Value, Value]) {
|
||
|
i := int64(0)
|
||
|
for v1, v2 := range s {
|
||
|
if v1.Int() != i {
|
||
|
t.Fatalf("got %d, want %d", v1.Int(), i)
|
||
|
}
|
||
|
i++
|
||
|
if v2.Int() != i {
|
||
|
t.Fatalf("got %d, want %d", v2.Int(), i)
|
||
|
}
|
||
|
}
|
||
|
if i != 4 {
|
||
|
t.Fatalf("should loop four times")
|
||
|
}
|
||
|
}},
|
||
|
{"[]int", ValueOf([]int{1, 2, 3, 4}), func(t *testing.T, s iter.Seq2[Value, Value]) {
|
||
|
i := int64(0)
|
||
|
for v1, v2 := range s {
|
||
|
if v1.Int() != i {
|
||
|
t.Fatalf("got %d, want %d", v1.Int(), i)
|
||
|
}
|
||
|
i++
|
||
|
if v2.Int() != i {
|
||
|
t.Fatalf("got %d, want %d", v2.Int(), i)
|
||
|
}
|
||
|
}
|
||
|
if i != 4 {
|
||
|
t.Fatalf("should loop four times")
|
||
|
}
|
||
|
}},
|
||
|
{"string", ValueOf("12语言"), func(t *testing.T, s iter.Seq2[Value, Value]) {
|
||
|
i := int64(0)
|
||
|
str := "12语言"
|
||
|
next, stop := iter.Pull2(s)
|
||
|
defer stop()
|
||
|
for j, s := range str {
|
||
|
v1, v2, ok := next()
|
||
|
if !ok {
|
||
|
t.Fatalf("should loop four times")
|
||
|
}
|
||
|
if v1.Int() != int64(j) {
|
||
|
t.Fatalf("got %d, want %d", v1.Int(), j)
|
||
|
}
|
||
|
if v2.Interface() != s {
|
||
|
t.Fatalf("got %v, want %v", v2.Interface(), s)
|
||
|
}
|
||
|
i++
|
||
|
}
|
||
|
if i != 4 {
|
||
|
t.Fatalf("should loop four times")
|
||
|
}
|
||
|
}},
|
||
|
{"map[string]int", ValueOf(m), func(t *testing.T, s iter.Seq2[Value, Value]) {
|
||
|
copy := maps.Clone(m)
|
||
|
for v1, v2 := range s {
|
||
|
v, ok := copy[v1.String()]
|
||
|
if !ok {
|
||
|
t.Fatalf("unexpected %v", v1.String())
|
||
|
}
|
||
|
if v != v2.Interface() {
|
||
|
t.Fatalf("got %v, want %d", v2.Interface(), v)
|
||
|
}
|
||
|
delete(copy, v1.String())
|
||
|
}
|
||
|
if len(copy) != 0 {
|
||
|
t.Fatalf("should loop four times")
|
||
|
}
|
||
|
}},
|
||
|
{"func", ValueOf(func(f func(int, int) bool) {
|
||
|
for i := range 4 {
|
||
|
f(i, i+1)
|
||
|
}
|
||
|
}), func(t *testing.T, s iter.Seq2[Value, Value]) {
|
||
|
i := int64(0)
|
||
|
for v1, v2 := range s {
|
||
|
if v1.Int() != i {
|
||
|
t.Fatalf("got %d, want %d", v1.Int(), i)
|
||
|
}
|
||
|
i++
|
||
|
if v2.Int() != i {
|
||
|
t.Fatalf("got %d, want %d", v2.Int(), i)
|
||
|
}
|
||
|
}
|
||
|
if i != 4 {
|
||
|
t.Fatalf("should loop four times")
|
||
|
}
|
||
|
}},
|
||
|
}
|
||
|
for _, tc := range tests {
|
||
|
seq := tc.val.Seq2()
|
||
|
tc.check(t, seq)
|
||
|
}
|
||
|
}
|