github.com/saiskee/goprotogettercheck@v0.0.0-20210809023653-4c1b526858e6/main_test.go (about) 1 package main 2 3 import ( 4 "bytes" 5 "github.com/saiskee/goprotogettercheck/errcheck" 6 "io" 7 "os" 8 "regexp" 9 "strings" 10 "testing" 11 12 ) 13 14 var dotStar = regexp.MustCompile(".*") 15 16 func TestMain(t *testing.T) { 17 saveStderr := os.Stderr 18 saveStdout := os.Stdout 19 saveCwd, err := os.Getwd() 20 if err != nil { 21 t.Errorf("Cannot receive current directory: %v", err) 22 } 23 24 r, w, err := os.Pipe() 25 if err != nil { 26 t.Errorf("Cannot create pipe: %v", err) 27 } 28 29 os.Stderr = w 30 os.Stdout = w 31 32 bufChannel := make(chan string) 33 34 go func() { 35 buf := new(bytes.Buffer) 36 _, err = io.Copy(buf, r) 37 r.Close() 38 if err != nil { 39 t.Errorf("Cannot copy to buffer: %v", err) 40 } 41 42 bufChannel <- buf.String() 43 }() 44 45 exitCode := mainCmd([]string{"cmd name", "github.com/kisielk/errcheck/testdata"}) 46 47 w.Close() 48 49 os.Stderr = saveStderr 50 os.Stdout = saveStdout 51 os.Chdir(saveCwd) 52 53 out := <-bufChannel 54 55 if exitCode != exitUncheckedError { 56 t.Errorf("Exit code is %d, expected %d", exitCode, exitUncheckedError) 57 } 58 59 expectUnchecked := 29 60 if got := strings.Count(out, "UNCHECKED"); got != expectUnchecked { 61 t.Errorf("Got %d UNCHECKED errors, expected %d in:\n%s", got, expectUnchecked, out) 62 } 63 } 64 65 type parseTestCase struct { 66 args []string 67 paths []string 68 ignore map[string]string // Exclusions.SymbolRegexpsByPackage 69 pkgs []string // Exclusions.Packages 70 tags []string // Tags 71 blank bool // !BlankAssignments 72 asserts bool // !TypeAssertions 73 error int 74 } 75 76 func TestParseFlags(t *testing.T) { 77 cases := []parseTestCase{ 78 parseTestCase{ 79 args: []string{"errcheck"}, 80 paths: []string{"."}, 81 ignore: map[string]string{}, 82 pkgs: []string{}, 83 tags: []string{}, 84 blank: false, 85 asserts: false, 86 error: exitCodeOk, 87 }, 88 parseTestCase{ 89 args: []string{"errcheck", "-blank", "-asserts"}, 90 paths: []string{"."}, 91 ignore: map[string]string{}, 92 pkgs: []string{}, 93 tags: []string{}, 94 blank: true, 95 asserts: true, 96 error: exitCodeOk, 97 }, 98 parseTestCase{ 99 args: []string{"errcheck", "foo", "bar"}, 100 paths: []string{"foo", "bar"}, 101 ignore: map[string]string{}, 102 pkgs: []string{}, 103 tags: []string{}, 104 blank: false, 105 asserts: false, 106 error: exitCodeOk, 107 }, 108 parseTestCase{ 109 args: []string{"errcheck", "-ignore", "fmt:.*,encoding/binary:.*"}, 110 paths: []string{"."}, 111 ignore: map[string]string{"fmt": ".*", "encoding/binary": dotStar.String()}, 112 pkgs: []string{}, 113 tags: []string{}, 114 blank: false, 115 asserts: false, 116 error: exitCodeOk, 117 }, 118 parseTestCase{ 119 args: []string{"errcheck", "-ignore", "fmt:[FS]?[Pp]rint*"}, 120 paths: []string{"."}, 121 ignore: map[string]string{"fmt": "[FS]?[Pp]rint*"}, 122 pkgs: []string{}, 123 tags: []string{}, 124 blank: false, 125 asserts: false, 126 error: exitCodeOk, 127 }, 128 parseTestCase{ 129 args: []string{"errcheck", "-ignore", "[rR]ead|[wW]rite"}, 130 paths: []string{"."}, 131 ignore: map[string]string{"": "[rR]ead|[wW]rite"}, 132 pkgs: []string{}, 133 tags: []string{}, 134 blank: false, 135 asserts: false, 136 error: exitCodeOk, 137 }, 138 parseTestCase{ 139 args: []string{"errcheck", "-ignorepkg", "testing"}, 140 paths: []string{"."}, 141 ignore: map[string]string{}, 142 pkgs: []string{"testing"}, 143 tags: []string{}, 144 blank: false, 145 asserts: false, 146 error: exitCodeOk, 147 }, 148 parseTestCase{ 149 args: []string{"errcheck", "-ignorepkg", "testing,foo"}, 150 paths: []string{"."}, 151 ignore: map[string]string{}, 152 pkgs: []string{"testing", "foo"}, 153 tags: []string{}, 154 blank: false, 155 asserts: false, 156 error: exitCodeOk, 157 }, 158 parseTestCase{ 159 args: []string{"errcheck", "-tags", "foo"}, 160 paths: []string{"."}, 161 ignore: map[string]string{}, 162 pkgs: []string{}, 163 tags: []string{"foo"}, 164 blank: false, 165 asserts: false, 166 error: exitCodeOk, 167 }, 168 parseTestCase{ 169 args: []string{"errcheck", "-tags", "foo bar !baz"}, 170 paths: []string{"."}, 171 ignore: map[string]string{}, 172 pkgs: []string{}, 173 tags: []string{"foo", "bar", "!baz"}, 174 blank: false, 175 asserts: false, 176 error: exitCodeOk, 177 }, 178 parseTestCase{ 179 args: []string{"errcheck", "-tags", "foo,bar,!baz"}, 180 paths: []string{"."}, 181 ignore: map[string]string{}, 182 pkgs: []string{}, 183 tags: []string{"foo", "bar", "!baz"}, 184 blank: false, 185 asserts: false, 186 error: exitCodeOk, 187 }, 188 parseTestCase{ 189 args: []string{"errcheck", "-tags", "foo bar !baz"}, 190 paths: []string{"."}, 191 ignore: map[string]string{}, 192 pkgs: []string{}, 193 tags: []string{"foo", "bar", "!baz"}, 194 blank: false, 195 asserts: false, 196 error: exitCodeOk, 197 }, 198 } 199 200 slicesEqual := func(a, b []string) bool { 201 if len(a) != len(b) { 202 return false 203 } 204 for i := range a { 205 if a[i] != b[i] { 206 return false 207 } 208 } 209 return true 210 } 211 212 213 for _, c := range cases { 214 var checker errcheck.Checker 215 p, e := parseFlags(&checker, c.args) 216 217 argsStr := strings.Join(c.args, " ") 218 if !slicesEqual(p, c.paths) { 219 t.Errorf("%q: path got %q want %q", argsStr, p, c.paths) 220 } 221 if e != c.error { 222 t.Errorf("%q: error got %q want %q", argsStr, e, c.error) 223 } 224 } 225 }