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