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