Skip to content

Commit f42e14c

Browse files
test: add test cases for range over function types
Add three test cases for Go 1.23 iterator function support: - TestForRangeFunc0: 0-value iterator (for range foo {}) - TestForRangeFunc1: 1-value iterator (for v := range bar {}) - TestForRangeFunc2: 2-value iterator (for k, v := range weekdays {}) Generated with [codeagent](https://github.com/qbox/codeagent) Co-authored-by: xushiwei <[email protected]>
1 parent 0959f19 commit f42e14c

1 file changed

Lines changed: 98 additions & 0 deletions

File tree

package_test.go

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2749,6 +2749,104 @@ func main() {
27492749
`)
27502750
}
27512751

2752+
func TestForRangeFunc0(t *testing.T) {
2753+
// Test range over func(yield func() bool) - 0 values
2754+
pkg := newMainPackage()
2755+
// Define iterator function type: func(yield func() bool)
2756+
yieldSig := types.NewSignatureType(nil, nil, nil, nil, types.NewTuple(types.NewVar(token.NoPos, nil, "", types.Typ[types.Bool])), false)
2757+
yieldParam := pkg.NewParam(token.NoPos, "yield", yieldSig)
2758+
iterSig := types.NewTuple(yieldParam)
2759+
2760+
// Define foo function
2761+
pkg.NewFunc(nil, "foo", iterSig, nil, false).BodyStart(pkg).
2762+
End()
2763+
2764+
pkg.NewFunc(nil, "main", nil, nil, false).BodyStart(pkg).
2765+
ForRange().Val(ctxRef(pkg, "foo")).RangeAssignThen(token.NoPos).
2766+
Val(pkg.Import("fmt").Ref("Println")).Val("Hi").Call(1).EndStmt().
2767+
End().
2768+
End()
2769+
domTest(t, pkg, `package main
2770+
2771+
import "fmt"
2772+
2773+
func foo(yield func() bool) {
2774+
}
2775+
func main() {
2776+
for range foo {
2777+
fmt.Println("Hi")
2778+
}
2779+
}
2780+
`)
2781+
}
2782+
2783+
func TestForRangeFunc1(t *testing.T) {
2784+
// Test range over func(yield func(V) bool) - 1 value
2785+
pkg := newMainPackage()
2786+
// Define iterator function type: func(yield func(string) bool)
2787+
yieldParamV := types.NewVar(token.NoPos, nil, "v", types.Typ[types.String])
2788+
yieldRet := types.NewVar(token.NoPos, nil, "", types.Typ[types.Bool])
2789+
yieldSig := types.NewSignatureType(nil, nil, nil, types.NewTuple(yieldParamV), types.NewTuple(yieldRet), false)
2790+
iterParam := pkg.NewParam(token.NoPos, "yield", yieldSig)
2791+
iterSig := types.NewTuple(iterParam)
2792+
2793+
// Define bar function
2794+
pkg.NewFunc(nil, "bar", iterSig, nil, false).BodyStart(pkg).
2795+
End()
2796+
2797+
pkg.NewFunc(nil, "main", nil, nil, false).BodyStart(pkg).
2798+
ForRange("v").Val(ctxRef(pkg, "bar")).RangeAssignThen(token.NoPos).
2799+
Val(pkg.Import("fmt").Ref("Println")).Val(ctxRef(pkg, "v")).Call(1).EndStmt().
2800+
End().
2801+
End()
2802+
domTest(t, pkg, `package main
2803+
2804+
import "fmt"
2805+
2806+
func bar(yield func(v string) bool) {
2807+
}
2808+
func main() {
2809+
for v := range bar {
2810+
fmt.Println(v)
2811+
}
2812+
}
2813+
`)
2814+
}
2815+
2816+
func TestForRangeFunc2(t *testing.T) {
2817+
// Test range over func(yield func(K, V) bool) - 2 values (key-value pairs)
2818+
pkg := newMainPackage()
2819+
// Define iterator function type: func(yield func(string, int) bool)
2820+
yieldParamK := types.NewVar(token.NoPos, nil, "k", types.Typ[types.String])
2821+
yieldParamV := types.NewVar(token.NoPos, nil, "v", types.Typ[types.Int])
2822+
yieldRet := types.NewVar(token.NoPos, nil, "", types.Typ[types.Bool])
2823+
yieldSig := types.NewSignatureType(nil, nil, nil, types.NewTuple(yieldParamK, yieldParamV), types.NewTuple(yieldRet), false)
2824+
iterParam := pkg.NewParam(token.NoPos, "yield", yieldSig)
2825+
iterSig := types.NewTuple(iterParam)
2826+
2827+
// Define weekdays function
2828+
pkg.NewFunc(nil, "weekdays", iterSig, nil, false).BodyStart(pkg).
2829+
End()
2830+
2831+
pkg.NewFunc(nil, "main", nil, nil, false).BodyStart(pkg).
2832+
ForRange("k", "v").Val(ctxRef(pkg, "weekdays")).RangeAssignThen(token.NoPos).
2833+
Val(pkg.Import("fmt").Ref("Println")).Val(ctxRef(pkg, "k")).Val(ctxRef(pkg, "v")).Call(2).EndStmt().
2834+
End().
2835+
End()
2836+
domTest(t, pkg, `package main
2837+
2838+
import "fmt"
2839+
2840+
func weekdays(yield func(k string, v int) bool) {
2841+
}
2842+
func main() {
2843+
for k, v := range weekdays {
2844+
fmt.Println(k, v)
2845+
}
2846+
}
2847+
`)
2848+
}
2849+
27522850
func TestReturn(t *testing.T) {
27532851
pkg := newMainPackage()
27542852
format := pkg.NewParam(token.NoPos, "format", types.Typ[types.String])

0 commit comments

Comments
 (0)