Commit 68a0e34d authored by Juan Batiz-Benet's avatar Juan Batiz-Benet

Merge pull request #1193 from ipfs/improve_parse_test

Improve parse_test.go
parents 00148893 a2d4d4b2
...@@ -3,35 +3,29 @@ package cli ...@@ -3,35 +3,29 @@ package cli
import ( import (
"strings" "strings"
"testing" "testing"
"io"
"io/ioutil"
"os"
"github.com/ipfs/go-ipfs/commands" "github.com/ipfs/go-ipfs/commands"
) )
func TestOptionParsing(t *testing.T) { type kvs map[string]interface{}
subCmd := &commands.Command{} type words []string
cmd := &commands.Command{
Options: []commands.Option{
commands.StringOption("string", "s", "a string"),
commands.BoolOption("bool", "b", "a bool"),
},
Subcommands: map[string]*commands.Command{
"test": subCmd,
},
}
type kvs map[string]interface{} func sameWords(a words, b words) bool {
type words []string if len(a) != len(b) {
return false
sameWords := func(a words, b words) bool { }
for i, w := range a { for i, w := range a {
if w != b[i] { if w != b[i] {
return false return false
} }
} }
return true return true
} }
sameKVs := func(a kvs, b kvs) bool { func sameKVs(a kvs, b kvs) bool {
if len(a) != len(b) { if len(a) != len(b) {
return false return false
} }
...@@ -41,6 +35,45 @@ func TestOptionParsing(t *testing.T) { ...@@ -41,6 +35,45 @@ func TestOptionParsing(t *testing.T) {
} }
} }
return true return true
}
func TestSameWords(t *testing.T) {
a := []string{"v1", "v2"}
b := []string{"v1", "v2", "v3"}
c := []string{"v2", "v3"}
d := []string{"v2"}
e := []string{"v2", "v3"}
f := []string{"v2", "v1"}
test := func(a words, b words, v bool) {
if sameWords(a, b) != v {
t.Errorf("sameWords('%v', '%v') != %v", a, b, v)
}
}
test(a, b, false)
test(a, a, true)
test(a, c, false)
test(b, c, false)
test(c, d, false)
test(c, e, true)
test(b, e, false)
test(a, b, false)
test(a, f, false)
test(e, f, false)
test(f, f, true)
}
func TestOptionParsing(t *testing.T) {
subCmd := &commands.Command{}
cmd := &commands.Command{
Options: []commands.Option{
commands.StringOption("string", "s", "a string"),
commands.BoolOption("bool", "b", "a bool"),
},
Subcommands: map[string]*commands.Command{
"test": subCmd,
},
} }
testHelper := func(args string, expectedOpts kvs, expectedWords words, expectErr bool) { testHelper := func(args string, expectedOpts kvs, expectedWords words, expectErr bool) {
...@@ -117,76 +150,78 @@ func TestArgumentParsing(t *testing.T) { ...@@ -117,76 +150,78 @@ func TestArgumentParsing(t *testing.T) {
commands.StringArg("b", true, false, "another arg"), commands.StringArg("b", true, false, "another arg"),
}, },
}, },
"stdinenabled": &commands.Command{
Arguments: []commands.Argument{
commands.StringArg("a", true, true, "some arg").EnableStdin(),
},
},
}, },
} }
_, _, _, err := Parse([]string{"noarg"}, nil, rootCmd) test := func(cmd words, f *os.File, res words) {
if err != nil { if f != nil {
t.Error("Should have passed") if _, err := f.Seek(0, os.SEEK_SET); err != nil {
t.Fatal(err)
} }
_, _, _, err = Parse([]string{"noarg", "value!"}, nil, rootCmd)
if err == nil {
t.Error("Should have failed (provided an arg, but command didn't define any)")
} }
req, _, _, err := Parse(cmd, f, rootCmd)
_, _, _, err = Parse([]string{"onearg", "value!"}, nil, rootCmd)
if err != nil { if err != nil {
t.Error("Should have passed") t.Errorf("Command '%v' should have passed parsing", cmd)
} }
_, _, _, err = Parse([]string{"onearg"}, nil, rootCmd) if !sameWords(req.Arguments(), res) {
if err == nil { t.Errorf("Arguments parsed from '%v' are not '%v'", cmd, res)
t.Error("Should have failed (didn't provide any args, arg is required)")
} }
_, _, _, err = Parse([]string{"twoargs", "value1", "value2"}, nil, rootCmd)
if err != nil {
t.Error("Should have passed")
} }
_, _, _, err = Parse([]string{"twoargs", "value!"}, nil, rootCmd)
testFail := func(cmd words, msg string) {
_, _, _, err := Parse(cmd, nil, rootCmd)
if err == nil { if err == nil {
t.Error("Should have failed (only provided 1 arg, needs 2)") t.Errorf("Should have failed: %v", msg)
} }
_, _, _, err = Parse([]string{"twoargs"}, nil, rootCmd)
if err == nil {
t.Error("Should have failed (didn't provide any args, 2 required)")
} }
_, _, _, err = Parse([]string{"variadic", "value!"}, nil, rootCmd) test([]string{"noarg"}, nil, []string{})
if err != nil { testFail([]string{"noarg", "value!"}, "provided an arg, but command didn't define any")
t.Error("Should have passed")
}
_, _, _, err = Parse([]string{"variadic", "value1", "value2", "value3"}, nil, rootCmd)
if err != nil {
t.Error("Should have passed")
}
_, _, _, err = Parse([]string{"variadic"}, nil, rootCmd)
if err == nil {
t.Error("Should have failed (didn't provide any args, 1 required)")
}
_, _, _, err = Parse([]string{"optional", "value!"}, nil, rootCmd) test([]string{"onearg", "value!"}, nil, []string{"value!"})
if err != nil { testFail([]string{"onearg"}, "didn't provide any args, arg is required")
t.Error("Should have passed")
}
_, _, _, err = Parse([]string{"optional"}, nil, rootCmd)
if err != nil {
t.Error("Should have passed")
}
_, _, _, err = Parse([]string{"reversedoptional", "value1", "value2"}, nil, rootCmd) test([]string{"twoargs", "value1", "value2"}, nil, []string{"value1", "value2"})
if err != nil { testFail([]string{"twoargs", "value!"}, "only provided 1 arg, needs 2")
t.Error("Should have passed") testFail([]string{"twoargs"}, "didn't provide any args, 2 required")
}
_, _, _, err = Parse([]string{"reversedoptional", "value!"}, nil, rootCmd) test([]string{"variadic", "value!"}, nil, []string{"value!"})
test([]string{"variadic", "value1", "value2", "value3"}, nil, []string{"value1", "value2", "value3"})
testFail([]string{"variadic"}, "didn't provide any args, 1 required")
test([]string{"optional", "value!"}, nil, []string{"value!"})
test([]string{"optional"}, nil, []string{})
test([]string{"reversedoptional", "value1", "value2"}, nil, []string{"value1", "value2"})
test([]string{"reversedoptional", "value!"}, nil, []string{"value!"})
testFail([]string{"reversedoptional"}, "didn't provide any args, 1 required")
testFail([]string{"reversedoptional", "value1", "value2", "value3"}, "provided too many args, only takes 1")
// Use a temp file to simulate stdin
fileToSimulateStdin := func(t *testing.T, content string) (*os.File) {
fstdin, err := ioutil.TempFile("", "")
if err != nil { if err != nil {
t.Error("Should have passed") t.Fatal(err)
} }
_, _, _, err = Parse([]string{"reversedoptional"}, nil, rootCmd) defer os.Remove(fstdin.Name())
if err == nil {
t.Error("Should have failed (didn't provide any args, 1 required)") if _, err := io.WriteString(fstdin, content); err != nil {
t.Fatal(err)
} }
_, _, _, err = Parse([]string{"reversedoptional", "value1", "value2", "value3"}, nil, rootCmd) return fstdin
if err == nil {
t.Error("Should have failed (provided too many args, only takes 1)")
} }
test([]string{"stdinenabled", "value1", "value2"}, nil, []string{"value1", "value2"})
fstdin := fileToSimulateStdin(t, "stdin1")
test([]string{"stdinenabled"}, fstdin, []string{"stdin1"})
test([]string{"stdinenabled", "value1"}, fstdin, []string{"stdin1", "value1"})
test([]string{"stdinenabled", "value1", "value2"}, fstdin, []string{"stdin1", "value1", "value2"})
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment