package uva.ql.test;
import static org.junit.Assert.*;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
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.Prog;
import uva.ql.interpreter.typecheck.TypeCheckVisitor;
import uva.ql.interpreter.typecheck.error.IssueObject;
import uva.ql.interpreter.typecheck.error.IssueType;
import uva.ql.parser.QLLexer;
import uva.ql.parser.QLMainVisitor;
import uva.ql.parser.QLParser;
public class TestTypeChecker {
private ParseTree getParseTree(String fromPath){
ANTLRInputStream inputStream = null;
try{
inputStream = new ANTLRInputStream(new FileInputStream(fromPath));
}
catch (IOException e){
System.out.println("Exception: " + e.getMessage());
}
QLLexer lexer = new QLLexer(inputStream);
CommonTokenStream stream = new CommonTokenStream(lexer);
QLParser parser = new QLParser(stream);
ParseTree tree = parser.prog();
return tree;
}
private Node getAbstractSyntaxTree(ParseTree fromTree){
QLMainVisitor visitor = new QLMainVisitor();
Node ast = visitor.visit(fromTree);
return ast;
}
private TypeCheckVisitor getTypeCheck(String forPath){
ParseTree tree = this.getParseTree(forPath);
Prog prog = (Prog)this.getAbstractSyntaxTree(tree);
TypeCheckVisitor typeCheck = new TypeCheckVisitor();
typeCheck.visitProg(prog);
return typeCheck;
}
/* Type Check Tests */
@Test
public void testDuplicateSameType(){
TypeCheckVisitor typeCheck = this.getTypeCheck("src/uva/ql/test/source/Duplicate.ql");
List<IssueObject> issues = typeCheck.getErrorOfType(IssueType.ERROR.DUPLICATE_SAME_TYPE);
assertEquals(issues.size(), 1);
}
@Test
public void testDuplicateDifferentType(){
TypeCheckVisitor typeCheck = this.getTypeCheck("src/uva/ql/test/source/Duplicate.ql");
List<IssueObject> issues = typeCheck.getErrorOfType(IssueType.ERROR.DUPLICATE_DIFFERENT_TYPE);
assertEquals(issues.size(), 1);
}
@Test
public void testBooleanCondition(){
TypeCheckVisitor typeCheck = this.getTypeCheck("src/uva/ql/test/source/Condition.ql");
List<IssueObject> issues = typeCheck.getErrorOfType(IssueType.ERROR.CONDITION_NOT_BOOLEAN);
assertEquals(issues.size(), 1);
}
@Test
public void testInvalidOperandsMath(){
TypeCheckVisitor typeCheck = this.getTypeCheck("src/uva/ql/test/source/InvalidOperator.ql");
List<IssueObject> issues = typeCheck.getErrorOfType(IssueType.ERROR.INVALID_OPERANDS_MATH);
assertEquals(issues.size(), 1);
}
@Test
public void testInvalidOperandsLogic(){
TypeCheckVisitor typeCheck = this.getTypeCheck("src/uva/ql/test/source/InvalidOperator.ql");
List<IssueObject> issues = typeCheck.getErrorOfType(IssueType.ERROR.INVALID_OPERANDS_LOGICAL);
assertEquals(issues.size(), 1);
}
@Test
public void testCyclicDependency(){
TypeCheckVisitor typeCheck = this.getTypeCheck("src/uva/ql/test/source/CyclicDependency.ql");
List<IssueObject> issues = typeCheck.getErrorOfType(IssueType.ERROR.CYCLIC_DEPENDANCIES);
assertEquals(issues.size(), 2);
}
}