github.com/elek/golangci-lint@v1.42.2-0.20211208090441-c05b7fcb3a9a/pkg/golinters/gofmt_test.go (about) 1 package golinters 2 3 import ( 4 "testing" 5 6 diffpkg "github.com/sourcegraph/go-diff/diff" 7 "github.com/stretchr/testify/assert" 8 "github.com/stretchr/testify/mock" 9 10 "github.com/elek/golangci-lint/pkg/logutils" 11 "github.com/elek/golangci-lint/pkg/result" 12 ) 13 14 func testDiffProducesChanges(t *testing.T, log logutils.Log, diff string, expectedChanges ...Change) { 15 diffs, err := diffpkg.ParseMultiFileDiff([]byte(diff)) 16 if err != nil { 17 assert.NoError(t, err) 18 } 19 20 assert.Len(t, diffs, 1) 21 hunks := diffs[0].Hunks 22 assert.NotEmpty(t, hunks) 23 24 var changes []Change 25 for _, hunk := range hunks { 26 p := hunkChangesParser{ 27 log: log, 28 } 29 changes = append(changes, p.parse(hunk)...) 30 } 31 32 assert.Equal(t, expectedChanges, changes) 33 } 34 35 func TestExtractChangesFromHunkAddOnly(t *testing.T) { 36 const diff = `diff --git a/internal/shared/logutil/log.go b/internal/shared/logutil/log.go 37 index 258b340..43d04bf 100644 38 --- a/internal/shared/logutil/log.go 39 +++ b/internal/shared/logutil/log.go 40 @@ -1,5 +1,6 @@ 41 package logutil 42 43 +// added line 44 type Func func(format string, args ...interface{}) 45 46 type Log interface { 47 ` 48 49 testDiffProducesChanges(t, nil, diff, Change{ 50 LineRange: result.Range{ 51 From: 2, 52 To: 2, 53 }, 54 Replacement: result.Replacement{ 55 NewLines: []string{ 56 "", 57 "// added line", 58 }, 59 }, 60 }) 61 } 62 63 func TestExtractChangesFromHunkAddOnlyOnFirstLine(t *testing.T) { 64 const diff = `diff --git a/internal/shared/logutil/log.go b/internal/shared/logutil/log.go 65 index 258b340..97e6660 100644 66 --- a/internal/shared/logutil/log.go 67 +++ b/internal/shared/logutil/log.go 68 @@ -1,3 +1,4 @@ 69 +// added line 70 package logutil 71 72 type Func func(format string, args ...interface{}) 73 ` 74 75 testDiffProducesChanges(t, nil, diff, Change{ 76 LineRange: result.Range{ 77 From: 1, 78 To: 1, 79 }, 80 Replacement: result.Replacement{ 81 NewLines: []string{ 82 "// added line", 83 "package logutil", 84 }, 85 }, 86 }) 87 } 88 89 func TestExtractChangesFromHunkAddOnlyOnFirstLineWithSharedOriginalLine(t *testing.T) { 90 const diff = `diff --git a/internal/shared/logutil/log.go b/internal/shared/logutil/log.go 91 index 258b340..7ff80c9 100644 92 --- a/internal/shared/logutil/log.go 93 +++ b/internal/shared/logutil/log.go 94 @@ -1,4 +1,7 @@ 95 +// added line 1 96 package logutil 97 +// added line 2 98 +// added line 3 99 100 type Func func(format string, args ...interface{}) 101 ` 102 testDiffProducesChanges(t, nil, diff, Change{ 103 LineRange: result.Range{ 104 From: 1, 105 To: 1, 106 }, 107 Replacement: result.Replacement{ 108 NewLines: []string{ 109 "// added line 1", 110 "package logutil", 111 "// added line 2", 112 "// added line 3", 113 }, 114 }, 115 }) 116 } 117 118 func TestExtractChangesFromHunkAddOnlyInAllDiff(t *testing.T) { 119 const diff = `diff --git a/test.go b/test.go 120 new file mode 100644 121 index 0000000..6399915 122 --- /dev/null 123 +++ b/test.go 124 @@ -0,0 +1,3 @@ 125 +package test 126 + 127 +// line 128 ` 129 130 log := logutils.NewMockLog() 131 log.On("Infof", "The diff contains only additions: no original or deleted lines: %#v", mock.Anything) 132 133 var noChanges []Change 134 testDiffProducesChanges(t, log, diff, noChanges...) 135 } 136 137 func TestExtractChangesFromHunkAddOnlyMultipleLines(t *testing.T) { 138 const diff = `diff --git a/internal/shared/logutil/log.go b/internal/shared/logutil/log.go 139 index 258b340..3b83a94 100644 140 --- a/internal/shared/logutil/log.go 141 +++ b/internal/shared/logutil/log.go 142 @@ -2,6 +2,9 @@ package logutil 143 144 type Func func(format string, args ...interface{}) 145 146 +// add line 1 147 +// add line 2 148 + 149 type Log interface { 150 Fatalf(format string, args ...interface{}) 151 Errorf(format string, args ...interface{}) 152 ` 153 154 testDiffProducesChanges(t, nil, diff, Change{ 155 LineRange: result.Range{ 156 From: 4, 157 To: 4, 158 }, 159 Replacement: result.Replacement{ 160 NewLines: []string{ 161 "", 162 "// add line 1", 163 "// add line 2", 164 "", 165 }, 166 }, 167 }) 168 } 169 170 func TestExtractChangesFromHunkAddOnlyDifferentLines(t *testing.T) { 171 const diff = `diff --git a/internal/shared/logutil/log.go b/internal/shared/logutil/log.go 172 index 258b340..e5ed2ad 100644 173 --- a/internal/shared/logutil/log.go 174 +++ b/internal/shared/logutil/log.go 175 @@ -2,9 +2,12 @@ package logutil 176 177 type Func func(format string, args ...interface{}) 178 179 +// add line 1 180 + 181 type Log interface { 182 Fatalf(format string, args ...interface{}) 183 Errorf(format string, args ...interface{}) 184 + // add line 2 185 Warnf(format string, args ...interface{}) 186 Infof(format string, args ...interface{}) 187 Debugf(key string, format string, args ...interface{}) 188 ` 189 190 expectedChanges := []Change{ 191 { 192 LineRange: result.Range{ 193 From: 4, 194 To: 4, 195 }, 196 Replacement: result.Replacement{ 197 NewLines: []string{ 198 "", 199 "// add line 1", 200 "", 201 }, 202 }, 203 }, 204 { 205 LineRange: result.Range{ 206 From: 7, 207 To: 7, 208 }, 209 Replacement: result.Replacement{ 210 NewLines: []string{ 211 " Errorf(format string, args ...interface{})", 212 " // add line 2", 213 }, 214 }, 215 }, 216 } 217 218 testDiffProducesChanges(t, nil, diff, expectedChanges...) 219 } 220 221 func TestExtractChangesDeleteOnlyFirstLines(t *testing.T) { 222 const diff = `diff --git a/internal/shared/logutil/log.go b/internal/shared/logutil/log.go 223 index 258b340..0fb554e 100644 224 --- a/internal/shared/logutil/log.go 225 +++ b/internal/shared/logutil/log.go 226 @@ -1,5 +1,3 @@ 227 -package logutil 228 - 229 type Func func(format string, args ...interface{}) 230 231 type Log interface { 232 ` 233 234 testDiffProducesChanges(t, nil, diff, Change{ 235 LineRange: result.Range{ 236 From: 1, 237 To: 2, 238 }, 239 Replacement: result.Replacement{ 240 NeedOnlyDelete: true, 241 }, 242 }) 243 } 244 245 func TestExtractChangesReplaceLine(t *testing.T) { 246 const diff = `diff --git a/internal/shared/logutil/log.go b/internal/shared/logutil/log.go 247 index 258b340..c2a8516 100644 248 --- a/internal/shared/logutil/log.go 249 +++ b/internal/shared/logutil/log.go 250 @@ -1,4 +1,4 @@ 251 -package logutil 252 +package test2 253 254 type Func func(format string, args ...interface{}) 255 ` 256 257 testDiffProducesChanges(t, nil, diff, Change{ 258 LineRange: result.Range{ 259 From: 1, 260 To: 1, 261 }, 262 Replacement: result.Replacement{ 263 NewLines: []string{"package test2"}, 264 }, 265 }) 266 } 267 268 func TestExtractChangesReplaceLineAfterFirstLineAdding(t *testing.T) { 269 const diff = `diff --git a/internal/shared/logutil/log.go b/internal/shared/logutil/log.go 270 index 258b340..43fc0de 100644 271 --- a/internal/shared/logutil/log.go 272 +++ b/internal/shared/logutil/log.go 273 @@ -1,6 +1,7 @@ 274 +// added line 275 package logutil 276 277 -type Func func(format string, args ...interface{}) 278 +// changed line 279 280 type Log interface { 281 Fatalf(format string, args ...interface{})` 282 283 testDiffProducesChanges(t, nil, diff, Change{ 284 LineRange: result.Range{ 285 From: 1, 286 To: 1, 287 }, 288 Replacement: result.Replacement{ 289 NewLines: []string{ 290 "// added line", 291 "package logutil", 292 }, 293 }, 294 }, Change{ 295 LineRange: result.Range{ 296 From: 3, 297 To: 3, 298 }, 299 Replacement: result.Replacement{ 300 NewLines: []string{ 301 "// changed line", 302 }, 303 }, 304 }) 305 } 306 307 func TestGofmtDiff(t *testing.T) { 308 const diff = `diff --git a/gofmt.go b/gofmt.go 309 index 2c9f78d..c0d5791 100644 310 --- a/gofmt.go 311 +++ b/gofmt.go 312 @@ -1,9 +1,9 @@ 313 //args: -Egofmt 314 package p 315 316 - func gofmt(a, b int) int { 317 - if a != b { 318 - return 1 319 +func gofmt(a, b int) int { 320 + if a != b { 321 + return 1 322 } 323 - return 2 324 + return 2 325 } 326 ` 327 testDiffProducesChanges(t, nil, diff, Change{ 328 LineRange: result.Range{ 329 From: 4, 330 To: 6, 331 }, 332 Replacement: result.Replacement{ 333 NewLines: []string{ 334 "func gofmt(a, b int) int {", 335 " if a != b {", 336 " return 1", 337 }, 338 }, 339 }, Change{ 340 LineRange: result.Range{ 341 From: 8, 342 To: 8, 343 }, 344 Replacement: result.Replacement{ 345 NewLines: []string{ 346 " return 2", 347 }, 348 }, 349 }) 350 }