package org.mvel2.tests.core;
import org.mvel2.MVEL;
import org.mvel2.ParserConfiguration;
import org.mvel2.ParserContext;
import org.mvel2.compiler.CompiledExpression;
import org.mvel2.compiler.ExecutableStatement;
import org.mvel2.compiler.ExpressionCompiler;
import org.mvel2.optimizers.OptimizerFactory;
import org.mvel2.util.Make;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import static org.mvel2.MVEL.compileExpression;
import static org.mvel2.MVEL.executeExpression;
public class ArithmeticTests extends AbstractTest {
public void testMath() {
Map vars = createTestMap();
// assertEquals(188, MVEL.eval("pi * hour", vars));
Serializable s = MVEL.compileExpression("pi * hour");
assertEquals(188, MVEL.executeExpression(s, vars));
}
public void testMath2() {
assertEquals(3, test("foo.number-1"));
}
public void testMath3() {
assertEquals((10d * 5d) * 2d / 3d, test("(10 * 5) * 2 / 3"));
}
public void testMath4() {
double val = ((100d % 3d) * 2d - 1d / 1d + 8d + (5d * 2d));
assertEquals(val, test("(100 % 3) * 2 - 1 / 1 + 8 + (5 * 2)"));
}
public void testMath4a() {
String expression = "(100 % 90) * 20 - 15 / 16 + 80 + (50 * 21)";
System.out.println("Expression: " + expression);
assertEquals(((100d % 90d) * 20d - 15d / 16d + 80d + (50d * 21d)), MVEL.eval(expression));
}
public void testMath5() {
assertEquals(300.5 / 5.3 / 2.1 / 1.5, test("300.5 / 5.3 / 2.1 / 1.5"));
}
public void testMath5a() {
String expression = "300.5 / 5.3 / 2.1 / 1.5";
System.out.println("Expression: " + expression);
assertEquals(300.5 / 5.3 / 2.1 / 1.5, MVEL.eval(expression));
}
public void testMath6() {
double val = (300 * 5 + 1) + 100 / 2 * 2;
String expression = "(300 * five + 1) + (100 / 2 * 2)";
System.out.println(">>" + expression + "<<");
Map vars = createTestMap();
assertEquals(val, MVEL.eval(expression, vars));
Serializable s = MVEL.compileExpression(expression);
assertEquals(val, MVEL.executeExpression(s, vars));
// assertEquals(val, test("(300 * five + 1) + (100 / 2 * 2)"));
}
public void testMath7() {
double val = ((100d % 3d) * 2d - 1d / 1d + 8d + (5d * 2d));
assertEquals(val, test("(100 % 3) * 2 - 1 / 1 + 8 + (5 * 2)"));
}
public void testMath8() {
double val = 5d * (100.56d * 30.1d);
assertEquals(val, test("5 * (100.56 * 30.1)"));
}
public void testPowerOf() {
assertEquals(25, test("5 ** 2"));
}
public void testSignOperator() {
String expr = "int x = 15; -x";
Map vars = new HashMap();
// assertEquals(-15, MVEL.eval(expr, vars));
vars.clear();
Serializable s = MVEL.compileExpression(expr);
assertEquals(-15, MVEL.executeExpression(s, vars));
// assertEquals(-15, test("int x = 15; -x"));
}
public void testMath14() {
assertEquals(10 - 5 * 2 + 5 * 8 - 4, test("10-5*2 + 5*8-4"));
}
public void testMath15() {
String ex = "100-500*200 + 500*800-400";
assertEquals(100 - 500 * 200 + 500 * 800 - 400, test(ex));
}
public void testMath16() {
String ex = "100-500*200*150 + 500*800-400";
assertEquals(100 - 500 * 200 * 150 + 500 * 800 - 400, test(ex));
}
public void testMath17() {
String ex = "(100d * 50d) * 20d / 30d * 2d";
Object o = test(ex);
assertEquals((100d * 50d) * 20d / 30d * 2d, o);
}
public void testMath18() {
String ex = "a = 100d; b = 50d; c = 20d; d = 30d; e = 2d; (a * b) * c / d * e";
System.out.println("Expression: " + ex);
Serializable s = MVEL.compileExpression(ex);
assertEquals((100d * 50d) * 20d / 30d * 2d, MVEL.executeExpression(s, new HashMap()));
}
public void testMath19() {
String ex = "a = 100; b = 500; c = 200; d = 150; e = 500; f = 800; g = 400; a-b*c*d + e*f-g";
System.out.println("Expression: " + ex);
assertEquals(100 - 500 * 200 * 150 + 500 * 800 - 400, testCompiledSimple(ex, new HashMap()));
}
public void testMath32() {
String ex = "x = 20; y = 10; z = 5; x-y-z";
System.out.println("Expression: " + ex);
assertEquals(20 - 10 - 5, testCompiledSimple(ex, new HashMap()));
}
public void testMath33() {
String ex = "x = 20; y = 2; z = 2; x/y/z";
System.out.println("Expression: " + ex);
Serializable s = MVEL.compileExpression(ex);
assertEquals(20 / 2 / 2, MVEL.executeExpression(s, new HashMap()));
}
public void testMath20() {
String ex = "10-5*7-3*8-6";
System.out.println("Expression: " + ex);
assertEquals(10 - 5 * 7 - 3 * 8 - 6, test(ex));
}
public void testMath21() {
String expression = "100-50*70-30*80-60";
System.out.println("Expression: " + expression);
assertEquals(100 - 50 * 70 - 30 * 80 - 60, test(expression));
}
public void testMath22() {
String expression = "(100-50)*70-30*(20-9)**3";
System.out.println("Expression: " + expression);
assertEquals((int) ((100 - 50) * 70 - 30 * Math.pow(20 - 9, 3)), test(expression));
}
public void testMath22b() {
String expression = "a = 100; b = 50; c = 70; d = 30; e = 20; f = 9; g = 3; (a-b)*c-d*(e-f)**g";
System.out.println("Expression: " + expression);
assertEquals((int) ((100 - 50) * 70 - 30 * Math.pow(20 - 9, 3)), testCompiledSimple(expression, new HashMap()));
}
public void testMath23() {
String expression = "10 ** (3)*10**3";
System.out.println("Expression: " + expression);
assertEquals((int) (Math.pow(10, 3) * Math.pow(10, 3)), test(expression));
}
public void testMath24() {
String expression = "51 * 52 * 33 / 24 / 15 + 45 * 66 * 47 * 28 + 19";
double val = 51d * 52d * 33d / 24d / 15d + 45d * 66d * 47d * 28d + 19d;
System.out.println("Expression: " + expression);
System.out.println("Expected Result: " + val);
assertEquals(val, test(expression));
}
public void testMath25() {
String expression = "51 * (40 - 1000 * 50) + 100 + 50 * 20 / 10 + 11 + 12 - 80";
double val = 51 * (40 - 1000 * 50) + 100 + 50 * 20 / 10 + 11 + 12 - 80;
System.out.println("Expression: " + expression);
System.out.println("Expected Result: " + val);
assertEquals(val, test(expression));
}
public void testMath26() {
String expression = "5 + 3 * 8 * 2 ** 2";
int val = (int) (5d + 3d * 8d * Math.pow(2, 2));
System.out.println("Expression: " + expression);
System.out.println("Expected Result: " + val);
Object result = test(expression);
assertEquals(val, result);
}
public void testMath27() {
String expression = "50 + 30 * 80 * 20 ** 3 * 51";
double val = 50 + 30 * 80 * Math.pow(20, 3) * 51;
System.out.println("Expression: " + expression);
System.out.println("Expected Result: " + val);
Object result = test(expression);
assertEquals((int) val, result);
}
public void testMath28() {
String expression = "50 + 30 + 80 + 11 ** 2 ** 2 * 51";
double val = 50 + 30 + 80 + Math.pow(Math.pow(11, 2), 2) * 51;
Object result = test(expression);
assertEquals((int) val, result);
}
public void testMath29() {
String expression = "10 + 20 / 4 / 4";
System.out.println("Expression: " + expression);
double val = 10d + 20d / 4d / 4d;
assertEquals(val, MVEL.eval(expression));
}
public void testMath30() {
String expression = "40 / 20 + 10 + 60 / 21";
System.out.println("Expression: " + expression);
double val = 40d / 20d + 10d + 60d / 21d;
assertEquals(val, MVEL.eval(expression));
}
public void testMath31() {
String expression = "40 / 20 + 5 - 4 + 8 / 2 * 2 * 6 ** 2 + 6 - 8";
double val = 40f / 20f + 5f - 4f + 8f / 2f * 2f * Math.pow(6, 2) + 6f - 8f;
assertEquals(val, MVEL.eval(expression));
}
public void testMath34() {
String expression = "a+b-c*d*x/y-z+10";
Map map = new HashMap();
map.put("a", 200);
map.put("b", 100);
map.put("c", 150);
map.put("d", 2);
map.put("x", 400);
map.put("y", 300);
map.put("z", 75);
Serializable s = compileExpression(expression);
assertEquals((double) 200 + 100 - 150 * 2 * 400 / 300 - 75 + 10, executeExpression(s, map));
}
public void testMath34_Interpreted() {
String expression = "a+b-c*x/y-z";
Map map = new HashMap();
map.put("a", 200);
map.put("b", 100);
map.put("c", 150);
map.put("x", 400);
map.put("y", 300);
map.put("z", 75);
assertEquals((double) 200 + 100 - 150 * 400 / 300 - 75, MVEL.eval(expression, map));
}
public void testMath35() {
String expression = "b/x/b/b*y+a";
Map map = new HashMap();
map.put("a", 10);
map.put("b", 20);
map.put("c", 30);
map.put("x", 40);
map.put("y", 50);
map.put("z", 60);
assertNumEquals(20d / 40d / 20d / 20d * 50d + 10d, executeExpression(compileExpression(expression), map));
}
public void testMath35_Interpreted() {
String expression = "b/x/b/b*y+a";
Map map = new HashMap();
map.put("a", 10);
map.put("b", 20);
map.put("c", 30);
map.put("x", 40);
map.put("y", 50);
map.put("z", 60);
assertNumEquals(20d / 40d / 20d / 20d * 50d + 10d, MVEL.eval(expression, map));
}
public void testMath36() {
String expression = "b/x*z/a+x-b+x-b/z+y";
Map map = new HashMap();
map.put("a", 10);
map.put("b", 20);
map.put("c", 30);
map.put("x", 40);
map.put("y", 50);
map.put("z", 60);
Serializable s = compileExpression(expression);
assertNumEquals(20d / 40d * 60d / 10d + 40d - 20d + 40d - 20d / 60d + 50d, executeExpression(s, map));
}
public void testMath37() {
String expression = "x+a*a*c/x*b*z+x/y-b";
Map map = new HashMap();
map.put("a", 10);
map.put("b", 20);
map.put("c", 30);
map.put("x", 2);
map.put("y", 2);
map.put("z", 60);
Serializable s = compileExpression(expression);
assertNumEquals(2d + 10d * 10d * 30d / 2d * 20d * 60d + 2d / 2d - 20d, executeExpression(s, map));
}
public void testMath38() {
String expression = "100 + 200 - 300 + 400 - 500 + 105 / 205 - 405 + 305 * 206";
double res = 100d + 200d - 300d + 400d - 500d + 105d / 205d - 405d + 305d * 206d;
System.out.println("Expression: " + expression);
System.out.println("CorrectResult:" + res);
assertEquals(res,
MVEL.eval(expression));
}
public void testMath39() {
String expression = "147 + 60 / 167 % 448 + 36 * 23 / 166";
double res = 147d + 60d / 167d % 448d + 36d * 23d / 166d;
System.out.println("Expression: " + expression);
System.out.println("CorrectRes: " + res);
assertEquals(res, MVEL.eval(expression));
}
public void testMath40() {
String expression = "228 - 338 % 375 - 103 + 260 + 412 * 177 + 121";
double res = 228d - 338d % 375d - 103d + 260d + 412d * 177d + 121d;
System.out.println("Expression: " + expression);
System.out.println("CorrectRes: " + res);
assertEquals(res, MVEL.eval(expression, Double.class));
}
public void testMath41() {
String expression = "304d - 246d / 242d % 235d / 425d - 326d + 355d * 264d % 308d";
double res = 304d - 246d / 242d % 235d / 425d - 326d + 355d * 264d % 308d;
System.out.println("Expression: " + expression);
System.out.println("CorrectRes: " + res);
assertEquals(res, MVEL.eval(expression));
}
public void testMath42() {
String expression = "11d - 7d / 3d * 18d % 14d * 8d * 11d - 2d - 11d / 13d + 14d";
double res = 11d - 7d / 3d * 18d % 14d * 8d * 11d - 2d - 11d / 13d + 14d;
System.out.println("Expression: " + expression);
System.out.println("CorrectRes: " + res);
assertEquals(res, MVEL.eval(expression));
}
public void testMath43() {
String expression = "4d/3d*6d%8d*5d*8d+7d+9d*1d";
double res = 4d / 3d * 6d % 8d * 5d * 8d + 7d + 9d * 1d;
System.out.println("Expression: " + expression);
System.out.println("CorrectRes: " + res);
assertEquals(res, MVEL.eval(expression));
}
public void testMath44() {
String expression = "6d+8d/9d*1d*9d*10d%4d*4d-4d*6d*3d";
double res = 6d + 8d / 9d * 1d * 9d * 10d % 4d * 4d - 4d * 6d * 3d;
System.out.println("Expression: " + expression);
System.out.println("CorrectRes: " + res);
assertEquals(res, MVEL.eval(expression));
}
public void testMath44b() {
String expression = "a+b/c*d*e*f%g*h-i*j*k";
double res = 6d + 8d / 9d * 1d * 9d * 10d % 4d * 4d - 4d * 6d * 3d;
Serializable s = compileExpression(expression);
Map vars = new HashMap();
vars.put("a", 6d);
vars.put("b", 8d);
vars.put("c", 9d);
vars.put("d", 1d);
vars.put("e", 9d);
vars.put("f", 10d);
vars.put("g", 4d);
vars.put("h", 4d);
vars.put("i", 4d);
vars.put("j", 6d);
vars.put("k", 3d);
assertEquals(res, executeExpression(s, vars));
}
public void testOperatorPrecedence() {
String ex = "_x_001 = 500.2; _x_002 = 200.8; _r_001 = 701; _r_001 == _x_001 + _x_002 || _x_001 == 500 + 0.1";
assertEquals(true, test(ex));
}
public void testOperatorPrecedence2() {
String ex = "_x_001 = 500.2; _x_002 = 200.8; _r_001 = 701; _r_001 == _x_001 + _x_002 && _x_001 == 500 + 0.2";
assertEquals(true, test(ex));
}
public void testOperatorPrecedence3() {
String ex = "_x_001 = 500.2; _x_002 = 200.9; _r_001 = 701; _r_001 == _x_001 + _x_002 && _x_001 == 500 + 0.2";
assertEquals(false, test(ex));
}
public void testOperatorPrecedence4() {
String ex = "_x_001 = 500.2; _x_002 = 200.9; _r_001 = 701; _r_001 == _x_001 + _x_002 || _x_001 == 500 + 0.2";
assertEquals(true, test(ex));
}
public void testOperatorPrecedence5() {
String ex = "_x_001 == _x_001 / 2 - _x_001 + _x_001 + _x_001 / 2 && _x_002 / 2 == _x_002 / 2";
Map vars = new HashMap();
vars.put("_x_001", 500.2);
vars.put("_x_002", 200.9);
vars.put("_r_001", 701);
ExpressionCompiler compiler = new ExpressionCompiler(ex);
assertEquals(true, executeExpression(compiler.compile(), vars));
}
public void testModulus() {
assertEquals(38392 % 2, test("38392 % 2"));
}
public void testBitwiseOr1() {
assertEquals(6, test("2|4"));
}
public void testBitwiseOr2() {
assertEquals(true, test("(2 | 1) > 0"));
}
public void testBitwiseOr3() {
assertEquals(true, test("(2|1) == 3"));
}
public void testBitwiseOr4() {
assertEquals(2 | 5, test("2|five"));
}
public void testBitwiseAnd1() {
assertEquals(2, test("2 & 3"));
}
public void testBitwiseAnd2() {
assertEquals(5 & 3, test("five & 3"));
}
public void testShiftLeft() {
assertEquals(4, test("2 << 1"));
}
public void testShiftLeft2() {
assertEquals(5 << 1, test("five << 1"));
}
public void testUnsignedShiftLeft() {
assertEquals(2, test("-2 <<< 0"));
}
public void testShiftRight() {
assertEquals(128, test("256 >> 1"));
}
public void testShiftRight2() {
assertEquals(5 >> 1, test("five >> 1"));
}
public void testUnsignedShiftRight() {
assertEquals(-5 >>> 1, test("-5 >>> 1"));
}
public void testUnsignedShiftRight2() {
assertEquals(-5 >>> 1, test("(five - 10) >>> 1"));
}
public void testShiftRightAssign() {
assertEquals(5 >> 2, test("_zZz = 5; _zZz >>= 2"));
}
public void testShiftLeftAssign() {
assertEquals(10 << 2, test("_yYy = 10; _yYy <<= 2"));
}
public void testUnsignedShiftRightAssign() {
String exp = "_xXx = -5; _xXx >>>= 2";
Serializable s = MVEL.compileExpression(exp);
assertEquals(-5 >>> 2, MVEL.executeExpression(s, new HashMap()));
}
public void testXOR() {
assertEquals(3, test("1 ^ 2"));
}
public void testXOR2() {
assertEquals(5 ^ 2, test("five ^ 2"));
}
public void testInvert() {
assertEquals(~10, test("~10"));
}
public void testInvert2() {
assertEquals(~(10 + 1), test("~(10 + 1)"));
}
public void testInvert3() {
assertEquals(~10 + (1 + ~50), test("~10 + (1 + ~50)"));
}
public void testDeepPropertyAdd() {
assertEquals(10, test("foo.countTest+ 10"));
}
public void testDeepAssignmentIncrement() {
String ex = "foo.countTest += 5; if (foo.countTest == 5) { foo.countTest = 0; return true; }" +
" else { foo.countTest = 0; return false; }";
Map vars = createTestMap();
assertEquals(true, MVEL.eval(ex, vars));
assertEquals(true,
test("foo.countTest += 5; if (foo.countTest == 5) { foo.countTest = 0; return true; }" +
" else { foo.countTest = 0; return false; }"));
}
public void testDeepAssignmentWithBlock() {
String ex = "with (foo) { countTest += 5 }; if (foo.countTest == 5) { foo.countTest = 0; return true; }" +
" else { foo.countTest = 0; return false; }";
Map vars = createTestMap();
assertEquals(true, MVEL.eval(ex, vars));
assertEquals(true,
test("with (foo) { countTest += 5 }; if (foo.countTest == 5) { foo.countTest = 0; return true; }" +
" else { foo.countTest = 0; return false; }"));
}
public void testOperativeAssignMod() {
int val = 5;
assertEquals(val %= 2, test("int val = 5; val %= 2; val"));
}
public void testOperativeAssignDiv() {
int val = 10;
assertEquals(val /= 2, test("int val = 10; val /= 2; val"));
}
public void testOperativeAssignShift1() {
int val = 5;
assertEquals(val <<= 2, test("int val = 5; val <<= 2; val"));
}
public void testOperativeAssignShift2() {
int val = 5;
assertEquals(val >>= 2, test("int val = 5; val >>= 2; val"));
}
public void testOperativeAssignShift3() {
int val = -5;
assertEquals(val >>>= 2, test("int val = -5; val >>>= 2; val"));
}
public void testAssignPlus() {
assertEquals(10, test("xx0 = 5; xx0 += 4; xx0 + 1"));
}
public void testAssignPlus2() {
assertEquals(10, test("xx0 = 5; xx0 =+ 4; xx0 + 1"));
}
public void testAssignDiv() {
assertEquals(2.0, test("xx0 = 20; xx0 /= 10; xx0"));
}
public void testAssignMult() {
assertEquals(36, test("xx0 = 6; xx0 *= 6; xx0"));
}
public void testAssignSub() {
assertEquals(11, test("xx0 = 15; xx0 -= 4; xx0"));
}
public void testAssignSub2() {
assertEquals(-95, test("xx0 = 5; xx0 =- 100"));
}
public void testBooleanStrAppend() {
assertEquals("footrue", test("\"foo\" + true"));
}
public void testStringAppend() {
String ex = "c + 'bar'";
Map vars = createTestMap();
assertEquals("catbar", MVEL.eval(ex, vars));
Serializable s = MVEL.compileExpression(ex);
assertEquals("catbar", MVEL.executeExpression(s, vars));
}
public void testNegation() {
assertEquals(1, test("-(-1)"));
}
public void testStrongTypingModeComparison() {
ParserContext parserContext = new ParserContext();
parserContext.setStrongTyping(true);
parserContext.addInput("a", Long.class);
CompiledExpression compiledExpression = new ExpressionCompiler("a==0", parserContext).compile();
HashMap<String, Object> variables = new HashMap<String, Object>();
variables.put("a", 0l);
MVEL.executeExpression(compiledExpression, variables);
}
public void testJIRA158() {
// Serializable s = MVEL.compileExpression("4/2 + Math.sin(1)");
//
// assertEquals(4 / 2 + Math.sin(1), MVEL.executeExpression(s));
Serializable s = MVEL.compileExpression("(float) (4/2 + Math.sin(1))", ParserContext.create().stronglyTyped());
assertEquals((float) (4 / 2 + Math.sin(1)), MVEL.executeExpression(s));
}
public void testJIRA162() {
Serializable s = MVEL.compileExpression("1d - 2d + (3d * var1) * var1",
ParserContext.create().withInput("var1", double.class));
Map vars = new HashMap();
vars.put("var1", 1d);
assertEquals((1 - 2 + (3 * 1d) * 1), MVEL.executeExpression(s, vars));
}
public void testJIRA161() {
Serializable s = MVEL.compileExpression("1==-(-1)", ParserContext.create().stronglyTyped());
assertEquals(1 == -(-1), MVEL.executeExpression(s));
ParserContext ctx = new ParserContext();
ctx.setStrongTyping(true);
CompiledExpression compiledExpression = new ExpressionCompiler("1==-(-1)", ctx).compile();
assertEquals(1 == -(-1), MVEL.executeExpression(compiledExpression));
}
public void testJIRA163() {
Serializable s = MVEL.compileExpression("1d - 2d + (3d * 4d) * var1",
ParserContext.create().withInput("var1", double.class));
Map vars = new HashMap();
vars.put("var1", 1d);
assertEquals((1 - 2 + (3 * 4) * 1d), MVEL.executeExpression(s, vars));
}
public void testJIRA164() {
Serializable s = MVEL.compileExpression("1 / (var1 + var1) * var1",
ParserContext.create().stronglyTyped().withInput("var1", double.class));
Map vars = new HashMap();
double var1 = 1d;
vars.put("var1", var1);
OptimizerFactory.setDefaultOptimizer("reflective");
assertEquals((1 / (var1 + var1) * var1), MVEL.executeExpression(s, vars));
s = MVEL.compileExpression("1 / (var1 + var1) * var1", ParserContext.create().withInput("var1", double.class));
OptimizerFactory.setDefaultOptimizer("ASM");
assertEquals((1 / (var1 + var1) * var1), MVEL.executeExpression(s, vars));
}
public void testJIRA164b() {
Serializable s = MVEL.compileExpression("1 + 1 / (var1 + var1) * var1",
ParserContext.create().stronglyTyped().withInput("var1", double.class));
Map vars = new HashMap();
double var1 = 1d;
vars.put("var1", var1);
OptimizerFactory.setDefaultOptimizer("reflective");
assertEquals((1 + 1 / (var1 + var1) * var1), MVEL.executeExpression(s, vars));
s = MVEL.compileExpression("1 + 1 / (var1 + var1) * var1",
ParserContext.create().withInput("var1", double.class));
OptimizerFactory.setDefaultOptimizer("ASM");
assertEquals((1 + 1 / (var1 + var1) * var1), MVEL.executeExpression(s, vars));
}
public void testJIRA164c() {
Serializable s = MVEL.compileExpression("1 + 1 / (var1 + var1 + 2 + 3) * var1",
ParserContext.create().stronglyTyped().withInput("var1", double.class));
Map vars = new HashMap();
double var1 = 1d;
vars.put("var1", var1);
OptimizerFactory.setDefaultOptimizer("reflective");
assertEquals((1 + 1 / (var1 + var1 + 2 + 3) * var1), MVEL.executeExpression(s, vars));
s = MVEL.compileExpression("1 + 1 / (var1 + var1 + 2 + 3) * var1",
ParserContext.create().withInput("var1", double.class));
OptimizerFactory.setDefaultOptimizer("ASM");
assertEquals((1 + 1 / (var1 + var1 + 2 + 3) * var1), MVEL.executeExpression(s, vars));
}
public void testJIRA164d() {
Serializable s = MVEL.compileExpression("1 + 1 + 1 / (var1 + var1) * var1",
ParserContext.create().stronglyTyped().withInput("var1", double.class));
Map vars = new HashMap();
double var1 = 1d;
vars.put("var1", var1);
OptimizerFactory.setDefaultOptimizer("reflective");
assertEquals((1 + 1 + 1 / (var1 + var1) * var1), MVEL.executeExpression(s, vars));
s = MVEL.compileExpression("1 + 1 + 1 / (var1 + var1) * var1",
ParserContext.create().withInput("var1", double.class));
OptimizerFactory.setDefaultOptimizer("ASM");
assertEquals((1 + 1 + 1 / (var1 + var1) * var1), MVEL.executeExpression(s, vars));
}
public void testJIRA164e() {
Serializable s = MVEL.compileExpression("10 + 11 + 12 / (var1 + var1 + 51 + 71) * var1 + 13 + 14",
ParserContext.create().stronglyTyped().withInput("var1", double.class));
Map vars = new HashMap();
double var1 = 1d;
vars.put("var1", var1);
OptimizerFactory.setDefaultOptimizer("reflective");
assertEquals((float) (10 + 11 + 12 / (var1 + var1 + 51 + 71) * var1 + 13 + 14),
((Double) MVEL.executeExpression(s, vars)).floatValue());
s = MVEL.compileExpression("10 + 11 + 12 / (var1 + var1 + 51 + 71) * var1 + 13 + 14",
ParserContext.create().withInput("var1", double.class));
OptimizerFactory.setDefaultOptimizer("ASM");
assertEquals((float) (10 + 11 + 12 / (var1 + var1 + 51 + 71) * var1 + 13 + 14),
((Double) MVEL.executeExpression(s, vars)).floatValue());
}
public void testJIRA164f() {
Serializable s = MVEL.compileExpression("10 + 11 + 12 / (var1 + 1 + var1 + 51 + 71) * var1 + 13 + 14",
ParserContext.create().stronglyTyped().withInput("var1", double.class));
Map vars = new HashMap();
double var1 = 1d;
vars.put("var1", var1);
OptimizerFactory.setDefaultOptimizer("reflective");
assertEquals((float) (10 + 11 + 12 / (var1 + 1 + var1 + 51 + 71) * var1 + 13 + 14),
((Double) MVEL.executeExpression(s, vars)).floatValue());
s = MVEL.compileExpression("10 + 11 + 12 / (var1 + 1 + var1 + 51 + 71) * var1 + 13 + 14",
ParserContext.create().withInput("var1", double.class));
OptimizerFactory.setDefaultOptimizer("ASM");
assertEquals((float) (10 + 11 + 12 / (var1 + 1 + var1 + 51 + 71) * var1 + 13 + 14),
((Double) MVEL.executeExpression(s, vars)).floatValue());
}
public void testJIRA164g() {
Serializable s = MVEL.compileExpression("1 - 2 + (3 * var1) * var1",
ParserContext.create().stronglyTyped().withInput("var1", double.class));
Map vars = new HashMap();
double var1 = 1d;
vars.put("var1", var1);
OptimizerFactory.setDefaultOptimizer("reflective");
assertEquals((float) (1 - 2 + (3 * var1) * var1), ((Double) MVEL.executeExpression(s, vars)).floatValue());
s = MVEL.compileExpression("1 - 2 + (3 * var1) * var1", ParserContext.create().withInput("var1", double.class));
OptimizerFactory.setDefaultOptimizer("ASM");
assertEquals((float) (1 - 2 + (3 * var1) * var1), ((Double) MVEL.executeExpression(s, vars)).floatValue());
}
public void testJIRA164h() {
Serializable s = MVEL.compileExpression("1 - var1 * (var1 * var1 * (var1 * var1) * var1) * var1",
ParserContext.create().stronglyTyped().withInput("var1", double.class));
Map vars = new HashMap();
double var1 = 2d;
vars.put("var1", var1);
OptimizerFactory.setDefaultOptimizer("reflective");
assertEquals((float) (1 - var1 * (var1 * var1 * (var1 * var1) * var1) * var1),
((Double) MVEL.executeExpression(s, vars)).floatValue());
s = MVEL.compileExpression("1 - var1 * (var1 * var1 * (var1 * var1) * var1) * var1",
ParserContext.create().withInput("var1", double.class));
OptimizerFactory.setDefaultOptimizer("ASM");
assertEquals((float) (1 - var1 * (var1 * var1 * (var1 * var1) * var1) * var1),
((Double) MVEL.executeExpression(s, vars)).floatValue());
}
public void testJIRA180() {
Serializable s = MVEL.compileExpression("-Math.sin(0)");
MVEL.executeExpression(s);
}
public void testJIRA208() {
Map<String, Object> vars = new LinkedHashMap<String, Object>();
vars.put("bal", 999);
String[] testCases = {"bal - 80 - 90 - 30", "bal-80-90-30", "100 + 80 == 180", "100+80==180"};
// System.out.println("bal = " + vars.get("bal"));
Object val1, val2;
for (String expr : testCases) {
System.out.println("Evaluating '" + expr + "': ......");
val1 = MVEL.eval(expr, vars);
// System.out.println("'" + expr + " ' = " + ret.toString());
assertNotNull(val1);
Serializable compiled = MVEL.compileExpression(expr);
val2 = executeExpression(compiled, vars);
// System.out.println("'" + expr + " ' = " + ret.toString());
assertNotNull(val2);
assertEquals("expression did not evaluate correctly: " + expr, val1, val2);
}
}
public void testJIRA1208a() {
assertEquals(799, executeExpression(compileExpression("bal - 80 - 90 - 30"), Make.Map.<Object, Object>$()._("bal", 999)._()));
}
public void testJIRA208b() {
Map<String, Object> vars = new LinkedHashMap<String, Object>();
vars.put("bal", 999);
String[] testCases = {
// "bal + 80 - 80",
// "bal - 80 + 80", "bal * 80 / 80",
"bal / 80 * 80"
};
// System.out.println("bal = " + vars.get("bal"));
Object val1, val2;
for (String expr : testCases) {
System.out.println("Evaluating '" + expr + "': ......");
val1 = MVEL.eval(expr, vars);
// System.out.println("'" + expr + " ' = " + ret.toString());
assertNotNull(val1);
Serializable compiled = MVEL.compileExpression(expr);
val2 = executeExpression(compiled, vars);
// System.out.println("'" + expr + " ' = " + ret.toString());
assertNotNull(val2);
assertEquals("expression did not evaluate correctly: " + expr, val1, val2);
}
}
public void testJIRA210() {
Map<String, Object> vars = new LinkedHashMap<String, Object>();
vars.put("bal", new BigDecimal("999.99"));
String[] testCases = {"bal - 1 + \"abc\"",};
Object val1, val2;
for (String expr : testCases) {
System.out.println("Evaluating '" + expr + "': ......");
val1 = MVEL.eval(expr, vars);
// System.out.println("'" + expr + " ' = " + ret.toString());
assertNotNull(val1);
Serializable compiled = MVEL.compileExpression(expr);
val2 = executeExpression(compiled, vars);
// System.out.println("'" + expr + " ' = " + ret.toString());
assertNotNull(val2);
assertEquals("expression did not evaluate correctly: " + expr, val1, val2);
}
}
public void testMathDec30() {
Map<String, Object> params = new HashMap<String, Object>();
params.put("value", 10);
Map<String, Object> vars = new HashMap<String, Object>();
vars.put("param", params);
vars.put("param2", 10);
assertEquals(1 + 2 * 10, MVEL.executeExpression(MVEL.compileExpression("1 + 2 * param.value"), vars));
}
public void testJIRA99_Interpreted() {
Map map = new HashMap();
map.put("x",
20);
map.put("y",
10);
map.put("z",
5);
assertEquals(20 - 10 - 5,
MVEL.eval("x - y - z",
map));
}
public void testJIRA99_Compiled() {
Map map = new HashMap();
map.put("x",
20);
map.put("y",
10);
map.put("z",
5);
assertEquals(20 - 10 - 5,
testCompiledSimple("x - y - z",
map));
}
public void testModExpr() {
String str = "$y % 4 == 0 && $y % 100 != 0 || $y % 400 == 0 ";
ParserConfiguration pconf = new ParserConfiguration();
ParserContext pctx = new ParserContext(pconf);
pctx.setStrictTypeEnforcement(true);
pctx.setStrongTyping(true);
pctx.addInput("$y", int.class);
Map<String, Object> vars = new HashMap<String, Object>();
ExecutableStatement stmt = (ExecutableStatement) MVEL.compileExpression(str, pctx);
for (int i = 0; i < 500; i++) {
int y = i;
boolean expected = y % 4 == 0 && y % 100 != 0 || y % 400 == 0;
vars.put("$y", y);
assertEquals(expected, MVEL.eval(str, vars));
assertEquals(expected, ((Boolean) MVEL.executeExpression(stmt, null, vars)).booleanValue());
}
}
public void testIntsWithDivision() {
String str = "0 == x - (y/2)";
ParserConfiguration pconf = new ParserConfiguration();
ParserContext pctx = new ParserContext(pconf);
pctx.setStrongTyping(true);
pctx.addInput("x", int.class);
pctx.addInput("y", int.class);
ExecutableStatement stmt = (ExecutableStatement) MVEL.compileExpression(str, pctx);
Map vars = new HashMap();
vars.put("x", 50);
vars.put("y", 100);
Boolean result = (Boolean) MVEL.executeExpression(stmt, vars);
assertTrue(result);
}
public void testMathCeil() {
String str = "Math.ceil( x/3 ) == 2";
ParserConfiguration pconf = new ParserConfiguration();
pconf.addImport("Math", Math.class);
ParserContext pctx = new ParserContext(pconf);
pctx.setStrongTyping(true);
pctx.addInput("x", int.class);
ExecutableStatement stmt = (ExecutableStatement) MVEL.compileExpression(str, pctx);
Map vars = new HashMap();
vars.put("x", 4);
Boolean result = (Boolean) MVEL.executeExpression(stmt, vars);
assertTrue(result);
}
public void testStaticMathCeil() {
int x = 4;
int m = (int) java.lang.Math.ceil( x/3 ); // demonstrating it's perfectly valid java
String str = "int m = (int) java.lang.Math.ceil( x/3 ); return m;";
ParserConfiguration pconf = new ParserConfiguration();
ParserContext pctx = new ParserContext(pconf);
pctx.setStrongTyping(true);
pctx.addInput("x", int.class);
ExecutableStatement stmt = (ExecutableStatement) MVEL.compileExpression(str, pctx);
Map vars = new HashMap();
vars.put("x", 4);
assertEquals(new Integer( 2 ), MVEL.executeExpression(stmt, vars));
}
public void testStaticMathCeilWithJavaClassStyleLiterals() {
MVEL.COMPILER_OPT_SUPPORT_JAVA_STYLE_CLASS_LITERALS = true;
try {
String str = "java.lang.Math.ceil( x/3 )";
ParserConfiguration pconf = new ParserConfiguration();
ParserContext pctx = new ParserContext(pconf);
pctx.setStrongTyping(true);
pctx.addInput("x", int.class);
ExecutableStatement stmt = (ExecutableStatement) MVEL.compileExpression(str, pctx);
Map vars = new HashMap();
vars.put("x", 4);
assertEquals(Math.ceil((double) 4 / 3), MVEL.executeExpression(stmt, vars));
} finally {
MVEL.COMPILER_OPT_SUPPORT_JAVA_STYLE_CLASS_LITERALS = false;
}
}
public void testMathCeilWithDoubleCast() {
String str = "Math.ceil( (double) x / 3 )";
ParserConfiguration pconf = new ParserConfiguration();
pconf.addImport("Math", Math.class);
ParserContext pctx = new ParserContext(pconf);
pctx.setStrongTyping(true);
pctx.addInput("x", Integer.class);
ExecutableStatement stmt = (ExecutableStatement) MVEL.compileExpression(str, pctx);
Map vars = new HashMap();
vars.put("x", 4);
assertEquals(Math.ceil((double) 4 / 3), MVEL.executeExpression(stmt, vars));
}
}