package test.qls.typechecker;
import static org.junit.Assert.assertEquals;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import ql.ast.QLNode;
import ql.ast.QLType;
import ql.ast.expression.Identifier;
import ql.ast.type.QLBoolean;
import ql.ast.type.QLFloat;
import ql.ast.type.QLForm;
import ql.ast.type.QLInteger;
import ql.ast.type.QLString;
import ql.ast.visitor.typechecker.TypeEnvironment;
import ql.errorhandling.ErrorEnvironment;
import qls.ast.Statement;
import qls.ast.expression.Literal;
import qls.ast.visitor.typechecker.TypeChecker;
import qls.parser.Parser;
public abstract class BaseTest {
private QLNode inputNode;
private boolean expected;
private static TypeEnvironment register;
public BaseTest(String input, boolean expected) {
System.out.println("Testing: " + input);
inputNode = Parser.parse(input);
this.expected = expected;
}
@BeforeClass
public static void setupEnvironment() {
System.out.println("================================");
System.out.println("*** Testing QLS Type Checker ***");
System.out.println("================================");
}
@Before
public void setupTest() {
// Clear the register to avoid problems.
register = new TypeEnvironment();
register.store(new Identifier("formNode"), new QLForm());
register.store(new Identifier("booleanQuestion"), new QLBoolean());
register.store(new Identifier("floatQuestion"), new QLFloat());
register.store(new Identifier("integerQuestion"), new QLInteger());
register.store(new Identifier("stringQuestion"), new QLString());
}
@Test
public void test() {
ErrorEnvironment errors;
if(inputNode instanceof Statement) {
errors = TypeChecker.check((Statement) inputNode, register);
} else if(inputNode instanceof Literal) {
errors = TypeChecker.check((Literal<?>) inputNode, register);
} else {
errors = TypeChecker.check((QLType) inputNode, register);
}
if(errors.hasErrors()) {
System.out.print(errors.getErrors());
}
System.out.println(" Result: " + !errors.hasErrors());
assertEquals(expected, !errors.hasErrors());
}
}