Cosmos Nicolaou | 7c659ac | 2014-06-09 22:47:04 -0700 | [diff] [blame] | 1 | package main |
| 2 | |
| 3 | import ( |
| 4 | "fmt" |
| 5 | "reflect" |
| 6 | "testing" |
Cosmos Nicolaou | 9c9918d | 2014-09-23 08:45:56 -0700 | [diff] [blame] | 7 | |
| 8 | "veyron.io/veyron/veyron/lib/modules" |
Cosmos Nicolaou | 7c659ac | 2014-06-09 22:47:04 -0700 | [diff] [blame] | 9 | ) |
| 10 | |
| 11 | func TestFields(t *testing.T) { |
| 12 | cases := []struct { |
| 13 | input string |
| 14 | output []string |
| 15 | }{ |
| 16 | {"", []string{}}, |
| 17 | {"a", []string{"a"}}, |
| 18 | {" z", []string{"z"}}, |
| 19 | {" zz zz", []string{"zz", "zz"}}, |
| 20 | {"ab", []string{"ab"}}, |
| 21 | {"a b", []string{"a", "b"}}, |
| 22 | {`a " b"`, []string{"a", " b"}}, |
| 23 | {`a " b zz"`, []string{"a", " b zz"}}, |
| 24 | {`a " b zz"`, []string{"a", " b zz"}}, |
| 25 | {`a " b" cc`, []string{"a", " b", "cc"}}, |
| 26 | {`a "z b" cc`, []string{"a", "z b", "cc"}}, |
| 27 | } |
| 28 | for i, c := range cases { |
| 29 | got, err := splitQuotedFields(c.input) |
| 30 | if err != nil { |
| 31 | t.Errorf("%d: %q: unexpected error: %v", i, c.input, err) |
| 32 | } |
| 33 | if !reflect.DeepEqual(got, c.output) { |
| 34 | t.Errorf("%d: %q: got %#v, want %#v", i, c.input, got, c.output) |
| 35 | } |
| 36 | } |
| 37 | if _, err := splitQuotedFields(`a b "c`); err == nil { |
| 38 | t.Errorf("expected error for unterminated quote") |
| 39 | } |
| 40 | } |
| 41 | |
| 42 | func TestVariables(t *testing.T) { |
Cosmos Nicolaou | 9c9918d | 2014-09-23 08:45:56 -0700 | [diff] [blame] | 43 | sh := modules.NewShell() |
| 44 | sh.SetVar("foo", "bar") |
Cosmos Nicolaou | 7c659ac | 2014-06-09 22:47:04 -0700 | [diff] [blame] | 45 | cases := []struct { |
| 46 | input string |
| 47 | output []string |
| 48 | }{ |
| 49 | {"a b", []string{"a", "b"}}, |
| 50 | {"a $foo", []string{"a", "bar"}}, |
| 51 | {"$foo a", []string{"bar", "a"}}, |
| 52 | {`a "$foo "`, []string{"a", "bar "}}, |
| 53 | {"a xx$foo", []string{"a", "xxbar"}}, |
| 54 | {"a xx${foo}yy", []string{"a", "xxbaryy"}}, |
| 55 | {`a "foo"`, []string{"a", "foo"}}, |
| 56 | } |
| 57 | for i, c := range cases { |
| 58 | fields, err := splitQuotedFields(c.input) |
| 59 | if err != nil { |
| 60 | t.Errorf("%d: %q: unexpected error: %v", i, c.input, err) |
| 61 | } |
Cosmos Nicolaou | 9c9918d | 2014-09-23 08:45:56 -0700 | [diff] [blame] | 62 | got, err := subVariables(sh, fields) |
Cosmos Nicolaou | 7c659ac | 2014-06-09 22:47:04 -0700 | [diff] [blame] | 63 | if err != nil { |
| 64 | t.Errorf("%d: %q: unexpected error: %v", i, c.input, err) |
| 65 | } |
| 66 | if !reflect.DeepEqual(got, c.output) { |
| 67 | t.Errorf("%d: %q: got %#v, want %#v", i, c.input, got, c.output) |
| 68 | } |
| 69 | } |
| 70 | |
| 71 | errors := []struct { |
| 72 | input string |
| 73 | err error |
| 74 | }{ |
| 75 | {"$foox", fmt.Errorf("unknown variable: %q", "foox")}, |
| 76 | {"${fo", fmt.Errorf("unterminated variable: %q", "{fo")}, |
| 77 | } |
| 78 | for i, c := range errors { |
Matt Rosencrantz | 0dd7ce0 | 2014-09-23 11:34:26 -0700 | [diff] [blame] | 79 | vars, got := subVariables(sh, []string{c.input}) |
| 80 | if (got == nil && c.err != nil) || got.Error() != c.err.Error() { |
| 81 | t.Errorf("%d: %q: expected error: got %v (with results %#v) want %v", i, c.input, got, vars, c.err) |
Cosmos Nicolaou | 7c659ac | 2014-06-09 22:47:04 -0700 | [diff] [blame] | 82 | } |
| 83 | } |
| 84 | } |