package test.nl.uva;
import java.util.ArrayList;
import java.util.List;
import main.nl.uva.parser.Form;
import main.nl.uva.parser.Line;
import main.nl.uva.parser.expression.And;
import main.nl.uva.parser.expression.Variable;
import main.nl.uva.parser.expression.unary.VariableAtom;
import main.nl.uva.parser.statement.Declaration;
import main.nl.uva.parser.statement.IfThenElse;
import main.nl.uva.parser.statement.Statement;
import main.nl.uva.validation.Scope;
import main.nl.uva.validation.type.Value;
import org.junit.Assert;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class ValidationTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {}
@Before
public void setUp() throws Exception {}
@Test
public void testValidVariableValidation() {
Variable v1 = new Variable(Value.Type.BOOLEAN, "testVar", Line.NO_LINE_NUMBER);
Variable v2 = new Variable(Value.Type.BOOLEAN, "usesTestVar", new VariableAtom("testVar", Line.NO_LINE_NUMBER), Line.NO_LINE_NUMBER);
Declaration decStatement1 = new Declaration(v1, "declares variable");
Declaration decStatement2 = new Declaration(v2, "uses variabe");
List<Statement> children = new ArrayList<Statement>();
children.add(decStatement1);
children.add(decStatement2);
Form form = new Form("testForm", children, Line.NO_LINE_NUMBER);
form.validateAndCalculate(new Scope()).printErrors();
Assert.assertTrue("Valid statement was marked invalid", !form.validateAndCalculate(new Scope()).hasErrors());
}
@Test
public void testInvalidVariableValidation() {
Variable v1 = new Variable(Value.Type.BOOLEAN, "testVar", Line.NO_LINE_NUMBER);
Variable v2 = new Variable(Value.Type.BOOLEAN, "testVar", new VariableAtom("testVar", Line.NO_LINE_NUMBER), Line.NO_LINE_NUMBER);
Declaration decStatement1 = new Declaration(v1, "declares variable");
Declaration decStatement2 = new Declaration(v2, "uses variabe");
List<Statement> children = new ArrayList<Statement>();
children.add(decStatement2);
children.add(decStatement1);
Form form = new Form("testForm", children, Line.NO_LINE_NUMBER);
Assert.assertTrue("Invalid statement was not marked invalid", form.validateAndCalculate(new Scope()).hasErrors());
}
@Test
public void testValidExpression() {
Variable v1 = new Variable(Value.Type.BOOLEAN, "testBoolean", Line.NO_LINE_NUMBER);
Variable v2 = new Variable(Value.Type.BOOLEAN, "testBoolean2", Line.NO_LINE_NUMBER);
And andExpression = new And(v1, v2, Line.NO_LINE_NUMBER);
Assert.assertFalse("Valid statement was marked invalid", andExpression.validateAndCalculate(new Scope()).hasErrors());
}
@Test
public void testInvalidExpression() {
Variable v1 = new Variable(Value.Type.BOOLEAN, "testBoolean", Line.NO_LINE_NUMBER);
Variable v2 = new Variable(Value.Type.MONEY, "testMoney", Line.NO_LINE_NUMBER);
And andExpression = new And(v1, v2, Line.NO_LINE_NUMBER);
Assert.assertTrue("Invalid statement was not marked invalid", andExpression.validateAndCalculate(new Scope()).hasErrors());
}
@Test
public void testIfElseValid() {
Variable v1 = new Variable(Value.Type.BOOLEAN, "testVar", Line.NO_LINE_NUMBER);
List<Statement> children = new ArrayList<Statement>();
children.add(new Declaration(v1, "declares variable"));
Variable v2 = new Variable(Value.Type.BOOLEAN, "testVarUser", new VariableAtom("testVar", Line.NO_LINE_NUMBER), Line.NO_LINE_NUMBER);
Variable v3 = new Variable(Value.Type.BOOLEAN, "testBoolean", Line.NO_LINE_NUMBER);
Variable v4 = new Variable(Value.Type.MONEY, "testMoney", Line.NO_LINE_NUMBER);
Declaration decStatement1 = new Declaration(v3, "declares variable");
Declaration decStatement2 = new Declaration(v4, "uses variabe");
List<Statement> ifBlock = new ArrayList<>();
ifBlock.add(decStatement1);
List<Statement> elseBlock = new ArrayList<>();
elseBlock.add(decStatement2);
IfThenElse ifElse = new IfThenElse(v2, ifBlock, elseBlock, Line.NO_LINE_NUMBER);
children.add(ifElse);
Form form = new Form("testForm", children, Line.NO_LINE_NUMBER);
Assert.assertFalse("Valid statement was marked invalid", form.validateAndCalculate(new Scope()).hasErrors());
}
@Test
public void testIfElseInvalid() {
List<Statement> children = new ArrayList<Statement>();
Variable v2 = new Variable(Value.Type.BOOLEAN, "testVarUser", new VariableAtom("testVar", Line.NO_LINE_NUMBER), Line.NO_LINE_NUMBER);
Variable v3 = new Variable(Value.Type.BOOLEAN, "testBoolean", Line.NO_LINE_NUMBER);
Variable v4 = new Variable(Value.Type.MONEY, "testMoney", Line.NO_LINE_NUMBER);
Declaration decStatement1 = new Declaration(v3, "declares variable");
Declaration decStatement2 = new Declaration(v4, "uses variabe");
List<Statement> ifBlock = new ArrayList<>();
ifBlock.add(decStatement1);
List<Statement> elseBlock = new ArrayList<>();
elseBlock.add(decStatement2);
IfThenElse ifElse = new IfThenElse(v2, ifBlock, elseBlock, Line.NO_LINE_NUMBER);
children.add(ifElse);
Form form = new Form("testForm", children, Line.NO_LINE_NUMBER);
Assert.assertTrue("Invalid statement was not marked invalid", form.validateAndCalculate(new Scope()).hasErrors());
}
}