package uva.ql.test;
import static org.junit.Assert.assertEquals;
import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.tree.ParseTree;
import org.junit.Test;
import uva.ql.ast.Node;
import uva.ql.ast.expressions.Expression;
import uva.ql.ast.value.BooleanValue;
import uva.ql.parser.QLLexer;
import uva.ql.parser.QLMainVisitor;
import uva.ql.parser.QLParser;
public class TestExpression {
private Node returnExpr(String stream){
ANTLRInputStream s = new ANTLRInputStream(stream);
QLLexer lexer = new QLLexer(s);
CommonTokenStream tokenStream = new CommonTokenStream(lexer);
QLParser parser = new QLParser(tokenStream);
ParseTree tree = parser.expr();
QLMainVisitor visitor = new QLMainVisitor();
Node ast = visitor.visit(tree);
return ast;
}
@Test
public void testMultiplication(){
Expression expression = (Expression)this.returnExpr("2*3*4");
assertEquals(expression.evaluate().getValue(), 24);
}
@Test
public void testAddition(){
Expression expression = (Expression)this.returnExpr("2+5+4+6+3");
assertEquals(expression.evaluate().getValue(), 20);
}
@Test
public void testSubstraction(){
Expression expression = (Expression)this.returnExpr("20-2-5-3");
assertEquals(expression.evaluate().getValue(),10);
}
@Test
public void testDivision(){
Expression expression = (Expression)this.returnExpr("200/2/4");
assertEquals(expression.evaluate().getValue(),25);
}
@Test
public void testExponentiation(){
Expression expression = (Expression)this.returnExpr("2^2");
assertEquals(expression.evaluate().getValue(),4);
}
@Test
public void testGreater(){
Expression expression = (Expression)this.returnExpr("2>3");
assertEquals(expression.evaluate().getValue(),false);
}
@Test
public void testLess(){
Expression expression = (Expression)this.returnExpr("8<10");
assertEquals(expression.evaluate().getValue(),true);
}
@Test
public void testLessEqual(){
Expression expression = (Expression)this.returnExpr("8<=8");
Expression expression2 = (Expression)this.returnExpr("8<=10");
assertEquals(expression.evaluate().getValue(),true);
assertEquals(expression2.evaluate().getValue(),true);
}
@Test
public void testGreaterEqual(){
Expression expression = (Expression)this.returnExpr("10>=8");
Expression expression2 = (Expression)this.returnExpr("8>=10");
assertEquals(expression.evaluate().getValue(),true);
assertEquals(expression2.evaluate().getValue(),false);
}
@Test
public void testEqual(){
Expression expression = (Expression)this.returnExpr("8==8");
Expression expression2 = (Expression)this.returnExpr("true==true");
assertEquals(expression.evaluate().getValue(),true);
assertEquals(expression2.evaluate().getValue(),true);
}
@Test
public void testNotEqual(){
Expression expression = (Expression)this.returnExpr("true!=true");
Expression expression2 = (Expression)this.returnExpr("true!=false");
assertEquals(expression.evaluate().getValue(),false);
assertEquals(expression2.evaluate().getValue(),true);
}
@Test
public void testAnd(){
Expression expression = (Expression)this.returnExpr("true && true");
Expression expression2 = (Expression)this.returnExpr("true && false");
assertEquals(expression.evaluate().getValue(),true);
assertEquals(expression2.evaluate().getValue(),false);
}
@Test
public void testOr(){
Expression expression = (Expression)this.returnExpr("true || false");
Expression expression2 = (Expression)this.returnExpr("false || false");
assertEquals(expression.evaluate().getValue(),true);
assertEquals(expression2.evaluate().getValue(),false);
}
@Test
public void testRandomExpressions(){
Expression expression = (Expression)this.returnExpr("(20+3-8)*10");
Expression expression2 = (Expression)this.returnExpr("((30+8+12)*12/2) <= 300 ");
Expression expression3 = (Expression)this.returnExpr("((30+8+12)*12/2) > 300 ");
assertEquals(expression.evaluate().getValue(),150);
assertEquals(expression2.evaluate().getValue(),true);
assertEquals(expression3.evaluate().getValue(),false);
}
@Test
public void testType(){
BooleanValue bool = new BooleanValue(true);
assertEquals(bool.getValue(),true);
}
}