first commit

This commit is contained in:
2026-08-14 23:41:57 +08:00
commit 086803a8dd
471 changed files with 91938 additions and 0 deletions
+69
View File
@@ -0,0 +1,69 @@
package runtime
// Tests for shell-style argument tokenization (US-001, #331). Covers the cases
// called out in the acceptance criteria: empty input, a single bare argument,
// double-quoted argument with internal space, single-quoted argument, mixed
// quoting, an unterminated quote (error), and leading/trailing whitespace.
import "testing"
func TestSplitArgs(t *testing.T) {
cases := []struct {
name string
in string
want []string
}{
{"empty", "", []string{}},
{"only whitespace", " ", []string{}},
{"single bare arg", "Button", []string{"Button"}},
{"two bare args", "a b", []string{"a", "b"}},
{"double quoted preserves internal space", `Button "click handler"`, []string{"Button", "click handler"}},
{"single quoted preserves internal space", `'a b'`, []string{"a b"}},
{"mixed single and double quotes", `x "y z" 'p q' r`, []string{"x", "y z", "p q", "r"}},
{"leading and trailing whitespace trimmed", ` hello world `, []string{"hello", "world"}},
{"quoted arg at boundaries", `"a b" c "d e"`, []string{"a b", "c", "d e"}},
{"empty double quotes yield empty arg", `""`, []string{""}},
}
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
got, err := SplitArgs(c.in)
if err != nil {
t.Fatalf("SplitArgs(%q) returned unexpected error: %v", c.in, err)
}
if len(got) != len(c.want) {
t.Fatalf("SplitArgs(%q) = %v (len %d), want %v (len %d)", c.in, got, len(got), c.want, len(c.want))
}
for i := range got {
if got[i] != c.want[i] {
t.Errorf("SplitArgs(%q)[%d] = %q, want %q", c.in, i, got[i], c.want[i])
}
}
})
}
}
func TestSplitArgsEmptyReturnsNonNil(t *testing.T) {
got, err := SplitArgs("")
if err != nil {
t.Fatalf("SplitArgs(\"\") returned unexpected error: %v", err)
}
if got == nil {
t.Fatal("SplitArgs(\"\") returned nil slice, want non-nil empty slice")
}
if len(got) != 0 {
t.Fatalf("SplitArgs(\"\") = %v, want empty", got)
}
}
func TestSplitArgsUnclosedQuoteErrors(t *testing.T) {
cases := []string{
`"unterminated`,
`'unterminated`,
`foo "bar baz`,
}
for _, in := range cases {
if _, err := SplitArgs(in); err == nil {
t.Errorf("SplitArgs(%q) expected an error for unterminated quote, got nil", in)
}
}
}