private double simpleEval(String expressionString) throws ExpressionException { final Expression expression = compile(expressionString); expression.setEnvironment(new ExpressionEnvironment() { @Override public int getBlockType(double x, double y, double z) { return (int) x; } @Override public int getBlockData(double x, double y, double z) { return (int) y; } @Override public int getBlockTypeAbs(double x, double y, double z) { return (int) x*10; } @Override public int getBlockDataAbs(double x, double y, double z) { return (int) y*10; } @Override public int getBlockTypeRel(double x, double y, double z) { return (int) x*100; } @Override public int getBlockDataRel(double x, double y, double z) { return (int) y*100; } }); return expression.evaluate(); }
compile("#"); fail("Error expected"); } catch (LexerException e) { compile("x"); fail("Error expected"); } catch (ParserException e) { compile("x()"); fail("Error expected"); } catch (ParserException e) { compile("("); fail("Error expected"); } catch (ParserException ignored) {} try { compile("x("); fail("Error expected"); } catch (ParserException ignored) {} compile("atan2(1)"); fail("Error expected"); } catch (ParserException e) { compile("atan2(1, 2, 3)"); fail("Error expected"); } catch (ParserException e) { compile("rotate(1, 2, 3)");
@Test public void testIf() throws ExpressionException { assertEquals(40, simpleEval("if (1) x=4; else y=5; x*10+y;"), 0); assertEquals(5, simpleEval("if (0) x=4; else y=5; x*10+y;"), 0); // test 'dangling else' final Expression expression1 = compile("if (1) if (0) x=4; else y=5;", "x", "y"); expression1.evaluate(1, 2); assertEquals(1, expression1.getVariable("x", false).getValue(), 0); assertEquals(5, expression1.getVariable("y", false).getValue(), 0); // test if the if construct is correctly recognized as a statement final Expression expression2 = compile("if (0) if (1) x=5; y=4;", "x", "y"); expression2.evaluate(1, 2); assertEquals(4, expression2.getVariable("y", false).getValue(), 0); }
@Test public void testEvaluate() throws ExpressionException { // check assertEquals(1 - 2 + 3, simpleEval("1 - 2 + 3"), 0); // check unary ops assertEquals(2 + +4, simpleEval("2 + +4"), 0); assertEquals(2 - -4, simpleEval("2 - -4"), 0); assertEquals(2 * -4, simpleEval("2 * -4"), 0); // check functions assertEquals(sin(5), simpleEval("sin(5)"), 0); assertEquals(atan2(3, 4), simpleEval("atan2(3, 4)"), 0); // check variables assertEquals(8, compile("foo+bar", "foo", "bar").evaluate(5, 3), 0); }
@Test public void testAssign() throws ExpressionException { Expression foo = compile("{a=x} b=y; c=z", "x", "y", "z", "a", "b", "c"); foo.evaluate(2, 3, 5); assertEquals(2, foo.getVariable("a", false).getValue(), 0); assertEquals(3, foo.getVariable("b", false).getValue(), 0); assertEquals(5, foo.getVariable("c", false).getValue(), 0); }