github.com/WindomZ/go-commander@v1.2.2/program_test.go (about) 1 package commander 2 3 import ( 4 "github.com/WindomZ/testify/assert" 5 "strconv" 6 "testing" 7 ) 8 9 func TestProgram_AutomaticHelp(t *testing.T) { 10 program := newProgram() 11 12 program.Command("go-commander"). 13 Version("0.0.1"). 14 Description("this is a test cli.") 15 16 if _, err := program.Parse([]string{}); err != nil { 17 t.Fatal(err) 18 } 19 if _, err := program.Parse([]string{"go-commander", "-h"}); err != nil { 20 t.Fatal(err) 21 } 22 } 23 24 func TestProgram_ShowVersion(t *testing.T) { 25 program := newProgram() 26 27 program.Command("go-commander") 28 program.Version("0.0.1"). 29 Description("this is a test cli.") 30 31 if _, err := program.Parse([]string{"go-commander", "-v"}); err != nil { 32 t.Fatal(err) 33 } 34 } 35 36 func TestProgram_ErrorHandling(t *testing.T) { 37 program := newProgram() 38 39 program.Command("go-commander"). 40 Version("0.0.1"). 41 Description("this is a test cli.") 42 43 program.Command("test").Action(func() error { 44 return newError("this is a test error") 45 }) 46 47 _, err := program.Parse(nil) 48 assert.Error(t, err) 49 50 _, err = program.Parse([]string{"go-commander", "test"}) 51 assert.Error(t, err) 52 53 var handing bool = false 54 program.ErrorHandling(func(err error) { 55 assert.Error(t, err) 56 handing = true 57 }) 58 59 _, err = program.Parse([]string{"go-commander", "test"}) 60 assert.Error(t, err) 61 assert.True(t, handing) 62 } 63 64 func TestProgram_LineOption(t *testing.T) { 65 var result string 66 var result2 string 67 68 program := newProgram() 69 70 program.Command("test"). 71 Version("0.0.1"). 72 Description("this is a test cli.") 73 74 program.Command("-a --aaa"). 75 Action(func() { 76 result = "aaa" 77 }). 78 Option("-d --ddd"). 79 Action(func() { 80 result2 = "ddd" 81 }) 82 program.Command("-b --bbb", "", 83 func() { 84 result = "bbb" 85 }) 86 program.Command("-c"). 87 Action(func() { 88 result = "ccc" 89 }) 90 91 if _, err := program.Parse([]string{"test", "-a"}); err != nil { 92 t.Fatal(err) 93 } else { 94 assert.Equal(t, result, "aaa") 95 } 96 if _, err := program.Parse([]string{"test", "-a", "-d"}); err != nil { 97 t.Fatal(err) 98 } else { 99 assert.Equal(t, result, "aaa") 100 assert.Equal(t, result2, "ddd") 101 } 102 if _, err := program.Parse([]string{"test", "--bbb"}); err != nil { 103 t.Fatal(err) 104 } else { 105 assert.Equal(t, result, "bbb") 106 } 107 if _, err := program.Parse([]string{"test", "-c"}); err != nil { 108 t.Fatal(err) 109 } else { 110 assert.Equal(t, result, "ccc") 111 } 112 } 113 114 func TestProgram_Aliases(t *testing.T) { 115 program := newProgram() 116 117 program.Command("go-commander") 118 119 program.Command("-i --init") 120 121 program.Command("-o"). 122 Aliases([]string{"--origin"}) 123 124 assert.Equal(t, program.HelpMessage(), ` Usage: 125 go-commander -i|--init 126 go-commander -o|--origin 127 go-commander -h|--help 128 go-commander -v|--version 129 130 Options: 131 -h --help output usage information 132 -v --version output the version number 133 `) 134 } 135 136 func TestProgram_CommandDescription(t *testing.T) { 137 program := newProgram() 138 139 program.Command("go-commander") 140 141 program.Command("-i --init"). 142 Description("this is init flag") 143 144 program.Command("-o"). 145 Aliases([]string{"--origin"}). 146 Description("this is origin flag") 147 148 assert.Equal(t, program.HelpMessage(), ` Usage: 149 go-commander -i|--init 150 go-commander -o|--origin 151 go-commander -h|--help 152 go-commander -v|--version 153 154 Options: 155 -h --help output usage information 156 -i --init this is init flag 157 -o --origin this is origin flag 158 -v --version output the version number 159 `) 160 } 161 162 func TestProgram_Ping(t *testing.T) { 163 var sum int 164 var host string 165 program := newProgram() 166 167 program.Command("test"). 168 Version("0.0.1"). 169 Description("this is a test cli.") 170 171 program.Command("add <x> <y>"). 172 Description("addition operation"). 173 Action(func() error { 174 sum = program.MustInt("<x>") + program.MustInt("<y>") 175 return nil 176 }) 177 178 program.Command("ping <host>"). 179 Option("--timeout=<seconds>", 180 "", 181 func() error { 182 seconds := program.MustString("<seconds>") 183 184 t.Log("seconds =", seconds) 185 186 assert.Equal(t, seconds, 0) 187 return nil 188 }, 189 ).Action(func() error { 190 host = program.MustString("<host>") 191 return nil 192 }) 193 194 if _, err := program.Parse([]string{"test", "add", "10", "20"}); err != nil { 195 t.Fatal(err) 196 } 197 if _, err := program.Parse([]string{"test", "ping", "127.0.0.1"}); err != nil { 198 t.Fatal(err) 199 } 200 201 assert.Equal(t, sum, 30) 202 assert.Equal(t, host, "127.0.0.1") 203 } 204 205 func TestProgram_Calculator(t *testing.T) { 206 var result int 207 program := newProgram() 208 209 program.Command("calculator_example"). 210 Version("0.0.1"). 211 Description("simple calculator example") 212 213 program.Command("<value> ( ( + | - | * | / ) <value> )...", "", func() error { 214 values := program.MustStrings("<value>") 215 for index, value := range values { 216 if i, err := strconv.Atoi(value); err != nil { 217 } else if index == 0 { 218 result = i 219 } else { 220 switch program.GetArg(index*2 - 1) { 221 case "+": 222 result += i 223 case "-": 224 result -= i 225 case "*": 226 result *= i 227 case "/": 228 result /= i 229 } 230 } 231 } 232 return nil 233 }) 234 235 program.Command("<function> <value> [( , <value> )]...", "", func() error { 236 result = 0 237 switch program.MustString("<function>") { 238 case "sum": 239 values := program.MustStrings("<value>") 240 for _, value := range values { 241 if i, err := strconv.Atoi(value); err == nil { 242 result += i 243 } 244 } 245 } 246 return nil 247 }) 248 249 if _, err := program.Parse([]string{"calculator_example", 250 "1", "+", "2", "+", "3", "+", "4", "+", "5"}); err != nil { 251 t.Fatal(err) 252 } 253 assert.Equal(t, result, 15) 254 255 if _, err := program.Parse([]string{"calculator_example", 256 "1", "+", "2", "*", "3", "/", "4", "-", "5"}); err != nil { 257 t.Fatal(err) 258 } 259 assert.Equal(t, result, -3) 260 261 if _, err := program.Parse([]string{"calculator_example", 262 "sum", "10", ",", "20", ",", "30", ",", "40"}); err != nil { 263 t.Fatal(err) 264 } 265 assert.Equal(t, result, 100) 266 }