Skip to content

Commit 8e9c01d

Browse files
committed
gets rid of fatal func, which exits application on unexpected error
1 parent a3338b5 commit 8e9c01d

File tree

5 files changed

+54
-30
lines changed

5 files changed

+54
-30
lines changed

fmt.go

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -53,20 +53,13 @@ type registeredFormatter struct {
5353

5454
var formatters []*registeredFormatter
5555

56-
func findFmt(format string) (f FormatterFunc, err error) {
57-
var names []string
56+
func findFmt(format string) FormatterFunc {
5857
for _, el := range formatters {
5958
if el.name == format {
60-
f = el.fmt
61-
break
59+
return el.fmt
6260
}
63-
names = append(names, el.name)
6461
}
65-
66-
if f == nil {
67-
err = fmt.Errorf(`unregistered formatter name: "%s", use one of: %s`, format, strings.Join(names, ", "))
68-
}
69-
return
62+
return nil
7063
}
7164

7265
// Format registers a feature suite output

fmt_test.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package godog
22

33
import (
44
"io"
5+
"testing"
56

67
"github.com/DATA-DOG/godog/gherkin"
78
)
@@ -32,3 +33,25 @@ func (f *testFormatter) Node(node interface{}) {
3233
}
3334

3435
func (f *testFormatter) Summary() {}
36+
37+
func TestShouldFindFormatter(t *testing.T) {
38+
cases := map[string]bool{
39+
"progress": true, // true means should be available
40+
"unknown": false,
41+
"junit": true,
42+
"cucumber": true,
43+
"pretty": true,
44+
"custom": true, // is available for test purposes only
45+
"undef": false,
46+
}
47+
48+
for name, shouldFind := range cases {
49+
actual := findFmt(name)
50+
if actual == nil && shouldFind {
51+
t.Fatalf("expected %s formatter should be available", name)
52+
}
53+
if actual != nil && !shouldFind {
54+
t.Fatalf("expected %s formatter should not be available", name)
55+
}
56+
}
57+
}

run.go

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"io"
66
"os"
77
"strconv"
8+
"strings"
89

910
"github.com/DATA-DOG/godog/colors"
1011
)
@@ -93,7 +94,7 @@ func RunWithOptions(suite string, contextInitializer func(suite *Suite), opt Opt
9394
s := &Suite{}
9495
contextInitializer(s)
9596
s.printStepDefinitions(output)
96-
return 0
97+
return 2 // showing help or printing definitions, results exit code - 2
9798
}
9899

99100
if len(opt.Paths) == 0 {
@@ -104,13 +105,28 @@ func RunWithOptions(suite string, contextInitializer func(suite *Suite), opt Opt
104105
}
105106

106107
if opt.Concurrency > 1 && !supportsConcurrency(opt.Format) {
107-
fatal(fmt.Errorf("format \"%s\" does not support concurrent execution", opt.Format))
108+
fmt.Fprintln(os.Stderr, fmt.Errorf("format \"%s\" does not support concurrent execution", opt.Format))
109+
return 1
110+
}
111+
formatter := findFmt(opt.Format)
112+
if nil == formatter {
113+
var names []string
114+
for name := range AvailableFormatters() {
115+
names = append(names, name)
116+
}
117+
fmt.Fprintln(os.Stderr, fmt.Errorf(
118+
`unregistered formatter name: "%s", use one of: %s`,
119+
opt.Format,
120+
strings.Join(names, ", "),
121+
))
122+
return 1
108123
}
109-
formatter, err := findFmt(opt.Format)
110-
fatal(err)
111124

112125
features, err := parseFeatures(opt.Tags, opt.Paths)
113-
fatal(err)
126+
if err != nil {
127+
fmt.Fprintln(os.Stderr, err)
128+
return 1
129+
}
114130

115131
r := runner{
116132
fmt: formatter(suite, output),
@@ -152,8 +168,10 @@ func Run(suite string, contextInitializer func(suite *Suite)) int {
152168
var opt Options
153169
opt.Output = colors.Colored(os.Stdout)
154170
flagSet := FlagSet(&opt)
155-
err := flagSet.Parse(os.Args[1:])
156-
fatal(err)
171+
if err := flagSet.Parse(os.Args[1:]); err != nil {
172+
fmt.Fprintln(os.Stderr, err)
173+
return 1
174+
}
157175

158176
opt.Paths = flagSet.Args()
159177

suite_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -137,9 +137,9 @@ func (s *suiteContext) ResetBeforeEachScenario(interface{}) {
137137
}
138138

139139
func (s *suiteContext) iRunFeatureSuiteWithFormatter(name string) error {
140-
f, err := findFmt(name)
141-
if err != nil {
142-
return err
140+
f := findFmt(name)
141+
if f == nil {
142+
return fmt.Errorf(`formatter "%s" is not available`, name)
143143
}
144144
s.testedSuite.fmt = f("godog", &s.out)
145145
if err := s.parseFeatures(); err != nil {

utils.go

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package godog
22

33
import (
4-
"fmt"
5-
"os"
64
"strings"
75
"time"
86

@@ -27,14 +25,6 @@ func s(n int) string {
2725
return strings.Repeat(" ", n)
2826
}
2927

30-
// checks the error and exits with error status code
31-
func fatal(err error) {
32-
if err != nil {
33-
fmt.Fprintln(os.Stderr, err)
34-
os.Exit(1)
35-
}
36-
}
37-
3828
var timeNowFunc = func() time.Time {
3929
return time.Now()
4030
}

0 commit comments

Comments
 (0)