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