gitee.com/lonely0422/gometalinter.git@v3.0.1-0.20190307123442-32416ab75314+incompatible/regressiontests/unparam_test.go (about)

     1  package regressiontests
     2  
     3  import (
     4  	"testing"
     5  )
     6  
     7  func TestUnparam(t *testing.T) {
     8  	t.Parallel()
     9  	source := `package foo
    10  
    11  import (
    12  	"errors"
    13  	"log"
    14  	"net/http"
    15  )
    16  
    17  type FooType int
    18  
    19  func AllUsed(a, b FooType) FooType { return a + b }
    20  
    21  func OneUnused(a, b FooType) FooType { return a }
    22  
    23  func doWork() {}
    24  
    25  var Sink interface{}
    26  
    27  func Parent() {
    28  	oneUnused := func(f FooType) {
    29  		doWork()
    30  	}
    31  	Sink = oneUnused
    32  }
    33  
    34  func Handler(w http.ResponseWriter, r *http.Request) {
    35  	w.Write([]byte("hi"))
    36  }
    37  
    38  type FooIface interface {
    39  	foo(w http.ResponseWriter, code FooType) error
    40  }
    41  
    42  func FooImpl(w http.ResponseWriter, code FooType) error {
    43  	w.Write([]byte("hi"))
    44  	return nil
    45  }
    46  
    47  func (f FooType) AllUsed(a FooType) FooType { return f + a }
    48  
    49  func (f FooType) OneUnused(a FooType) FooType { return f }
    50  
    51  func DummyImpl(f FooType) {}
    52  
    53  func PanicImpl(f FooType) { panic("dummy") }
    54  
    55  func NonPanicImpl(w http.ResponseWriter, f FooType) {
    56  	for i := 0; i < 10; i++ {
    57  		w.Write([]byte("foo"))
    58  	}
    59  	panic("default")
    60  }
    61  
    62  func endlessLoop(w http.ResponseWriter) {
    63  	for {
    64  		w.Write([]byte("foo"))
    65  	}
    66  }
    67  
    68  func NonPanicImpl2(w http.ResponseWriter, f FooType) {
    69  	endlessLoop(w)
    70  	panic("unreachable")
    71  }
    72  
    73  func throw(v ...interface{}) {}
    74  
    75  func ThrowImpl(f FooType) { throw("dummy") }
    76  
    77  func ZeroImpl(f FooType) (int, string, []byte) { return 0, "", nil }
    78  
    79  func ErrorsImpl(f FooType) error { return errors.New("unimpl") }
    80  
    81  const ConstFoo = FooType(123)
    82  
    83  func (f FooType) Error() string { return "foo" }
    84  
    85  func CustomErrImpl(f FooType) error { return ConstFoo }
    86  
    87  func NonConstImpl(f FooType, s string) error { return f }
    88  
    89  func LogImpl(f FooType) { log.Print("not implemented") }
    90  
    91  type BarFunc func(a FooType, s string) int
    92  
    93  func BarImpl(a FooType, s string) int { return int(a) }
    94  
    95  func NoName(FooType) { doWork() }
    96  
    97  func UnderscoreName(_ FooType) { doWork() }
    98  
    99  type BarStruct struct {
   100  	fn func(a FooType, b byte)
   101  }
   102  
   103  func BarField(a FooType, b byte) { doWork() }
   104  
   105  type Bar2Struct struct {
   106  	st struct {
   107  		fn func(a FooType, r rune)
   108  	}
   109  }
   110  
   111  func Bar2Field(a FooType, r rune) { doWork() }
   112  
   113  func FuncAsParam(fn func(FooType) string) { fn(0) }
   114  
   115  func PassedAsParam(f FooType) string {
   116  	doWork()
   117  	return "foo"
   118  }
   119  
   120  func (f FooType) FuncAsParam2(fn func(FooType) []byte) { fn(0) }
   121  
   122  func PassedAsParam2(f FooType) []byte {
   123  	doWork()
   124  	return nil
   125  }
   126  
   127  type RecursiveIface interface {
   128  	Foo(RecursiveIface)
   129  }
   130  
   131  func AsSliceElem(f FooType) []int {
   132  	doWork()
   133  	return nil
   134  }
   135  
   136  var SliceElems = []func(FooType) []int{AsSliceElem} `
   137  	expected := Issues{
   138  		Issue{Linter: "unparam", Severity: "warning", Path: "test.go", Line: 13, Col: 19, Message: "parameter b is unused"},
   139  		Issue{Linter: "unparam", Severity: "warning", Path: "test.go", Line: 20, Col: 20, Message: "parameter f is unused"},
   140  		Issue{Linter: "unparam", Severity: "warning", Path: "test.go", Line: 34, Col: 37, Message: "parameter code is unused"},
   141  		Issue{Linter: "unparam", Severity: "warning", Path: "test.go", Line: 41, Col: 28, Message: "parameter a is unused"},
   142  		Issue{Linter: "unparam", Severity: "warning", Path: "test.go", Line: 47, Col: 42, Message: "parameter f is unused"},
   143  		Issue{Linter: "unparam", Severity: "warning", Path: "test.go", Line: 60, Col: 43, Message: "parameter f is unused"},
   144  		Issue{Linter: "unparam", Severity: "warning", Path: "test.go", Line: 79, Col: 30, Message: "parameter s is unused"},
   145  		Issue{Linter: "unparam", Severity: "warning", Path: "test.go", Line: 85, Col: 25, Message: "parameter s is unused"},
   146  		Issue{Linter: "unparam", Severity: "warning", Path: "test.go", Line: 95, Col: 15, Message: "parameter a is unused"},
   147  		Issue{Linter: "unparam", Severity: "warning", Path: "test.go", Line: 95, Col: 26, Message: "parameter b is unused"},
   148  		Issue{Linter: "unparam", Severity: "warning", Path: "test.go", Line: 103, Col: 16, Message: "parameter a is unused"},
   149  		Issue{Linter: "unparam", Severity: "warning", Path: "test.go", Line: 103, Col: 27, Message: "parameter r is unused"},
   150  		Issue{Linter: "unparam", Severity: "warning", Path: "test.go", Line: 123, Col: 18, Message: "parameter f is unused"},
   151  	}
   152  	ExpectIssues(t, "unparam", source, expected)
   153  }