aboutsummaryrefslogtreecommitdiff
path: root/expr_test.go
diff options
context:
space:
mode:
authorFumitoshi Ukai <fumitoshi.ukai@gmail.com>2015-04-10 15:06:38 +0900
committerFumitoshi Ukai <fumitoshi.ukai@gmail.com>2015-04-10 16:04:13 +0900
commitb36f387a1f4b711987ddf219867938a1b74279e8 (patch)
treea543d725ecad3211690b472e86223077a20334a0 /expr_test.go
parent370be72f2e01602b652763f7b0c1c12c1075500c (diff)
downloadkati-b36f387a1f4b711987ddf219867938a1b74279e8.tar.gz
split expression parser and evaluator
Diffstat (limited to 'expr_test.go')
-rw-r--r--expr_test.go174
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)
+ }
+ }
+}