package nl.uva.sc.encoders.ql.parser;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;
import java.util.List;
import nl.uva.sc.encoders.ql.ast.Questionnaire;
import nl.uva.sc.encoders.ql.ast.TextLocation;
import nl.uva.sc.encoders.ql.ast.expression.BinaryExpression;
import nl.uva.sc.encoders.ql.ast.operator.BinaryOperator;
import nl.uva.sc.encoders.ql.ast.statement.ConditionalBlock;
import nl.uva.sc.encoders.ql.ast.statement.Question;
import nl.uva.sc.encoders.ql.ast.statement.Statement;
import nl.uva.sc.encoders.ql.validation.SyntaxError;
import org.junit.Before;
import org.junit.Test;
public class QuestionnaireParserTest {
private static final String RESOURCE_ROOT = "src/main/resources/";
private QuestionnaireParser parser;
@Before
public void setUp() {
parser = new QuestionnaireParser();
}
@Test
public void testParse_validInputGivesResultWithAbstractSyntaxTree() throws Exception {
QuestionnaireParsingResult result = parser.parse(RESOURCE_ROOT + "ql/input_form.ql");
assertThat(result, is(notNullValue()));
List<SyntaxError> syntaxErrors = result.getSyntaxErrors();
assertThat(syntaxErrors.toString(), syntaxErrors.size(), is(0));
Questionnaire questionnaire = result.getQuestionnaire();
assertThat(questionnaire, is(notNullValue()));
assertThat(questionnaire.getName(), is("taxOfficeExample"));
List<Statement> statements = questionnaire.getStatements();
assertThat(statements, is(notNullValue()));
assertThat(statements.toString(), statements.size(), is(9));
Question hasSoldHouse = (Question) statements.get(0);
assertThat(hasSoldHouse.getName(), is("hasSoldHouse"));
ConditionalBlock conditionalBlock = (ConditionalBlock) statements.get(7);
BinaryExpression condition = (BinaryExpression) conditionalBlock.getCondition();
BinaryOperator operator = condition.getOperator();
assertThat(operator.toString(), is("&&"));
}
@Test
public void testParse_inputWithSyntaxErrorsGivesResultWithSyntaxErrors() throws Exception {
QuestionnaireParsingResult result = parser.parse(RESOURCE_ROOT + "ql/input_form_with_syntax_errors.ql");
assertThat(result, is(notNullValue()));
List<SyntaxError> syntaxErrors = result.getSyntaxErrors();
assertThat(syntaxErrors.toString(), syntaxErrors.size(), is(5));
SyntaxError missingFormError = syntaxErrors.get(0);
assertThat(missingFormError.getValidationMessage(), is("missing 'form' at 'fom'"));
TextLocation textLocation = missingFormError.getTextLocation();
assertThat(textLocation.getColumn(), is(0));
assertThat(textLocation.getLine(), is(1));
}
}