package test.nl.uva;
import main.nl.uva.parser.Line;
import main.nl.uva.parser.expression.Addition;
import main.nl.uva.parser.expression.And;
import main.nl.uva.parser.expression.Division;
import main.nl.uva.parser.expression.Equal;
import main.nl.uva.parser.expression.Multiplication;
import main.nl.uva.parser.expression.Or;
import main.nl.uva.parser.expression.Substraction;
import main.nl.uva.parser.expression.Variable;
import main.nl.uva.parser.expression.unary.UnaryExpression;
import main.nl.uva.validation.Scope;
import main.nl.uva.validation.type.Bool;
import main.nl.uva.validation.type.Money;
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 ExpressionTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {}
@Before
public void setUp() throws Exception {}
@Test
public void testAddition() {
Addition expression = new Addition(new UnaryExpression(new Money(3)), new UnaryExpression(new Money(5)), Line.NO_LINE_NUMBER);
Assert.assertFalse(expression.validateAndCalculate(new Scope()).hasErrors());
Money value = (Money) expression.getValue();
Assert.assertEquals(8, value.getValue(), 0.0001);
}
@Test
public void testSubstraction() {
Substraction expression = new Substraction(new UnaryExpression(new Money(3)), new UnaryExpression(new Money(5)),
Line.NO_LINE_NUMBER);
Assert.assertFalse(expression.validateAndCalculate(new Scope()).hasErrors());
Money value = (Money) expression.getValue();
Assert.assertEquals(-2, value.getValue(), 0.0001);
}
@Test
public void testMultiplication() {
Multiplication expression = new Multiplication(new UnaryExpression(new Money(3)), new UnaryExpression(new Money(5)),
Line.NO_LINE_NUMBER);
Assert.assertFalse(expression.validateAndCalculate(new Scope()).hasErrors());
Money value = (Money) expression.getValue();
Assert.assertEquals(15, value.getValue(), 0.0001);
}
@Test
public void testDivision() {
Division expression = new Division(new UnaryExpression(new Money(3)), new UnaryExpression(new Money(5)), Line.NO_LINE_NUMBER);
Assert.assertFalse(expression.validateAndCalculate(new Scope()).hasErrors());
Money value = (Money) expression.getValue();
Assert.assertEquals(3.0 / 5.0, value.getValue(), 0.0001);
}
@Test
public void testAnd() {
And expression = new And(new UnaryExpression(new Bool(true)), new UnaryExpression(new Bool(false)), Line.NO_LINE_NUMBER);
Assert.assertFalse(expression.validateAndCalculate(new Scope()).hasErrors());
Bool value = (Bool) expression.getValue();
Assert.assertFalse(value.getValue());
}
@Test
public void testOr() {
Or expression = new Or(new UnaryExpression(new Bool(true)), new UnaryExpression(new Bool(false)), Line.NO_LINE_NUMBER);
Assert.assertFalse(expression.validateAndCalculate(new Scope()).hasErrors());
Bool value = (Bool) expression.getValue();
Assert.assertTrue(value.getValue());
}
@Test
public void testComparrison() {
Equal expression = new Equal(new UnaryExpression(new Bool(true)), new UnaryExpression(new Bool(false)), Line.NO_LINE_NUMBER);
Assert.assertFalse(expression.validateAndCalculate(new Scope()).hasErrors());
Bool value = (Bool) expression.getValue();
Assert.assertFalse(value.getValue());
expression = new Equal(new UnaryExpression(new Money(3)), new UnaryExpression(new Money(3)), Line.NO_LINE_NUMBER);
Assert.assertFalse(expression.validateAndCalculate(new Scope()).hasErrors());
value = (Bool) expression.getValue();
Assert.assertTrue(value.getValue());
expression = new Equal(new UnaryExpression(new Money(3)), new UnaryExpression(new Money(4)), Line.NO_LINE_NUMBER);
Assert.assertFalse(expression.validateAndCalculate(new Scope()).hasErrors());
value = (Bool) expression.getValue();
Assert.assertFalse(value.getValue());
}
@Test
public void testVariable() {
Variable variable = new Variable(Value.Type.MONEY, "payment", new Multiplication(new UnaryExpression(new Money(3)),
new UnaryExpression(new Money(5)), Line.NO_LINE_NUMBER), Line.NO_LINE_NUMBER);
Assert.assertEquals(variable.getName(), "payment");
variable.validateAndCalculate(new Scope());
Assert.assertTrue(variable.getValue().isTypeOf(Value.Type.MONEY));
}
}