import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.List;
import nl.uva.polyql.ast.Form;
import nl.uva.polyql.ast.IfStatement;
import nl.uva.polyql.ast.Question;
import nl.uva.polyql.ast.values.NumberValue;
import nl.uva.polyql.utils.Log;
import nl.uva.polyql.utils.ParserHelper;
import nl.uva.polyql.validation.DuplicateIdError;
import nl.uva.polyql.validation.DuplicateLabelWarning;
import nl.uva.polyql.validation.InvalidBinaryOperationError;
import nl.uva.polyql.validation.InvalidIfStatementError;
import nl.uva.polyql.validation.UnknownIdError;
import nl.uva.polyql.validation.ValidationError;
import nl.uva.polyql.validation.Validator;
import org.junit.Before;
import org.junit.Test;
public class ParserTest {
@Before
public void beforeTests() {
Log.setLogging(false);
}
@Test
public void testIfStatement() {
final Form form = ParserHelper.parseResourceForm("ifstatement");
Validator.validate(form);
final Question question = form.getQuestion("num");
final IfStatement ifStatement = (IfStatement) form.getRules().get(1);
assertFalse(ifStatement.isSatisfied());
question.setValue(new NumberValue(10.0));
assertTrue(ifStatement.isSatisfied());
}
@Test
public void testIfStatementType() {
final Form form = ParserHelper.parseResourceForm("ex_ifstatement");
final Validator validator = Validator.validate(form);
final List<ValidationError> errors = validator.getErrors();
assertEquals(1, errors.size());
assertTrue(errors.get(0) instanceof InvalidIfStatementError);
}
@Test
public void testPrecedence() {
final Form form = ParserHelper.parseResourceForm("precedence");
Validator.validate(form);
assertEquals(7.0, form.getQuestion("qSumMult").getValue().getValue());
assertEquals(3.0, form.getQuestion("qSubDiv").getValue().getValue());
assertEquals(true, form.getQuestion("qAndOrAnd").getValue().getValue());
assertEquals(true, form.getQuestion("qSumGt").getValue().getValue());
assertEquals(1.0, form.getQuestion("qBracket").getValue().getValue());
assertEquals(1.0, form.getQuestion("qSubMod").getValue().getValue());
}
@Test
public void testWarnings() {
Form form = ParserHelper.parseResourceForm("warnings");
Validator validator = Validator.validate(form);
List<ValidationError> errors = validator.getErrors();
assertEquals(1, errors.size());
assertTrue(errors.get(0) instanceof DuplicateLabelWarning);
form = ParserHelper.parseResourceForm("nowarnings");
validator = Validator.validate(form);
errors = validator.getErrors();
assertEquals(0, errors.size());
}
@Test
public void testTypes() {
Form form = ParserHelper.parseResourceForm("ex_bool_plus_num");
Validator validator = Validator.validate(form);
List<ValidationError> errors = validator.getErrors();
assertEquals(4, errors.size());
assertTrue(errors.get(0) instanceof DuplicateLabelWarning);
assertTrue(errors.get(1) instanceof DuplicateLabelWarning);
assertTrue(errors.get(2) instanceof DuplicateLabelWarning);
assertTrue(errors.get(3) instanceof InvalidBinaryOperationError);
form = ParserHelper.parseResourceForm("ex_string_min_num");
validator = Validator.validate(form);
errors = validator.getErrors();
assertEquals(4, errors.size());
assertTrue(errors.get(0) instanceof DuplicateLabelWarning);
assertTrue(errors.get(1) instanceof DuplicateLabelWarning);
assertTrue(errors.get(2) instanceof DuplicateLabelWarning);
assertTrue(errors.get(3) instanceof InvalidBinaryOperationError);
}
@Test
public void testDuplicateId() {
final Form form = ParserHelper.parseResourceForm("ex_duplicateid");
final Validator validator = Validator.validate(form);
final List<ValidationError> errors = validator.getErrors();
assertEquals(1, errors.size());
assertTrue(errors.get(0) instanceof DuplicateIdError);
}
@Test
public void testInvalidId() {
final Form form = ParserHelper.parseResourceForm("ex_invalidid");
final Validator validator = Validator.validate(form);
final List<ValidationError> errors = validator.getErrors();
assertEquals(1, errors.size());
assertTrue(errors.get(0) instanceof UnknownIdError);
}
}