github.com/elek/golangci-lint@v1.42.2-0.20211208090441-c05b7fcb3a9a/pkg/result/processors/sort_results_test.go (about)

     1  package processors
     2  
     3  import (
     4  	"fmt"
     5  	"go/token"
     6  	"testing"
     7  
     8  	"github.com/stretchr/testify/assert"
     9  
    10  	"github.com/elek/golangci-lint/pkg/config"
    11  	"github.com/elek/golangci-lint/pkg/result"
    12  )
    13  
    14  var issues = []result.Issue{
    15  	{
    16  		Pos: token.Position{
    17  			Filename: "file_windows.go",
    18  			Column:   80,
    19  			Line:     10,
    20  		},
    21  	},
    22  	{
    23  		Pos: token.Position{
    24  			Filename: "file_linux.go",
    25  			Column:   70,
    26  			Line:     11,
    27  		},
    28  	},
    29  	{
    30  		Pos: token.Position{
    31  			Filename: "file_darwin.go",
    32  			Line:     12,
    33  		},
    34  	},
    35  	{
    36  		Pos: token.Position{
    37  			Filename: "file_darwin.go",
    38  			Column:   60,
    39  			Line:     10,
    40  		},
    41  	},
    42  }
    43  
    44  type compareTestCase struct {
    45  	a, b     result.Issue
    46  	expected compareResult
    47  }
    48  
    49  func testCompareValues(t *testing.T, cmp comparator, name string, tests []compareTestCase) {
    50  	t.Parallel()
    51  
    52  	for i := 0; i < len(tests); i++ {
    53  		test := tests[i]
    54  		t.Run(fmt.Sprintf("%s(%d)", name, i), func(t *testing.T) {
    55  			res := cmp.Compare(&test.a, &test.b)
    56  			assert.Equal(t, test.expected.String(), res.String())
    57  		})
    58  	}
    59  }
    60  
    61  func TestCompareByLine(t *testing.T) {
    62  	testCompareValues(t, ByLine{}, "Compare By Line", []compareTestCase{
    63  		{issues[0], issues[1], Less},    // 10 vs 11
    64  		{issues[0], issues[0], Equal},   // 10 vs 10
    65  		{issues[3], issues[3], Equal},   // 10 vs 10
    66  		{issues[0], issues[3], Equal},   // 10 vs 10
    67  		{issues[3], issues[2], Less},    // 10 vs 12
    68  		{issues[1], issues[1], Equal},   // 11 vs 11
    69  		{issues[1], issues[0], Greater}, // 11 vs 10
    70  		{issues[1], issues[2], Less},    // 11 vs 12
    71  		{issues[2], issues[3], Greater}, // 12 vs 10
    72  		{issues[2], issues[1], Greater}, // 12 vs 11
    73  		{issues[2], issues[2], Equal},   // 12 vs 12
    74  	})
    75  }
    76  
    77  func TestCompareByName(t *testing.T) { //nolint:dupl
    78  	testCompareValues(t, ByName{}, "Compare By Name", []compareTestCase{
    79  		{issues[0], issues[1], Greater}, // file_windows.go vs file_linux.go
    80  		{issues[1], issues[2], Greater}, // file_linux.go vs file_darwin.go
    81  		{issues[2], issues[3], Equal},   // file_darwin.go vs file_darwin.go
    82  		{issues[1], issues[1], Equal},   // file_linux.go vs file_linux.go
    83  		{issues[1], issues[0], Less},    // file_linux.go vs file_windows.go
    84  		{issues[3], issues[2], Equal},   // file_darwin.go vs file_darwin.go
    85  		{issues[2], issues[1], Less},    // file_darwin.go vs file_linux.go
    86  		{issues[0], issues[0], Equal},   // file_windows.go vs file_windows.go
    87  		{issues[2], issues[2], Equal},   // file_darwin.go vs file_darwin.go
    88  		{issues[3], issues[3], Equal},   // file_darwin.go vs file_darwin.go
    89  	})
    90  }
    91  
    92  func TestCompareByColumn(t *testing.T) { //nolint:dupl
    93  	testCompareValues(t, ByColumn{}, "Compare By Column", []compareTestCase{
    94  		{issues[0], issues[1], Greater}, // 80 vs 70
    95  		{issues[1], issues[2], None},    // 70 vs zero value
    96  		{issues[3], issues[3], Equal},   // 60 vs 60
    97  		{issues[2], issues[3], None},    // zero value vs 60
    98  		{issues[2], issues[1], None},    // zero value vs 70
    99  		{issues[1], issues[0], Less},    // 70 vs 80
   100  		{issues[1], issues[1], Equal},   // 70 vs 70
   101  		{issues[3], issues[2], None},    // vs zero value
   102  		{issues[2], issues[2], Equal},   // zero value vs zero value
   103  		{issues[1], issues[1], Equal},   // 70 vs 70
   104  	})
   105  }
   106  
   107  func TestCompareNested(t *testing.T) {
   108  	var cmp = ByName{
   109  		next: ByLine{
   110  			next: ByColumn{},
   111  		},
   112  	}
   113  
   114  	testCompareValues(t, cmp, "Nested Comparing", []compareTestCase{
   115  		{issues[1], issues[0], Less},    // file_linux.go vs file_windows.go
   116  		{issues[2], issues[1], Less},    // file_darwin.go vs file_linux.go
   117  		{issues[0], issues[1], Greater}, // file_windows.go vs file_linux.go
   118  		{issues[1], issues[2], Greater}, // file_linux.go vs file_darwin.go
   119  		{issues[3], issues[2], Less},    // file_darwin.go vs file_darwin.go, 10 vs 12
   120  		{issues[0], issues[0], Equal},   // file_windows.go vs file_windows.go
   121  		{issues[2], issues[3], Greater}, // file_darwin.go vs file_darwin.go, 12 vs 10
   122  		{issues[1], issues[1], Equal},   // file_linux.go vs file_linux.go
   123  		{issues[2], issues[2], Equal},   // file_darwin.go vs file_darwin.go
   124  		{issues[3], issues[3], Equal},   // file_darwin.go vs file_darwin.go
   125  	})
   126  }
   127  
   128  func TestNumericCompare(t *testing.T) {
   129  	var tests = []struct {
   130  		a, b     int
   131  		expected compareResult
   132  	}{
   133  		{0, 0, Equal},
   134  		{0, 1, None},
   135  		{1, 0, None},
   136  		{1, -1, None},
   137  		{-1, 1, None},
   138  		{1, 1, Equal},
   139  		{1, 2, Less},
   140  		{2, 1, Greater},
   141  	}
   142  
   143  	t.Parallel()
   144  
   145  	for i := 0; i < len(tests); i++ {
   146  		test := tests[i]
   147  		t.Run(fmt.Sprintf("%s(%d)", "Numeric Compare", i), func(t *testing.T) {
   148  			res := numericCompare(test.a, test.b)
   149  			assert.Equal(t, test.expected.String(), res.String())
   150  		})
   151  	}
   152  }
   153  
   154  func TestNoSorting(t *testing.T) {
   155  	var tests = make([]result.Issue, len(issues))
   156  	copy(tests, issues)
   157  
   158  	var sr = NewSortResults(&config.Config{})
   159  
   160  	results, err := sr.Process(tests)
   161  	assert.Equal(t, tests, results)
   162  	assert.Nil(t, err, nil)
   163  }
   164  
   165  func TestSorting(t *testing.T) {
   166  	var tests = make([]result.Issue, len(issues))
   167  	copy(tests, issues)
   168  
   169  	var expected = make([]result.Issue, len(issues))
   170  	expected[0] = issues[3]
   171  	expected[1] = issues[2]
   172  	expected[2] = issues[1]
   173  	expected[3] = issues[0]
   174  
   175  	var cfg = config.Config{}
   176  	cfg.Output.SortResults = true
   177  	var sr = NewSortResults(&cfg)
   178  
   179  	results, err := sr.Process(tests)
   180  	assert.Equal(t, results, expected)
   181  	assert.Nil(t, err, nil)
   182  }