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  }