package org.uva.ql.test.evaluator; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.uva.ql.ast.CodePosition; import org.uva.ql.ast.expression.Expression; import org.uva.ql.ast.expression.association.Parenthesis; import org.uva.ql.ast.expression.binary.Addition; import org.uva.ql.ast.expression.binary.Divide; import org.uva.ql.ast.expression.binary.Equal; import org.uva.ql.ast.expression.binary.Greater; import org.uva.ql.ast.expression.binary.GreaterEqual; import org.uva.ql.ast.expression.binary.Less; import org.uva.ql.ast.expression.binary.LessEqual; import org.uva.ql.ast.expression.binary.Multiply; import org.uva.ql.ast.expression.binary.NotEqual; import org.uva.ql.ast.expression.binary.Substraction; import org.uva.ql.ast.expression.literal.Identifier; import org.uva.ql.ast.expression.literal.IntLiteral; import org.uva.ql.ast.expression.unary.Negative; import org.uva.ql.ast.expression.unary.Positive; import org.uva.ql.ast.value.IntValue; import org.uva.ql.ast.value.Value; import org.uva.ql.evaluation.Evaluator; public class IntTest { private final int INT_VALUE1 = 15; private final int INT_VALUE2 = 5; private final CodePosition POS = new CodePosition(0, 0); private final Identifier ID = new Identifier("ID", POS); private final IntLiteral INT_LITERAL1 = new IntLiteral(INT_VALUE1, POS); private final IntLiteral INT_LITERAL2 = new IntLiteral(INT_VALUE2, POS); private Evaluator evaluator = new Evaluator(); @Test public void testPOSitive() { int expected = +INT_VALUE1; int actual = (int) evaluator.evaluate(new Positive(INT_LITERAL1, POS)).value(); Assert.assertEquals(expected, actual); } @Test public void testNegative() { int expected = -INT_VALUE1; int actual = (int) evaluator.evaluate(new Negative(INT_LITERAL1, POS)).value(); Assert.assertEquals(expected, actual); } @Test public void testPlusInt() { int expected = INT_VALUE1 + INT_VALUE2; int actual = (int) evaluator.evaluate(new Addition(INT_LITERAL1, INT_LITERAL2, POS)).value(); Assert.assertEquals(expected, actual); } @Test public void testMinus() { int expected = INT_VALUE1 - INT_VALUE2; int actual = (int) evaluator.evaluate(new Substraction(INT_LITERAL1, INT_LITERAL2, POS)).value(); Assert.assertEquals(expected, actual); } @Test public void testMutiply() { int expected = INT_VALUE1 * INT_VALUE2; int actual = (int) evaluator.evaluate(new Multiply(INT_LITERAL1, INT_LITERAL2, POS)).value(); Assert.assertEquals(expected, actual); } @Test public void testDivide() { int expected = INT_VALUE1 / INT_VALUE2; int actual = (int) evaluator.evaluate(new Divide(INT_LITERAL1, INT_LITERAL2, POS)).value(); Assert.assertEquals(expected, actual); } @Test public void testDivideZero() { boolean expected = false; boolean actual = evaluator.evaluate(new Divide(INT_LITERAL1, new IntLiteral(0, POS), POS)).isDefined(); Assert.assertEquals(expected, actual); } @Test public void testEqualInt1() { boolean expected = INT_VALUE1 == INT_VALUE1; boolean actual = (boolean) evaluator.evaluate(new Equal(INT_LITERAL1, INT_LITERAL1, POS)).value(); Assert.assertEquals(expected, actual); } @Test public void testEqualInt2() { boolean expected = INT_VALUE1 == INT_VALUE2; boolean actual = (boolean) evaluator.evaluate(new Equal(INT_LITERAL1, INT_LITERAL2, POS)).value(); Assert.assertEquals(expected, actual); } @Test public void testNotEqualInt1() { boolean expected = INT_VALUE1 != INT_VALUE1; boolean actual = (boolean) evaluator.evaluate(new NotEqual(INT_LITERAL1, INT_LITERAL1, POS)).value(); Assert.assertEquals(expected, actual); } @Test public void testNotEqualInt2() { boolean expected = INT_VALUE1 != INT_VALUE2; boolean actual = (boolean) evaluator.evaluate(new NotEqual(INT_LITERAL1, INT_LITERAL2, POS)).value(); Assert.assertEquals(expected, actual); } @Test public void testGreater() { boolean expected = INT_VALUE1 > INT_VALUE2; boolean actual = (boolean) evaluator.evaluate(new Greater(INT_LITERAL1, INT_LITERAL2, POS)).value(); Assert.assertEquals(expected, actual); } @Test public void testGreaterEqual() { boolean expected = INT_VALUE1 >= INT_VALUE2; boolean actual = (boolean) evaluator.evaluate(new GreaterEqual(INT_LITERAL1, INT_LITERAL2, POS)).value(); Assert.assertEquals(expected, actual); } @Test public void testLess() { boolean expected = INT_VALUE1 < INT_VALUE2; boolean actual = (boolean) evaluator.evaluate(new Less(INT_LITERAL1, INT_LITERAL2, POS)).value(); Assert.assertEquals(expected, actual); } @Test public void testLessEqual() { boolean expected = INT_VALUE1 <= INT_VALUE2; boolean actual = (boolean) evaluator.evaluate(new LessEqual(INT_LITERAL1, INT_LITERAL2, POS)).value(); Assert.assertEquals(expected, actual); } @Test public void testParenthese() { int expected = (INT_VALUE1 - INT_VALUE2); int actual = (int) evaluator.evaluate(new Parenthesis(new Substraction(INT_LITERAL1, INT_LITERAL2, POS), POS)) .value(); Assert.assertEquals(expected, actual); } @Test public void testCombination() { boolean expected = ((INT_VALUE1 - INT_VALUE2) * INT_VALUE2) > INT_VALUE1 * INT_VALUE2; Expression expr = new Greater( new Multiply(new Substraction(INT_LITERAL1, INT_LITERAL2, POS), INT_LITERAL2, POS), new Multiply( INT_LITERAL1, INT_LITERAL2, POS), POS); boolean actual = (boolean) evaluator.evaluate(expr).value(); Assert.assertEquals(expected, actual); } @Test public void testAddValue() { int expected = evaluator.countValues() + 1; evaluator.addValue(ID, new IntValue(99)); int actual = evaluator.countValues(); Assert.assertEquals(expected, actual); } @Test public void testContains() { evaluator.addValue(ID, new IntValue(99)); boolean expected = true; boolean actual = evaluator.contains(ID); Assert.assertEquals(expected, actual); } @Test public void testGetValue() { IntValue expected = new IntValue(99); evaluator.addValue(ID, new IntValue(99)); IntValue actual = (IntValue) evaluator.getValue(ID); Assert.assertEquals(expected, actual); } public void testSpecialCase(){ // Testing case age == (num1 + num2) IntLiteral age = new IntLiteral(150,POS); IntLiteral num1 = new IntLiteral(50,POS); IntLiteral num2 = new IntLiteral(100,POS); Addition add = new Addition(num1, num2, POS); Equal equal = new Equal(age, add, POS); boolean val = evaluator.equals(equal); Assert.assertEquals(true, val); } }