diff --git a/v2/precedence_test.go b/v2/precedence_test.go new file mode 100644 index 0000000..84646e4 --- /dev/null +++ b/v2/precedence_test.go @@ -0,0 +1,271 @@ +package arg + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// this file contains tests related to the precedence rules for: +// ProcessCommandLine +// ProcessOptions +// ProcessPositionals +// ProcessEnvironment +// ProcessMap +// ProcessSingle +// ProcessSequence +// OverwriteWithCommandLine +// OverwriteWithOptions +// OverwriteWithPositionals +// OverwriteWithEnvironment +// OverwriteWithMap +// +// The Process* functions should not overwrite fields that have +// been previously populated, whereas the OverwriteWith* functions +// should overwrite fields that have been previously populated. + +// check that we can accumulate "separate" args across env, cmdline, map, and defaults + +// check what happens if we have a required arg with a default value + +// add more tests for combinations of separate and cardinality + +// check what happens if we call ProcessCommandLine multiple times with different subcommands + +func TestProcessOptions(t *testing.T) { + var args struct { + Arg string + } + + p, err := NewParser(&args) + require.NoError(t, err) + + _, err = p.ProcessOptions([]string{"program", "--arg=hello"}) + require.NoError(t, err) + assert.Equal(t, "hello", args.Arg) +} + +func TestProcessOptionsDoesNotOverwrite(t *testing.T) { + var args struct { + Arg string `arg:"env"` + } + + p, err := NewParser(&args) + require.NoError(t, err) + + err = p.ProcessEnvironment([]string{"ARG=123"}) + require.NoError(t, err) + + _, err = p.ProcessOptions([]string{"--arg=hello"}) + require.NoError(t, err) + + assert.EqualValues(t, "123", args.Arg) +} + +func TestOverwriteWithOptions(t *testing.T) { + var args struct { + Arg string `arg:"env"` + } + + p, err := NewParser(&args) + require.NoError(t, err) + + err = p.ProcessEnvironment([]string{"ARG=123"}) + require.NoError(t, err) + + _, err = p.OverwriteWithOptions([]string{"--arg=hello"}) + require.NoError(t, err) + + assert.EqualValues(t, "hello", args.Arg) +} + +func TestProcessPositionals(t *testing.T) { + var args struct { + Arg string `arg:"positional"` + } + + p, err := NewParser(&args) + require.NoError(t, err) + + err = p.ProcessPositionals([]string{"hello"}) + require.NoError(t, err) + assert.Equal(t, "hello", args.Arg) +} + +func TestProcessPositionalsDoesNotOverwrite(t *testing.T) { + var args struct { + Arg string `arg:"env,positional"` + } + + p, err := NewParser(&args) + require.NoError(t, err) + + err = p.ProcessEnvironment([]string{"ARG=123"}) + require.NoError(t, err) + + err = p.ProcessPositionals([]string{"hello"}) + require.NoError(t, err) + + assert.EqualValues(t, "123", args.Arg) +} + +func TestOverwriteWithPositionals(t *testing.T) { + var args struct { + Arg string `arg:"env,positional"` + } + + p, err := NewParser(&args) + require.NoError(t, err) + + err = p.ProcessEnvironment([]string{"ARG=123"}) + require.NoError(t, err) + + err = p.OverwriteWithPositionals([]string{"hello"}) + require.NoError(t, err) + + assert.EqualValues(t, "hello", args.Arg) +} + +func TestProcessCommandLine(t *testing.T) { + var args struct { + Arg string + } + + p, err := NewParser(&args) + require.NoError(t, err) + + err = p.ProcessCommandLine([]string{"program", "--arg=hello"}) + require.NoError(t, err) + assert.Equal(t, "hello", args.Arg) +} + +func TestProcessCommandLineDoesNotOverwrite(t *testing.T) { + var args struct { + Arg string `arg:"env"` + } + + p, err := NewParser(&args) + require.NoError(t, err) + + err = p.ProcessEnvironment([]string{"ARG=123"}) + require.NoError(t, err) + + err = p.ProcessCommandLine([]string{"program", "--arg=hello"}) + require.NoError(t, err) + + assert.EqualValues(t, "123", args.Arg) +} + +func TestOverwriteWithCommandLine(t *testing.T) { + var args struct { + Arg string `arg:"env"` + } + + p, err := NewParser(&args) + require.NoError(t, err) + + err = p.ProcessEnvironment([]string{"ARG=123"}) + require.NoError(t, err) + + err = p.OverwriteWithCommandLine([]string{"program", "--arg=hello"}) + require.NoError(t, err) + + assert.EqualValues(t, "hello", args.Arg) +} + +func TestProcessEnvironment(t *testing.T) { + var args struct { + Arg string `arg:"env"` + } + + p, err := NewParser(&args) + require.NoError(t, err) + + err = p.ProcessEnvironment([]string{"ARG=hello"}) + require.NoError(t, err) + + assert.EqualValues(t, "hello", args.Arg) +} + +func TestProcessEnvironmentDoesNotOverwrite(t *testing.T) { + var args struct { + Arg string `arg:"env"` + } + + p, err := NewParser(&args) + require.NoError(t, err) + + _, err = p.ProcessOptions([]string{"--arg=123"}) + require.NoError(t, err) + + err = p.ProcessEnvironment([]string{"ARG=hello"}) + require.NoError(t, err) + + assert.EqualValues(t, "123", args.Arg) +} + +func TestOverwriteWithEnvironment(t *testing.T) { + var args struct { + Arg string `arg:"env"` + } + + p, err := NewParser(&args) + require.NoError(t, err) + + _, err = p.ProcessOptions([]string{"--arg=123"}) + require.NoError(t, err) + + err = p.OverwriteWithEnvironment([]string{"ARG=hello"}) + require.NoError(t, err) + + assert.EqualValues(t, "hello", args.Arg) +} + +func TestProcessDefaults(t *testing.T) { + var args struct { + Arg string `default:"hello"` + } + + p, err := NewParser(&args) + require.NoError(t, err) + + err = p.ProcessDefaults() + require.NoError(t, err) + + assert.EqualValues(t, "hello", args.Arg) +} + +func TestProcessDefaultsDoesNotOverwrite(t *testing.T) { + var args struct { + Arg string `default:"hello"` + } + + p, err := NewParser(&args) + require.NoError(t, err) + + _, err = p.ProcessOptions([]string{"--arg=123"}) + require.NoError(t, err) + + err = p.ProcessDefaults() + require.NoError(t, err) + + assert.EqualValues(t, "123", args.Arg) +} + +func TestOverwriteWithDefaults(t *testing.T) { + var args struct { + Arg string `default:"hello"` + } + + p, err := NewParser(&args) + require.NoError(t, err) + + _, err = p.ProcessOptions([]string{"--arg=123"}) + require.NoError(t, err) + + err = p.OverwriteWithDefaults() + require.NoError(t, err) + + assert.EqualValues(t, "hello", args.Arg) +}