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  }