Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions enumer.go
Original file line number Diff line number Diff line change
Expand Up @@ -215,3 +215,30 @@ func (g *Generator) buildYAMLMethods(runs [][]Value, typeName string, runsThresh
// We rely on the %[1]sString method to provide typed errors when enabled
g.Printf(yamlMethods, typeName)
}

// Arguments to format are: [1]: type name
const flagValueMethodSet = `
// Set allows flag and pflag libraries to set a value dinamically.
func (i *%[1]s) Set(value string) error {
var err error
*i, err = %[1]sString(s)
return err
}
`

// Arguments to format are: [1]: type name
const pflagValueMethodType = `
// Type returns a string that represents all possible values to this type joined by '|'.
func (%[1]s) Type() string {
return strings.Join(_%[1]sNames, "|")
}
`

func (g *Generator) buildFlagMethods(runs [][]Value, typeName string, runsThreshold int) {
g.Printf(flagValueMethodSet, typeName)
}

func (g *Generator) buildPflagMethods(runs [][]Value, typeName string, runsThreshold int) {
g.Printf(flagValueMethodSet, typeName)
g.Printf(pflagValueMethodType, typeName)
}
127 changes: 97 additions & 30 deletions golden_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
package main

import (
"io/ioutil"
"io"
"os"
"path/filepath"
"strings"
Expand Down Expand Up @@ -76,6 +76,14 @@ var goldenLinecomment = []Golden{
{"dayWithLinecomment", linecommentIn},
}

var goldenFlagValue = []Golden{
{"flagvalue", dayIn},
}

var goldenPflagValue = []Golden{
{"pflagvalue", dayIn},
}

var goldenTypedErrors = []Golden{
{"typedErrors", typedErrorsIn},
}
Expand Down Expand Up @@ -327,49 +335,102 @@ const (

func TestGolden(t *testing.T) {
for _, test := range golden {
runGoldenTest(t, test, false, false, false, false, false, false, true, "", "", false)
runGoldenTest(t, test, generateOptions{
transformMethod: "noop",
includeValuesMethod: true,
})
}
for _, test := range goldenJSON {
runGoldenTest(t, test, true, false, false, false, false, false, false, "", "", false)
runGoldenTest(t, test, generateOptions{
includeJSON: true,
transformMethod: "noop",
})
}
for _, test := range goldenText {
runGoldenTest(t, test, false, false, false, true, false, false, false, "", "", false)
runGoldenTest(t, test, generateOptions{
includeText: true,
transformMethod: "noop",
})
}
for _, test := range goldenYAML {
runGoldenTest(t, test, false, true, false, false, false, false, false, "", "", false)
runGoldenTest(t, test, generateOptions{
includeYAML: true,
transformMethod: "noop",
})
}
for _, test := range goldenSQL {
runGoldenTest(t, test, false, false, true, false, false, false, false, "", "", false)
runGoldenTest(t, test, generateOptions{
includeSQL: true,
transformMethod: "noop",
})
}
for _, test := range goldenJSONAndSQL {
runGoldenTest(t, test, true, false, true, false, false, false, false, "", "", false)
runGoldenTest(t, test, generateOptions{
includeJSON: true,
includeSQL: true,
transformMethod: "noop",
})
}
for _, test := range goldenGQLGen {
runGoldenTest(t, test, false, false, false, false, false, true, false, "", "", false)
runGoldenTest(t, test, generateOptions{
includeGQLGen: true,
transformMethod: "noop",
})
}
for _, test := range goldenTrimPrefix {
runGoldenTest(t, test, false, false, false, false, false, false, false, "Day", "", false)
runGoldenTest(t, test, generateOptions{
trimPrefix: "Day",
transformMethod: "noop",
})
}
for _, test := range goldenTrimPrefixMultiple {
runGoldenTest(t, test, false, false, false, false, false, false, false, "Day,Night", "", false)
runGoldenTest(t, test, generateOptions{
trimPrefix: "Day,Night",
transformMethod: "noop",
})
}
for _, test := range goldenWithPrefix {
runGoldenTest(t, test, false, false, false, false, false, false, false, "", "Day", false)
runGoldenTest(t, test, generateOptions{
addPrefix: "Day",
transformMethod: "noop",
})
}
for _, test := range goldenTrimAndAddPrefix {
runGoldenTest(t, test, false, false, false, false, false, false, false, "Day", "Night", false)
runGoldenTest(t, test, generateOptions{
trimPrefix: "Day",
addPrefix: "Night",
transformMethod: "noop",
})
}
for _, test := range goldenLinecomment {
runGoldenTest(t, test, false, false, false, false, true, false, false, "", "", false)
runGoldenTest(t, test, generateOptions{
transformMethod: "noop",
lineComment: true,
})
}
for _, test := range goldenFlagValue {
runGoldenTest(t, test, generateOptions{
transformMethod: "noop",
includeFlagMethods: true,
})
}
for _, test := range goldenPflagValue {
runGoldenTest(t, test, generateOptions{
transformMethod: "noop",
includePflagMethods: true,
})
}

for _, test := range goldenTypedErrors {
runGoldenTest(t, test, false, false, false, false, false, false, false, "", "", true)
runGoldenTest(t, test, generateOptions{
transformMethod: "noop",
useTypedErrors: true,
})
}
}

func runGoldenTest(t *testing.T, test Golden,
generateJSON, generateYAML, generateSQL, generateText, linecomment, generateGQLGen, generateValuesMethod bool,
trimPrefix string, prefix string, useTypedErrors bool) {
func runGoldenTest(t *testing.T, test Golden, opts generateOptions) {
t.Helper()

var g Generator
file := test.name + ".go"
Expand Down Expand Up @@ -397,29 +458,35 @@ func runGoldenTest(t *testing.T, test Golden,
if len(tokens) != 3 {
t.Fatalf("%s: need type declaration on first line", test.name)
}
g.generate(tokens[1], generateJSON, generateYAML, generateSQL, generateText, generateGQLGen, "noop", trimPrefix, prefix, linecomment, generateValuesMethod, useTypedErrors)
g.generate(tokens[1], opts)

got := string(g.format())
if got != loadGolden(test.name) {
expected, err := loadGolden(test.name)
if err != nil {
t.Fatalf("unexpected error while loading golden %q: %v", test.name, err)
}

if 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 = ioutil.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(name string) (string, error) {
fh, err := os.Open("testdata/" + name + ".golden")
if err != nil {
return ""
return "", err
}
defer fh.Close()
b, err := ioutil.ReadAll(fh)
b, err := io.ReadAll(fh)
if err != nil {
return ""
return "", err
}
return string(b)
return string(b), nil

}
Loading