blob: fa827a7adf204c1ac4f4c1e51a6a3c21438a1b9f [file] [edit]
// Copyright 2026 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.
//go:build goexperiment.genericmethods
package importer
import (
"cmd/compile/internal/syntax"
"cmd/compile/internal/types2"
"internal/testenv"
"os"
"path/filepath"
"runtime"
"strings"
"testing"
)
func TestGenMeth(t *testing.T) {
testenv.MustHaveGoBuild(t)
// This package only handles gc export data.
if runtime.Compiler != "gc" {
t.Skipf("gc-built packages not available (compiler = %s)", runtime.Compiler)
}
tmpdir := t.TempDir()
testoutdir := filepath.Join(tmpdir, "testdata")
if err := os.Mkdir(testoutdir, 0700); err != nil {
t.Fatalf("making output dir: %v", err)
}
compile(t, "testdata", "genmeth.go", testoutdir, nil)
genmeth, err := Import(make(map[string]*types2.Package), "./testdata/genmeth", tmpdir, nil)
if err != nil {
t.Fatal(err)
}
check := func(pkgname, src string, imports importMap) (*types2.Package, error) {
f, err := syntax.Parse(syntax.NewFileBase(pkgname), strings.NewReader(src), nil, nil, 0)
if err != nil {
return nil, err
}
config := &types2.Config{
Importer: imports,
}
return config.Check(pkgname, []*syntax.File{f}, nil)
}
const pSrc = `package p
import "genmeth"
func _() {
var ex func(int) genmeth.List[int]
var fl func(genmeth.List[int]) genmeth.List[int]
var l genmeth.List[int]
l = l.Map(ex).FlatMap(fl)
var bl genmeth.BiList[int, any]
bl = bl.MapKeys(ex).Flip().FlatMapValues(fl).Flip()
var id func(int) int
var op genmeth.Option[int]
var _ int = op.MapIfPresent(id).Get()
var ol genmeth.OrderedList[int]
var _ int = ol.Min().Get()
var b genmeth.Box[int]
b.Set(42)
var _ int = b.Get()
}
`
importer := importMap{
"genmeth": genmeth,
}
if _, err := check("p", pSrc, importer); err != nil {
t.Errorf("Check failed: %v", err)
}
}