diff --git a/endtoend_test.go b/endtoend_test.go index 1f1d230..c165a64 100644 --- a/endtoend_test.go +++ b/endtoend_test.go @@ -5,7 +5,6 @@ // go command is not available on android //go:build !android -// +build !android package main @@ -13,7 +12,6 @@ import ( "fmt" "go/build" "io" - "io/ioutil" "os" "os/exec" "path/filepath" @@ -22,11 +20,9 @@ import ( "testing" ) -var ( - // GOEXE defines the executable file name suffix (".exe" on Windows, "" on other systems). - // Must be defined here, cannot be read from ENVIRONMENT variables - GOEXE = "" -) +// GOEXE defines the executable file name suffix (".exe" on Windows, "" on other systems). +// Must be defined here, cannot be read from ENVIRONMENT variables +var GOEXE = "" func init() { // Set GOEXE for Windows platform @@ -41,15 +37,11 @@ func init() { // binary panics if the String method for X is not correct, including for error cases. func TestEndToEnd(t *testing.T) { - dir, err := ioutil.TempDir("", "stringer") - if err != nil { - t.Fatal(err) - } - defer os.RemoveAll(dir) + dir := t.TempDir() // Create stringer in temporary directory. stringer := filepath.Join(dir, fmt.Sprintf("stringer%s", GOEXE)) - err = run("go", "build", "-o", stringer) + err := run("go", "build", "-o", stringer) if err != nil { t.Fatalf("building stringer: %s", err) } diff --git a/enumer.go b/enumer.go index 2e122e3..08370b5 100644 --- a/enumer.go +++ b/enumer.go @@ -121,6 +121,7 @@ func (g *Generator) printValueMap(runs [][]Value, typeName string, runsThreshold } g.Printf("}\n\n") } + func (g *Generator) printNamesSlice(runs [][]Value, typeName string, runsThreshold int) { thereAreRuns := len(runs) > 1 && len(runs) <= runsThreshold g.Printf("\nvar _%sNames = []string{\n", typeName) diff --git a/golden_test.go b/golden_test.go index 2906f04..2a81482 100644 --- a/golden_test.go +++ b/golden_test.go @@ -10,7 +10,7 @@ package main import ( - "io/ioutil" + "io" "os" "path/filepath" "strings" @@ -21,7 +21,7 @@ import ( type Golden struct { name string input string // input; the package clause is provided when running the test. - //output string // expected output. + // output string // expected output. } var golden = []Golden{ @@ -36,6 +36,7 @@ var golden = []Golden{ var goldenJSON = []Golden{ {"primeJson", primeJsonIn}, } + var goldenText = []Golden{ {"primeText", primeTextIn}, } @@ -369,25 +370,16 @@ func TestGolden(t *testing.T) { func runGoldenTest(t *testing.T, test Golden, generateJSON, generateYAML, generateSQL, generateText, linecomment, generateGQLGen, generateValuesMethod bool, - trimPrefix string, prefix string, useTypedErrors bool) { + trimPrefix, prefix string, useTypedErrors bool) { var g Generator file := test.name + ".go" input := "package test\n" + test.input - dir, err := os.MkdirTemp("", "stringer") - if err != nil { - t.Error(err) - } - defer func() { - err = os.RemoveAll(dir) - if err != nil { - t.Error(err) - } - }() + dir := t.TempDir() absFile := filepath.Join(dir, file) - err = os.WriteFile(absFile, []byte(input), 0644) + err := os.WriteFile(absFile, []byte(input), 0o644) if err != nil { t.Error(err) } @@ -399,27 +391,31 @@ func runGoldenTest(t *testing.T, test Golden, } g.generate(tokens[1], generateJSON, generateYAML, generateSQL, generateText, generateGQLGen, "noop", trimPrefix, prefix, linecomment, generateValuesMethod, useTypedErrors) got := string(g.format()) - if got != loadGolden(test.name) { + if expected := loadGolden(t, test.name); got != expected { // Use this to help build a golden text when changes are needed - // goldenFile := fmt.Sprintf("./testdata/%v.golden", test.name) - // err = os.WriteFile(goldenFile, []byte(got), 0644) - // if err != nil { - // t.Error(err) - // } - t.Errorf("%s: got\n====\n%s====\nexpected\n====%s", test.name, got, loadGolden(test.name)) + //goldenFile := fmt.Sprintf("./testdata/%v.golden", test.name) + //err = os.WriteFile(goldenFile, []byte(got), 0644) + //if err != nil { + // t.Error(err) + //} + t.Errorf("%s: got\n====\n%s====\nexpected\n====%s", test.name, got, expected) } } -func loadGolden(name string) string { +func loadGolden(t *testing.T, name string) string { + t.Helper() + fh, err := os.Open("testdata/" + name + ".golden") if err != nil { - return "" + t.Fatalf("unable to open golden file for %s: %v", name, err) } + defer fh.Close() - b, err := ioutil.ReadAll(fh) + + b, err := io.ReadAll(fh) if err != nil { - return "" + t.Fatalf("unable to read golden file for %s: %v", name, err) } - return string(b) + return string(b) } diff --git a/stringer.go b/stringer.go index 4c99758..07e3c33 100644 --- a/stringer.go +++ b/stringer.go @@ -18,7 +18,6 @@ import ( "go/importer" "go/token" "go/types" - "io/ioutil" "log" "os" "path/filepath" @@ -154,7 +153,7 @@ func main() { } // Write to tmpfile first - tmpFile, err := ioutil.TempFile(dir, fmt.Sprintf("%s_enumer_", typs[0])) + tmpFile, err := os.CreateTemp(dir, fmt.Sprintf("%s_enumer_", typs[0])) if err != nil { log.Fatalf("creating temporary file for output: %s", err) } @@ -250,7 +249,7 @@ type Package struct { // parsePackage analyzes the single package constructed from the patterns and tags. // parsePackage exits if there is an error. -func (g *Generator) parsePackage(patterns []string, tags []string) { +func (g *Generator) parsePackage(patterns, tags []string) { cfg := &packages.Config{ Mode: packages.LoadSyntax, // TODO: Need to think about constants in test files. Maybe write type_string_test.go @@ -420,7 +419,9 @@ func (g *Generator) prefixValueNames(values []Value, prefix string) { // generate produces the String method for the named type. func (g *Generator) generate(typeName string, includeJSON, includeYAML, includeSQL, includeText, includeGQLGen bool, - transformMethod string, trimPrefix string, addPrefix string, lineComment bool, includeValuesMethod bool, useTypedErrors bool) { + transformMethod, trimPrefix, addPrefix string, + lineComment, includeValuesMethod, useTypedErrors bool, +) { values := make([]Value, 0, 100) for _, file := range g.pkg.files { file.lineComment = lineComment @@ -696,11 +697,11 @@ func (g *Generator) declareIndexAndNameVar(run []Value, typeName string) { g.Printf("var %s\n", index) index, n = g.createLowerIndexAndNameDecl(run, typeName, "") g.Printf("const %s\n", n) - //g.Printf("var %s\n", index) + // g.Printf("var %s\n", index) } // createIndexAndNameDecl returns the pair of declarations for the run. The caller will add "const" and "var". -func (g *Generator) createLowerIndexAndNameDecl(run []Value, typeName string, suffix string) (string, string) { +func (g *Generator) createLowerIndexAndNameDecl(run []Value, typeName, suffix string) (string, string) { b := new(bytes.Buffer) indexes := make([]int, len(run)) for i := range run { @@ -722,7 +723,7 @@ func (g *Generator) createLowerIndexAndNameDecl(run []Value, typeName string, su } // createIndexAndNameDecl returns the pair of declarations for the run. The caller will add "const" and "var". -func (g *Generator) createIndexAndNameDecl(run []Value, typeName string, suffix string) (string, string) { +func (g *Generator) createIndexAndNameDecl(run []Value, typeName, suffix string) (string, string) { b := new(bytes.Buffer) indexes := make([]int, len(run)) for i := range run { @@ -744,7 +745,7 @@ func (g *Generator) createIndexAndNameDecl(run []Value, typeName string, suffix } // declareNameVars declares the concatenated names string representing all the values in the runs. -func (g *Generator) declareNameVars(runs [][]Value, typeName string, suffix string) { +func (g *Generator) declareNameVars(runs [][]Value, typeName, suffix string) { g.Printf("const _%sName%s = \"", typeName, suffix) for _, run := range runs { for i := range run { diff --git a/util_test.go b/util_test.go index a572666..dda4cec 100644 --- a/util_test.go +++ b/util_test.go @@ -12,8 +12,10 @@ import ( ) // Helpers to save typing in the test cases. -type u []uint64 -type uu [][]uint64 +type ( + u []uint64 + uu [][]uint64 +) type SplitTest struct { input u