github.com/prysmaticlabs/prysm@v1.4.4/tools/analyzers/errcheck/embedded_walker_test.go (about) 1 package errcheck 2 3 import ( 4 "go/ast" 5 "go/parser" 6 "go/token" 7 "go/types" 8 "testing" 9 10 "github.com/prysmaticlabs/prysm/shared/testutil/assert" 11 "github.com/prysmaticlabs/prysm/shared/testutil/require" 12 ) 13 14 const commonSrc = ` 15 package p 16 17 type Inner struct {} 18 func (Inner) Method() 19 20 type Outer struct {Inner} 21 type OuterP struct {*Inner} 22 23 type InnerInterface interface { 24 Method() 25 } 26 27 type OuterInterface interface {InnerInterface} 28 type MiddleInterfaceStruct struct {OuterInterface} 29 type OuterInterfaceStruct struct {MiddleInterfaceStruct} 30 31 var c = ` 32 33 type testCase struct { 34 selector string 35 expectedOk bool 36 expected []string 37 } 38 39 func TestWalkThroughEmbeddedInterfaces(t *testing.T) { 40 cases := []testCase{ 41 {"Inner{}.Method", false, nil}, 42 {"(&Inner{}).Method", false, nil}, 43 {"Outer{}.Method", false, nil}, 44 {"InnerInterface.Method", true, []string{"test.InnerInterface"}}, 45 {"OuterInterface.Method", true, []string{"test.OuterInterface", "test.InnerInterface"}}, 46 {"OuterInterfaceStruct.Method", true, []string{"test.OuterInterface", "test.InnerInterface"}}, 47 } 48 49 for _, c := range cases { 50 fset := token.NewFileSet() 51 f, err := parser.ParseFile(fset, "test", commonSrc+c.selector, 0) 52 require.NoError(t, err) 53 54 conf := types.Config{} 55 info := types.Info{ 56 Selections: make(map[*ast.SelectorExpr]*types.Selection), 57 } 58 _, err = conf.Check("test", fset, []*ast.File{f}, &info) 59 require.NoError(t, err) 60 ast.Inspect(f, func(n ast.Node) bool { 61 s, ok := n.(*ast.SelectorExpr) 62 if ok { 63 selection, ok := info.Selections[s] 64 require.Equal(t, true, ok, "No selection!") 65 ts, ok := walkThroughEmbeddedInterfaces(selection) 66 if ok != c.expectedOk { 67 t.Errorf("expected ok %v got %v", c.expectedOk, ok) 68 return false 69 } 70 if !ok { 71 return false 72 } 73 74 require.Equal(t, len(c.expected), len(ts)) 75 for i, e := range c.expected { 76 assert.Equal(t, e, ts[i].String(), "mismatch at index %d", i) 77 } 78 } 79 return true 80 }) 81 } 82 }