Source file src/reflect/iter_test.go

     1  // Copyright 2024 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package reflect_test
     6  
     7  import (
     8  	"iter"
     9  	"maps"
    10  	. "reflect"
    11  	"testing"
    12  )
    13  
    14  func TestValueSeq(t *testing.T) {
    15  	m := map[string]int{
    16  		"1": 1,
    17  		"2": 2,
    18  		"3": 3,
    19  		"4": 4,
    20  	}
    21  	c := make(chan int, 3)
    22  	for i := range 3 {
    23  		c <- i
    24  	}
    25  	close(c)
    26  	tests := []struct {
    27  		name  string
    28  		val   Value
    29  		check func(*testing.T, iter.Seq[Value])
    30  	}{
    31  		{"int", ValueOf(4), func(t *testing.T, s iter.Seq[Value]) {
    32  			i := int64(0)
    33  			for v := range s {
    34  				if v.Int() != i {
    35  					t.Fatalf("got %d, want %d", v.Int(), i)
    36  				}
    37  				i++
    38  			}
    39  			if i != 4 {
    40  				t.Fatalf("should loop four times")
    41  			}
    42  		}},
    43  		{"int8", ValueOf(int8(4)), func(t *testing.T, s iter.Seq[Value]) {
    44  			i := int8(0)
    45  			for v := range s {
    46  				if v.Interface().(int8) != i {
    47  					t.Fatalf("got %d, want %d", v.Int(), i)
    48  				}
    49  				i++
    50  			}
    51  			if i != 4 {
    52  				t.Fatalf("should loop four times")
    53  			}
    54  		}},
    55  		{"uint", ValueOf(uint64(4)), func(t *testing.T, s iter.Seq[Value]) {
    56  			i := uint64(0)
    57  			for v := range s {
    58  				if v.Uint() != i {
    59  					t.Fatalf("got %d, want %d", v.Uint(), i)
    60  				}
    61  				i++
    62  			}
    63  			if i != 4 {
    64  				t.Fatalf("should loop four times")
    65  			}
    66  		}},
    67  		{"uint8", ValueOf(uint8(4)), func(t *testing.T, s iter.Seq[Value]) {
    68  			i := uint8(0)
    69  			for v := range s {
    70  				if v.Interface().(uint8) != i {
    71  					t.Fatalf("got %d, want %d", v.Int(), i)
    72  				}
    73  				i++
    74  			}
    75  			if i != 4 {
    76  				t.Fatalf("should loop four times")
    77  			}
    78  		}},
    79  		{"*[4]int", ValueOf(&[4]int{1, 2, 3, 4}), func(t *testing.T, s iter.Seq[Value]) {
    80  			i := int64(0)
    81  			for v := range s {
    82  				if v.Int() != i {
    83  					t.Fatalf("got %d, want %d", v.Int(), i)
    84  				}
    85  				i++
    86  			}
    87  			if i != 4 {
    88  				t.Fatalf("should loop four times")
    89  			}
    90  		}},
    91  		{"[4]int", ValueOf([4]int{1, 2, 3, 4}), func(t *testing.T, s iter.Seq[Value]) {
    92  			i := int64(0)
    93  			for v := range s {
    94  				if v.Int() != i {
    95  					t.Fatalf("got %d, want %d", v.Int(), i)
    96  				}
    97  				i++
    98  			}
    99  			if i != 4 {
   100  				t.Fatalf("should loop four times")
   101  			}
   102  		}},
   103  		{"[]int", ValueOf([]int{1, 2, 3, 4}), func(t *testing.T, s iter.Seq[Value]) {
   104  			i := int64(0)
   105  			for v := range s {
   106  				if v.Int() != i {
   107  					t.Fatalf("got %d, want %d", v.Int(), i)
   108  				}
   109  				i++
   110  			}
   111  			if i != 4 {
   112  				t.Fatalf("should loop four times")
   113  			}
   114  		}},
   115  		{"string", ValueOf("12语言"), func(t *testing.T, s iter.Seq[Value]) {
   116  			i := int64(0)
   117  			indexs := []int64{0, 1, 2, 5}
   118  			for v := range s {
   119  				if v.Int() != indexs[i] {
   120  					t.Fatalf("got %d, want %d", v.Int(), indexs[i])
   121  				}
   122  				i++
   123  			}
   124  			if i != 4 {
   125  				t.Fatalf("should loop four times")
   126  			}
   127  		}},
   128  		{"map[string]int", ValueOf(m), func(t *testing.T, s iter.Seq[Value]) {
   129  			i := int64(0)
   130  			copy := maps.Clone(m)
   131  			for v := range s {
   132  				if _, ok := copy[v.String()]; !ok {
   133  					t.Fatalf("unexpected %v", v.Interface())
   134  				}
   135  				delete(copy, v.String())
   136  				i++
   137  			}
   138  			if len(copy) != 0 {
   139  				t.Fatalf("should loop four times")
   140  			}
   141  		}},
   142  		{"chan int", ValueOf(c), func(t *testing.T, s iter.Seq[Value]) {
   143  			i := 0
   144  			m := map[int64]bool{
   145  				0: false,
   146  				1: false,
   147  				2: false,
   148  			}
   149  			for v := range s {
   150  				if b, ok := m[v.Int()]; !ok || b {
   151  					t.Fatalf("unexpected %v", v.Interface())
   152  				}
   153  				m[v.Int()] = true
   154  				i++
   155  			}
   156  			if i != 3 {
   157  				t.Fatalf("should loop three times")
   158  			}
   159  		}},
   160  		{"func", ValueOf(func(yield func(int) bool) {
   161  			for i := range 4 {
   162  				if !yield(i) {
   163  					return
   164  				}
   165  			}
   166  		}), func(t *testing.T, s iter.Seq[Value]) {
   167  			i := int64(0)
   168  			for v := range s {
   169  				if v.Int() != i {
   170  					t.Fatalf("got %d, want %d", v.Int(), i)
   171  				}
   172  				i++
   173  			}
   174  			if i != 4 {
   175  				t.Fatalf("should loop four times")
   176  			}
   177  		}},
   178  	}
   179  	for _, tc := range tests {
   180  		seq := tc.val.Seq()
   181  		tc.check(t, seq)
   182  	}
   183  }
   184  
   185  func TestValueSeq2(t *testing.T) {
   186  	m := map[string]int{
   187  		"1": 1,
   188  		"2": 2,
   189  		"3": 3,
   190  		"4": 4,
   191  	}
   192  	tests := []struct {
   193  		name  string
   194  		val   Value
   195  		check func(*testing.T, iter.Seq2[Value, Value])
   196  	}{
   197  		{"*[4]int", ValueOf(&[4]int{1, 2, 3, 4}), func(t *testing.T, s iter.Seq2[Value, Value]) {
   198  			i := int64(0)
   199  			for v1, v2 := range s {
   200  				if v1.Int() != i {
   201  					t.Fatalf("got %d, want %d", v1.Int(), i)
   202  				}
   203  				i++
   204  				if v2.Int() != i {
   205  					t.Fatalf("got %d, want %d", v2.Int(), i)
   206  				}
   207  			}
   208  			if i != 4 {
   209  				t.Fatalf("should loop four times")
   210  			}
   211  		}},
   212  		{"[4]int", ValueOf([4]int{1, 2, 3, 4}), func(t *testing.T, s iter.Seq2[Value, Value]) {
   213  			i := int64(0)
   214  			for v1, v2 := range s {
   215  				if v1.Int() != i {
   216  					t.Fatalf("got %d, want %d", v1.Int(), i)
   217  				}
   218  				i++
   219  				if v2.Int() != i {
   220  					t.Fatalf("got %d, want %d", v2.Int(), i)
   221  				}
   222  			}
   223  			if i != 4 {
   224  				t.Fatalf("should loop four times")
   225  			}
   226  		}},
   227  		{"[]int", ValueOf([]int{1, 2, 3, 4}), func(t *testing.T, s iter.Seq2[Value, Value]) {
   228  			i := int64(0)
   229  			for v1, v2 := range s {
   230  				if v1.Int() != i {
   231  					t.Fatalf("got %d, want %d", v1.Int(), i)
   232  				}
   233  				i++
   234  				if v2.Int() != i {
   235  					t.Fatalf("got %d, want %d", v2.Int(), i)
   236  				}
   237  			}
   238  			if i != 4 {
   239  				t.Fatalf("should loop four times")
   240  			}
   241  		}},
   242  		{"string", ValueOf("12语言"), func(t *testing.T, s iter.Seq2[Value, Value]) {
   243  			i := int64(0)
   244  			str := "12语言"
   245  			next, stop := iter.Pull2(s)
   246  			defer stop()
   247  			for j, s := range str {
   248  				v1, v2, ok := next()
   249  				if !ok {
   250  					t.Fatalf("should loop four times")
   251  				}
   252  				if v1.Int() != int64(j) {
   253  					t.Fatalf("got %d, want %d", v1.Int(), j)
   254  				}
   255  				if v2.Interface() != s {
   256  					t.Fatalf("got %v, want %v", v2.Interface(), s)
   257  				}
   258  				i++
   259  			}
   260  			if i != 4 {
   261  				t.Fatalf("should loop four times")
   262  			}
   263  		}},
   264  		{"map[string]int", ValueOf(m), func(t *testing.T, s iter.Seq2[Value, Value]) {
   265  			copy := maps.Clone(m)
   266  			for v1, v2 := range s {
   267  				v, ok := copy[v1.String()]
   268  				if !ok {
   269  					t.Fatalf("unexpected %v", v1.String())
   270  				}
   271  				if v != v2.Interface() {
   272  					t.Fatalf("got %v, want %d", v2.Interface(), v)
   273  				}
   274  				delete(copy, v1.String())
   275  			}
   276  			if len(copy) != 0 {
   277  				t.Fatalf("should loop four times")
   278  			}
   279  		}},
   280  		{"func", ValueOf(func(f func(int, int) bool) {
   281  			for i := range 4 {
   282  				f(i, i+1)
   283  			}
   284  		}), func(t *testing.T, s iter.Seq2[Value, Value]) {
   285  			i := int64(0)
   286  			for v1, v2 := range s {
   287  				if v1.Int() != i {
   288  					t.Fatalf("got %d, want %d", v1.Int(), i)
   289  				}
   290  				i++
   291  				if v2.Int() != i {
   292  					t.Fatalf("got %d, want %d", v2.Int(), i)
   293  				}
   294  			}
   295  			if i != 4 {
   296  				t.Fatalf("should loop four times")
   297  			}
   298  		}},
   299  	}
   300  	for _, tc := range tests {
   301  		seq := tc.val.Seq2()
   302  		tc.check(t, seq)
   303  	}
   304  }
   305  

View as plain text