You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
49 lines
1.3 KiB
49 lines
1.3 KiB
package expr |
|
|
|
import ( |
|
"fmt" |
|
"testing" |
|
) |
|
|
|
func TestExpr(t *testing.T) { |
|
tests := []struct { |
|
expr string |
|
env Env |
|
want string |
|
}{ |
|
{"$1 > 80 && $2 <9", Env{"$1": 100, "$2": 2}, "true"}, |
|
{"$1 % 10", Env{"$1": 104, "$2": 2}, "4"}, |
|
{"pow(x, false) + pow(y, false)", Env{"x": 12, "y": 1}, "2"}, |
|
{"pow(x, 3) + pow(y, 3)", Env{"x": 9, "y": 10}, "1729"}, |
|
{"5.0 / 9 * (F - 32)", Env{"F": -40}, "-40"}, |
|
{"5.0 / 9 * (F - 32)", Env{"F": 32}, "0"}, |
|
{"5.0 / 9 * (F - 32)", Env{"F": 212}, "100"}, |
|
////!-Eval |
|
//// additional tests that don't appear in the book |
|
{"-1 + -x", Env{"x": 1}, "-2"}, |
|
{"-1 - x", Env{"x": 1}, "-2"}, |
|
{"a >= 10", Env{"a": 15}, "true"}, |
|
{"b >= sin(10) && a < 1", Env{"a": 9, "b": 10}, "false"}, |
|
{"!!!true", Env{"a": 9, "b": 10}, "false"}, |
|
//!+Eval |
|
} |
|
var prevExpr string |
|
parser := NewExpressionParser() |
|
for _, test := range tests { |
|
// Print expr only when it changes. |
|
if test.expr != prevExpr { |
|
t.Logf("\n%s\n", test.expr) |
|
prevExpr = test.expr |
|
} |
|
if err := parser.Parse(test.expr); err != nil { |
|
t.Error(err) // parse error |
|
continue |
|
} |
|
got := fmt.Sprintf("%v", parser.GetExpr().Eval(test.env)) |
|
t.Logf("\t%v => %s\n", test.env, got) |
|
if got != test.want { |
|
t.Errorf("%s.Eval() in %v = %q, want %q\n", |
|
test.expr, test.env, got, test.want) |
|
} |
|
} |
|
}
|
|
|