package nl.uva.softwcons.ql.validation;
import static org.assertj.core.api.Assertions.assertThat;
import nl.uva.softwcons.helper.TestHelper;
import nl.uva.softwcons.ql.FormBuilder;
import nl.uva.softwcons.ql.ast.expression.Expression;
import nl.uva.softwcons.ql.ast.form.Form;
import nl.uva.softwcons.ql.ast.statement.ComputedQuestion;
import nl.uva.softwcons.ql.validation.VariableExctractor;
import org.junit.Test;
public class VariableExtractorTest {
@Test
public void testNoExtractedVariablesFromLiterals() {
assertThat(VariableExctractor.extractFrom(getExpression("false"))).isEmpty();
assertThat(VariableExctractor.extractFrom(getExpression("0"))).isEmpty();
assertThat(VariableExctractor.extractFrom(getExpression("1.0"))).isEmpty();
// empty string literal ""
assertThat(VariableExctractor.extractFrom(getExpression("\"\""))).isEmpty();
}
@Test
public void testSingleExtractedVariableFromIdentifierLiteral() {
assertThat(VariableExctractor.extractFrom(getExpression("id"))).extracting("name").containsOnly("id");
}
@Test
public void testAdditionExpressionWithVariables() {
assertThat(VariableExctractor.extractFrom(getExpression("1 + 1"))).isEmpty();
assertThat(VariableExctractor.extractFrom(getExpression("1 + var"))).extracting("name").containsOnly("var");
assertThat(VariableExctractor.extractFrom(getExpression("var + var"))).extracting("name").containsOnly("var");
assertThat(VariableExctractor.extractFrom(getExpression("foo + bar + baz"))).extracting("name").containsOnly(
"foo", "bar", "baz");
}
@Test
public void testSubtractionExpressionWithVariables() {
assertThat(VariableExctractor.extractFrom(getExpression("1 - 1"))).isEmpty();
assertThat(VariableExctractor.extractFrom(getExpression("1 - var"))).extracting("name").containsOnly("var");
assertThat(VariableExctractor.extractFrom(getExpression("var - var"))).extracting("name").containsOnly("var");
assertThat(VariableExctractor.extractFrom(getExpression("foo - bar - baz"))).extracting("name").containsOnly(
"foo", "bar", "baz");
}
@Test
public void testMultiplicationExpressionWithVariables() {
assertThat(VariableExctractor.extractFrom(getExpression("1 * 1"))).isEmpty();
assertThat(VariableExctractor.extractFrom(getExpression("1 * var"))).extracting("name").containsOnly("var");
assertThat(VariableExctractor.extractFrom(getExpression("var * var"))).extracting("name").containsOnly("var");
assertThat(VariableExctractor.extractFrom(getExpression("foo * bar * baz"))).extracting("name").containsOnly(
"foo", "bar", "baz");
}
@Test
public void testDivisionExpressionWithVariables() {
assertThat(VariableExctractor.extractFrom(getExpression("1 / 1"))).isEmpty();
assertThat(VariableExctractor.extractFrom(getExpression("1 / var"))).extracting("name").containsOnly("var");
assertThat(VariableExctractor.extractFrom(getExpression("var / var"))).extracting("name").containsOnly("var");
assertThat(VariableExctractor.extractFrom(getExpression("foo / bar / baz"))).extracting("name").containsOnly(
"foo", "bar", "baz");
}
@Test
public void testEqualsExpressionWithVariables() {
assertThat(VariableExctractor.extractFrom(getExpression("1 == 1"))).isEmpty();
assertThat(VariableExctractor.extractFrom(getExpression("1 == var"))).extracting("name").containsOnly("var");
assertThat(VariableExctractor.extractFrom(getExpression("var == var"))).extracting("name").containsOnly("var");
assertThat(VariableExctractor.extractFrom(getExpression("foo == bar || baz == true"))).extracting("name")
.containsOnly("foo", "bar", "baz");
}
@Test
public void testNotEqualsExpressionWithVariables() {
assertThat(VariableExctractor.extractFrom(getExpression("1 != 1"))).isEmpty();
assertThat(VariableExctractor.extractFrom(getExpression("1 != var"))).extracting("name").containsOnly("var");
assertThat(VariableExctractor.extractFrom(getExpression("var != var"))).extracting("name").containsOnly("var");
assertThat(VariableExctractor.extractFrom(getExpression("foo != bar || baz != true"))).extracting("name")
.containsOnly("foo", "bar", "baz");
}
@Test
public void testGreaterOrEqualExpressionWithVariables() {
assertThat(VariableExctractor.extractFrom(getExpression("1 >= 1"))).isEmpty();
assertThat(VariableExctractor.extractFrom(getExpression("1 >= var"))).extracting("name").containsOnly("var");
assertThat(VariableExctractor.extractFrom(getExpression("var >= var"))).extracting("name").containsOnly("var");
assertThat(VariableExctractor.extractFrom(getExpression("foo >= bar || baz >= true"))).extracting("name")
.containsOnly("foo", "bar", "baz");
}
@Test
public void testGreaterThanExpressionWithVariables() {
assertThat(VariableExctractor.extractFrom(getExpression("1 > 1"))).isEmpty();
assertThat(VariableExctractor.extractFrom(getExpression("1 > var"))).extracting("name").containsOnly("var");
assertThat(VariableExctractor.extractFrom(getExpression("var > var"))).extracting("name").containsOnly("var");
assertThat(VariableExctractor.extractFrom(getExpression("foo > bar || baz > true"))).extracting("name")
.containsOnly("foo", "bar", "baz");
}
@Test
public void testLowerOrEqualExpressionWithVariables() {
assertThat(VariableExctractor.extractFrom(getExpression("1 <= 1"))).isEmpty();
assertThat(VariableExctractor.extractFrom(getExpression("1 <= var"))).extracting("name").containsOnly("var");
assertThat(VariableExctractor.extractFrom(getExpression("var <= var"))).extracting("name").containsOnly("var");
assertThat(VariableExctractor.extractFrom(getExpression("foo <= bar || baz <= true"))).extracting("name")
.containsOnly("foo", "bar", "baz");
}
@Test
public void testLowerThanExpressionWithVariables() {
assertThat(VariableExctractor.extractFrom(getExpression("1 < 1"))).isEmpty();
assertThat(VariableExctractor.extractFrom(getExpression("1 < var"))).extracting("name").containsOnly("var");
assertThat(VariableExctractor.extractFrom(getExpression("var < var"))).extracting("name").containsOnly("var");
assertThat(VariableExctractor.extractFrom(getExpression("foo < bar || baz < true"))).extracting("name")
.containsOnly("foo", "bar", "baz");
}
@Test
public void testAndExpressionWithVariables() {
assertThat(VariableExctractor.extractFrom(getExpression("true && false"))).isEmpty();
assertThat(VariableExctractor.extractFrom(getExpression("true && var"))).extracting("name").containsOnly("var");
assertThat(VariableExctractor.extractFrom(getExpression("var && var"))).extracting("name").containsOnly("var");
assertThat(VariableExctractor.extractFrom(getExpression("foo && bar && baz"))).extracting("name").containsOnly(
"foo", "bar", "baz");
}
@Test
public void testOrExpressionWithVariables() {
assertThat(VariableExctractor.extractFrom(getExpression("true || false"))).isEmpty();
assertThat(VariableExctractor.extractFrom(getExpression("true || var"))).extracting("name").containsOnly("var");
assertThat(VariableExctractor.extractFrom(getExpression("var || var"))).extracting("name").containsOnly("var");
assertThat(VariableExctractor.extractFrom(getExpression("foo || bar || baz"))).extracting("name").containsOnly(
"foo", "bar", "baz");
}
@Test
public void testNotExpressionWithVariables() {
assertThat(VariableExctractor.extractFrom(getExpression("!true"))).isEmpty();
assertThat(VariableExctractor.extractFrom(getExpression("!var"))).extracting("name").containsOnly("var");
assertThat(VariableExctractor.extractFrom(getExpression("!var || !var"))).extracting("name")
.containsOnly("var");
assertThat(VariableExctractor.extractFrom(getExpression("!foo || !bar || !baz"))).extracting("name")
.containsOnly("foo", "bar", "baz");
}
@Test
public void testComplexAndNestedExpressionWithVariables() {
final Expression expr = getExpression("(a > b) || (b > c && !(6*d + 15/e/e - f == 0))");
assertThat(VariableExctractor.extractFrom(expr)).extracting("name").containsOnly("a", "b", "c", "d", "e", "f");
}
private Expression getExpression(final String expressionText) {
final String questionText = "question: \"Label\" boolean(" + expressionText + ")";
final Form form = FormBuilder.build(TestHelper.buildForm("form1", questionText));
final ComputedQuestion question = (ComputedQuestion) form.getStatements().get(0);
return question.getExpression();
}
}