summaryrefslogtreecommitdiff
path: root/subcommand_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'subcommand_test.go')
-rw-r--r--subcommand_test.go170
1 files changed, 170 insertions, 0 deletions
diff --git a/subcommand_test.go b/subcommand_test.go
new file mode 100644
index 0000000..25689a4
--- /dev/null
+++ b/subcommand_test.go
@@ -0,0 +1,170 @@
+package arg
+
+import (
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+// This file contains tests for parse.go but I decided to put them here
+// since that file is getting large
+
+func TestSubcommandNotAPointer(t *testing.T) {
+ var args struct {
+ A string `arg:"subcommand"`
+ }
+ _, err := NewParser(Config{}, &args)
+ assert.Error(t, err)
+}
+
+func TestSubcommandNotAPointerToStruct(t *testing.T) {
+ var args struct {
+ A struct{} `arg:"subcommand"`
+ }
+ _, err := NewParser(Config{}, &args)
+ assert.Error(t, err)
+}
+
+func TestPositionalAndSubcommandNotAllowed(t *testing.T) {
+ var args struct {
+ A string `arg:"positional"`
+ B struct{} `arg:"subcommand"`
+ }
+ _, err := NewParser(Config{}, &args)
+ assert.Error(t, err)
+}
+
+func TestMinimalSubcommand(t *testing.T) {
+ type listCmd struct {
+ }
+ var args struct {
+ List *listCmd `arg:"subcommand"`
+ }
+ err := parse("list", &args)
+ require.NoError(t, err)
+ assert.NotNil(t, args.List)
+}
+
+func TestNamedSubcommand(t *testing.T) {
+ type listCmd struct {
+ }
+ var args struct {
+ List *listCmd `arg:"subcommand:ls"`
+ }
+ err := parse("ls", &args)
+ require.NoError(t, err)
+ assert.NotNil(t, args.List)
+}
+
+func TestEmptySubcommand(t *testing.T) {
+ type listCmd struct {
+ }
+ var args struct {
+ List *listCmd `arg:"subcommand"`
+ }
+ err := parse("", &args)
+ require.NoError(t, err)
+ assert.Nil(t, args.List)
+}
+
+func TestTwoSubcommands(t *testing.T) {
+ type getCmd struct {
+ }
+ type listCmd struct {
+ }
+ var args struct {
+ Get *getCmd `arg:"subcommand"`
+ List *listCmd `arg:"subcommand"`
+ }
+ err := parse("list", &args)
+ require.NoError(t, err)
+ assert.Nil(t, args.Get)
+ assert.NotNil(t, args.List)
+}
+
+func TestSubcommandsWithOptions(t *testing.T) {
+ type getCmd struct {
+ Name string
+ }
+ type listCmd struct {
+ Limit int
+ }
+ type cmd struct {
+ Verbose bool
+ Get *getCmd `arg:"subcommand"`
+ List *listCmd `arg:"subcommand"`
+ }
+
+ {
+ var args cmd
+ err := parse("list", &args)
+ require.NoError(t, err)
+ assert.Nil(t, args.Get)
+ assert.NotNil(t, args.List)
+ }
+
+ {
+ var args cmd
+ err := parse("list --limit 3", &args)
+ require.NoError(t, err)
+ assert.Nil(t, args.Get)
+ assert.NotNil(t, args.List)
+ assert.Equal(t, args.List.Limit, 3)
+ }
+
+ {
+ var args cmd
+ err := parse("list --limit 3 --verbose", &args)
+ require.NoError(t, err)
+ assert.Nil(t, args.Get)
+ assert.NotNil(t, args.List)
+ assert.Equal(t, args.List.Limit, 3)
+ assert.True(t, args.Verbose)
+ }
+
+ {
+ var args cmd
+ err := parse("list --verbose --limit 3", &args)
+ require.NoError(t, err)
+ assert.Nil(t, args.Get)
+ assert.NotNil(t, args.List)
+ assert.Equal(t, args.List.Limit, 3)
+ assert.True(t, args.Verbose)
+ }
+
+ {
+ var args cmd
+ err := parse("--verbose list --limit 3", &args)
+ require.NoError(t, err)
+ assert.Nil(t, args.Get)
+ assert.NotNil(t, args.List)
+ assert.Equal(t, args.List.Limit, 3)
+ assert.True(t, args.Verbose)
+ }
+
+ {
+ var args cmd
+ err := parse("get", &args)
+ require.NoError(t, err)
+ assert.NotNil(t, args.Get)
+ assert.Nil(t, args.List)
+ }
+
+ {
+ var args cmd
+ err := parse("get --name test", &args)
+ require.NoError(t, err)
+ assert.NotNil(t, args.Get)
+ assert.Nil(t, args.List)
+ assert.Equal(t, args.Get.Name, "test")
+ }
+}
+
+func TestNestedSubcommands(t *testing.T) {
+ // tree of subcommands
+}
+
+func TestSubcommandsWithPositionals(t *testing.T) {
+ // subcommands with positional arguments
+}