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  }