github.com/qiniu/x@v1.11.9/cmdline/cmdline_test.go (about)

     1  package cmdline
     2  
     3  import (
     4  	"reflect"
     5  	"testing"
     6  )
     7  
     8  // ---------------------------------------------------------------------------
     9  
    10  func equalErr(err error, errExp interface{}) bool {
    11  
    12  	if err == nil || errExp == nil {
    13  		return err == nil && errExp == nil
    14  	}
    15  	return err.Error() == errExp.(string)
    16  }
    17  
    18  // ---------------------------------------------------------------------------
    19  
    20  func TestComment(t *testing.T) {
    21  
    22  	execSub := false
    23  	ctx := Parser{
    24  		ExecSub: func(code string) (string, error) {
    25  			execSub = true
    26  			return "[" + code + "]", nil
    27  		},
    28  		Escape: func(c byte) string {
    29  			return string(c)
    30  		},
    31  	}
    32  
    33  	cmd, codeNext, err := ctx.ParseCode("#abc `calc $(a)+$(b)`")
    34  	if err != EOF || codeNext != "" {
    35  		t.Fatal("ParseCode: eof is expected")
    36  	}
    37  	if execSub {
    38  		t.Fatal("don't execSub")
    39  	}
    40  	if len(cmd) != 0 {
    41  		t.Fatal("len(cmd) != 0")
    42  	}
    43  }
    44  
    45  // ---------------------------------------------------------------------------
    46  
    47  type caseParse struct {
    48  	code     string
    49  	cmd      []string
    50  	codeNext string
    51  	err      interface{}
    52  }
    53  
    54  func TestParse(t *testing.T) {
    55  
    56  	cases := []caseParse{
    57  		{
    58  			code:     ";b",
    59  			cmd:      []string{"b"},
    60  			codeNext: "",
    61  			err:      "end of file",
    62  		},
    63  		{
    64  			code:     ";b;abc",
    65  			cmd:      []string{"b"},
    66  			codeNext: "abc",
    67  			err:      nil,
    68  		},
    69  		{
    70  			code:     "a`b`\\c",
    71  			cmd:      []string{"a[b]c"},
    72  			codeNext: "",
    73  			err:      "end of file",
    74  		},
    75  		{
    76  			code:     "a`b`c 'c\\n`123`' \"c\\n\"",
    77  			cmd:      []string{"a[b]c", "c\\n`123`", "cn"},
    78  			codeNext: "",
    79  			err:      "end of file",
    80  		},
    81  		{
    82  			code:     "auth qboxtest 'mac AccessKey SecretKey'",
    83  			cmd:      []string{"auth", "qboxtest", "mac AccessKey SecretKey"},
    84  			codeNext: "",
    85  			err:      "end of file",
    86  		},
    87  		{
    88  			code:     "post http://rs.qiniu.com/delete/`base64 Bucket:Key`",
    89  			cmd:      []string{"post", "http://rs.qiniu.com/delete/[base64 Bucket:Key]"},
    90  			codeNext: "",
    91  			err:      "end of file",
    92  		},
    93  		{
    94  			code:     "post http://rs.qiniu.com/delete `base64 Bucket:Key`",
    95  			cmd:      []string{"post", "http://rs.qiniu.com/delete", "[base64 Bucket:Key]"},
    96  			codeNext: "",
    97  			err:      "end of file",
    98  		},
    99  		{
   100  			code:     "post http://rs.qiniu.com/delete/|base64 Bucket:Key|",
   101  			cmd:      []string{"post", "http://rs.qiniu.com/delete/[base64 Bucket:Key]"},
   102  			codeNext: "",
   103  			err:      "end of file",
   104  		},
   105  		{
   106  			code: `json '[
   107  	{"code": 200}, {"code": 612}
   108  ]'`,
   109  			cmd: []string{"json", `[
   110  	{"code": 200}, {"code": 612}
   111  ]`},
   112  			codeNext: "",
   113  			err:      "end of file",
   114  		},
   115  		{
   116  			code:     "auth qboxtest ```\nmac AccessKey SecretKey```",
   117  			cmd:      []string{"auth", "qboxtest", "mac AccessKey SecretKey"},
   118  			codeNext: "",
   119  			err:      "end of file",
   120  		},
   121  		{
   122  			code:     "auth qboxtest ===\nmac AccessKey SecretKey```",
   123  			cmd:      []string{"auth", "qboxtest"},
   124  			codeNext: "mac AccessKey SecretKey```",
   125  			err:      "incomplete string, expect ===",
   126  		},
   127  		{
   128  			code:     "auth qboxtest ===\rmac AccessKey SecretKey===",
   129  			cmd:      []string{"auth", "qboxtest", "mac AccessKey SecretKey"},
   130  			codeNext: "",
   131  			err:      "end of file",
   132  		},
   133  		{
   134  			code:     "auth qboxtest ===\n\rmac AccessKey SecretKey===",
   135  			cmd:      []string{"auth", "qboxtest", "\rmac AccessKey SecretKey"},
   136  			codeNext: "",
   137  			err:      "end of file",
   138  		},
   139  		{
   140  			code:     "auth qboxtest ===\r\n\nmac AccessKey SecretKey===",
   141  			cmd:      []string{"auth", "qboxtest", "\nmac AccessKey SecretKey"},
   142  			codeNext: "",
   143  			err:      "end of file",
   144  		},
   145  		{
   146  			code:     "auth qboxtest ===mac AccessKey SecretKey===",
   147  			cmd:      []string{"auth", "qboxtest", "mac AccessKey SecretKey"},
   148  			codeNext: "",
   149  			err:      "end of file",
   150  		},
   151  	}
   152  
   153  	ctx := Parser{
   154  		ExecSub: func(code string) (string, error) {
   155  			return "[" + code + "]", nil
   156  		},
   157  		Escape: func(c byte) string {
   158  			return string(c)
   159  		},
   160  	}
   161  	for _, c := range cases {
   162  		cmd, codeNext, err := ctx.ParseCode(c.code)
   163  		if !equalErr(err, c.err) {
   164  			t.Fatal("Parse failed:", c, err)
   165  		}
   166  		if !reflect.DeepEqual(cmd, c.cmd) || codeNext != c.codeNext {
   167  			t.Fatal("Parse failed:", c, cmd, codeNext)
   168  		}
   169  	}
   170  }
   171  
   172  // ---------------------------------------------------------------------------