package com.sap.finex.expressionpad.tests;
import java.lang.reflect.InvocationTargetException;
import org.antlr.runtime.RecognitionException;
import structure.Field;
import structure.FinexClass;
import structure.Type;
import com.sap.finex.interpreter.objects.FinexNativeObject;
import com.sap.runlet.abstractexpressionpad.Evaluator.ExecuteResult;
import com.sap.runlet.abstractinterpreter.objects.RunletObject;
import com.sap.runlet.abstractinterpreter.util.Fraction;
public class GeneralTests extends FinexTestCase {
public void testComplexOqlQueries() throws Exception {
ExecuteResult<Field, Type, FinexClass> executeResult = main.execute(
"(select a, b from [create A(.a: \"abc\", .b: 123), create A(.a: \"def\", .b: 456)] as a, a.b as b where true).count()",
"(select a, b from [create A(.a: \"abc\", .b: 123), create A(.a: \"def\", .b: 456)] as a, a[.b==123].b as b where true).count()",
"(select a, b from [create A(.a: \"abc\", .b: 123), create A(.a: \"def\", .b: 456)] as a, [2, 4, 6] as c, a.b as b where 100*c<a.b).count()",
"(select a, b, c from [create A(.a: \"abc\", .b: 123), create A(.a: \"def\", .b: 456)] as a, [2, 4, 6] as c, a.b as b where 100*c<b).b",
"(select a, b, c from [create A(.a: \"abc\", .b: 123), create A(.a: \"def\", .b: 456)] as a, [2, 4, 6] as c, a.b as b where 100*c<b).c");
RunletObject<Field, Type, FinexClass>[] result = executeResult.getResult();
String[] errors = executeResult.getErrors();
assertEquals(5, result.length);
assertEquals(15, errors.length); // side effects in from-clause
assertNOEquals(2l, result[0]);
assertNOEquals(1l, result[1]);
assertNOEquals(2l, result[2]);
assertMultiObjectOfNativeObjectsEqualsIgnoringOrdering(new Long[] { 456l, 456l }, result[3]);
assertMultiObjectOfNativeObjectsEqualsIgnoringOrdering(new Long[] { 2l, 4l }, result[4]);
}
public void testSimpleOqlQueries() throws Exception {
ExecuteResult<Field, Type, FinexClass> executeResult = main.execute(
"(select a, b from [1, 3, 5] as a, [2, 4, 6] as b where b>a).count()",
"(select a, b from [1, 2, 3] as a, [4, 5, 6] as b where true).count()",
"(from [1, 2, 3] as a, [4, 5, 6] as b where true).count()",
"(from [1, 2, 3] as a, [4, 5, 6] as b where b==2*a).b");
RunletObject<Field, Type, FinexClass>[] result = executeResult.getResult();
String[] errors = executeResult.getErrors();
assertEquals(4, result.length);
assertEquals(0, errors.length);
assertNOEquals(6l, result[0]);
assertNOEquals(9l, result[1]);
assertNOEquals(9l, result[2]);
assertMultiObjectOfNativeObjectsEqualsIgnoringOrdering(new Long[] { 4l, 6l }, result[3]);
}
public void testTransitiveDetermination() throws Exception {
ExecuteResult<Field, Type, FinexClass> executeResult = main.execute(
"create A(.b: 1).transitiveDependent");
RunletObject<Field, Type, FinexClass>[] result = executeResult.getResult();
String[] errors = executeResult.getErrors();
assertEquals(1, result.length);
assertEquals(0, errors.length);
}
public void testSimpleDetermination() throws Exception {
ExecuteResult<Field, Type, FinexClass> executeResult = main.execute(
"create A(.b: 234, .c: 1).d",
"create A(.b: 234).d");
RunletObject<Field, Type, FinexClass>[] result = executeResult.getResult();
String[] errors = executeResult.getErrors();
assertEquals(2, result.length);
assertEquals(0, errors.length);
assertNOEquals(235l, result[0]);
assertNOEquals(357l, result[1]);
}
public void testSimpleExpression() throws SecurityException, IllegalArgumentException,
RecognitionException, NoSuchMethodException, InstantiationException,
IllegalAccessException, InvocationTargetException {
RunletObject<Field, Type, FinexClass>[] result = main.evaluate("123");
assertEquals(1, result.length);
assertTrue(result[0] instanceof FinexNativeObject);
assertEquals(((FinexNativeObject) result[0]).getNativeObject(), 123l);
}
public void testSimpleArithmeticAndComparisons() throws Exception {
ExecuteResult<Field, Type, FinexClass> executeResult = main.execute(
"123==123",
"123==124",
"123!=124",
"123!=123",
"2*2",
"2./3.",
"4-1",
"1+1",
"\"abc\"==\"abc\"",
"\"abc\"==\"def\"",
"\"abc\"!=\"abc\"",
"\"abc\"!=\"def\"");
RunletObject<Field, Type, FinexClass>[] result = executeResult.getResult();
String[] errors = executeResult.getErrors();
assertEquals(12, result.length);
assertEquals(0, errors.length);
assertNOEquals(true, result[0]);
assertNOEquals(false, result[1]);
assertNOEquals(true, result[2]);
assertNOEquals(false, result[3]);
assertNOEquals(4l, result[4]);
assertNOEquals(new Fraction(2, 3), result[5]);
assertNOEquals(3l, result[6]);
assertNOEquals(2l, result[7]);
assertNOEquals(true, result[8]);
assertNOEquals(false, result[9]);
assertNOEquals(false, result[10]);
assertNOEquals(true, result[11]);
}
public void testDefaultValueForField() throws Exception {
ExecuteResult<Field, Type, FinexClass> executeResult = main.execute(
"create A(.a: \"abc\").a",
"create A(.a: \"abc\").c",
"create A(.a: \"abc\", .c:234).c",
"create A(.a: \"abc\", .c:234).a");
RunletObject<Field, Type, FinexClass>[] result = executeResult.getResult();
String[] errors = executeResult.getErrors();
assertEquals(4, result.length);
assertEquals(0, errors.length);
assertNOEquals("abc", result[0]);
assertNOEquals(123l, result[1]);
assertNOEquals(234l, result[2]);
assertNOEquals("abc", result[3]);
}
public void testTupleOverMultipleEntities() throws Exception {
ExecuteResult<Field, Type, FinexClass> executeResult = main.execute(
"[create A(.b: 1), create A(.b: 2), create A(.b: 3)].(b: .b).b");
RunletObject<Field, Type, FinexClass>[] result = executeResult.getResult();
String[] errors = executeResult.getErrors();
assertEquals(1, result.length);
assertEquals(0, errors.length);
assertMultiObjectOfNativeObjectsEqualsIgnoringOrdering(new Long[] { 1l, 2l, 3l }, result[0]);
}
public void testTupleOverMultipleAliasedEntities() throws Exception {
ExecuteResult<Field, Type, FinexClass> executeResult = main.execute(
"[create A(.b: 1), create A(.b: 2), create A(.b: 3)] AS e.(b: e.b).b");
RunletObject<Field, Type, FinexClass>[] result = executeResult.getResult();
String[] errors = executeResult.getErrors();
assertEquals(1, result.length);
assertEquals(0, errors.length);
assertMultiObjectOfNativeObjectsEqualsIgnoringOrdering(new Long[] { 1l, 2l, 3l }, result[0]);
}
public void testAdditionWithAliasAndTuple() throws Exception {
ExecuteResult<Field, Type, FinexClass> executeResult = main.execute(
"(1 AS eins + 2).(x: eins, y: 2*eins).x",
"(1 AS eins + 2).(x: eins, y: 2*eins).y");
RunletObject<Field, Type, FinexClass>[] result = executeResult.getResult();
String[] errors = executeResult.getErrors();
assertEquals(2, result.length);
assertEquals(0, errors.length);
assertNOEquals(1l, result[0]);
assertNOEquals(2l, result[1]);
}
public void testTupleOverMultiObjectWithAlias() throws Exception {
ExecuteResult<Field, Type, FinexClass> executeResult = main.execute(
"[create A(.b: 1), create A(.b: 2 AS two), create A(.b: 3)].(z: two).z");
RunletObject<Field, Type, FinexClass>[] result = executeResult.getResult();
String[] errors = executeResult.getErrors();
assertEquals(1, result.length);
assertEquals(0, errors.length);
assertMultiObjectOfNativeObjectsEqualsIgnoringOrdering(new Long[] { 2l, 2l, 2l }, result[0]);
}
public void testAliasOnLiteralInSumWithTuple() throws Exception {
ExecuteResult<Field, Type, FinexClass> executeResult = main.execute(
"(1 + 2 AS x).(x1: x).x1");
RunletObject<Field, Type, FinexClass>[] result = executeResult.getResult();
String[] errors = executeResult.getErrors();
assertEquals(1, result.length);
assertEquals(0, errors.length);
assertNOEquals(2l, result[0]);
}
public void testSimpleAliases() throws Exception {
ExecuteResult<Field, Type, FinexClass> executeResult = main.execute(
"[1 AS one, 2 AS two].sum() AS s.(a: one, b: two, c: s).a",
"[1 AS one, 2 AS two].sum() AS s.(a: one, b: two, c: s).b",
"[1 AS one, 2 AS two].sum() AS s.(a: one, b: two, c: s).c");
RunletObject<Field, Type, FinexClass>[] result = executeResult.getResult();
String[] errors = executeResult.getErrors();
assertEquals(3, result.length);
assertEquals(0, errors.length);
assertNOEquals(1l, result[0]);
assertNOEquals(2l, result[1]);
assertNOEquals(3l, result[2]);
}
public void testComplexPathExpressionWithAliasInTheMiddle() throws Exception {
ExecuteResult<Field, Type, FinexClass> executeResult = main.execute(
"[create SalesOrder(.Type: \"Type1\", .SOItem: ["+
"create SOItem(.Quantity: 1., .Product: create Product(.Color: \"Blue\"), .Price: 10.), "+
"create SOItem(.Quantity: 2., .Product: create Product(.Color: \"Green\"), .Price: 22.)]),"+
"create SalesOrder(.Type: \"Type1\", .SOItem: ["+
"create SOItem(.Quantity: 1., .Product: create Product(.Color: \"Blue\"), .Price: 10.), "+
"create SOItem(.Quantity: 3., .Product: create Product(.Color: \"Blue\"), .Price: 33.)]), "+
"create SalesOrder(.Type: \"Type2\", .SOItem: ["+
"create SOItem(.Quantity: 1., .Product: create Product(.Color: \"Blue\"), .Price: 10.), "+
"create SOItem(.Quantity: 4., .Product: create Product(.Color: \"Yellow\"), .Price: 44.)])]"+
"[.Type==\"Type1\"].SOItem AS i.Product[.Color==\"Blue\"].(item: i).item.Price");
RunletObject<Field, Type, FinexClass>[] result = executeResult.getResult();
String[] errors = executeResult.getErrors();
assertEquals(1, result.length);
assertEquals(0, errors.length);
assertMultiObjectOfNativeObjectsEqualsIgnoringOrdering(new Fraction[] {
new Fraction(10), new Fraction(33), new Fraction(10) }, result[0]);
}
public void testSimpleAll() throws Exception {
ExecuteResult<Field, Type, FinexClass> executeResult = main.execute(
"create Product(.Color: \"Blue\")",
"create Product(.Color: \"Green\")",
"create Product(.Color: \"Yellow\")",
"create Product(.Color: \"Red\")",
"all Product.Color");
RunletObject<Field, Type, FinexClass>[] result = executeResult.getResult();
String[] errors = executeResult.getErrors();
assertEquals(5, result.length);
assertEquals(0, errors.length);
assertMultiObjectOfNativeObjectsEqualsIgnoringOrdering(new String[] {
"Blue", "Red", "Green", "Yellow" }, result[4]);
}
}