From bf2eb525fe2d3954b519d66f6e097b71ca1f1162 Mon Sep 17 00:00:00 2001 From: Nuruddin Ashr Date: Mon, 1 Jun 2026 23:11:33 +0700 Subject: [PATCH] unused: rewrite test --- unused/testdata/src/a/a.go | 42 ---------- unused/testdata/src/a/a.go.golden | 38 --------- unused/testdata/src/agroup/agroup.go | 44 ---------- unused/testdata/src/agroup/agroup.go.golden | 40 --------- unused/testdata/src/agroupdoc/agroupdoc.go | 29 ------- .../src/agroupdoc/agroupdoc.go.golden | 24 ------ .../testdata/src/agroupsingle/agroupsingle.go | 7 -- .../src/agroupsingle/agroupsingle.go.golden | 1 - unused/testdata/src/b/access.go | 14 ---- unused/testdata/src/b/clock.go | 7 -- unused/testdata/src/basic/basic.go | 83 +++++++++++++++++++ unused/testdata/src/basic/basic.go.golden | 72 ++++++++++++++++ unused/testdata/src/c/c.go | 5 -- unused/testdata/src/d/d.go | 27 ------ unused/testdata/src/d/d.go.golden | 18 ---- unused/testdata/src/e/e.go | 14 ---- unused/testdata/src/excludepkg/excludepkg.go | 5 ++ .../src/ignoredirective/ignoredirective.go | 53 ++++++++++++ .../ignoredirective/ignoredirective.go.golden | 29 +++++++ unused/unused_test.go | 19 ++--- 20 files changed, 247 insertions(+), 324 deletions(-) delete mode 100644 unused/testdata/src/a/a.go delete mode 100644 unused/testdata/src/a/a.go.golden delete mode 100644 unused/testdata/src/agroup/agroup.go delete mode 100644 unused/testdata/src/agroup/agroup.go.golden delete mode 100644 unused/testdata/src/agroupdoc/agroupdoc.go delete mode 100644 unused/testdata/src/agroupdoc/agroupdoc.go.golden delete mode 100644 unused/testdata/src/agroupsingle/agroupsingle.go delete mode 100644 unused/testdata/src/agroupsingle/agroupsingle.go.golden delete mode 100644 unused/testdata/src/b/access.go delete mode 100644 unused/testdata/src/b/clock.go create mode 100644 unused/testdata/src/basic/basic.go create mode 100644 unused/testdata/src/basic/basic.go.golden delete mode 100644 unused/testdata/src/c/c.go delete mode 100644 unused/testdata/src/d/d.go delete mode 100644 unused/testdata/src/d/d.go.golden delete mode 100644 unused/testdata/src/e/e.go create mode 100644 unused/testdata/src/excludepkg/excludepkg.go create mode 100644 unused/testdata/src/ignoredirective/ignoredirective.go create mode 100644 unused/testdata/src/ignoredirective/ignoredirective.go.golden diff --git a/unused/testdata/src/a/a.go b/unused/testdata/src/a/a.go deleted file mode 100644 index 9f97dad..0000000 --- a/unused/testdata/src/a/a.go +++ /dev/null @@ -1,42 +0,0 @@ -package user - -import "database/sql" - -type User struct { - ID string - Name string -} - -type UserRepository interface { // want "interface 'UserRepository' is declared but not used within the package" - UserOf(id string) (*User, error) -} - -type UserRepositorySQL struct { - DB *sql.DB -} - -func (r *UserRepositorySQL) UserOf(id string) (*User, error) { - var u User - err := r.DB.QueryRow("SELECT id, name FROM users WHERE id = ?", id).Scan(u.ID, u.Name) - if err != nil { - return nil, err - } - - return &u, nil -} - -type Granter interface { - Grant(permission string) error -} - -func AllowAll(g Granter) error { - return g.Grant("all") -} - -type Allower interface { - Allow(permission string) error -} - -func Allow(x interface{}) { - _ = x.(Allower) -} diff --git a/unused/testdata/src/a/a.go.golden b/unused/testdata/src/a/a.go.golden deleted file mode 100644 index 76ea6a1..0000000 --- a/unused/testdata/src/a/a.go.golden +++ /dev/null @@ -1,38 +0,0 @@ -package user - -import "database/sql" - -type User struct { - ID string - Name string -} - -type UserRepositorySQL struct { - DB *sql.DB -} - -func (r *UserRepositorySQL) UserOf(id string) (*User, error) { - var u User - err := r.DB.QueryRow("SELECT id, name FROM users WHERE id = ?", id).Scan(u.ID, u.Name) - if err != nil { - return nil, err - } - - return &u, nil -} - -type Granter interface { - Grant(permission string) error -} - -func AllowAll(g Granter) error { - return g.Grant("all") -} - -type Allower interface { - Allow(permission string) error -} - -func Allow(x interface{}) { - _ = x.(Allower) -} diff --git a/unused/testdata/src/agroup/agroup.go b/unused/testdata/src/agroup/agroup.go deleted file mode 100644 index 6e878b7..0000000 --- a/unused/testdata/src/agroup/agroup.go +++ /dev/null @@ -1,44 +0,0 @@ -package user - -import "database/sql" - -type ( - User struct { - ID string - Name string - } - - UserRepository interface { // want "interface 'UserRepository' is declared but not used within the package" - UserOf(id string) (*User, error) - } - - UserRepositorySQL struct { - DB *sql.DB - } -) - -func (r *UserRepositorySQL) UserOf(id string) (*User, error) { - var u User - err := r.DB.QueryRow("SELECT id, name FROM users WHERE id = ?", id).Scan(u.ID, u.Name) - if err != nil { - return nil, err - } - - return &u, nil -} - -type Granter interface { - Grant(permission string) error -} - -func AllowAll(g Granter) error { - return g.Grant("all") -} - -type Allower interface { - Allow(permission string) error -} - -func Allow(x interface{}) { - _ = x.(Allower) -} diff --git a/unused/testdata/src/agroup/agroup.go.golden b/unused/testdata/src/agroup/agroup.go.golden deleted file mode 100644 index 90e8f54..0000000 --- a/unused/testdata/src/agroup/agroup.go.golden +++ /dev/null @@ -1,40 +0,0 @@ -package user - -import "database/sql" - -type ( - User struct { - ID string - Name string - } - - UserRepositorySQL struct { - DB *sql.DB - } -) - -func (r *UserRepositorySQL) UserOf(id string) (*User, error) { - var u User - err := r.DB.QueryRow("SELECT id, name FROM users WHERE id = ?", id).Scan(u.ID, u.Name) - if err != nil { - return nil, err - } - - return &u, nil -} - -type Granter interface { - Grant(permission string) error -} - -func AllowAll(g Granter) error { - return g.Grant("all") -} - -type Allower interface { - Allow(permission string) error -} - -func Allow(x interface{}) { - _ = x.(Allower) -} diff --git a/unused/testdata/src/agroupdoc/agroupdoc.go b/unused/testdata/src/agroupdoc/agroupdoc.go deleted file mode 100644 index c273284..0000000 --- a/unused/testdata/src/agroupdoc/agroupdoc.go +++ /dev/null @@ -1,29 +0,0 @@ -package user - -import "database/sql" - -type ( - User struct { - ID string - Name string - } - - // UserRepository provides access to user data. - UserRepository interface { // want "interface 'UserRepository' is declared but not used within the package" - UserOf(id string) (*User, error) - } - - UserRepositorySQL struct { - DB *sql.DB - } -) - -func (r *UserRepositorySQL) UserOf(id string) (*User, error) { - var u User - err := r.DB.QueryRow("SELECT id, name FROM users WHERE id = ?", u.ID).Scan(&u.ID, &u.Name) - if err != nil { - return nil, err - } - - return &u, nil -} \ No newline at end of file diff --git a/unused/testdata/src/agroupdoc/agroupdoc.go.golden b/unused/testdata/src/agroupdoc/agroupdoc.go.golden deleted file mode 100644 index 715a412..0000000 --- a/unused/testdata/src/agroupdoc/agroupdoc.go.golden +++ /dev/null @@ -1,24 +0,0 @@ -package user - -import "database/sql" - -type ( - User struct { - ID string - Name string - } - - UserRepositorySQL struct { - DB *sql.DB - } -) - -func (r *UserRepositorySQL) UserOf(id string) (*User, error) { - var u User - err := r.DB.QueryRow("SELECT id, name FROM users WHERE id = ?", u.ID).Scan(&u.ID, &u.Name) - if err != nil { - return nil, err - } - - return &u, nil -} \ No newline at end of file diff --git a/unused/testdata/src/agroupsingle/agroupsingle.go b/unused/testdata/src/agroupsingle/agroupsingle.go deleted file mode 100644 index fc345dd..0000000 --- a/unused/testdata/src/agroupsingle/agroupsingle.go +++ /dev/null @@ -1,7 +0,0 @@ -package user - -type ( - Doer interface { // want "interface 'Doer' is declared but not used within the package" - Do() error - } -) \ No newline at end of file diff --git a/unused/testdata/src/agroupsingle/agroupsingle.go.golden b/unused/testdata/src/agroupsingle/agroupsingle.go.golden deleted file mode 100644 index 47068eb..0000000 --- a/unused/testdata/src/agroupsingle/agroupsingle.go.golden +++ /dev/null @@ -1 +0,0 @@ -package user \ No newline at end of file diff --git a/unused/testdata/src/b/access.go b/unused/testdata/src/b/access.go deleted file mode 100644 index b9ce91d..0000000 --- a/unused/testdata/src/b/access.go +++ /dev/null @@ -1,14 +0,0 @@ -package iam - -import "time" - -type Access struct { - Permissions []string - ExpiryTime time.Time - Revoked bool -} - -func (a Access) Expired(clock Clock) bool { - now := clock.Now() - return now.After(a.ExpiryTime) -} diff --git a/unused/testdata/src/b/clock.go b/unused/testdata/src/b/clock.go deleted file mode 100644 index ed6e78e..0000000 --- a/unused/testdata/src/b/clock.go +++ /dev/null @@ -1,7 +0,0 @@ -package iam - -import "time" - -type Clock interface { - Now() time.Time -} diff --git a/unused/testdata/src/basic/basic.go b/unused/testdata/src/basic/basic.go new file mode 100644 index 0000000..ccd5c23 --- /dev/null +++ b/unused/testdata/src/basic/basic.go @@ -0,0 +1,83 @@ +package basic + +// -- used as argument + +type Sender interface { + Send(msg string) error +} + +func Ping(sender Sender) error { + return sender.Send("ping") +} + +// -- used as struct field + +type MessageHandler interface { + HandleMessage(msg string) error +} + +type Consumer struct { + Handler MessageHandler +} + +// -- used as type cast + +type Commitable interface { + Commit() error +} + +func CommitAll(msgs []any) error { + for _, msg := range msgs { + c, ok := msg.(Commitable) + if !ok { + continue + } + + if err := c.Commit(); err != nil { + return err + } + } + + return nil +} + +// grouped type declaration + +type ( + Executor interface { // want "^interface 'Executor' is declared but not used within the package$" + Execute() error + } + + Job struct { + Name string + } + + Runner interface { // want "^interface 'Runner' is declared but not used within the package$" + Run() error + } +) + +// -- used as return value + +type Calculator interface { + Calc() int +} + +type Task struct { + A int + B int +} + +func (t *Task) Calc() int { + return t.A + t.B +} + +func Add(a, b int) Calculator { + return &Task{A: a, B: b} +} + +// -- single type declaration + +type Writer interface { // want "^interface 'Writer' is declared but not used within the package$" + Write(b []byte) error +} diff --git a/unused/testdata/src/basic/basic.go.golden b/unused/testdata/src/basic/basic.go.golden new file mode 100644 index 0000000..d1f0a34 --- /dev/null +++ b/unused/testdata/src/basic/basic.go.golden @@ -0,0 +1,72 @@ +package basic + +// -- used as argument + +type Sender interface { + Send(msg string) error +} + +func Ping(sender Sender) error { + return sender.Send("ping") +} + +// -- used as struct field + +type MessageHandler interface { + HandleMessage(msg string) error +} + +type Consumer struct { + Handler MessageHandler +} + +// -- used as type cast + +type Commitable interface { + Commit() error +} + +func CommitAll(msgs []any) error { + for _, msg := range msgs { + c, ok := msg.(Commitable) + if !ok { + continue + } + + if err := c.Commit(); err != nil { + return err + } + } + + return nil +} + +// grouped type declaration + +type ( + Job struct { + Name string + } +) + +// -- used as return value + +type Calculator interface { + Calc() int +} + +type Task struct { + A int + B int +} + +func (t *Task) Calc() int { + return t.A + t.B +} + +func Add(a, b int) Calculator { + return &Task{A: a, B: b} +} + +// -- single type declaration + diff --git a/unused/testdata/src/c/c.go b/unused/testdata/src/c/c.go deleted file mode 100644 index 52790a3..0000000 --- a/unused/testdata/src/c/c.go +++ /dev/null @@ -1,5 +0,0 @@ -package log - -type Logger interface { - Log(keyvals ...interface{}) error -} diff --git a/unused/testdata/src/d/d.go b/unused/testdata/src/d/d.go deleted file mode 100644 index 0d16179..0000000 --- a/unused/testdata/src/d/d.go +++ /dev/null @@ -1,27 +0,0 @@ -package actor - -// Doer performs some work. -// -//iface:ignore -type Doer interface { - Do() error -} - -type Greeter interface { // want "interface 'Greeter' is declared but not used within the package" - Greet() error -} - -//iface:ignore=unused -type Runner interface { - Run() error -} - -//iface:ignore=other -type Executor interface { // want "interface 'Executor' is declared but not used within the package" - Execute() error -} - -//iface:ignore=other,unused -type Server interface { - Serve() error -} diff --git a/unused/testdata/src/d/d.go.golden b/unused/testdata/src/d/d.go.golden deleted file mode 100644 index 771bf77..0000000 --- a/unused/testdata/src/d/d.go.golden +++ /dev/null @@ -1,18 +0,0 @@ -package actor - -// Doer performs some work. -// -//iface:ignore -type Doer interface { - Do() error -} - -//iface:ignore=unused -type Runner interface { - Run() error -} - -//iface:ignore=other,unused -type Server interface { - Serve() error -} diff --git a/unused/testdata/src/e/e.go b/unused/testdata/src/e/e.go deleted file mode 100644 index 13b258e..0000000 --- a/unused/testdata/src/e/e.go +++ /dev/null @@ -1,14 +0,0 @@ -package shadow - -type Notifier interface { - Notify() error -} - -func NotifyAll[n any](items []n) error { - for _, item := range items { - if notifier, ok := any(item).(Notifier); ok { - _ = notifier.Notify() - } - } - return nil -} \ No newline at end of file diff --git a/unused/testdata/src/excludepkg/excludepkg.go b/unused/testdata/src/excludepkg/excludepkg.go new file mode 100644 index 0000000..dbe8aeb --- /dev/null +++ b/unused/testdata/src/excludepkg/excludepkg.go @@ -0,0 +1,5 @@ +package excludepkg + +type Sender interface { + Send(msg string) error +} diff --git a/unused/testdata/src/ignoredirective/ignoredirective.go b/unused/testdata/src/ignoredirective/ignoredirective.go new file mode 100644 index 0000000..b1f0f88 --- /dev/null +++ b/unused/testdata/src/ignoredirective/ignoredirective.go @@ -0,0 +1,53 @@ +package ignoredirective + +type Sender interface { // want "^interface 'Sender' is declared but not used within the package$" + Send(msg string) error +} + +//iface:ignore=unused +type MessageHandler interface { + HandleMessage(msg string) error +} + +//iface:ignore=identical +type Commitable interface { // want "^interface 'Commitable' is declared but not used within the package$" + Commit() error +} + +type ( + //iface:ignore=unused + Executor interface { + Execute() error + } + + Job struct { + Name string + } + + Runner interface { // want "^interface 'Runner' is declared but not used within the package$" + Run() error + } + + //iface:ignore=identical + Calculator interface { // want "^interface 'Calculator' is declared but not used within the package$" + Calc() int + } +) + +//iface:ignore=unused +type ( + Writer interface { + Write(b []byte) error + } + + Reader interface { + Read() ([]byte, error) + } +) + +//iface:ignore=identical +type ( + Caller interface { // want "^interface 'Caller' is declared but not used within the package$" + Call() error + } +) diff --git a/unused/testdata/src/ignoredirective/ignoredirective.go.golden b/unused/testdata/src/ignoredirective/ignoredirective.go.golden new file mode 100644 index 0000000..1c8dcc5 --- /dev/null +++ b/unused/testdata/src/ignoredirective/ignoredirective.go.golden @@ -0,0 +1,29 @@ +package ignoredirective + +//iface:ignore=unused +type MessageHandler interface { + HandleMessage(msg string) error +} + +type ( + //iface:ignore=unused + Executor interface { + Execute() error + } + + Job struct { + Name string + } +) + +//iface:ignore=unused +type ( + Writer interface { + Write(b []byte) error + } + + Reader interface { + Read() ([]byte, error) + } +) + diff --git a/unused/unused_test.go b/unused/unused_test.go index e59b76a..00d4e03 100644 --- a/unused/unused_test.go +++ b/unused/unused_test.go @@ -8,23 +8,14 @@ import ( ) func Test(t *testing.T) { - testdata := analysistest.TestData() - analysistest.RunWithSuggestedFixes(t, testdata, unused.Analyzer, "a") - analysistest.RunWithSuggestedFixes(t, testdata, unused.Analyzer, "agroup") - analysistest.RunWithSuggestedFixes(t, testdata, unused.Analyzer, "agroupdoc") - analysistest.RunWithSuggestedFixes(t, testdata, unused.Analyzer, "agroupsingle") - analysistest.Run(t, testdata, unused.Analyzer, "b") - analysistest.RunWithSuggestedFixes(t, testdata, unused.Analyzer, "d") - analysistest.Run(t, testdata, unused.Analyzer, "e") -} - -func TestExclusion(t *testing.T) { - err := unused.Analyzer.Flags.Set("exclude", "c") + err := unused.Analyzer.Flags.Set("exclude", "excludepkg") if err != nil { t.Fatal(err) } testdata := analysistest.TestData() - analysistest.RunWithSuggestedFixes(t, testdata, unused.Analyzer, "a") - analysistest.Run(t, testdata, unused.Analyzer, "c") + analysistest.RunWithSuggestedFixes(t, testdata, unused.Analyzer, + "basic", + "ignoredirective", + "excludepkg") }