package com.sk89q.worldedit.expression; import static org.junit.Assert.*; import static java.lang.Math.*; import org.junit.*; import com.sk89q.worldedit.expression.lexer.LexerException; import com.sk89q.worldedit.expression.parser.ParserException; public class ExpressionTest { @Test public void testEvaluate() throws Exception { // 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, Expression.compile("foo+bar", "foo", "bar").evaluate(5, 3), 0); } @Test public void testErrors() throws ExpressionException { // test lexer errors try { Expression.compile("#"); fail("Error expected"); } catch (LexerException e) { assertEquals("Error position", 0, e.getPosition()); } // test parser errors try { Expression.compile("x"); fail("Error expected"); } catch (ParserException e) { assertEquals("Error position", 0, e.getPosition()); } try { Expression.compile("x()"); fail("Error expected"); } catch (ParserException e) { assertEquals("Error position", 0, e.getPosition()); } try { Expression.compile("("); fail("Error expected"); } catch (ParserException e) {} try { Expression.compile("x("); fail("Error expected"); } catch (ParserException e) {} } @Test public void testAssign() throws ExpressionException { Expression foo = Expression.compile("{a=x} b=y; c=z", "x", "y", "z", "a", "b", "c"); foo.evaluate(2, 3, 5); assertEquals(2, foo.getVariable("a").invoke(), 0); assertEquals(3, foo.getVariable("b").invoke(), 0); assertEquals(5, foo.getVariable("c").invoke(), 0); } private double simpleEval(String expression) throws Exception { return Expression.compile(expression).evaluate(); } }