package test.nl.uva;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import main.nl.uva.g4.FormGrammarLexer;
import main.nl.uva.g4.FormGrammarParser;
import main.nl.uva.parser.Form;
import main.nl.uva.validation.ASTValidation;
import main.nl.uva.validation.Scope;
import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class ParserTest {
private static final String QUESTIONAIRE_PATH = "questionaires/test";
private static final String INVALID_QUESTIONAIRE = QUESTIONAIRE_PATH + "/invalid";
private static final String VALID_QUESTIONAIRE = QUESTIONAIRE_PATH + "/valid";
@BeforeClass
public static void setUpBeforeClass() throws Exception {}
@Before
public void setUp() throws Exception {
}
private static Form getFormForFile(final String fileName) throws FileNotFoundException, IOException {
File file = new File(fileName);
ANTLRInputStream input = new ANTLRInputStream(new FileInputStream(file));
FormGrammarLexer lexer = new FormGrammarLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
FormGrammarParser parser = new FormGrammarParser(tokens);
return parser.form().parsedForm;
}
@Test
public void validExample() throws FileNotFoundException, IOException {
Form form = getFormForFile(VALID_QUESTIONAIRE + "/example.txt");
ASTValidation validation = form.validateAndCalculate(new Scope());
validation.printErrors();
Assert.assertFalse(validation.hasErrors());
}
@Test
public void validIfElse() throws FileNotFoundException, IOException {
Form form = getFormForFile(VALID_QUESTIONAIRE + "/if_else.txt");
ASTValidation validation = form.validateAndCalculate(new Scope());
validation.printErrors();
Assert.assertFalse(validation.hasErrors());
}
@Test
public void validNestedIf() throws FileNotFoundException, IOException {
Form form = getFormForFile(VALID_QUESTIONAIRE + "/nested_if.txt");
ASTValidation validation = form.validateAndCalculate(new Scope());
validation.printErrors();
Assert.assertFalse(validation.hasErrors());
}
@Test
public void booleanToMoneyTest() throws FileNotFoundException, IOException {
Form form = getFormForFile(INVALID_QUESTIONAIRE + "/bool_to_int.txt");
ASTValidation validation = form.validateAndCalculate(new Scope());
Assert.assertTrue(validation.hasErrors());
Assert.assertTrue(("[3 1] Invalid type of \"question1\"").equals(validation.getValidationErrors().get(0).toString()));
}
@Test
public void conditionNotBooleanTest() throws FileNotFoundException, IOException {
Form form = getFormForFile(INVALID_QUESTIONAIRE + "/condition_not_boolean.txt");
ASTValidation validation = form.validateAndCalculate(new Scope());
Assert.assertTrue(validation.hasErrors());
Assert.assertTrue(("[7 1] Invalid type of \"if ( q2 + q3 )\"").equals(validation.getValidationErrors().get(0).toString()));
}
@Test
public void cyclicDependencyTest() throws FileNotFoundException, IOException {
Form form = getFormForFile(INVALID_QUESTIONAIRE + "/cyclic_dependency.txt");
ASTValidation validation = form.validateAndCalculate(new Scope());
Assert.assertTrue(validation.hasErrors());
Assert.assertTrue(("[3 38] Variable \"q3\" not found").equals(validation.getValidationErrors().get(0).toString()));
Assert.assertTrue(("[3 1] Invalid type of \"q2\"").equals(validation.getValidationErrors().get(1).toString()));
Assert.assertTrue(("[4 1] Invalid type of \"q3\"").equals(validation.getValidationErrors().get(2).toString()));
}
@Test
public void mathMistakeTest() throws FileNotFoundException, IOException {
Form form = getFormForFile(INVALID_QUESTIONAIRE + "/math_mistake.txt");
ASTValidation validation = form.validateAndCalculate(new Scope());
Assert.assertTrue(validation.hasErrors());
Assert.assertTrue(("[6 41] Invalid type of \"q1 + q3\"").equals(validation.getValidationErrors().get(0).toString()));
Assert.assertTrue(("[6 1] Invalid type of \"q4\"").equals(validation.getValidationErrors().get(1).toString()));
}
@Test
public void undefinedQuestionTest() throws FileNotFoundException, IOException {
Form form = getFormForFile(INVALID_QUESTIONAIRE + "/undefined_question.txt");
ASTValidation validation = form.validateAndCalculate(new Scope());
Assert.assertTrue(validation.hasErrors());
Assert.assertTrue(("[4 43] Variable \"q1\" not found").equals(validation.getValidationErrors().get(0).toString()));
Assert.assertTrue(("[4 4] Invalid type of \"q1\"").equals(validation.getValidationErrors().get(1).toString()));
}
}