package org.mvel2.tests.core;
import org.mvel2.MVEL;
import org.mvel2.ParserContext;
import org.mvel2.compiler.CompiledExpression;
import org.mvel2.compiler.ExpressionCompiler;
import org.mvel2.optimizers.OptimizerFactory;
import org.mvel2.tests.core.res.Foo;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.mvel2.MVEL.compileExpression;
import static org.mvel2.MVEL.executeExpression;
public class MutationsTests extends AbstractTest {
public void testDeepAssignment() {
Map map = createTestMap();
assertEquals("crap", testCompiledSimple("foo.bar.assignTest = 'crap'", map));
assertEquals("crap", testCompiledSimple("foo.bar.assignTest", map));
}
public void testDeepAssignment2() {
Map map = createTestMap();
ParserContext ctx = new ParserContext();
ctx.addInput("foo", Foo.class);
ctx.setStrongTyping(true);
ExpressionCompiler compiler = new ExpressionCompiler("foo.bar.age = 21", ctx);
CompiledExpression ce = compiler.compile();
executeExpression(ce, map);
assertEquals(((Foo) map.get("foo")).getBar().getAge(), 21);
}
public void testComplexExpression() {
assertEquals("bar", test("a = 'foo'; b = 'bar'; c = 'jim'; list = {a,b,c}; list[1]"));
}
public void testAssignment() {
assertEquals(true, test("populate(); blahfoo = 'sarah'; blahfoo == 'sarah'"));
}
public void testAssignment2() {
assertEquals("sarah", test("populate(); blahfoo = barfoo"));
}
public void testAssignment3() {
assertEquals(java.lang.Integer.class, test("blah = 5").getClass());
}
public void testAssignment4() {
assertEquals(102, test("a = 100 + 1 + 1"));
}
public void testAssignment6() {
assertEquals("blip", test("array[zero] = array[zero+1]; array[zero]"));
}
public void testConstructor() {
assertEquals("foo", test("a = 'foobar'; new String(a.toCharArray(), 0, 3)"));
}
public void testStaticVarAssignment() {
assertEquals("1", test("String mikeBrock = 1; mikeBrock"));
}
public void testFunctionPointer() {
String ex = "squareRoot = java.lang.Math.sqrt; squareRoot(4)";
Object o = MVEL.eval(ex, new HashMap());
assertEquals(2.0, o);
assertEquals(2.0, test(ex));
}
/*
// TODO - Temporarily comment these 2 tests out.
// They succeed inside the IDE but for some reason fail when running from maven
public void testFunctionPointerAsParam() {
assertEquals("2.0", test("squareRoot = Math.sqrt; new String(String.valueOf(squareRoot(4)));"));
}
public void testFunctionPointerInAssignment() {
assertEquals(5.0, test("squareRoot = Math.sqrt; i = squareRoot(25); return i;"));
}
*/
public void testIncrementOperator() {
assertEquals(2, test("x = 1; x++; x"));
}
public void testPreIncrementOperator() {
assertEquals(2, test("x = 1; ++x"));
}
public void testDecrementOperator() {
assertEquals(1, test("x = 2; x--; x"));
}
public void testPreDecrementOperator() {
assertEquals(1, test("x = 2; --x"));
}
public void testQualifiedStaticTyping() {
Object val = test("java.math.BigDecimal a = new java.math.BigDecimal( 10.0 ); java.math.BigDecimal b = new java.math.BigDecimal( 10.0 ); java.math.BigDecimal c = a + b; return c; ");
assertEquals(new BigDecimal(20), val);
}
public void testUnQualifiedStaticTyping() {
CompiledExpression ce = (CompiledExpression) compileExpression("import java.math.BigDecimal; BigDecimal a = new BigDecimal( 10.0 ); BigDecimal b = new BigDecimal( 10.0 ); BigDecimal c = a + b; return c; ");
assertEquals(new BigDecimal(20), testCompiledSimple("import java.math.BigDecimal; BigDecimal a = new BigDecimal( 10.0 ); BigDecimal b = new BigDecimal( 10.0 ); BigDecimal c = a + b; return c; ", new HashMap()));
}
public void testSubExpressionIndexer() {
assertEquals("bar", test("xx = new java.util.HashMap(); xx.put('foo', 'bar'); prop = 'foo'; xx[prop];"));
}
public void testAssignListToBean() {
OptimizerFactory.setDefaultOptimizer("reflective");
MockClass mock = new MockClass();
executeExpression(compileExpression("this.values = [0, 1, 2, 3, 4]"), mock);
assertEquals(5, mock.getValues().size());
}
public static class MockClass {
List values;
public List getValues() {
return values;
}
public void setValues(List values) {
this.values = values;
}
}
}