/src/test/java/org/mvel2/tests/core/ControlFlowTests.java
Java | 480 lines | 370 code | 104 blank | 6 comment | 10 complexity | 2b605c21f1bc2cfbd3e8ab15b0a95425 MD5 | raw file
Possible License(s): BSD-3-Clause, Apache-2.0
- package org.mvel2.tests.core;
- import org.mvel2.MVEL;
- import org.mvel2.ParserConfiguration;
- import org.mvel2.ParserContext;
- import org.mvel2.compiler.ExecutableStatement;
- import org.mvel2.tests.core.res.Base;
- import org.mvel2.tests.core.res.Foo;
- import java.util.*;
- import java.io.Serializable;
- import static org.mvel2.MVEL.compileExpression;
- import static org.mvel2.MVEL.eval;
- import static org.mvel2.MVEL.executeExpression;
- public class ControlFlowTests extends AbstractTest {
- public void testSimpleIfStatement() {
- test("if (true) { System.out.println(\"test!\") } \n");
- }
- public void testAnd() {
- assertEquals(true, test("c != null && foo.bar.name == 'dog' && foo.bar.woof"));
- }
- public void testAnd2() {
- assertEquals(true, test("c!=null&&foo.bar.name=='dog'&&foo.bar.woof"));
- }
- public void testComplexAnd() {
- assertEquals(true, test("(pi * hour) > 0 && foo.happy() == 'happyBar'"));
- }
- public void testShortPathExpression() {
- assertEquals(null, MVEL.eval("3 > 4 && foo.toUC('test'); foo.register", new Base(), createTestMap()));
- }
- public void testShortPathExpression2() {
- assertEquals(true, test("4 > 3 || foo.toUC('test')"));
- }
- public void testShortPathExpression4() {
- assertEquals(true, test("4>3||foo.toUC('test')"));
- }
- public void testOr() {
- assertEquals(true, test("fun || true"));
- }
- public void testOrOperator() {
- assertEquals(true, test("true||true"));
- }
- public void testOrOperator2() {
- assertEquals(true, test("2 > 3 || 3 > 2"));
- }
- public void testOrOperator3() {
- assertEquals(true, test("pi > 5 || pi > 6 || pi > 3"));
- }
- public void testShortPathExpression3() {
- assertEquals(false, test("defnull != null && defnull.length() > 0"));
- }
- public void testMultiStatement() {
- assertEquals(true, test("populate(); barfoo == 'sarah'"));
- }
- public void testTernary() {
- assertEquals("foobie", test("zero==0?'foobie':zero"));
- }
- public void testTernary2() {
- assertEquals("blimpie", test("zero==1?'foobie':'blimpie'"));
- }
- public void testTernary3() {
- assertEquals("foobiebarbie", test("zero==1?'foobie':'foobie'+'barbie'"));
- }
- public void testTernary5() {
- assertEquals("skat!", test("isdef someWierdVar ? 'squid' : 'skat!';"));
- }
- public void testEmptyIf() {
- assertEquals(5, test("a = 5; if (a == 5) { }; return a;"));
- }
- public void testEmptyIf2() {
- assertEquals(5, test("a=5;if(a==5){};return a;"));
- }
- public void testIf() {
- String ex = "if (5 > 4) { return 10; } else { return 5; }";
- assertEquals(10, MVEL.eval(ex));
- Serializable s = MVEL.compileExpression(ex);
- assertEquals(10, MVEL.executeExpression(s));
- }
- public void testIf2() {
- assertEquals(10, test("if (5 < 4) { return 5; } else { return 10; }"));
- }
- public void testIf3() {
- String ex = "if(5<4){return 5;}else{return 10;}";
- assertEquals(10, MVEL.eval(ex));
- assertEquals(10, test("if(5<4){return 5;}else{return 10;}"));
- }
- public void testIfAndElse() {
- assertEquals(true, test("if (false) { return false; } else { return true; }"));
- }
- public void testIfAndElseif() {
- assertEquals(true, test("if (false) { return false; } else if(100 < 50) { return false; } else if (10 > 5) return true;"));
- }
- public void testIfAndElseif2() {
- assertEquals(true, MVEL.eval("if (false) { return false; } else if(100 < 50) { return false; } else if (10 > 5) return true;"));
- }
- public void testIfAndElseif3() {
- assertEquals(true, MVEL.executeExpression(MVEL.compileExpression("if (false) { return false; } else if(100 < 50) { return false; } else if (10 > 5) return true;")));
- }
- public void testIfAndElseIfCondensedGrammar() {
- assertEquals("Foo244", test("if (false) return 'Bar'; else return 'Foo244';"));
- }
- public void testTernary4() {
- assertEquals("<test>", test("true ? '<test>' : '<poo>'"));
- }
- public void testPrecedenceOrder1() {
- String ex = "50 > 60 && 20 < 10 || 100 > 90";
- System.out.println("Expression: " + ex);
- assertTrue((Boolean) MVEL.eval(ex));
- }
- public void testDoLoop() {
- assertEquals(10, test("i = 0; do { i++ } while (i != 10); i"));
- }
- public void testDoLoop2() {
- assertEquals(50, test("i=100;do{i--}until(i==50); i"));
- }
- public void testForLoop() {
- String ex = "String str = ''; for(i=0;i<6;i++) { str += i }; str";
- assertEquals("012345", MVEL.eval(ex, new HashMap()));
- assertEquals("012345", test(ex));
- }
- public void testForLoop2() {
- assertEquals("012345", MVEL.eval("String str='';for(i=0;i<6;i++){str+=i};str", new HashMap()));
- }
- public void testUntilLoop() {
- assertEquals("012345", test("String str = ''; int i = 0; until (i == 6) { str += i++; }; str"));
- }
- public void testQualifiedForLoop() {
- ParserContext pCtx = new ParserContext();
- pCtx.setStrongTyping(true);
- pCtx.addImport(Foo.class);
- pCtx.addInput("l", ArrayList.class, new Class[]{Foo.class});
- List l = new ArrayList();
- l.add(new Foo());
- l.add(new Foo());
- l.add(new Foo());
- Map vars = new HashMap();
- vars.put("l", l);
- Serializable s = MVEL.compileExpression("String s = ''; for (Foo f : l) { s += f.name }; s", pCtx);
- String r = (String) MVEL.executeExpression(s, vars);
- assertEquals("dogdogdog", r);
- }
- public void testForLoopWithVar() {
- String str = "int height = 100; int j = 0; for (i = 0; i < height; i++) {j++ }; return j;";
- ParserConfiguration pconf = new ParserConfiguration();
- ParserContext pctx = new ParserContext(pconf);
- pctx.setStrongTyping(true);
- ExecutableStatement stmt = (ExecutableStatement) MVEL.compileExpression(str, pctx);
- Map vars = new HashMap();
- assertEquals( new Integer(100), MVEL.executeExpression(stmt, vars) );
- }
- public void testEmptyLoopSemantics() {
- Serializable s = MVEL.compileExpression("for (i = 0; i < 100000000000; i++) { }");
- MVEL.executeExpression(s, new HashMap());
- }
- public void testLoopWithEscape() {
- Serializable s = MVEL.compileExpression("x = 0; for (; x < 10000; x++) {}");
- Map<String, Object> vars = new HashMap<String, Object>();
- MVEL.executeExpression(s, vars);
- assertEquals(10000, vars.get("x"));
- vars.remove("x");
- MVEL.eval("x = 0; for (; x < 10000; x++) {}", vars);
- assertEquals(10000, vars.get("x"));
- }
- public static class TargetClass {
- private short _targetValue = 5;
- public short getTargetValue() {
- return _targetValue;
- }
- }
- public void testNestedMethodCall() {
- List elements = new ArrayList();
- elements.add(new TargetClass());
- Map variableMap = new HashMap();
- variableMap.put("elements",
- elements);
- eval("results = new java.util.ArrayList(); foreach (element : elements) { " +
- "if( {5} contains element.targetValue.intValue()) { results.add(element); } }; results",
- variableMap);
- }
- public void testStaticallyTypedItemInForEach() {
- assertEquals("1234",
- test("StringBuffer sbuf = new StringBuffer(); foreach (int i : new int[] { 1,2,3,4 })" +
- " { sbuf.append(i); }; sbuf.toString()"));
- }
- public void testJIRA115() {
- String exp = "results = new java.util.ArrayList(); foreach (element : elements) { " +
- "if( {1,32769,32767} contains element ) { results.add(element); } }; results";
- Map map = new HashMap();
- map.put("elements",
- new int[]{1, 32769, 32767});
- ArrayList result = (ArrayList) MVEL.eval(exp,
- map);
- assertEquals(3,
- result.size());
- }
- public void testStringWithTernaryIf() {
- test("System.out.print(\"Hello : \" + (foo != null ? \"FOO!\" : \"NO FOO\") + \". Bye.\");");
- }
- private static Object testTernary(int i,
- String expression) throws Exception {
- Object val;
- Object val2;
- try {
- val = executeExpression(compileExpression(expression),
- JIRA124_CTX);
- }
- catch (Exception e) {
- System.out.println("FailedCompiled[" + i + "]:" + expression);
- throw e;
- }
- try {
- val2 = MVEL.eval(expression,
- JIRA124_CTX);
- }
- catch (Exception e) {
- System.out.println("FailedEval[" + i + "]:" + expression);
- throw e;
- }
- if (((val == null || val2 == null) && val != val2) || (val != null && !val.equals(val2))) {
- throw new AssertionError("results do not match (" + String.valueOf(val)
- + " != " + String.valueOf(val2) + ")");
- }
- return val;
- }
- private static Map<String, Boolean> JIRA124_CTX = Collections.singletonMap("testValue",
- true);
- public void testJIRA124() throws Exception {
- assertEquals("A",
- testTernary(1,
- "testValue == true ? 'A' : 'B' + 'C'"));
- assertEquals("AB",
- testTernary(2,
- "testValue ? 'A' + 'B' : 'C'"));
- assertEquals("A",
- testTernary(3,
- "(testValue ? 'A' : 'B' + 'C')"));
- assertEquals("AB",
- testTernary(4,
- "(testValue ? 'A' + 'B' : 'C')"));
- assertEquals("A",
- testTernary(5,
- "(testValue ? 'A' : ('B' + 'C'))"));
- assertEquals("AB",
- testTernary(6,
- "(testValue ? ('A' + 'B') : 'C')"));
- JIRA124_CTX = Collections.singletonMap("testValue",
- false);
- assertEquals("BC",
- testTernary(1,
- "testValue ? 'A' : 'B' + 'C'"));
- assertEquals("C",
- testTernary(2,
- "testValue ? 'A' + 'B' : 'C'"));
- assertEquals("BC",
- testTernary(3,
- "(testValue ? 'A' : 'B' + 'C')"));
- assertEquals("C",
- testTernary(4,
- "(testValue ? 'A' + 'B' : 'C')"));
- assertEquals("BC",
- testTernary(5,
- "(testValue ? 'A' : ('B' + 'C'))"));
- assertEquals("C",
- testTernary(6,
- "(testValue ? ('A' + 'B') : 'C')"));
- }
- /**
- * Community provided test cases
- */
- @SuppressWarnings({"unchecked"})
- public void testCalculateAge() {
- Calendar c1 = Calendar.getInstance();
- c1.set(1999,
- 0,
- 10); // 1999 jan 20
- Map objectMap = new HashMap(1);
- Map propertyMap = new HashMap(1);
- propertyMap.put("GEBDAT",
- c1.getTime());
- objectMap.put("EV_VI_ANT1",
- propertyMap);
- assertEquals("N",
- testCompiledSimple(
- "new org.mvel2.tests.core.res.PDFFieldUtil().calculateAge(EV_VI_ANT1.GEBDAT) >= 25 ? 'Y' : 'N'",
- null,
- objectMap));
- }
- public void testSubEvaluation() {
- HashMap<String, Object> map = new HashMap<String, Object>();
- map.put("EV_BER_BER_NR",
- "12345");
- map.put("EV_BER_BER_PRIV",
- Boolean.FALSE);
- assertEquals("12345",
- testCompiledSimple("EV_BER_BER_NR + ((EV_BER_BER_PRIV != empty && EV_BER_BER_PRIV == true) ? \"/PRIVAT\" : '')",
- null,
- map));
- map.put("EV_BER_BER_PRIV",
- Boolean.TRUE);
- assertEquals("12345/PRIVAT",
- testCompiledSimple("EV_BER_BER_NR + ((EV_BER_BER_PRIV != empty && EV_BER_BER_PRIV == true) ? \"/PRIVAT\" : '')",
- null,
- map));
- }
- public void testCompactIfElse() {
- assertEquals("foo",
- test("if (false) 'bar'; else 'foo';"));
- }
- public void testForInitializerScope() {
- String ex = "for (int i = 0; i < 10; i++) { 'fop'; }\n" +
- "for (int i = 0; i < 10; i++) { 'foo'; }";
- Serializable s = MVEL.compileExpression(ex);
- MVEL.executeExpression(s, new HashMap());
- }
- public void testForEachTerminateFlow() {
- String ex = "for(int i=0;i<5;i++) {\n" +
- "System.out.println(\"LOOP\" + i);\n" +
- "return true;\n" +
- "}\n" +
- "System.out.println(\"END\");";
- Serializable s = MVEL.compileExpression(ex);
- assertEquals(true, MVEL.executeExpression(s, new HashMap()));
- }
- public final void testFunctionCall() {
- MVEL.eval(
- "def test() { for(i = 0; i < 3; i++) { System.out.println('...') } } \n" +
- "test()",
- new HashMap<String, Object>());
- }
- public void testMultipleArgumentsInFunction() {
- String expression = "def cond(x, y) {\n" +
- "\tif (x ~= \"fet.*\") {\n" +
- "\t\tif ((x.endsWith(('sock')))) {\n" +
- " \t\t\treturn 1;\n" +
- "\t\t} else if ((x.endsWith(('lock')))) {\n" +
- " \t\t\treturn [1: ((y > 12) ? 1 : 2), 2: (12 + 1)];\n" +
- "\t\t} ;\n" +
- "\t}\n" +
- "(null).print();\n" + // THIS LINE SHOULD NEVER EXECUTE BUT IT DOES, INCORRECT!
- "\n" +
- "}\n" +
- "\n" +
- "cond('fetlock', 12)";
- Exception thrown = null;
- try {
- MVEL.executeExpression(MVEL.compileExpression(expression), new HashMap());
- }
- catch (Exception e) {
- thrown = e;
- }
- assertNull("Return statement not being honored!", thrown);
- }
- public void testDhanji1() {
- String expression = "def insert(i, ls) {\n" +
- " if (ls == empty) {\n" +
- " return [];\n" +
- " }\n" +
- " if (ls is java.util.List) {\n" +
- " x = ls[0];\n" +
- " xs = ls.size() == 1 ? [] : ls.subList(1, ls.size());\n" +
- " return (((i <= x) ? ([i, x] + xs) : insert(i, xs)));\n" +
- " }\n" +
- "}\n" +
- "\n" +
- "insert(2, [1, 3, 4])";
- Object o = MVEL.eval(expression, new HashMap<String, Object>());
- System.out.println(o);
- }
- // public void testDhanji2() {
- // System.out.println(MVEL.eval("x = 1; y = 2; [x,y] + [3,4]", new HashMap<String, Object>()));
- // }
- private static int fibonacci(int n) {
- if (n < 2)
- return 1;
- else
- return fibonacci(n - 2) + fibonacci(n - 1);
- }
- }