package org.uva.sea.ql.parser.test; import static org.junit.Assert.assertEquals; import org.junit.Test; import org.uva.sea.ql.ast.expr.Add; import org.uva.sea.ql.ast.expr.And; import org.uva.sea.ql.ast.expr.BoolLiteral; import org.uva.sea.ql.ast.expr.Div; import org.uva.sea.ql.ast.expr.Eq; import org.uva.sea.ql.ast.expr.Expr; import org.uva.sea.ql.ast.expr.GT; import org.uva.sea.ql.ast.expr.Ident; import org.uva.sea.ql.ast.expr.IntLiteral; import org.uva.sea.ql.ast.expr.LEq; import org.uva.sea.ql.ast.expr.LT; import org.uva.sea.ql.ast.expr.Mul; import org.uva.sea.ql.ast.expr.NEq; import org.uva.sea.ql.ast.expr.Neg; import org.uva.sea.ql.ast.expr.Not; import org.uva.sea.ql.ast.expr.Or; import org.uva.sea.ql.ast.expr.Pos; import org.uva.sea.ql.ast.expr.StrLiteral; import org.uva.sea.ql.ast.expr.Sub; public class TestExpressions { private IParser<Expr> parser; public TestExpressions() { this.parser = new ExprParser(); } @Test public void testAdds() throws ParseError { assertEquals(parser.parse("a + b").getClass(), Add.class); assertEquals(parser.parse("a + b + c").getClass(), Add.class); assertEquals(parser.parse("(a + b + c)").getClass(), Add.class); assertEquals(parser.parse("a + (b + c)").getClass(), Add.class); assertEquals(parser.parse("(a * b) + c").getClass(), Add.class); assertEquals(parser.parse("(a + b)").getClass(), Add.class); assertEquals(parser.parse("a + b * c").getClass(), Add.class); assertEquals(parser.parse("a * b + c").getClass(), Add.class); } @Test public void testSubs() throws ParseError { assertEquals(parser.parse("a - b").getClass(), Sub.class); assertEquals(parser.parse("a - b - c").getClass(), Sub.class); assertEquals(parser.parse("(a - b - c)").getClass(), Sub.class); assertEquals(parser.parse("a - (b - c)").getClass(), Sub.class); assertEquals(parser.parse("(a - b) - c").getClass(), Sub.class); assertEquals(parser.parse("(a - b)").getClass(), Sub.class); assertEquals(parser.parse("a - b * c").getClass(), Sub.class); assertEquals(parser.parse("a * b - c").getClass(), Sub.class); } @Test public void testMuls() throws ParseError { assertEquals(parser.parse("a * b").getClass(), Mul.class); assertEquals(parser.parse("a * b * c").getClass(), Mul.class); assertEquals(parser.parse("a * (b * c)").getClass(), Mul.class); assertEquals(parser.parse("(a * b) * c").getClass(), Mul.class); assertEquals(parser.parse("(a * b)").getClass(), Mul.class); assertEquals(parser.parse("(a + b) * c").getClass(), Mul.class); assertEquals(parser.parse("a * (b + c)").getClass(), Mul.class); } @Test public void testDivs() throws ParseError { assertEquals(parser.parse("a / b").getClass(), Div.class); assertEquals(parser.parse("a / b / c").getClass(), Div.class); assertEquals(parser.parse("a / (b / c)").getClass(), Div.class); assertEquals(parser.parse("(a / b) / c").getClass(), Div.class); assertEquals(parser.parse("(a / b)").getClass(), Div.class); assertEquals(parser.parse("(a + b) / c").getClass(), Div.class); assertEquals(parser.parse("a / (b + c)").getClass(), Div.class); } @Test public void testRels() throws ParseError { assertEquals(parser.parse("a < b").getClass(), LT.class); assertEquals(parser.parse("a < b + c").getClass(), LT.class); assertEquals(parser.parse("a + b < c").getClass(), LT.class); assertEquals(parser.parse("a < (b * c)").getClass(), LT.class); assertEquals(parser.parse("(a * b) < c").getClass(), LT.class); assertEquals(parser.parse("(a <= b)").getClass(), LEq.class); assertEquals(parser.parse("a > b").getClass(), GT.class); assertEquals(parser.parse("a + b > c").getClass(), GT.class); assertEquals(parser.parse("a > b + c").getClass(), GT.class); assertEquals(parser.parse("a > (b * c)").getClass(), GT.class); assertEquals(parser.parse("(a * b) > c").getClass(), GT.class); assertEquals(parser.parse("a == b").getClass(), Eq.class); assertEquals(parser.parse("a == b + c").getClass(), Eq.class); assertEquals(parser.parse("a * b == c").getClass(), Eq.class); assertEquals(parser.parse("a == (b / c)").getClass(), Eq.class); assertEquals(parser.parse("a != b").getClass(), NEq.class); assertEquals(parser.parse("a != b + c").getClass(), NEq.class); assertEquals(parser.parse("a * b != c").getClass(), NEq.class); assertEquals(parser.parse("(a < b) != c)").getClass(), NEq.class); } @Test public void testAnd() throws ParseError { assertEquals(parser.parse("a && b").getClass(), And.class); assertEquals(parser.parse("a && b > c").getClass(), And.class); assertEquals(parser.parse("a > b && c)").getClass(), And.class); assertEquals(parser.parse("(a || b) && c").getClass(), And.class); assertEquals(parser.parse("(a && b)").getClass(), And.class); } @Test public void testOr() throws ParseError { assertEquals(parser.parse("a || b").getClass(), Or.class); assertEquals(parser.parse("a || b > c").getClass(), Or.class); assertEquals(parser.parse("a > b || c").getClass(), Or.class); assertEquals(parser.parse("a || (b && c)").getClass(), Or.class); } @Test public void testPos() throws ParseError { assertEquals(parser.parse("+ a").getClass(), Pos.class); assertEquals(parser.parse("+ - a").getClass(), Pos.class); assertEquals(parser.parse("+ + a").getClass(), Pos.class); assertEquals(parser.parse("+ (a - b) ").getClass(), Pos.class); } @Test public void TestNeg() throws ParseError { assertEquals(parser.parse("- a").getClass(), Neg.class); assertEquals(parser.parse("- - a").getClass(), Neg.class); assertEquals(parser.parse("- + a").getClass(), Neg.class); assertEquals(parser.parse("- (a + b) ").getClass(), Neg.class); } @Test public void testNot() throws ParseError { assertEquals(parser.parse("! a").getClass(), Not.class); assertEquals(parser.parse("!(a && b)").getClass(), Not.class); } @Test public void testIds() throws ParseError { assertEquals(parser.parse("a").getClass(), Ident.class); assertEquals(parser.parse("abc").getClass(), Ident.class); assertEquals(parser.parse("aBC").getClass(), Ident.class); assertEquals(parser.parse("ABCDEF").getClass(), Ident.class); assertEquals(parser.parse("abC2323").getClass(), Ident.class); assertEquals(parser.parse("a2bc232").getClass(), Ident.class); assertEquals(parser.parse("_a2bc232aa").getClass(), Ident.class); assertEquals(parser.parse("_2abc232aa").getClass(), Ident.class); } @Test public void testBool() throws ParseError { assertEquals(parser.parse("true").getClass(), BoolLiteral.class); assertEquals(parser.parse("false").getClass(), BoolLiteral.class); } @Test public void testNums() throws ParseError { assertEquals(parser.parse("0").getClass(), IntLiteral.class); assertEquals(parser.parse("1223").getClass(), IntLiteral.class); assertEquals(parser.parse("234234234").getClass(), IntLiteral.class); } @Test public void testString() throws ParseError { assertEquals(parser.parse("\"\"").getClass(), StrLiteral.class); assertEquals(parser.parse("\"\\\"\n\r\t\f\"").getClass(), StrLiteral.class); assertEquals(parser.parse("\"~`!@#$%^&*()_-+={}|[]:;'<>?,./\"").getClass(), StrLiteral.class); assertEquals(parser.parse("\"the quick brown fox jumps over the lazy dog\"").getClass(), StrLiteral.class); assertEquals(parser.parse("\"THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG\"").getClass(), StrLiteral.class); } }