package org.fugazi.ql.evaluator; import org.fugazi.ql.ast.expression.logical.And; import org.fugazi.ql.ast.expression.logical.Or; import org.fugazi.ql.ast.expression.unary.Negative; import org.fugazi.ql.ast.expression.unary.Not; import org.fugazi.ql.ast.expression.unary.Positive; import org.fugazi.ql.ast.type.IntType; import org.fugazi.ql.evaluator.expression_value.ExpressionValue; import org.fugazi.ql.evaluator.expression_value.IntValue; import org.fugazi.ql.evaluator.expression_value.UndefinedValue; import org.fugazi.ql.ast.expression.comparison.*; import org.fugazi.ql.ast.expression.literal.BOOL; import org.fugazi.ql.ast.expression.literal.ID; import org.fugazi.ql.ast.expression.literal.INT; import org.fugazi.ql.ast.expression.literal.STRING; import org.fugazi.ql.ast.expression.numerical.Add; import org.fugazi.ql.ast.expression.numerical.Div; import org.fugazi.ql.ast.expression.numerical.Mul; import org.fugazi.ql.ast.expression.numerical.Sub; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; public class EvaluatorTest { private Evaluator evaluator; // Test data private ValueStorage valueStorage = new ValueStorage(); private final INT num5 = new INT(5); private final INT num4 = new INT(4); private final STRING stringFoo = new STRING("Foo"); private final STRING stringBar = new STRING("bar"); private final BOOL boolTrue = new BOOL(true); private final BOOL boolFalse = new BOOL(false ); private final String testString1 = "testString1"; @Before public void setupEnv() { evaluator = new Evaluator(valueStorage); } /** * Test Add */ @Test public void testAddExpressionWithNums() throws Exception { // test: 5 + 4 = 9; Add expression = new Add(num5, num4 ); ExpressionValue value = evaluator.evaluateExpression(expression); assertEquals(value.getValue(), 9); } @Test public void testAddExpressionWithStrings() throws Exception { // test: Foo + bar = Foobar; Add expression = new Add(stringFoo, stringBar ); ExpressionValue value = evaluator.evaluateExpression(expression); assertEquals(value.getValue(), "Foobar"); } @Test(expected=AssertionError.class) public void testAddExpressionWithBools() throws Exception { // test: Undefined Add expression = new Add(boolTrue, boolFalse ); ExpressionValue value = evaluator.evaluateExpression(expression); } /** * Test Sub */ @Test public void testSubExpressionWithNums() throws Exception { Sub expression = new Sub(num5, num4 ); ExpressionValue value = evaluator.evaluateExpression(expression); assertEquals(value.getValue(), 1); } @Test(expected=AssertionError.class) public void testSubExpressionWithStrings() throws Exception { // test: Undefined Sub expression = new Sub(stringFoo, stringBar ); ExpressionValue value = evaluator.evaluateExpression(expression); } @Test(expected=AssertionError.class) public void testSubExpressionWithBools() throws Exception { // test: Undefined Add expression = new Add(boolTrue, boolFalse ); ExpressionValue value = evaluator.evaluateExpression(expression); } /** * Test Mul */ @Test public void testMulExpressionWithNums() throws Exception { // test: 5 * 4 = 20; Mul expression = new Mul(num5, num4 ); ExpressionValue value = evaluator.evaluateExpression(expression); assertEquals(value.getValue(), 20); } @Test(expected=AssertionError.class) public void testMulExpressionWithStrings() throws Exception { // test: Undefined Mul expression = new Mul(stringFoo, stringBar ); ExpressionValue value = evaluator.evaluateExpression(expression); } @Test(expected=AssertionError.class) public void testMulExpressionWithBools() throws Exception { // test: Undefined Mul expression = new Mul(boolTrue, boolFalse ); ExpressionValue value = evaluator.evaluateExpression(expression); } /** * Test Div */ @Test public void testDivExpressionWithNums() throws Exception { // test: 5 / 4 = 1; Div expression = new Div(num5, num4 ); ExpressionValue value = evaluator.evaluateExpression(expression); assertEquals(value.getValue(), 1); } @Test(expected=AssertionError.class) public void testDivExpressionWithStrings() throws Exception { // test: Undefined Div expression = new Div(stringFoo, stringBar ); ExpressionValue value = evaluator.evaluateExpression(expression); } @Test(expected=AssertionError.class) public void testDivExpressionWithBools() throws Exception { // test: Undefined Div expression = new Div(boolTrue, boolFalse ); ExpressionValue value = evaluator.evaluateExpression(expression); } /** * Test Literals */ @Test public void testIDExpression() throws Exception { ID id = new ID(testString1); valueStorage.saveValue(testString1, new IntValue(5)); ExpressionValue value = evaluator.evaluateExpression(id); assertEquals(value.getValue(), 5); } @Test public void testBOOLExpression() throws Exception { BOOL bool = new BOOL(true ); ExpressionValue value = evaluator.evaluateExpression(bool); assertEquals(value.getValue(), bool.getValue()); } @Test public void testINTExpression() throws Exception { INT num = num5; ExpressionValue value = evaluator.evaluateExpression(num); assertEquals(value.getValue(), num.getValue()); } @Test public void testSTRINGExpression() throws Exception { STRING str = new STRING(testString1 ); ExpressionValue value = evaluator.evaluateExpression(str); assertEquals(value.getValue(), str.getValue()); } /** * Test And */ @Test(expected=AssertionError.class) public void testAndExpressionWithNums() throws Exception { // test: Undefined And expression = new And(num5, num4 ); ExpressionValue value = evaluator.evaluateExpression(expression); } @Test(expected=AssertionError.class) public void testAndExpressionWithStrings() throws Exception { // test: Undefined And expression = new And(stringFoo, stringBar ); ExpressionValue value = evaluator.evaluateExpression(expression); } @Test public void testAndExpressionWithBools() throws Exception { // test: True && False = False And expression = new And(boolTrue, boolFalse ); ExpressionValue value = evaluator.evaluateExpression(expression); assertEquals(value.getValue(), false); } /** * Test Or */ @Test(expected=AssertionError.class) public void testOrExpressionWithNums() throws Exception { // test: Undefined Or expression = new Or(num5, num4 ); ExpressionValue value = evaluator.evaluateExpression(expression); } @Test(expected=AssertionError.class) public void testOrExpressionWithStrings() throws Exception { // test: Undefined Or expression = new Or(stringFoo, stringBar ); ExpressionValue value = evaluator.evaluateExpression(expression); } @Test public void testOrExpressionWithBools() throws Exception { // test: True || False = True Or expression = new Or(boolTrue, boolFalse ); ExpressionValue value = evaluator.evaluateExpression(expression); assertEquals(value.getValue(), true); } /** * Test Not */ @Test public void testNotExpressionWithBools() throws Exception { // test: !False = True Not expression1 = new Not(boolFalse ); ExpressionValue value1 = evaluator.evaluateExpression(expression1); assertEquals(value1.getValue(), true); // test: !True = False Not expression2 = new Not(boolTrue ); ExpressionValue value2 = evaluator.evaluateExpression(expression2); assertEquals(value2.getValue(), false); } /** * Test Positive */ @Test public void testPosExpressionWithNums() throws Exception { // test: (+)5 = 5 Positive expression = new Positive(num5 ); ExpressionValue value1 = evaluator.evaluateExpression(expression); assertEquals(value1.getValue(), num5.getValue()); } /** * Test Negative */ @Test public void testNegExpressionWithNums() throws Exception { // test: (-)5 = -5 Negative expression = new Negative(num5 ); ExpressionValue value1 = evaluator.evaluateExpression(expression); assertEquals(value1.getValue(), -num5.getValue()); } /** * Test equals */ @Test public void testEqualsExpressionWithNums() throws Exception { // test: 5 == 4 = false EQ expression1 = new EQ(num5, num4 ); ExpressionValue value1 = evaluator.evaluateExpression(expression1); assertEquals(value1.getValue(), false); // test: 5 == 5 = true EQ expression2 = new EQ(num5, num5 ); ExpressionValue value2 = evaluator.evaluateExpression(expression2); assertEquals(value2.getValue(), true); } @Test public void testEqualsExpressionWithStrings() throws Exception { // test: Foo == bar = false; EQ expression1 = new EQ(stringFoo, stringBar ); ExpressionValue value1 = evaluator.evaluateExpression(expression1); assertEquals(value1.getValue(), false); // test: Foo == Foo = true; EQ expression2 = new EQ(stringFoo, stringFoo ); ExpressionValue value2 = evaluator.evaluateExpression(expression2); assertEquals(value2.getValue(), true); } @Test public void testEqualsExpressionWithBools() throws Exception { // test: true == false = false; EQ expression1 = new EQ(boolTrue, boolFalse ); ExpressionValue value1 = evaluator.evaluateExpression(expression1); assertEquals(value1.getValue(), false); // test: true == true = true; EQ expression2 = new EQ(boolTrue, boolTrue ); ExpressionValue value2 = evaluator.evaluateExpression(expression2); assertEquals(value2.getValue(), true); } /** * Test not equals */ @Test public void testNotEqualsExpressionWithNums() throws Exception { // test: 5 != 4 = true NotEq expression1 = new NotEq(num5, num4 ); ExpressionValue value1 = evaluator.evaluateExpression(expression1); assertEquals(value1.getValue(), true); // test: 5 != 5 = false NotEq expression2 = new NotEq(num5, num5 ); ExpressionValue value2 = evaluator.evaluateExpression(expression2); assertEquals(value2.getValue(), false); } @Test public void testNotEqualsExpressionWithStrings() throws Exception { // test: Foo != bar = true; NotEq expression1 = new NotEq(stringFoo, stringBar ); ExpressionValue value1 = evaluator.evaluateExpression(expression1); assertEquals(value1.getValue(), true); // test: Foo != Foo = false; NotEq expression2 = new NotEq(stringFoo, stringFoo ); ExpressionValue value2 = evaluator.evaluateExpression(expression2); assertEquals(value2.getValue(), false); } @Test public void testNotEqualsExpressionWithBools() throws Exception { // test: true != false = true; NotEq expression1 = new NotEq(boolTrue, boolFalse ); ExpressionValue value1 = evaluator.evaluateExpression(expression1); assertEquals(value1.getValue(), true); // test: true != true = false; NotEq expression2 = new NotEq(boolTrue, boolTrue ); ExpressionValue value2 = evaluator.evaluateExpression(expression2); assertEquals(value2.getValue(), false); } /** * Test Greater */ @Test public void testGreaterExpressionWithNums() throws Exception { // test: 5 > 4 = true Greater expression1 = new Greater(num5, num4 ); ExpressionValue value1 = evaluator.evaluateExpression(expression1); assertEquals(value1.getValue(), true); // test: 5 > 5 = false Greater expression2 = new Greater(num5, num5 ); ExpressionValue value2 = evaluator.evaluateExpression(expression2); assertEquals(value2.getValue(), false); // test: 4 > 5 = false Greater expression3 = new Greater(num4, num5 ); ExpressionValue value3 = evaluator.evaluateExpression(expression3); assertEquals(value3.getValue(), false); } @Test(expected=AssertionError.class) public void testGreaterExpressionWithStrings() throws Exception { // test: Undefined Greater expression1 = new Greater(stringFoo, stringBar ); ExpressionValue value1 = evaluator.evaluateExpression(expression1); } @Test(expected=AssertionError.class) public void testGreaterExpressionWithBools() throws Exception { // test: Undefined Greater expression1 = new Greater(boolTrue, boolFalse ); ExpressionValue value1 = evaluator.evaluateExpression(expression1); } /** * Test Lesser */ @Test public void testLesserExpressionWithNums() throws Exception { // test: 5 < 4 = false Less expression1 = new Less(num5, num4 ); ExpressionValue value1 = evaluator.evaluateExpression(expression1); assertEquals(value1.getValue(), false); // test: 5 < 5 = false Less expression2 = new Less(num5, num5 ); ExpressionValue value2 = evaluator.evaluateExpression(expression2); assertEquals(value2.getValue(), false); // test: 4 < 5 = true Less expression3 = new Less(num4, num5 ); ExpressionValue value3 = evaluator.evaluateExpression(expression3); assertEquals(value3.getValue(), true); } @Test(expected=AssertionError.class) public void testLesserExpressionWithStrings() throws Exception { // test: Undefined Less expression1 = new Less(stringFoo, stringBar ); ExpressionValue value1 = evaluator.evaluateExpression(expression1); } @Test(expected=AssertionError.class) public void testLesserExpressionWithBools() throws Exception { // test: Undefined Less expression1 = new Less(boolTrue, boolFalse ); ExpressionValue value1 = evaluator.evaluateExpression(expression1); Assert.assertEquals(value1.getValue(), new UndefinedValue().getValue()); } /** * Test Greater Equal */ @Test public void testGreaterEqualExpressionWithNums() throws Exception { // test: 5 >= 4 = true GE expression1 = new GE(num5, num4 ); ExpressionValue value1 = evaluator.evaluateExpression(expression1); assertEquals(value1.getValue(), true); // test: 5 >= 5 = true GE expression2 = new GE(num5, num5 ); ExpressionValue value2 = evaluator.evaluateExpression(expression2); assertEquals(value2.getValue(), true); // test: 4 >= 5 = false GE expression3 = new GE(num4, num5 ); ExpressionValue value3 = evaluator.evaluateExpression(expression3); assertEquals(value3.getValue(), false); } @Test(expected=AssertionError.class) public void testGreaterEqualExpressionWithStrings() throws Exception { // test: Undefined GE expression1 = new GE(stringFoo, stringBar ); ExpressionValue value1 = evaluator.evaluateExpression(expression1); } @Test(expected=AssertionError.class) public void testGreaterEqualExpressionWithBools() throws Exception { // test: Undefined GE expression1 = new GE(boolTrue, boolFalse ); ExpressionValue value1 = evaluator.evaluateExpression(expression1); } /** * Test Less Equal */ @Test public void testLessEqualExpressionWithNums() throws Exception { // test: 5 <= 4 = false LE expression1 = new LE(num5, num4 ); ExpressionValue value1 = evaluator.evaluateExpression(expression1); assertEquals(value1.getValue(), false); // test: 5 <= 5 = true LE expression2 = new LE(num5, num5 ); ExpressionValue value2 = evaluator.evaluateExpression(expression2); assertEquals(value2.getValue(), true); // test: 4 <= 5 = true LE expression3 = new LE(num4, num5 ); ExpressionValue value3 = evaluator.evaluateExpression(expression3); assertEquals(value3.getValue(), true); } @Test(expected=AssertionError.class) public void testLessEqualExpressionWithStrings() throws Exception { // test: Undefined LE expression1 = new LE(stringFoo, stringBar ); ExpressionValue value1 = evaluator.evaluateExpression(expression1); } @Test(expected=AssertionError.class) public void testLessEqualExpressionWithBools() throws Exception { // test: Undefined LE expression1 = new LE(boolTrue, boolFalse ); ExpressionValue value1 = evaluator.evaluateExpression(expression1); } }