| package shell |
| |
| import ( |
| "reflect" |
| "testing" |
| ) |
| |
| func TestQuote(t *testing.T) { |
| tests := []struct { |
| in, want string |
| }{ |
| {"", ""}, // nothing to quote |
| {"abc", "abc"}, // " |
| {"--flag", "--flag"}, // " |
| {"'abc", `\'abc`}, // single quote only |
| {"abc'", `abc\'`}, // " |
| {`shan't`, `shan\'t`}, // " |
| {"--flag=value", `'--flag=value'`}, |
| {"a b\tc", "'a b\tc'"}, |
| {`a"b"c`, `'a"b"c'`}, |
| {`'''`, `\'\'\'`}, |
| {`\`, `'\'`}, |
| {`'a=b`, `\''a=b'`}, // quotes and other stuff |
| {`a='b`, `'a='\''b'`}, // " |
| {`a=b'`, `'a=b'\'`}, // " |
| } |
| for _, test := range tests { |
| got := Quote(test.in) |
| if got != test.want { |
| t.Errorf("Quote %q: got %q, want %q", test.in, got, test.want) |
| } |
| } |
| } |
| |
| func TestRoundTrip(t *testing.T) { |
| tests := [][]string{ |
| nil, |
| {"a"}, |
| {"a", "b", "c"}, |
| {"a", "b c"}, |
| {"--flag=value"}, |
| {"m='$USER'", "nop+", "$$"}, |
| {`"a" b `, "c"}, |
| {"a=b", "--foo", "${bar}", `\$`}, |
| {"cat", "a${b}.txt", "|", "tee", "capture", "2>", "/dev/null"}, |
| } |
| for _, test := range tests { |
| s := Join(test) |
| t.Logf("Join %#q = %v", test, s) |
| if got := Split(s); !reflect.DeepEqual(got, test) { |
| t.Errorf("Split %+q: got %q, want %q", s, got, test) |
| } |
| } |
| } |