github.com/cockroachdb/tools@v0.0.0-20230222021103-a6d27438930d/go/types/typeutil/ui_test.go (about)

     1  // Copyright 2016 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 typeutil_test
     6  
     7  import (
     8  	"fmt"
     9  	"go/ast"
    10  	"go/parser"
    11  	"go/token"
    12  	"go/types"
    13  	"strings"
    14  	"testing"
    15  
    16  	"golang.org/x/tools/go/types/typeutil"
    17  )
    18  
    19  func TestIntuitiveMethodSet(t *testing.T) {
    20  	const source = `
    21  package P
    22  type A int
    23  func (A) f()
    24  func (*A) g()
    25  `
    26  
    27  	fset := token.NewFileSet()
    28  	f, err := parser.ParseFile(fset, "hello.go", source, 0)
    29  	if err != nil {
    30  		t.Fatal(err)
    31  	}
    32  
    33  	var conf types.Config
    34  	pkg, err := conf.Check("P", fset, []*ast.File{f}, nil)
    35  	if err != nil {
    36  		t.Fatal(err)
    37  	}
    38  	qual := types.RelativeTo(pkg)
    39  
    40  	for _, test := range []struct {
    41  		expr string // type expression
    42  		want string // intuitive method set
    43  	}{
    44  		{"A", "(A).f (*A).g"},
    45  		{"*A", "(*A).f (*A).g"},
    46  		{"error", "(error).Error"},
    47  		{"*error", ""},
    48  		{"struct{A}", "(struct{A}).f (*struct{A}).g"},
    49  		{"*struct{A}", "(*struct{A}).f (*struct{A}).g"},
    50  	} {
    51  		tv, err := types.Eval(fset, pkg, 0, test.expr)
    52  		if err != nil {
    53  			t.Errorf("Eval(%s) failed: %v", test.expr, err)
    54  		}
    55  		var names []string
    56  		for _, m := range typeutil.IntuitiveMethodSet(tv.Type, nil) {
    57  			name := fmt.Sprintf("(%s).%s", types.TypeString(m.Recv(), qual), m.Obj().Name())
    58  			names = append(names, name)
    59  		}
    60  		got := strings.Join(names, " ")
    61  		if got != test.want {
    62  			t.Errorf("IntuitiveMethodSet(%s) = %q, want %q", test.expr, got, test.want)
    63  		}
    64  	}
    65  }