...
1 package cli
2
3 import (
4 "bytes"
5 "errors"
6 "fmt"
7 "testing"
8 )
9
10 func TestHandleExitCoder_nil(t *testing.T) {
11 exitCode := 0
12 called := false
13
14 OsExiter = func(rc int) {
15 if !called {
16 exitCode = rc
17 called = true
18 }
19 }
20
21 defer func() { OsExiter = fakeOsExiter }()
22
23 HandleExitCoder(nil)
24
25 expect(t, exitCode, 0)
26 expect(t, called, false)
27 }
28
29 func TestHandleExitCoder_ExitCoder(t *testing.T) {
30 exitCode := 0
31 called := false
32
33 OsExiter = func(rc int) {
34 if !called {
35 exitCode = rc
36 called = true
37 }
38 }
39
40 defer func() { OsExiter = fakeOsExiter }()
41
42 HandleExitCoder(Exit("galactic perimeter breach", 9))
43
44 expect(t, exitCode, 9)
45 expect(t, called, true)
46 }
47
48 func TestHandleExitCoder_ErrorExitCoder(t *testing.T) {
49 exitCode := 0
50 called := false
51
52 OsExiter = func(rc int) {
53 if !called {
54 exitCode = rc
55 called = true
56 }
57 }
58
59 defer func() { OsExiter = fakeOsExiter }()
60
61 HandleExitCoder(Exit(errors.New("galactic perimeter breach"), 9))
62
63 expect(t, exitCode, 9)
64 expect(t, called, true)
65 }
66
67 func TestHandleExitCoder_MultiErrorWithExitCoder(t *testing.T) {
68 exitCode := 0
69 called := false
70
71 OsExiter = func(rc int) {
72 if !called {
73 exitCode = rc
74 called = true
75 }
76 }
77
78 defer func() { OsExiter = fakeOsExiter }()
79
80 exitErr := Exit("galactic perimeter breach", 9)
81 exitErr2 := Exit("last ExitCoder", 11)
82 err := newMultiError(errors.New("wowsa"), errors.New("egad"), exitErr, exitErr2)
83 HandleExitCoder(err)
84
85 expect(t, exitCode, 11)
86 expect(t, called, true)
87 }
88
89 func TestHandleExitCoder_MultiErrorWithoutExitCoder(t *testing.T) {
90 exitCode := 0
91 called := false
92
93 OsExiter = func(rc int) {
94 if !called {
95 exitCode = rc
96 called = true
97 }
98 }
99
100 defer func() { OsExiter = fakeOsExiter }()
101
102 err := newMultiError(errors.New("wowsa"), errors.New("egad"))
103 HandleExitCoder(err)
104
105 expect(t, exitCode, 1)
106 expect(t, called, true)
107 }
108
109
110 type ErrorWithFormat struct {
111 error
112 }
113
114 func NewErrorWithFormat(m string) *ErrorWithFormat {
115 return &ErrorWithFormat{error: errors.New(m)}
116 }
117
118 func (f *ErrorWithFormat) Format(s fmt.State, verb rune) {
119 fmt.Fprintf(s, "This the format: %v", f.error)
120 }
121
122 func TestHandleExitCoder_ErrorWithFormat(t *testing.T) {
123 called := false
124
125 OsExiter = func(rc int) {
126 if !called {
127 called = true
128 }
129 }
130 ErrWriter = &bytes.Buffer{}
131
132 defer func() {
133 OsExiter = fakeOsExiter
134 ErrWriter = fakeErrWriter
135 }()
136
137 err := Exit(NewErrorWithFormat("I am formatted"), 1)
138 HandleExitCoder(err)
139
140 expect(t, called, true)
141 expect(t, ErrWriter.(*bytes.Buffer).String(), "This the format: I am formatted\n")
142 }
143
144 func TestHandleExitCoder_MultiErrorWithFormat(t *testing.T) {
145 called := false
146
147 OsExiter = func(rc int) {
148 if !called {
149 called = true
150 }
151 }
152 ErrWriter = &bytes.Buffer{}
153
154 defer func() { OsExiter = fakeOsExiter }()
155
156 err := newMultiError(NewErrorWithFormat("err1"), NewErrorWithFormat("err2"))
157 HandleExitCoder(err)
158
159 expect(t, called, true)
160 expect(t, ErrWriter.(*bytes.Buffer).String(), "This the format: err1\nThis the format: err2\n")
161 }
162
View as plain text