package tests; import static org.junit.Assert.assertEquals; import org.junit.After; import org.junit.Before; import org.junit.Test; import ast.expression.Expression; import ast.expression.arithmetic.Addition; import ast.expression.arithmetic.Division; import ast.expression.arithmetic.Multiplication; import ast.expression.arithmetic.Substraction; import ast.expression.comparison.Equal; import ast.expression.comparison.GreaterEqual; import ast.expression.comparison.GreaterThan; import ast.expression.comparison.LessEqual; import ast.expression.comparison.LessThan; import ast.expression.comparison.NotEqual; import ast.expression.logical.And; import ast.expression.logical.Or; import ast.expression.variables.BooleanVariable; import ast.expression.variables.IntegerVariable; import ast.unary.Not; import evaluator.EvaluatorVisitor; import evaluator.Value; import evaluator.ValueRepository; public class TestEvaluator { private final IntegerVariable int4 = new IntegerVariable(4); private ValueRepository valrep = new ValueRepository(); private EvaluatorVisitor eval; @Before public void setUp() { eval = new EvaluatorVisitor(valrep); } public Value evaluate(Expression expression) { return expression.accept(this.eval); } @After public void tearDown() { eval = null; } @Test public void testAddition() { Value value = evaluate( new Addition(new IntegerVariable(3), new IntegerVariable(5))); Value value2 = evaluate( new Addition(new IntegerVariable(1), new IntegerVariable(4))); Value value3 = evaluate( new Addition( new Addition(new IntegerVariable(1), new IntegerVariable(4)), int4)); assertEquals("3+5 = 8", value.getValue(), 8); assertEquals("1+4 = 5", value2.getValue(), 5); assertEquals("(1+4)+4 = 9", value3.getValue(), 9); } @Test public void testSubstraction() { Value value2 = evaluate( new Substraction(new IntegerVariable(75), new IntegerVariable(6))); Value value3 = evaluate( new Substraction( new Addition(new IntegerVariable(8), new IntegerVariable(6)), int4)); assertEquals("75-6=69", value2.getValue(), 69); assertEquals("(8+6)-4=10", value3.getValue(), 10); } @Test public void testMultiplication() { Value value = evaluate( new Multiplication(new IntegerVariable(5), new IntegerVariable(4))); assertEquals("5*4 = 20", value.getValue(), 20); } @Test public void testDivision() { Value value1 = evaluate(new Division(new IntegerVariable(200), new IntegerVariable(40))); Value value2 = evaluate(new Division(new IntegerVariable(45), new IntegerVariable(9))); assertEquals("200/40=5", value1.getValue(), 5); assertEquals("45/9=5", value2.getValue(), 5); } @Test public void testCalculations() { Value value1 = evaluate( new Multiplication( new Substraction(new IntegerVariable(7), new IntegerVariable(2)), new IntegerVariable(5)) ); Value value2 = evaluate(new Multiplication( new Division(new IntegerVariable(48), new IntegerVariable(8)), new IntegerVariable(2)) ); assertEquals("(7-2)*5=25", value1.getValue(), 25); assertEquals("(48/8)*2=12", value2.getValue(), 12); } @Test public void testAndComparisons() throws Exception { Value value1 = evaluate(new And(new BooleanVariable(true), new BooleanVariable(true))); Value value2 = evaluate(new And(new BooleanVariable(true), new BooleanVariable(false))); Value value3 = evaluate(new And(new BooleanVariable(false), new BooleanVariable(false))); assertEquals("t && t = t", value1.getValue(), true); assertEquals("t && f = f", value2.getValue(), false); assertEquals("f && f = f", value3.getValue(), false); } @Test public void testOrComparisons() throws Exception { Value value1 = evaluate(new Or(new BooleanVariable(true), new BooleanVariable(true))); Value value2 = evaluate(new Or(new BooleanVariable(true), new BooleanVariable(false))); Value value3 = evaluate(new Or(new BooleanVariable(false), new BooleanVariable(false))); assertEquals("t || t = t", value1.getValue(), true); assertEquals("t || f = t", value2.getValue(), true); assertEquals("f || f = f", value3.getValue(), false); } @Test public void testNotComparisons() throws Exception { Value value1 = evaluate(new Not(new BooleanVariable(true))); Value value2 = evaluate(new Not(new BooleanVariable(false))); assertEquals("!t = f", value1.getValue(), false); assertEquals("!f = t", value2.getValue(), true); } @Test public void testLogicalComparisons() throws Exception { Value value1 = evaluate(new Not(new Or(new BooleanVariable(true), new BooleanVariable(true)))); Value value2 = evaluate(new Or(new BooleanVariable(true), new And( new BooleanVariable(false),new BooleanVariable(false)))); assertEquals("!(t || t) = f", value1.getValue(), false); assertEquals("t || (f && f) = t", value2.getValue(), true); } @Test public void testComparisons() throws Exception { Value value1 = evaluate(new Equal(new IntegerVariable(7), new IntegerVariable(8))); Value value2 = evaluate(new GreaterEqual(new IntegerVariable(8), new IntegerVariable(8))); Value value3 = evaluate(new GreaterThan(new IntegerVariable(78), new IntegerVariable(8))); Value value4 = evaluate(new LessThan(new IntegerVariable(666), new IntegerVariable(-2))); Value value5 = evaluate(new LessEqual(new IntegerVariable(102), new IntegerVariable(103))); Value value6 = evaluate(new NotEqual(new IntegerVariable(102), new IntegerVariable(103))); assertEquals("7 ==8", value1.getValue(), false); assertEquals("8 >= 8", value2.getValue(), true); assertEquals("78 > 8", value3.getValue(), true); assertEquals("666 < -2", value4.getValue(), false); assertEquals("102 <= 103", value5.getValue(), true); assertEquals("102 != 103", value6.getValue(), true); } @Test public void testMix() throws Exception { Value value1 = evaluate(new Or( new Equal(new IntegerVariable(7), new IntegerVariable(8)), new BooleanVariable(true)) ); Value value2 = evaluate(new And( new LessThan(new IntegerVariable(7), new IntegerVariable(8)), new BooleanVariable(true)) ); assertEquals("(7 == 8) || true", value1.getValue(), true); assertEquals("(7 > 8 ) && true", value2.getValue(), true); } }