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  // ---------------------------------------------------------------------------