// 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) } }