blob: 9b78fcf7247f5fc5b60fe1022f80a099965ed2a7 [file] [log] [blame]
// 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")
}
}},
{"int8", ValueOf(int8(4)), func(t *testing.T, s iter.Seq[Value]) {
i := int8(0)
for v := range s {
if v.Interface().(int8) != 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")
}
}},
{"uint8", ValueOf(uint8(4)), func(t *testing.T, s iter.Seq[Value]) {
i := uint8(0)
for v := range s {
if v.Interface().(uint8) != 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")
}
}},
{"[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)
}
}