mirror of
https://github.com/eiblog/eiblog.git
synced 2026-02-10 16:42:26 +08:00
174 lines
3.9 KiB
Go
174 lines
3.9 KiB
Go
package cmdline
|
|
|
|
import (
|
|
"reflect"
|
|
"testing"
|
|
)
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
func equalErr(err error, errExp interface{}) bool {
|
|
|
|
if err == nil || errExp == nil {
|
|
return err == nil && errExp == nil
|
|
}
|
|
return err.Error() == errExp.(string)
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
func TestComment(t *testing.T) {
|
|
|
|
execSub := false
|
|
ctx := Parser{
|
|
ExecSub: func(code string) (string, error) {
|
|
execSub = true
|
|
return "[" + code + "]", nil
|
|
},
|
|
Escape: func(c byte) string {
|
|
return string(c)
|
|
},
|
|
}
|
|
|
|
cmd, codeNext, err := ctx.ParseCode("#abc `calc $(a)+$(b)`")
|
|
if err != EOF || codeNext != "" {
|
|
t.Fatal("ParseCode: eof is expected")
|
|
}
|
|
if execSub {
|
|
t.Fatal("don't execSub")
|
|
}
|
|
if len(cmd) != 0 {
|
|
t.Fatal("len(cmd) != 0")
|
|
}
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|
|
type caseParse struct {
|
|
code string
|
|
cmd []string
|
|
codeNext string
|
|
err interface{}
|
|
}
|
|
|
|
func TestParse(t *testing.T) {
|
|
|
|
cases := []caseParse{
|
|
{
|
|
code: ";b",
|
|
cmd: []string{"b"},
|
|
codeNext: "",
|
|
err: "end of file",
|
|
},
|
|
{
|
|
code: ";b;abc",
|
|
cmd: []string{"b"},
|
|
codeNext: "abc",
|
|
err: nil,
|
|
},
|
|
{
|
|
code: "a`b`\\c",
|
|
cmd: []string{"a[b]c"},
|
|
codeNext: "",
|
|
err: "end of file",
|
|
},
|
|
{
|
|
code: "a`b`c 'c\\n`123`' \"c\\n\"",
|
|
cmd: []string{"a[b]c", "c\\n`123`", "cn"},
|
|
codeNext: "",
|
|
err: "end of file",
|
|
},
|
|
{
|
|
code: "auth qboxtest 'mac AccessKey SecretKey'",
|
|
cmd: []string{"auth", "qboxtest", "mac AccessKey SecretKey"},
|
|
codeNext: "",
|
|
err: "end of file",
|
|
},
|
|
{
|
|
code: "post http://rs.qiniu.com/delete/`base64 Bucket:Key`",
|
|
cmd: []string{"post", "http://rs.qiniu.com/delete/[base64 Bucket:Key]"},
|
|
codeNext: "",
|
|
err: "end of file",
|
|
},
|
|
{
|
|
code: "post http://rs.qiniu.com/delete `base64 Bucket:Key`",
|
|
cmd: []string{"post", "http://rs.qiniu.com/delete", "[base64 Bucket:Key]"},
|
|
codeNext: "",
|
|
err: "end of file",
|
|
},
|
|
{
|
|
code: "post http://rs.qiniu.com/delete/|base64 Bucket:Key|",
|
|
cmd: []string{"post", "http://rs.qiniu.com/delete/[base64 Bucket:Key]"},
|
|
codeNext: "",
|
|
err: "end of file",
|
|
},
|
|
{
|
|
code: `json '[
|
|
{"code": 200}, {"code": 612}
|
|
]'`,
|
|
cmd: []string{"json", `[
|
|
{"code": 200}, {"code": 612}
|
|
]`},
|
|
codeNext: "",
|
|
err: "end of file",
|
|
},
|
|
{
|
|
code: "auth qboxtest ```\nmac AccessKey SecretKey```",
|
|
cmd: []string{"auth", "qboxtest", "mac AccessKey SecretKey"},
|
|
codeNext: "",
|
|
err: "end of file",
|
|
},
|
|
{
|
|
code: "auth qboxtest ===\nmac AccessKey SecretKey```",
|
|
cmd: []string{"auth", "qboxtest"},
|
|
codeNext: "mac AccessKey SecretKey```",
|
|
err: "incomplete string, expect ===",
|
|
},
|
|
{
|
|
code: "auth qboxtest ===\rmac AccessKey SecretKey===",
|
|
cmd: []string{"auth", "qboxtest", "mac AccessKey SecretKey"},
|
|
codeNext: "",
|
|
err: "end of file",
|
|
},
|
|
{
|
|
code: "auth qboxtest ===\n\rmac AccessKey SecretKey===",
|
|
cmd: []string{"auth", "qboxtest", "\rmac AccessKey SecretKey"},
|
|
codeNext: "",
|
|
err: "end of file",
|
|
},
|
|
{
|
|
code: "auth qboxtest ===\r\n\nmac AccessKey SecretKey===",
|
|
cmd: []string{"auth", "qboxtest", "\nmac AccessKey SecretKey"},
|
|
codeNext: "",
|
|
err: "end of file",
|
|
},
|
|
{
|
|
code: "auth qboxtest ===mac AccessKey SecretKey===",
|
|
cmd: []string{"auth", "qboxtest", "mac AccessKey SecretKey"},
|
|
codeNext: "",
|
|
err: "end of file",
|
|
},
|
|
}
|
|
|
|
ctx := Parser{
|
|
ExecSub: func(code string) (string, error) {
|
|
return "[" + code + "]", nil
|
|
},
|
|
Escape: func(c byte) string {
|
|
return string(c)
|
|
},
|
|
}
|
|
for _, c := range cases {
|
|
cmd, codeNext, err := ctx.ParseCode(c.code)
|
|
if !equalErr(err, c.err) {
|
|
t.Fatal("Parse failed:", c, err)
|
|
}
|
|
if !reflect.DeepEqual(cmd, c.cmd) || codeNext != c.codeNext {
|
|
t.Fatal("Parse failed:", c, cmd, codeNext)
|
|
}
|
|
}
|
|
}
|
|
|
|
// ---------------------------------------------------------------------------
|
|
|