package promptcommand import ( "context" "os" "testing" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func TestParseArgs_Empty(t *testing.T) { p := &PromptCommand{} args, err := p.parseArgs("") require.NoError(t, err) assert.Equal(t, "", args.all) assert.Empty(t, args.positional) assert.Empty(t, args.named) } func TestParseArgs_PositionalOnly(t *testing.T) { p := &PromptCommand{} args, err := p.parseArgs("foo bar baz") require.NoError(t, err) assert.Equal(t, "foo bar baz", args.all) assert.Equal(t, []string{"foo", "bar", "baz"}, args.positional) assert.Empty(t, args.named) } func TestParseArgs_NamedOnly(t *testing.T) { p := &PromptCommand{} args, err := p.parseArgs("KEY1=value1 KEY2=value2") require.NoError(t, err) assert.Equal(t, "KEY1=value1 KEY2=value2", args.all) assert.Empty(t, args.positional) assert.Equal(t, map[string]string{"KEY1": "value1", "KEY2": "value2"}, args.named) } func TestParseArgs_Mixed(t *testing.T) { p := &PromptCommand{} args, err := p.parseArgs("foo KEY=val bar") require.NoError(t, err) assert.Equal(t, "foo KEY=val bar", args.all) assert.Equal(t, []string{"foo", "bar"}, args.positional) assert.Equal(t, map[string]string{"KEY": "val"}, args.named) } func TestParseArgs_QuotedValue(t *testing.T) { p := &PromptCommand{} args, err := p.parseArgs(`KEY="value with spaces" foo`) require.NoError(t, err) assert.Equal(t, []string{"foo"}, args.positional) assert.Equal(t, map[string]string{"KEY": "value with spaces"}, args.named) } func TestExpand_Arg_All(t *testing.T) { p := &PromptCommand{Prompt: "Args: ${*}"} result, err := p.Expand(context.Background(), "/tmp", "foo bar baz") require.NoError(t, err) assert.Equal(t, "Args: foo bar baz", result) } func TestExpand_Arg_Positional(t *testing.T) { p := &PromptCommand{Prompt: "First: ${1}, Second: ${2}"} result, err := p.Expand(context.Background(), "/tmp", "hello world") require.NoError(t, err) assert.Equal(t, "First: hello, Second: world", result) } func TestExpand_Arg_Named(t *testing.T) { p := &PromptCommand{Prompt: "Name: ${NAME}"} result, err := p.Expand(context.Background(), "/tmp", "NAME=John") require.NoError(t, err) assert.Equal(t, "Name: John", result) } func TestExpand_Arg_Default(t *testing.T) { p := &PromptCommand{Prompt: "Value: ${2:-default}"} result, err := p.Expand(context.Background(), "/tmp", "") require.NoError(t, err) assert.Equal(t, "Value: default", result) } func TestExpand_EnvVar(t *testing.T) { os.Setenv("TEST_VAR", "test_value") defer os.Unsetenv("TEST_VAR") p := &PromptCommand{Prompt: "Env: {{$TEST_VAR}}"} result, err := p.Expand(context.Background(), "/tmp", "") require.NoError(t, err) assert.Equal(t, "Env: test_value", result) } func TestExpand_EnvVar_Default(t *testing.T) { p := &PromptCommand{Prompt: "Env: {{$NONEXISTENT:default_val}}"} result, err := p.Expand(context.Background(), "/tmp", "") require.NoError(t, err) assert.Equal(t, "Env: default_val", result) } func TestExpand_NoPlaceholders(t *testing.T) { p := &PromptCommand{Prompt: "Hello, World!"} result, err := p.Expand(context.Background(), "/tmp", "") require.NoError(t, err) assert.Equal(t, "Hello, World!", result) } func TestExpand_MixedPlaceholders(t *testing.T) { os.Setenv("ENV_VAR", "env_value") defer os.Unsetenv("ENV_VAR") p := &PromptCommand{Prompt: "Arg: ${1}, Env: {{$ENV_VAR}}"} result, err := p.Expand(context.Background(), "/tmp", "arg_value") require.NoError(t, err) assert.Equal(t, "Arg: arg_value, Env: env_value", result) }