package nl.uva.softwcons.qls.validation;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.List;
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.validation.Error;
import nl.uva.softwcons.ql.validation.identifier.error.DuplicateQuestionIdentifier;
import nl.uva.softwcons.qls.StylesheetBuilder;
import nl.uva.softwcons.qls.ast.stylesheet.Stylesheet;
import nl.uva.softwcons.qls.validation.questionidentifier.QuestionIdentifierChecker;
import nl.uva.softwcons.qls.validation.questionidentifier.error.MissingQuestionIdentifier;
import nl.uva.softwcons.qls.validation.questionidentifier.error.UnknownQuestionIdentifier;
import org.junit.Test;
public class QuestionIdentifierCheckerTest {
@Test
public void testMissingIdentifierOnlyOneQuestionPresent() {
List<Error> errors = getQuestionIdentifierErrors("page page1 { question q1 }");
assertThat(errors).hasSize(1);
assertThat(errors.get(0)).isExactlyInstanceOf(MissingQuestionIdentifier.class);
assertThat(errors.get(0).getMessage()).contains("q2");
assertThat(errors.get(0).getMessage()).contains("q3");
assertThat(errors.get(0).getMessage()).doesNotContain("q1");
}
@Test
public void testMissingIdentifierTwoQuestionsPresent() {
List<Error> errors = getQuestionIdentifierErrors("page page1 { question q1 question q2 }");
assertThat(errors).hasSize(1);
assertThat(errors.get(0)).isExactlyInstanceOf(MissingQuestionIdentifier.class);
assertThat(errors.get(0).getMessage()).contains("q3");
assertThat(errors.get(0).getMessage()).doesNotContain("q1");
assertThat(errors.get(0).getMessage()).doesNotContain("q2");
}
@Test
public void testMissingIdentifierAllQuestionsPresent() {
List<Error> errors = getQuestionIdentifierErrors("page page1 { question q1 question q2 question q3}");
assertThat(errors).isEmpty();
}
@Test
public void testDuplicateQuestionIdentifierOneDuplication() {
List<Error> errors = getQuestionIdentifierErrors("page page1 { question q1 question q2 question q3 question q1}");
assertThat(errors).hasSize(1);
assertThat(errors).hasOnlyElementsOfType(DuplicateQuestionIdentifier.class);
}
@Test
public void testDuplicateQuestionIdentifierTwoDuplications() {
List<Error> errors = getQuestionIdentifierErrors("page page1 { question q1 question q3 question q2 question q3 question q1}");
assertThat(errors).hasSize(2);
assertThat(errors).hasOnlyElementsOfType(DuplicateQuestionIdentifier.class);
}
@Test
public void testDuplicateQuestionIdentifierTwoSameDuplications() {
List<Error> errors = getQuestionIdentifierErrors("page page1 { question q1 question q3 question q2 question q1 question q1}");
assertThat(errors).hasSize(2);
assertThat(errors).hasOnlyElementsOfType(DuplicateQuestionIdentifier.class);
}
@Test
public void testUnknownQuestionIdentifierOne() {
List<Error> errors = getQuestionIdentifierErrors("page page1 { question q1 question q3 question q2 question q4}");
assertThat(errors).hasSize(1);
assertThat(errors).hasOnlyElementsOfType(UnknownQuestionIdentifier.class);
}
@Test
public void testUnknownQuestionIdentifierTwoEquals() {
List<Error> errors = getQuestionIdentifierErrors("page page1 { question q1 question q3 question q2 question q4 question q4}");
assertThat(errors).hasSize(3);
assertThat(errors.get(0)).isExactlyInstanceOf(UnknownQuestionIdentifier.class);
assertThat(errors.get(1)).isExactlyInstanceOf(UnknownQuestionIdentifier.class);
assertThat(errors.get(2)).isExactlyInstanceOf(DuplicateQuestionIdentifier.class);
}
@Test
public void testAllErrorsPresent() {
List<Error> errors = getQuestionIdentifierErrors("page page1 { question q8 question q8}");
assertThat(errors).hasSize(4);
assertThat(errors.get(0)).isExactlyInstanceOf(UnknownQuestionIdentifier.class);
assertThat(errors.get(1)).isExactlyInstanceOf(UnknownQuestionIdentifier.class);
assertThat(errors.get(2)).isExactlyInstanceOf(DuplicateQuestionIdentifier.class);
assertThat(errors.get(3)).isExactlyInstanceOf(MissingQuestionIdentifier.class);
assertThat(errors.get(3).getMessage()).contains("q3");
assertThat(errors.get(3).getMessage()).contains("q2");
assertThat(errors.get(3).getMessage()).contains("q1");
}
@Test
public void testMixedErrorsPresent() {
List<Error> errors = getQuestionIdentifierErrors("page page1 { question q8 question q5 question q2}");
assertThat(errors).hasSize(3);
assertThat(errors.get(0)).isExactlyInstanceOf(UnknownQuestionIdentifier.class);
assertThat(errors.get(1)).isExactlyInstanceOf(UnknownQuestionIdentifier.class);
assertThat(errors.get(2)).isExactlyInstanceOf(MissingQuestionIdentifier.class);
assertThat(errors.get(2).getMessage()).contains("q3");
assertThat(errors.get(2).getMessage()).contains("q1");
assertThat(errors.get(2).getMessage()).doesNotContain("q2");
}
private static Form getForm() {
final String question1 = "q1: \"Label 1\" boolean";
final String question2 = "q2: \"Label 2\" boolean";
final String conditional1 = "if (q1) { q3: \"Label 1\" boolean(q1) }";
return FormBuilder.build(TestHelper.buildForm("form1", question1, question2, conditional1));
}
private static List<Error> getQuestionIdentifierErrors(final String... stylesheetContents) {
final Stylesheet stylesheet = StylesheetBuilder.build(TestHelper.buildStylesheet("stylesheet1",
stylesheetContents));
return QuestionIdentifierChecker.check(stylesheet, getForm());
}
}