diff options
author | Fumitoshi Ukai <fumitoshi.ukai@gmail.com> | 2015-04-10 15:06:38 +0900 |
---|---|---|
committer | Fumitoshi Ukai <fumitoshi.ukai@gmail.com> | 2015-04-10 16:04:13 +0900 |
commit | b36f387a1f4b711987ddf219867938a1b74279e8 (patch) | |
tree | a543d725ecad3211690b472e86223077a20334a0 /expr_test.go | |
parent | 370be72f2e01602b652763f7b0c1c12c1075500c (diff) | |
download | kati-b36f387a1f4b711987ddf219867938a1b74279e8.tar.gz |
split expression parser and evaluator
Diffstat (limited to 'expr_test.go')
-rw-r--r-- | expr_test.go | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/expr_test.go b/expr_test.go new file mode 100644 index 0000000..e0bdf5b --- /dev/null +++ b/expr_test.go @@ -0,0 +1,174 @@ +package main + +import ( + "reflect" + "testing" +) + +func TestParseExpr(t *testing.T) { + for _, tc := range []struct { + in string + val Value + isErr bool + }{ + { + in: "foo", + val: literal("foo"), + }, + { + in: "(foo)", + val: literal("(foo)"), + }, + { + in: "{foo}", + val: literal("{foo}"), + }, + { + in: "$$", + val: literal("$"), + }, + { + in: "foo$$bar", + val: literal("foo$bar"), + }, + { + in: "$foo", + val: Expr{varref{varname: literal("f")}, literal("oo")}, + }, + { + in: "$(foo)", + val: varref{varname: literal("foo")}, + }, + { + in: "$(foo:.c=.o)", + val: varsubst{ + varname: literal("foo"), + pat: literal(".c"), + subst: literal(".o"), + }, + }, + { + in: "$(subst $(space),$(,),$(foo))/bar", + val: Expr{ + &funcSubst{ + fclosure: fclosure{ + args: []Value{ + varref{ + varname: literal("space"), + }, + varref{ + varname: literal(","), + }, + varref{ + varname: literal("foo"), + }, + }, + }, + }, + literal("/bar"), + }, + }, + { + in: "$(subst $(space),$,,$(foo))", + val: &funcSubst{ + fclosure: fclosure{ + args: []Value{ + varref{ + varname: literal("space"), + }, + varref{ + varname: literal(""), + }, + Expr{ + literal(","), + varref{ + varname: literal("foo"), + }, + }, + }, + }, + }, + }, + { + in: `$(shell echo '()')`, + val: &funcShell{ + fclosure: fclosure{ + args: []Value{ + literal("echo '()'"), + }, + }, + }, + }, + { + in: `$(shell echo '()')`, + val: &funcShell{ + fclosure: fclosure{ + args: []Value{ + literal("echo '()'"), + }, + }, + }, + }, + { + in: `$(shell echo ')')`, + val: Expr{ + &funcShell{ + fclosure: fclosure{ + args: []Value{ + literal("echo '"), + }, + }, + }, + literal("')"), + }, + }, + { + in: `${shell echo ')'}`, + val: &funcShell{ + fclosure: fclosure{ + args: []Value{ + literal("echo ')'"), + }, + }, + }, + }, + { + in: `${shell echo '}'}`, + val: Expr{ + &funcShell{ + fclosure: fclosure{ + args: []Value{ + literal("echo '"), + }, + }, + }, + literal("'}"), + }, + }, + { + in: `$(shell make --version | ruby -n0e 'puts $$_[/Make (\d)/,1]')`, + val: &funcShell{ + fclosure: fclosure{ + args: []Value{ + literal(`make --version | ruby -n0e 'puts $_[/Make (\d)/,1]'`), + }, + }, + }, + }, + } { + val, _, err := parseExpr([]byte(tc.in), nil) + if tc.isErr { + if err == nil { + t.Errorf(`parseExpr(%q)=_, _, nil; want error`, tc.in) + } + continue + } + if err != nil { + t.Errorf(`parseExpr(%q)=_, _, %v; want nil error`, tc.in, err) + continue + } + if got, want := val, tc.val; !reflect.DeepEqual(got, want) { + t.Errorf("parseExpr(%[1]q)=%[2]q %#[2]v, _, _;\n want %[3]q %#[3]v, _, _", tc.in, got, want) + } + } +} |