github.com/bayrepo/bayzr@v0.0.0-20240308125417-466ee1dfea8d/go-bindata/src/github.com/kisielk/errcheck/main_test.go (about)

     1  package main
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"os"
     7  	"regexp"
     8  	"strings"
     9  	"testing"
    10  
    11  	"github.com/kisielk/errcheck/internal/errcheck"
    12  )
    13  
    14  func TestMain(t *testing.T) {
    15  	saveStderr := os.Stderr
    16  	saveStdout := os.Stdout
    17  	saveCwd, err := os.Getwd()
    18  	if err != nil {
    19  		t.Errorf("Cannot receive current directory: %v", err)
    20  	}
    21  
    22  	r, w, err := os.Pipe()
    23  	if err != nil {
    24  		t.Errorf("Cannot create pipe: %v", err)
    25  	}
    26  
    27  	os.Stderr = w
    28  	os.Stdout = w
    29  
    30  	bufChannel := make(chan string)
    31  
    32  	go func() {
    33  		buf := new(bytes.Buffer)
    34  		_, err = io.Copy(buf, r)
    35  		r.Close()
    36  		if err != nil {
    37  			t.Errorf("Cannot copy to buffer: %v", err)
    38  		}
    39  
    40  		bufChannel <- buf.String()
    41  	}()
    42  
    43  	exitCode := mainCmd([]string{"cmd name", "github.com/kisielk/errcheck/testdata"})
    44  
    45  	w.Close()
    46  
    47  	os.Stderr = saveStderr
    48  	os.Stdout = saveStdout
    49  	os.Chdir(saveCwd)
    50  
    51  	out := <-bufChannel
    52  
    53  	if exitCode != exitUncheckedError {
    54  		t.Errorf("Exit code is %d, expected %d", exitCode, exitUncheckedError)
    55  	}
    56  
    57  	expectUnchecked := 14
    58  	if got := strings.Count(out, "UNCHECKED"); got != expectUnchecked {
    59  		t.Errorf("Got %d UNCHECKED errors, expected %d in:\n%s", got, expectUnchecked, out)
    60  	}
    61  }
    62  
    63  type parseTestCase struct {
    64  	args    []string
    65  	paths   []string
    66  	ignore  map[string]string
    67  	tags    []string
    68  	blank   bool
    69  	asserts bool
    70  	error   int
    71  }
    72  
    73  func TestParseFlags(t *testing.T) {
    74  	cases := []parseTestCase{
    75  		parseTestCase{
    76  			args:    []string{"errcheck"},
    77  			paths:   []string{"."},
    78  			ignore:  map[string]string{"fmt": dotStar.String()},
    79  			tags:    []string{},
    80  			blank:   false,
    81  			asserts: false,
    82  			error:   exitCodeOk,
    83  		},
    84  		parseTestCase{
    85  			args:    []string{"errcheck", "-blank", "-asserts"},
    86  			paths:   []string{"."},
    87  			ignore:  map[string]string{"fmt": dotStar.String()},
    88  			tags:    []string{},
    89  			blank:   true,
    90  			asserts: true,
    91  			error:   exitCodeOk,
    92  		},
    93  		parseTestCase{
    94  			args:    []string{"errcheck", "foo", "bar"},
    95  			paths:   []string{"foo", "bar"},
    96  			ignore:  map[string]string{"fmt": dotStar.String()},
    97  			tags:    []string{},
    98  			blank:   false,
    99  			asserts: false,
   100  			error:   exitCodeOk,
   101  		},
   102  		parseTestCase{
   103  			args:    []string{"errcheck", "-ignore", "fmt:.*,encoding/binary:.*"},
   104  			paths:   []string{"."},
   105  			ignore:  map[string]string{"fmt": dotStar.String(), "encoding/binary": dotStar.String()},
   106  			tags:    []string{},
   107  			blank:   false,
   108  			asserts: false,
   109  			error:   exitCodeOk,
   110  		},
   111  		parseTestCase{
   112  			args:    []string{"errcheck", "-ignore", "fmt:[FS]?[Pp]rint*"},
   113  			paths:   []string{"."},
   114  			ignore:  map[string]string{"fmt": "[FS]?[Pp]rint*"},
   115  			tags:    []string{},
   116  			blank:   false,
   117  			asserts: false,
   118  			error:   exitCodeOk,
   119  		},
   120  		parseTestCase{
   121  			args:    []string{"errcheck", "-ignore", "[rR]ead|[wW]rite"},
   122  			paths:   []string{"."},
   123  			ignore:  map[string]string{"fmt": dotStar.String(), "": "[rR]ead|[wW]rite"},
   124  			tags:    []string{},
   125  			blank:   false,
   126  			asserts: false,
   127  			error:   exitCodeOk,
   128  		},
   129  		parseTestCase{
   130  			args:    []string{"errcheck", "-ignorepkg", "testing"},
   131  			paths:   []string{"."},
   132  			ignore:  map[string]string{"fmt": dotStar.String(), "testing": dotStar.String()},
   133  			tags:    []string{},
   134  			blank:   false,
   135  			asserts: false,
   136  			error:   exitCodeOk,
   137  		},
   138  		parseTestCase{
   139  			args:    []string{"errcheck", "-ignorepkg", "testing,foo"},
   140  			paths:   []string{"."},
   141  			ignore:  map[string]string{"fmt": dotStar.String(), "testing": dotStar.String(), "foo": dotStar.String()},
   142  			tags:    []string{},
   143  			blank:   false,
   144  			asserts: false,
   145  			error:   exitCodeOk,
   146  		},
   147  		parseTestCase{
   148  			args:    []string{"errcheck", "-tags", "foo"},
   149  			paths:   []string{"."},
   150  			ignore:  map[string]string{"fmt": dotStar.String()},
   151  			tags:    []string{"foo"},
   152  			blank:   false,
   153  			asserts: false,
   154  			error:   exitCodeOk,
   155  		},
   156  		parseTestCase{
   157  			args:    []string{"errcheck", "-tags", "foo bar !baz"},
   158  			paths:   []string{"."},
   159  			ignore:  map[string]string{"fmt": dotStar.String()},
   160  			tags:    []string{"foo", "bar", "!baz"},
   161  			blank:   false,
   162  			asserts: false,
   163  			error:   exitCodeOk,
   164  		},
   165  		parseTestCase{
   166  			args:    []string{"errcheck", "-tags", "foo   bar   !baz"},
   167  			paths:   []string{"."},
   168  			ignore:  map[string]string{"fmt": dotStar.String()},
   169  			tags:    []string{"foo", "bar", "!baz"},
   170  			blank:   false,
   171  			asserts: false,
   172  			error:   exitCodeOk,
   173  		},
   174  	}
   175  
   176  	slicesEqual := func(a, b []string) bool {
   177  		if len(a) != len(b) {
   178  			return false
   179  		}
   180  		for i := range a {
   181  			if a[i] != b[i] {
   182  				return false
   183  			}
   184  		}
   185  		return true
   186  	}
   187  
   188  	ignoresEqual := func(a map[string]*regexp.Regexp, b map[string]string) bool {
   189  		if len(a) != len(b) {
   190  			return false
   191  		}
   192  		for k, v := range a {
   193  			if v.String() != b[k] {
   194  				return false
   195  			}
   196  		}
   197  		return true
   198  	}
   199  
   200  	for _, c := range cases {
   201  		checker := &errcheck.Checker{}
   202  		p, e := parseFlags(checker, c.args)
   203  
   204  		argsStr := strings.Join(c.args, " ")
   205  		if !slicesEqual(p, c.paths) {
   206  			t.Fatalf("%q: path got %q want %q", argsStr, p, c.paths)
   207  		}
   208  		if ign := checker.Ignore; !ignoresEqual(ign, c.ignore) {
   209  			t.Fatalf("%q: ignore got %q want %q", argsStr, ign, c.ignore)
   210  		}
   211  		if tags := checker.Tags; !slicesEqual(tags, c.tags) {
   212  			t.Fatalf("%q: tags got %v want %v", argsStr, tags, c.tags)
   213  		}
   214  		if b := checker.Blank; b != c.blank {
   215  			t.Fatalf("%q: blank got %q want %q", argsStr, b, c.blank)
   216  		}
   217  		if a := checker.Asserts; a != c.asserts {
   218  			t.Fatalf("%q: asserts got %q want %q", argsStr, a, c.asserts)
   219  		}
   220  		if e != c.error {
   221  			t.Fatalf("%q: error got %q want %q", argsStr, e, c.error)
   222  		}
   223  	}
   224  }