package org.uva.sea.ql.parser.test; import static org.junit.Assert.assertEquals; import org.junit.Test; import org.uva.sea.ql.ast.operators.arithmetic.Add; import org.uva.sea.ql.ast.operators.arithmetic.Div; import org.uva.sea.ql.ast.operators.arithmetic.Mul; import org.uva.sea.ql.ast.operators.arithmetic.Neg; import org.uva.sea.ql.ast.operators.arithmetic.Sub; import org.uva.sea.ql.ast.operators.comparison.Eq; import org.uva.sea.ql.ast.operators.comparison.GEq; import org.uva.sea.ql.ast.operators.comparison.GT; import org.uva.sea.ql.ast.operators.comparison.LEq; import org.uva.sea.ql.ast.operators.comparison.LT; import org.uva.sea.ql.ast.operators.comparison.NEq; import org.uva.sea.ql.ast.operators.logical.And; import org.uva.sea.ql.ast.operators.logical.Not; import org.uva.sea.ql.ast.operators.logical.Or; import org.uva.sea.ql.parser.jacc.ParseException; public class TestExpressions extends TestParser{ @Test public void testArithmetic() throws ParseException{ assertEquals(parser.parser("a + b").getClass(), Add.class); assertEquals(parser.parser("a + b + c").getClass(), Add.class); assertEquals(parser.parser("a - b").getClass(), Sub.class); assertEquals(parser.parser("a - b - c").getClass(), Sub.class); assertEquals(parser.parser(" a * b").getClass(), Mul.class); assertEquals(parser.parser("a * b * c").getClass(), Mul.class); assertEquals(parser.parser("a / b").getClass(), Div.class); assertEquals(parser.parser("a / b / c").getClass(), Div.class); assertEquals(parser.parser("-a").getClass(), Neg.class); //special cases assertEquals(parser.parser("a + b * c").getClass(), Add.class); assertEquals(parser.parser("a * b + c").getClass(), Add.class); assertEquals(parser.parser("a * b //+ c ").getClass(), Mul.class); assertEquals(parser.parser(" a + b / c").getClass(), Add.class); assertEquals(parser.parser(" a / b + c").getClass(), Add.class); assertEquals(parser.parser(" (a + b) / c").getClass(), Div.class); assertEquals(parser.parser(" a / (b + c)").getClass(), Div.class); assertEquals(parser.parser("(a + b) * c").getClass(), Mul.class); assertEquals(parser.parser("a * (b + c)").getClass(), Mul.class); assertEquals(parser.parser("-(a + b)").getClass(), Neg.class); } @Test public void testLogical() throws ParseException{ assertEquals(parser.parser("a && b").getClass(), And.class); assertEquals(parser.parser("a && b && c").getClass(), And.class); assertEquals(parser.parser("a || b").getClass(), Or.class); assertEquals(parser.parser(" a || b || c").getClass(), Or.class); assertEquals(parser.parser("!a").getClass(), Not.class); assertEquals(parser.parser("a && b || c").getClass(), And.class); assertEquals(parser.parser("!(a && b)").getClass(), Not.class); assertEquals(parser.parser("a || (b && c)").getClass(), Or.class); } @Test public void testComparison() throws ParseException{ assertEquals(parser.parser("a == a").getClass(), Eq.class); assertEquals(parser.parser("a != c").getClass(), NEq.class); assertEquals(parser.parser("a >= b").getClass(), GEq.class); assertEquals(parser.parser("a > b").getClass(), GT.class); assertEquals(parser.parser("a <= b").getClass(), LEq.class); assertEquals(parser.parser("a < b").getClass(), LT.class); } }