github.com/qiniu/dyn@v1.3.0/flag/parser_test.go (about) 1 package flag 2 3 import ( 4 "reflect" 5 "testing" 6 7 "github.com/qiniu/dyn/vars" 8 ) 9 10 // --------------------------------------------------------------------------- 11 12 type retArgs struct { 13 Ret Cmd `cmd:"ret"` 14 Code int `arg:"code,opt"` // opt: 可选参数 15 } 16 17 type hostArgs struct { 18 HostCmd Cmd `cmd:"host"` 19 Host string `arg:"host - eg. api.qiniu.com"` 20 Portal string `arg:"portal - eg. <ip>:<port>"` 21 } 22 23 type base64Args struct { 24 Base64 Cmd `cmd:"base64"` 25 StdEncoding bool `flag:"std - use standard base64 encoding. default is urlsafe base64 encoding."` 26 Fdecode bool `flag:"d - to decode data. default is to encode data."` 27 Data string `arg:"data"` 28 } 29 30 // --------------------------------------------------------------------------- 31 32 type caseParseArgs struct { 33 argsType reflect.Type 34 cmd []string 35 args interface{} 36 err error 37 } 38 39 func TestParse(t *testing.T) { 40 41 cases := []caseParseArgs{ 42 { 43 argsType: reflect.TypeOf((*retArgs)(nil)), 44 cmd: []string{"ret", "200"}, 45 args: &retArgs{Cmd{}, 200}, 46 err: nil, 47 }, 48 { 49 argsType: reflect.TypeOf((*retArgs)(nil)), 50 cmd: []string{"ret", "$(code)"}, 51 args: &retArgs{Cmd{}, 200}, 52 err: nil, 53 }, 54 { 55 argsType: reflect.TypeOf((*retArgs)(nil)), 56 cmd: []string{"ret"}, 57 args: &retArgs{Cmd{}, 0}, 58 err: nil, 59 }, 60 { 61 argsType: reflect.TypeOf((*hostArgs)(nil)), 62 cmd: []string{"host", "api.qiniu.com", "192.168.1.10:8888"}, 63 args: &hostArgs{Cmd{}, "api.qiniu.com", "192.168.1.10:8888"}, 64 err: nil, 65 }, 66 { 67 argsType: reflect.TypeOf((*base64Args)(nil)), 68 cmd: []string{"base64", "-std", "hello"}, 69 args: &base64Args{StdEncoding: true, Fdecode: false, Data: "hello"}, 70 err: nil, 71 }, 72 } 73 74 ctx := vars.New() 75 setVar(t, ctx, "code", 200) 76 77 for _, c := range cases { 78 args, err := Parse(ctx, c.argsType, c.cmd) 79 if err != c.err { 80 t.Fatal("Parse unexpected error:", err, c) 81 } 82 if !reflect.DeepEqual(args.Interface(), c.args) { 83 t.Fatal("Parse unexpected args:", args.Interface(), c) 84 } 85 } 86 } 87 88 func setVar(t *testing.T, ctx *vars.Context, varName string, obj interface{}) { 89 90 ctx.DeleteVar(varName) 91 err := ctx.MatchVar(varName, obj) 92 if err != nil { 93 t.Fatal("setVar Match failed:", err) 94 } 95 } 96 97 // ---------------------------------------------------------------------------