package nl.uva.softwcons.ql.eval;
import static nl.uva.softwcons.helper.TestHelper.QUESTION;
import static nl.uva.softwcons.helper.TestHelper.QUESTION2;
import static nl.uva.softwcons.helper.TestHelper.UNUSED;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.List;
import java.util.stream.Collectors;
import nl.uva.softwcons.helper.TestHelper;
import nl.uva.softwcons.ql.FormBuilder;
import nl.uva.softwcons.ql.ast.form.Form;
import nl.uva.softwcons.ql.ast.statement.ComputedQuestion;
import nl.uva.softwcons.ql.ast.statement.Conditional;
import org.junit.Test;
public class ReferenceResolverTest {
@Test
public void testResolvingReferencedConditionalsForUnusedVariable() {
String questionText = "question: \"Label\" boolean";
String conditionText = "if (question) { question2: \"Label\" boolean }";
Form form = FormBuilder.build(TestHelper.buildForm("form1", questionText, conditionText));
ReferenceResolver referencesResolver = new ReferenceResolver(form);
assertThat(referencesResolver.getReferencedConditionals(UNUSED)).isEmpty();
}
@Test
public void testResolvingReferencedQuestionsForUnusedVariable() {
String questionText = "question: \"Label\" boolean";
Form form = FormBuilder.build(TestHelper.buildForm("form1", questionText));
ReferenceResolver referencesResolver = new ReferenceResolver(form);
assertThat(referencesResolver.getReferencedQuestions(UNUSED)).isEmpty();
}
@Test
public void testResolvingReferencedConditionalsForUnboundedVariable() {
String questionText = "question: \"Label\" boolean";
String conditionText = "if (test) { question2: \"Label\" boolean }";
Form form = FormBuilder.build(TestHelper.buildForm("form1", questionText, conditionText));
ReferenceResolver referencesResolver = new ReferenceResolver(form);
assertThat(referencesResolver.getReferencedConditionals(QUESTION)).isEmpty();
}
@Test
public void testResolvingReferencedQuestionsForUnboundedVariable() {
String questionText = "question: \"Label\" boolean";
Form form = FormBuilder.build(TestHelper.buildForm("form1", questionText));
ReferenceResolver referencesResolver = new ReferenceResolver(form);
assertThat(referencesResolver.getReferencedQuestions(QUESTION)).isEmpty();
}
@Test
public void testResolvingReferencedConditionalsForQuestionBoundedVariable() {
String questionText = "question: \"Label\" boolean (question != true)";
String conditionText = "if (test) { question2: \"Label\" boolean }";
Form form = FormBuilder.build(TestHelper.buildForm("form1", questionText, conditionText));
ReferenceResolver referencesResolver = new ReferenceResolver(form);
assertThat(referencesResolver.getReferencedConditionals(QUESTION)).isEmpty();
}
@Test
public void testResolvingReferencedQuestionsForConditionalBoundedVariable() {
String questionText = "question: \"Label\" boolean";
String conditionText = "if (question) { question2: \"Label\" boolean }";
Form form = FormBuilder.build(TestHelper.buildForm("form1", questionText, conditionText));
ReferenceResolver referencesResolver = new ReferenceResolver(form);
assertThat(referencesResolver.getReferencedQuestions(QUESTION)).isEmpty();
}
@Test
public void testResolvingReferencedConditionalsForBoundedVariable() {
String conditionText = "if (question) { question2: \"Label\" boolean }";
Form form = FormBuilder.build(TestHelper.buildForm("form1", conditionText));
Conditional conditionForQuestion = (Conditional) form.getStatements().get(0);
ReferenceResolver referencesResolver = new ReferenceResolver(form);
assertThat(referencesResolver.getReferencedConditionals(QUESTION)).containsOnly(conditionForQuestion);
}
@Test
public void testResolvingReferencedQuestionsForBoundedVariable() {
String questionText = "question1: \"Label\" boolean (question != true)";
Form form = FormBuilder.build(TestHelper.buildForm("form1", questionText));
ComputedQuestion question1 = (ComputedQuestion) form.getStatements().get(0);
ReferenceResolver referencesResolver = new ReferenceResolver(form);
assertThat(referencesResolver.getReferencedQuestions(QUESTION)).containsOnly(question1);
}
@Test
public void testResolvingMultipleConditionalReferencesForBoundedVariable() {
String condition1Text = "if (question != true) { question1: \"Label\" boolean }";
String condition2Text = "if (question || false) { question2: \"Label\" boolean }";
String condition3Text = "if (question > 1) { question3: \"Label\" boolean }";
Form form = FormBuilder.build(TestHelper.buildForm("form1", condition1Text, condition2Text, condition3Text));
ReferenceResolver referencesResolver = new ReferenceResolver(form);
// convert all statements to conditionals for easier assertion
List<Conditional> expectedConditionals = form.getStatements().stream().map(Conditional.class::cast)
.collect(Collectors.toList());
assertThat(referencesResolver.getReferencedConditionals(QUESTION)).hasSize(3);
assertThat(referencesResolver.getReferencedConditionals(QUESTION)).containsExactlyElementsOf(
expectedConditionals);
}
@Test
public void testResolvingMultipleQuestionReferencesForBoundedVariable() {
String question1Text = "question1: \"Label\" boolean (question != true)";
String question2Text = "question2: \"Label\" boolean (question > 2)";
String question3Text = "question3: \"Label\" boolean (question + 2 - 1 == 5)";
Form form = FormBuilder.build(TestHelper.buildForm("form1", question1Text, question2Text, question3Text));
ReferenceResolver referencesResolver = new ReferenceResolver(form);
// convert all statements to computed questions for easier assertion
List<ComputedQuestion> expectedConditionals = form.getStatements().stream().map(ComputedQuestion.class::cast)
.collect(Collectors.toList());
assertThat(referencesResolver.getReferencedQuestions(QUESTION)).hasSize(3);
assertThat(referencesResolver.getReferencedQuestions(QUESTION)).containsExactlyElementsOf(expectedConditionals);
}
@Test
public void testResolvingBothQuestionAndConditionalReferencesForBoundedVariables() {
String question1Text = "question1: \"Label\" boolean (question != true)";
String condition1Text = "if (question) { question2: \"Label\" boolean (question > 2) }";
String condition2Text = "if (question2) { question3: \"Label\" boolean }";
Form form = FormBuilder.build(TestHelper.buildForm("form1", question1Text, condition1Text, condition2Text));
ReferenceResolver referencesResolver = new ReferenceResolver(form);
// expected results
ComputedQuestion question1 = (ComputedQuestion) form.getStatements().get(0);
Conditional conditional1 = (Conditional) form.getStatements().get(1);
ComputedQuestion question2 = (ComputedQuestion) conditional1.getQuestions().get(0);
Conditional conditional2 = (Conditional) form.getStatements().get(2);
assertThat(referencesResolver.getReferencedQuestions(QUESTION)).containsExactly(question1, question2);
assertThat(referencesResolver.getReferencedConditionals(QUESTION)).containsExactly(conditional1);
assertThat(referencesResolver.getReferencedConditionals(QUESTION2)).containsExactly(conditional2);
}
}