You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by he...@apache.org on 2017/07/14 13:07:21 UTC

svn commit: r1801957 [2/2] - in /commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3: IssuesTest.java IssuesTest100.java IssuesTest200.java

Copied: commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest200.java (from r1800844, commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest.java)
URL: http://svn.apache.org/viewvc/commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest200.java?p2=commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest200.java&p1=commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest.java&r1=1800844&r2=1801957&rev=1801957&view=diff
==============================================================================
--- commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest.java (original)
+++ commons/proper/jexl/trunk/src/test/java/org/apache/commons/jexl3/IssuesTest200.java Fri Jul 14 13:07:20 2017
@@ -16,32 +16,25 @@
  */
 package org.apache.commons.jexl3;
 
-import org.apache.commons.jexl3.internal.Engine;
-import org.apache.commons.jexl3.internal.introspection.Uberspect;
-
-import java.io.File;
-import java.math.BigDecimal;
-import java.math.MathContext;
-import java.net.URL;
-import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import java.util.TreeSet;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-//import org.apache.commons.beanutils.LazyDynaMap;
 
 /**
- * Test cases for reported issue .
+ * Test cases for reported issue between JEXL-200 and JEXL-299.
  */
 @SuppressWarnings({"boxing", "UnnecessaryBoxing", "AssertEqualsBetweenInconvertibleTypes"})
-public class IssuesTest extends JexlTestCase {
-    public IssuesTest() {
-        super("IssuesTest", null);
+public class IssuesTest200 extends JexlTestCase {
+    public IssuesTest200() {
+        super("IssuesTest200", null);
     }
 
     @Before
@@ -51,1134 +44,6 @@ public class IssuesTest extends JexlTest
         java.util.logging.Logger.getLogger(JexlEngine.class.getName()).setLevel(java.util.logging.Level.SEVERE);
     }
 
-    // JEXL-49: blocks not parsed (fixed)
-    @Test
-    public void test49() throws Exception {
-        JexlEngine jexl = new Engine();
-        Map<String, Object> vars = new HashMap<String, Object>();
-        JexlContext ctxt = new MapContext(vars);
-        String stmt = "a = 'b'; c = 'd';";
-        JexlScript expr = jexl.createScript(stmt);
-        /* Object value = */ expr.execute(ctxt);
-        Assert.assertTrue("JEXL-49 is not fixed", vars.get("a").equals("b") && vars.get("c").equals("d"));
-    }
-
-    // JEXL-48: bad assignment detection
-    public static class Another {
-        public String name = "whatever";
-        private final Boolean foo = Boolean.TRUE;
-
-        public Boolean foo() {
-            return foo;
-        }
-
-        public int goo() {
-            return 100;
-        }
-    }
-
-    public static class Foo {
-        private final Another inner;
-
-        Foo() {
-            inner = new Another();
-        }
-
-        public Another getInner() {
-            return inner;
-        }
-    }
-
-    @Test
-    public void test48() throws Exception {
-        JexlEngine jexl = new Engine();
-        JexlEvalContext jc = new JexlEvalContext();
-        // ensure errors will throw
-        jc.setStrict(true);
-        jc.setSilent(false);
-        try {
-            String jexlExp = "(foo.getInner().foo() eq true) and (foo.getInner().goo() = (foo.getInner().goo()+1-1))";
-            JexlExpression e = jexl.createExpression(jexlExp);
-            jc.set("foo", new Foo());
-            /* Object o = */ e.evaluate(jc);
-            Assert.fail("Should have failed due to invalid assignment");
-        } catch (JexlException.Assignment xparse) {
-            String dbg = xparse.toString();
-        } catch (JexlException xjexl) {
-            Assert.fail("Should have thrown a parse exception");
-        }
-    }
-
-    // JEXL-47: C style comments (single & multi line) (fixed in Parser.jjt)
-    // JEXL-44: comments dont allow double quotes (fixed in Parser.jjt)
-    @Test
-    public void test47() throws Exception {
-        JexlEngine jexl = new Engine();
-        JexlEvalContext ctxt = new JexlEvalContext();
-        // ensure errors will throw
-        ctxt.setSilent(false);
-
-        JexlExpression expr = jexl.createExpression("true//false\n");
-        Object value = expr.evaluate(ctxt);
-        Assert.assertTrue("should be true", (Boolean) value);
-
-        expr = jexl.createExpression("/*true*/false");
-        value = expr.evaluate(ctxt);
-        Assert.assertFalse("should be false", (Boolean) value);
-
-        expr = jexl.createExpression("/*\"true\"*/false");
-        value = expr.evaluate(ctxt);
-        Assert.assertFalse("should be false", (Boolean) value);
-    }
-
-    // JEXL-42: NullPointerException evaluating an expression
-    // fixed in JexlArithmetic by allowing add operator to deal with string, null
-    @Test
-    public void test42() throws Exception {
-        JexlEngine jexl = new JexlBuilder().create();
-        JxltEngine uel = jexl.createJxltEngine();
-        // ensure errors will throw
-        //jexl.setSilent(false);
-        JexlEvalContext ctxt = new JexlEvalContext();
-        ctxt.setStrict(false);
-        ctxt.set("ax", "ok");
-
-        JxltEngine.Expression expr = uel.createExpression("${ax+(bx)}");
-        Object value = expr.evaluate(ctxt);
-        Assert.assertTrue("should be ok", "ok".equals(value));
-    }
-
-    // JEXL-40: failed to discover all methods (non public class implements public method)
-    // fixed in ClassMap by taking newer version of populateCache from Velocity
-    public static abstract class Base {
-        public abstract boolean foo();
-    }
-
-    class Derived extends Base {
-        @Override
-        public boolean foo() {
-            return true;
-        }
-    }
-
-    @Test
-    public void test40() throws Exception {
-        JexlEngine jexl = new Engine();
-        JexlEvalContext ctxt = new JexlEvalContext();
-        // ensure errors will throw
-        ctxt.setSilent(false);
-
-        ctxt.set("derived", new Derived());
-
-        JexlExpression expr = jexl.createExpression("derived.foo()");
-        Object value = expr.evaluate(ctxt);
-        Assert.assertTrue("should be true", (Boolean) value);
-    }
-
-    // JEXL-52: can be implemented by deriving Interpreter.{g,s}etAttribute; later
-    @Test
-    public void test52base() throws Exception {
-        Engine jexl = (Engine) createEngine(false);
-        Uberspect uber = (Uberspect) jexl.getUberspect();
-        // most likely, call will be in an Interpreter, getUberspect
-        String[] names = uber.getMethodNames(Another.class);
-        Assert.assertTrue("should find methods", names.length > 0);
-        int found = 0;
-        for (String name : names) {
-            if ("foo".equals(name) || "goo".equals(name)) {
-                found += 1;
-            }
-        }
-        Assert.assertTrue("should have foo & goo", found == 2);
-
-        names = uber.getFieldNames(Another.class);
-        Assert.assertTrue("should find fields", names.length > 0);
-        found = 0;
-        for (String name : names) {
-            if ("name".equals(name)) {
-                found += 1;
-            }
-        }
-        Assert.assertTrue("should have name", found == 1);
-    }
-
-    // JEXL-10/JEXL-11: variable checking, null operand is error
-    @Test
-    public void test11() throws Exception {
-        JexlEngine jexl = createEngine(false);
-        JexlEvalContext ctxt = new JexlEvalContext();
-        // ensure errors will throw
-        ctxt.setSilent(false);
-        ctxt.setStrict(true);
-
-        ctxt.set("a", null);
-
-        String[] exprs = {
-            //"10 + null",
-            //"a - 10",
-            //"b * 10",
-            "a % b"//,
-        //"1000 / a"
-        };
-        for (int e = 0; e < exprs.length; ++e) {
-            try {
-                JexlExpression expr = jexl.createExpression(exprs[e]);
-                /* Object value = */ expr.evaluate(ctxt);
-                Assert.fail(exprs[e] + " : should have failed due to null argument");
-            } catch (JexlException xjexl) {
-                // expected
-            }
-        }
-    }
-
-    // JEXL-62
-    @Test
-    public void test62() throws Exception {
-        JexlEngine jexl = createEngine(false);
-        MapContext vars = new MapContext();
-        JexlEvalContext ctxt = new JexlEvalContext(vars);
-        ctxt.setStrict(true);
-        ctxt.setSilent(true);// to avoid throwing JexlException on null method call
-
-        JexlScript jscript;
-
-        jscript = jexl.createScript("dummy.hashCode()");
-        Assert.assertEquals(jscript.getSourceText(), null, jscript.execute(ctxt)); // OK
-
-        ctxt.set("dummy", "abcd");
-        Assert.assertEquals(jscript.getSourceText(), Integer.valueOf("abcd".hashCode()), jscript.execute(ctxt)); // OK
-
-        jscript = jexl.createScript("dummy.hashCode");
-        Assert.assertEquals(jscript.getSourceText(), null, jscript.execute(ctxt)); // OK
-
-        JexlExpression jexpr;
-        vars.clear();
-        jexpr = jexl.createExpression("dummy.hashCode()");
-        Assert.assertEquals(jexpr.toString(), null, jexpr.evaluate(ctxt)); // OK
-
-        ctxt.set("dummy", "abcd");
-        Assert.assertEquals(jexpr.toString(), Integer.valueOf("abcd".hashCode()), jexpr.evaluate(ctxt)); // OK
-
-        jexpr = jexl.createExpression("dummy.hashCode");
-        Assert.assertEquals(jexpr.toString(), null, jexpr.evaluate(ctxt)); // OK
-    }
-
-    // JEXL-73
-    @Test
-    public void test73() throws Exception {
-        JexlEngine jexl = createEngine(false);
-        JexlEvalContext ctxt = new JexlEvalContext();
-        // ensure errors will throw
-        ctxt.setSilent(false);
-        ctxt.setStrict(true);
-        JexlExpression e;
-        e = jexl.createExpression("c.e");
-        try {
-            /* Object o = */ e.evaluate(ctxt);
-            Assert.fail("c.e not declared as variable");
-        } catch (JexlException.Variable xjexl) {
-            String msg = xjexl.getMessage();
-            Assert.assertTrue(msg.indexOf("c.e") > 0);
-        }
-
-        ctxt.set("c", "{ 'a' : 3, 'b' : 5}");
-        ctxt.set("e", Integer.valueOf(2));
-        try {
-            /* Object o = */ e.evaluate(ctxt);
-            Assert.fail("c.e not accessible as property");
-        } catch (JexlException.Property xjexl) {
-            String msg = xjexl.getMessage();
-            Assert.assertTrue(msg.indexOf("e") > 0);
-        }
-
-    }
-
-    // JEXL-87
-    @Test
-    public void test87() throws Exception {
-        JexlEngine jexl = createEngine(false);
-        JexlEvalContext ctxt = new JexlEvalContext();
-        // ensure errors will throw
-        ctxt.setSilent(false);
-        JexlExpression divide = jexl.createExpression("l / r");
-        JexlExpression modulo = jexl.createExpression("l % r");
-
-        ctxt.set("l", java.math.BigInteger.valueOf(7));
-        ctxt.set("r", java.math.BigInteger.valueOf(2));
-        Assert.assertEquals(java.math.BigInteger.valueOf(3), divide.evaluate(ctxt));
-        Assert.assertTrue(jexl.getArithmetic().equals(1, modulo.evaluate(ctxt)));
-
-        ctxt.set("l", java.math.BigDecimal.valueOf(7));
-        ctxt.set("r", java.math.BigDecimal.valueOf(2));
-        Assert.assertEquals(java.math.BigDecimal.valueOf(3.5), divide.evaluate(ctxt));
-        Assert.assertTrue(jexl.getArithmetic().equals(1, modulo.evaluate(ctxt)));
-    }
-
-    // JEXL-90
-    @Test
-    public void test90() throws Exception {
-        JexlEngine jexl = createEngine(false);
-        JexlEvalContext ctxt = new JexlEvalContext();
-        // ensure errors will throw
-        ctxt.setSilent(false);
-        // ';' is necessary between expressions
-        String[] fexprs = {
-            "a=3 b=4",
-            "while(a) while(a)",
-            "1 2",
-            "if (true) 2; 3 {}",
-            "while (x) 1 if (y) 2 3"
-        };
-        for (int f = 0; f < fexprs.length; ++f) {
-            try {
-                jexl.createScript(fexprs[f]);
-                Assert.fail(fexprs[f] + ": Should have failed in parse");
-            } catch (JexlException xany) {
-                // expected to fail in createExpression
-            }
-        }
-        // ';' is necessary between expressions and only expressions
-        String[] exprs = {
-            "if (x) {1} if (y) {2}",
-            "if (x) 1 if (y) 2",
-            "while (x) 1 if (y) 2 else 3",
-            "for(z : [3, 4, 5]) { z } y ? 2 : 1",
-            "for(z : [3, 4, 5]) { z } if (y) 2 else 1"
-        };
-        ctxt.set("x", Boolean.FALSE);
-        ctxt.set("y", Boolean.TRUE);
-        for (int e = 0; e < exprs.length; ++e) {
-            JexlScript s = jexl.createScript(exprs[e]);
-            Assert.assertEquals(Integer.valueOf(2), s.execute(ctxt));
-        }
-        debuggerCheck(jexl);
-    }
-
-    // JEXL-44
-    @Test
-    public void test44() throws Exception {
-        JexlEngine jexl = createEngine(false);
-        JexlEvalContext ctxt = new JexlEvalContext();
-        // ensure errors will throw
-        ctxt.setSilent(false);
-        JexlScript script;
-        script = jexl.createScript("'hello world!'//commented");
-        Assert.assertEquals("hello world!", script.execute(ctxt));
-        script = jexl.createScript("'hello world!';//commented\n'bye...'");
-        Assert.assertEquals("bye...", script.execute(ctxt));
-        script = jexl.createScript("'hello world!'## commented");
-        Assert.assertEquals("hello world!", script.execute(ctxt));
-        script = jexl.createScript("'hello world!';## commented\n'bye...'");
-        Assert.assertEquals("bye...", script.execute(ctxt));
-    }
-
-    @Test
-    public void test97() throws Exception {
-        JexlEngine jexl = createEngine(false);
-        JexlEvalContext ctxt = new JexlEvalContext();
-        // ensure errors will throw
-        ctxt.setSilent(false);
-        for (char v = 'a'; v <= 'z'; ++v) {
-            ctxt.set(Character.toString(v), 10);
-        }
-        String input
-                = "(((((((((((((((((((((((((z+y)/x)*w)-v)*u)/t)-s)*r)/q)+p)-o)*n)-m)+l)*k)+j)/i)+h)*g)+f)/e)+d)-c)/b)+a)";
-
-        JexlExpression script;
-        // Make sure everything is loaded...
-        long start = System.nanoTime();
-        script = jexl.createExpression(input);
-        Object value = script.evaluate(ctxt);
-        Assert.assertEquals(Integer.valueOf(11), value);
-        long end = System.nanoTime();
-        double millisec = (end - start) / 1e6;
-        double limit = 200.0; // Allow plenty of slack
-        Assert.assertTrue("Expected parse to take less than " + limit + "ms, actual " + millisec, millisec < limit);
-    }
-
-    public static class fn98 {
-        public String replace(String str, String target, String replacement) {
-            return str.replace(target, replacement);
-        }
-    }
-
-    @Test
-    public void test98() throws Exception {
-        String[] exprs = {
-            "fn:replace('DOMAIN\\somename', '\\\\', '\\\\\\\\')",
-            "fn:replace(\"DOMAIN\\somename\", \"\\\\\", \"\\\\\\\\\")",
-            "fn:replace('DOMAIN\\somename', '\\u005c', '\\u005c\\u005c')"
-        };
-        Map<String, Object> funcs = new HashMap<String, Object>();
-        funcs.put("fn", new fn98());
-        JexlEngine jexl = new JexlBuilder().namespaces(funcs).create();
-        for (String expr : exprs) {
-            Object value = jexl.createExpression(expr).evaluate(null);
-            Assert.assertEquals(expr, "DOMAIN\\\\somename", value);
-        }
-    }
-
-    @Test
-    public void test100() throws Exception {
-        JexlEngine jexl = new JexlBuilder().cache(4).create();
-        JexlContext ctxt = new MapContext();
-        int[] foo = {42};
-        ctxt.set("foo", foo);
-        Object value;
-        for (int l = 0; l < 2; ++l) {
-            value = jexl.createExpression("foo[0]").evaluate(ctxt);
-            Assert.assertEquals(42, value);
-            value = jexl.createExpression("foo[0] = 43").evaluate(ctxt);
-            Assert.assertEquals(43, value);
-            value = jexl.createExpression("foo.0").evaluate(ctxt);
-            Assert.assertEquals(43, value);
-            value = jexl.createExpression("foo.0 = 42").evaluate(ctxt);
-            Assert.assertEquals(42, value);
-        }
-    }
-
-// A's class definition
-    public static class A105 {
-        String nameA;
-        String propA;
-
-        public A105(String nameA, String propA) {
-            this.nameA = nameA;
-            this.propA = propA;
-        }
-
-        @Override
-        public String toString() {
-            return "A [nameA=" + nameA + ", propA=" + propA + "]";
-        }
-
-        public String getNameA() {
-            return nameA;
-        }
-
-        public String getPropA() {
-            return propA;
-        }
-
-        public String uppercase(String str) {
-            return str.toUpperCase();
-        }
-    }
-
-    @Test
-    public void test105() throws Exception {
-        JexlContext context = new MapContext();
-        JexlExpression selectExp = new Engine().createExpression("[a.propA]");
-        context.set("a", new A105("a1", "p1"));
-        Object[] r = (Object[]) selectExp.evaluate(context);
-        Assert.assertEquals("p1", r[0]);
-
-//selectExp = new Engine().createExpression("[a.propA]");
-        context.set("a", new A105("a2", "p2"));
-        r = (Object[]) selectExp.evaluate(context);
-        Assert.assertEquals("p2", r[0]);
-    }
-
-    @Test
-    public void test106() throws Exception {
-        JexlEvalContext context = new JexlEvalContext();
-        context.setStrict(true, true);
-        context.set("a", new BigDecimal(1));
-        context.set("b", new BigDecimal(3));
-        JexlEngine jexl = new Engine();
-        try {
-            Object value = jexl.createExpression("a / b").evaluate(context);
-            Assert.assertNotNull(value);
-        } catch (JexlException xjexl) {
-            Assert.fail("should not occur");
-        }
-        context.setMathContext(MathContext.UNLIMITED);
-        context.setMathScale(2);
-        try {
-            jexl.createExpression("a / b").evaluate(context);
-            Assert.fail("should fail");
-        } catch (JexlException xjexl) {
-            //ok  to fail
-        }
-    }
-
-    @Test
-    public void test107() throws Exception {
-        String[] exprs = {
-            "'Q4'.toLowerCase()", "q4",
-            "(Q4).toLowerCase()", "q4",
-            "(4).toString()", "4",
-            "(1 + 3).toString()", "4",
-            "({ 'q' : 'Q4'}).get('q').toLowerCase()", "q4",
-            "{ 'q' : 'Q4'}.get('q').toLowerCase()", "q4",
-            "({ 'q' : 'Q4'})['q'].toLowerCase()", "q4",
-            "(['Q4'])[0].toLowerCase()", "q4"
-        };
-
-        JexlContext context = new MapContext();
-        context.set("Q4", "Q4");
-        JexlEngine jexl = new Engine();
-        for (int e = 0; e < exprs.length; e += 2) {
-            JexlExpression expr = jexl.createExpression(exprs[e]);
-            Object expected = exprs[e + 1];
-            Object value = expr.evaluate(context);
-            Assert.assertEquals(expected, value);
-            expr = jexl.createExpression(expr.getParsedText());
-            value = expr.evaluate(context);
-            Assert.assertEquals(expected, value);
-        }
-    }
-
-    @Test
-    public void test108() throws Exception {
-        JexlScript expr;
-        Object value;
-        JexlEngine jexl = new Engine();
-        expr = jexl.createScript("size([])");
-        value = expr.execute(null);
-        Assert.assertEquals(0, value);
-        expr = jexl.createScript(expr.getParsedText());
-        value = expr.execute(null);
-        Assert.assertEquals(0, value);
-
-        expr = jexl.createScript("if (true) { [] } else { {:} }");
-        value = expr.execute(null);
-        Assert.assertTrue(value.getClass().isArray());
-        expr = jexl.createScript(expr.getParsedText());
-        value = expr.execute(null);
-        Assert.assertTrue(value.getClass().isArray());
-
-        expr = jexl.createScript("size({:})");
-        value = expr.execute(null);
-        Assert.assertEquals(0, value);
-        expr = jexl.createScript(expr.getParsedText());
-        value = expr.execute(null);
-        Assert.assertEquals(0, value);
-
-        expr = jexl.createScript("if (false) { [] } else { {:} }");
-        value = expr.execute(null);
-        Assert.assertTrue(value instanceof Map<?, ?>);
-        expr = jexl.createScript(expr.getParsedText());
-        value = expr.execute(null);
-        Assert.assertTrue(value instanceof Map<?, ?>);
-    }
-
-    @Test
-    public void test109() throws Exception {
-        JexlEngine jexl = new Engine();
-        Object value;
-        JexlContext context = new MapContext();
-        context.set("foo.bar", 40);
-        value = jexl.createExpression("foo.bar + 2").evaluate(context);
-        Assert.assertEquals(42, value);
-    }
-
-    @Test
-    public void test110() throws Exception {
-        JexlEngine jexl = new Engine();
-        String[] names = {"foo"};
-        Object value;
-        JexlContext context = new MapContext();
-        value = jexl.createScript("foo + 2", names).execute(context, 40);
-        Assert.assertEquals(42, value);
-        context.set("frak.foo", -40);
-        value = jexl.createScript("frak.foo - 2", names).execute(context, 40);
-        Assert.assertEquals(-42, value);
-    }
-
-    static public class RichContext extends ObjectContext<A105> {
-        RichContext(JexlEngine jexl, A105 a105) {
-            super(jexl, a105);
-        }
-    }
-
-    @Test
-    public void testRichContext() throws Exception {
-        A105 a105 = new A105("foo", "bar");
-        JexlEngine jexl = new Engine();
-        Object value;
-        JexlContext context = new RichContext(jexl, a105);
-        value = jexl.createScript("uppercase(nameA + propA)").execute(context);
-        Assert.assertEquals("FOOBAR", value);
-    }
-
-    @Test
-    public void test111() throws Exception {
-        JexlEngine jexl = new Engine();
-        Object value;
-        JexlContext context = new MapContext();
-        String strExpr = "((x>0)?\"FirstValue=\"+(y-x):\"SecondValue=\"+x)";
-        JexlExpression expr = jexl.createExpression(strExpr);
-
-        context.set("x", 1);
-        context.set("y", 10);
-        value = expr.evaluate(context);
-        Assert.assertEquals("FirstValue=9", value);
-
-        context.set("x", 1.0d);
-        context.set("y", 10.0d);
-        value = expr.evaluate(context);
-        Assert.assertEquals("FirstValue=9.0", value);
-
-        context.set("x", 1);
-        context.set("y", 10.0d);
-        value = expr.evaluate(context);
-        Assert.assertEquals("FirstValue=9.0", value);
-
-        context.set("x", 1.0d);
-        context.set("y", 10);
-        value = expr.evaluate(context);
-        Assert.assertEquals("FirstValue=9.0", value);
-
-        context.set("x", -10);
-        context.set("y", 1);
-        value = expr.evaluate(context);
-        Assert.assertEquals("SecondValue=-10", value);
-
-        context.set("x", -10.0d);
-        context.set("y", 1.0d);
-        value = expr.evaluate(context);
-        Assert.assertEquals("SecondValue=-10.0", value);
-
-        context.set("x", -10);
-        context.set("y", 1.0d);
-        value = expr.evaluate(context);
-        Assert.assertEquals("SecondValue=-10", value);
-
-        context.set("x", -10.0d);
-        context.set("y", 1);
-        value = expr.evaluate(context);
-        Assert.assertEquals("SecondValue=-10.0", value);
-    }
-
-    @Test
-    public void testScaleIssue() throws Exception {
-        JexlEngine jexlX = new Engine();
-        String expStr1 = "result == salary/month * work.percent/100.00";
-        JexlExpression exp1 = jexlX.createExpression(expStr1);
-        JexlEvalContext ctx = new JexlEvalContext();
-        ctx.set("result", new BigDecimal("9958.33"));
-        ctx.set("salary", new BigDecimal("119500.00"));
-        ctx.set("month", new BigDecimal("12.00"));
-        ctx.set("work.percent", new BigDecimal("100.00"));
-
-        // will fail because default scale is 5
-        Assert.assertFalse((Boolean) exp1.evaluate(ctx));
-
-        // will succeed with scale = 2
-        ctx.setMathScale(2);
-        Assert.assertTrue((Boolean) exp1.evaluate(ctx));
-    }
-
-    @Test
-    public void test112() throws Exception {
-        Object result;
-        JexlEngine jexl = new Engine();
-        result = jexl.createScript(Integer.toString(Integer.MAX_VALUE)).execute(null);
-        Assert.assertEquals(Integer.MAX_VALUE, result);
-        result = jexl.createScript(Integer.toString(Integer.MIN_VALUE + 1)).execute(null);
-        Assert.assertEquals(Integer.MIN_VALUE + 1, result);
-        result = jexl.createScript(Integer.toString(Integer.MIN_VALUE)).execute(null);
-        Assert.assertEquals(Integer.MIN_VALUE, result);
-    }
-
-    @Test
-    public void test117() throws Exception {
-        JexlEngine jexl = new Engine();
-        JexlExpression e = jexl.createExpression("TIMESTAMP > 20100102000000");
-        JexlContext ctx = new MapContext();
-        ctx.set("TIMESTAMP", new Long("20100103000000"));
-        Object result = e.evaluate(ctx);
-        Assert.assertTrue((Boolean) result);
-    }
-
-    public static class Foo125 {
-        public String method() {
-            return "OK";
-        }
-
-        public String total(String tt) {
-            return "total " + tt;
-        }
-    }
-
-    public static class Foo125Context extends ObjectContext<Foo125> {
-        public Foo125Context(JexlEngine engine, Foo125 wrapped) {
-            super(engine, wrapped);
-        }
-    }
-
-    @Test
-    public void test125() throws Exception {
-        JexlEngine jexl = new Engine();
-        JexlExpression e = jexl.createExpression("method()");
-        JexlContext jc = new Foo125Context(jexl, new Foo125());
-        Assert.assertEquals("OK", e.evaluate(jc));
-    }
-
-    @Test
-    public void test130a() throws Exception {
-        String myName = "Test.Name";
-        Object myValue = "Test.Value";
-
-        JexlEngine myJexlEngine = new Engine();
-        MapContext myMapContext = new MapContext();
-        myMapContext.set(myName, myValue);
-
-        Object myObjectWithTernaryConditional = myJexlEngine.createScript(myName + "?:null").execute(myMapContext);
-        Assert.assertEquals(myValue, myObjectWithTernaryConditional);
-    }
-
-    @Test
-    public void test130b() throws Exception {
-        String myName = "Test.Name";
-        Object myValue = new Object() {
-            @Override
-            public String toString() {
-                return "Test.Value";
-            }
-        };
-
-        JexlEngine myJexlEngine = new Engine();
-        MapContext myMapContext = new MapContext();
-        myMapContext.set(myName, myValue);
-
-        Object myObjectWithTernaryConditional = myJexlEngine.createScript(myName + "?:null").execute(myMapContext);
-        Assert.assertEquals(myValue, myObjectWithTernaryConditional);
-    }
-
-    @Test
-    public void test135() throws Exception {
-        JexlEngine jexl = new Engine();
-        JexlContext jc = new MapContext();
-        JexlScript script;
-        Object result;
-        Map<Integer, Object> foo = new HashMap<Integer, Object>();
-        foo.put(3, 42);
-        jc.set("state", foo);
-
-        script = jexl.createScript("var y = state[3]; y");
-        result = script.execute(jc, foo);
-        Assert.assertEquals(42, result);
-
-        jc.set("a", 3);
-        script = jexl.createScript("var y = state[a]; y");
-        result = script.execute(jc, foo);
-        Assert.assertEquals(42, result);
-
-        jc.set("a", 2);
-        script = jexl.createScript("var y = state[a + 1]; y");
-        result = script.execute(jc, foo);
-        Assert.assertEquals(42, result);
-
-        jc.set("a", 2);
-        jc.set("b", 1);
-        script = jexl.createScript("var y = state[a + b]; y");
-        result = script.execute(jc, foo);
-        Assert.assertEquals(42, result);
-
-        script = jexl.createScript("var y = state[3]; y", "state");
-        result = script.execute(null, foo, 3);
-        Assert.assertEquals(42, result);
-
-        script = jexl.createScript("var y = state[a]; y", "state", "a");
-        result = script.execute(null, foo, 3);
-        Assert.assertEquals(42, result);
-
-        script = jexl.createScript("var y = state[a + 1]; y", "state", "a");
-        result = script.execute(null, foo, 2);
-        Assert.assertEquals(42, result);
-
-        script = jexl.createScript("var y = state[a + b]; y", "state", "a", "b");
-        result = script.execute(null, foo, 2, 1);
-        Assert.assertEquals(42, result);
-    }
-
-    @Test
-    public void test136() throws Exception {
-        JexlEngine jexl = new Engine();
-        JexlContext jc = new MapContext();
-        JexlScript script;
-        JexlExpression expr;
-        Object result;
-
-        script = jexl.createScript("var x = $TAB[idx]; return x;", "idx");
-        jc.set("fn01", script);
-
-        script = jexl.createScript("$TAB = { 1:11, 2:22, 3:33}; IDX=2;");
-        script.execute(jc);
-
-        expr = jexl.createExpression("fn01(IDX)");
-        result = expr.evaluate(jc);
-        Assert.assertEquals("EXPR01 result", 22, result);
-    }
-
-//    @Test
-//    public void test138() throws Exception {
-//        MapContext ctxt = new MapContext();
-//        ctxt.set("tz", java.util.TimeZone.class);
-//        String source = ""
-//                + "var currentDate = new('java.util.Date');"
-//                +  "var gmt = tz.getTimeZone('GMT');"
-//                +  "var cet = tz.getTimeZone('CET');"
-//                +  "var calendarGMT = new('java.util.GregorianCalendar' , gmt);"
-//                +  "var calendarCET = new('java.util.GregorianCalendar', cet);"
-//                +  "var diff = calendarCET.getTime() - calendarGMT.getTime();"
-//                + "return diff";
-//
-//        JexlEngine jexl = new Engine();
-//        JexlScript script = jexl.createScript(source);
-//        Object result = script.execute(ctxt);
-//        Assert.Assert.assertNotNull(result);
-//    }
-    @Test
-    public void test143() throws Exception {
-        JexlEngine jexl = new Engine();
-        JexlContext jc = new MapContext();
-        JexlScript script;
-        Object result;
-
-        script = jexl.createScript("var total = 10; total = (total - ((x < 3)? y : z)) / (total / 10); total", "x", "y", "z");
-        result = script.execute(jc, 2, 2, 1);
-        Assert.assertEquals(8, result);
-        script = jexl.createScript("var total = 10; total = (total - ((x < 3)? y : 1)) / (total / 10); total", "x", "y", "z");
-        result = script.execute(jc, 2, 2, 1);
-        Assert.assertEquals(8, result);
-    }
-
-    @Test
-    public void test144() throws Exception {
-        JexlEngine jexl = new Engine();
-        JexlContext jc = new MapContext();
-        JexlScript script;
-        Object result;
-        script = jexl.createScript("var total = 10; total('tt')");
-        try {
-            result = script.execute(jc);
-            Assert.fail("total() is not solvable");
-        } catch (JexlException.Method ambiguous) {
-            Assert.assertEquals("total", ambiguous.getMethod());
-        }
-    }
-
-    /**
-     * Test cases for empty array assignment.
-     */
-    public static class Quux144 {
-        String[] arr;
-        String[] arr2;
-
-        public Quux144() {
-        }
-
-        public String[] getArr() {
-            return arr;
-        }
-
-        public String[] getArr2() {
-            return arr2;
-        }
-
-        public void setArr(String[] arr) {
-            this.arr = arr;
-        }
-
-        public void setArr2(String[] arr2) {
-            this.arr2 = arr2;
-        }
-
-        // Overloaded setter with different argument type.
-        public void setArr2(Integer[] arr2) {
-        }
-    }
-
-    @Test
-    public void test144a() throws Exception {
-        JexlEngine jexl = new Engine();
-        JexlContext jc = new MapContext();
-        jc.set("quuxClass", Quux144.class);
-        JexlExpression create = jexl.createExpression("quux = new(quuxClass)");
-        JexlExpression assignArray = jexl.createExpression("quux.arr = [ 'hello', 'world' ]");
-        JexlExpression checkArray = jexl.createExpression("quux.arr");
-
-        // test with a string
-        Quux144 quux = (Quux144) create.evaluate(jc);
-        Assert.assertNotNull("quux is null", quux);
-
-        // test with a nonempty string array
-        Object o = assignArray.evaluate(jc);
-        Assert.assertEquals("Result is not a string array", String[].class, o.getClass());
-        o = checkArray.evaluate(jc);
-        Assert.assertEquals("The array elements are equal", Arrays.asList("hello", "world"), Arrays.asList((String[]) o));
-
-        // test with a null array
-        assignArray = jexl.createExpression("quux.arr = null");
-        o = assignArray.evaluate(jc);
-        Assert.assertNull("Result is not null", o);
-        o = checkArray.evaluate(jc);
-        Assert.assertNull("Result is not null", o);
-
-        // test with an empty array
-        assignArray = jexl.createExpression("quux.arr = [ ]");
-        o = assignArray.evaluate(jc);
-        Assert.assertNotNull("Result is null", o);
-        o = checkArray.evaluate(jc);
-        Assert.assertEquals("The array elements are not equal", Arrays.asList(new String[0]), Arrays.asList((String[]) o));
-        Assert.assertEquals("The array size is not zero", 0, ((String[]) o).length);
-
-        // test with an empty array on the overloaded setter for different types.
-        // so, the assignment should fail with logging 'The ambiguous property, arr2, should have failed.'
-        try {
-            assignArray = jexl.createExpression("quux.arr2 = [ ]");
-            o = assignArray.evaluate(jc);
-            Assert.fail("The arr2 property shouldn't be set due to its ambiguity (overloaded setters with different types).");
-        } catch (JexlException.Property e) {
-            //System.out.println("Expected ambiguous property setting exception: " + e);
-        }
-        Assert.assertNull("The arr2 property value should remain as null, not an empty array.", quux.arr2);
-    }
-
-    @Test
-    public void test147b() throws Exception {
-        String[] scripts = {"var x = new ('java.util.HashMap'); x.one = 1; x.two = 2; x.one", // results to 1
-            "x = new ('java.util.HashMap'); x.one = 1; x.two = 2; x.one",// results to 1
-            "x = new ('java.util.HashMap'); x.one = 1; x.two = 2; x['one']",//results to 1
-            "var x = new ('java.util.HashMap'); x.one = 1; x.two = 2; x['one']"// result to null?
-        };
-
-        JexlEngine jexl = new Engine();
-        JexlContext jc = new MapContext();
-        for (String s : scripts) {
-            Object o = jexl.createScript(s).execute(jc);
-            Assert.assertEquals(1, o);
-        }
-    }
-
-    @Test
-    public void test147c() throws Exception {
-        String[] scripts = {
-            "var x = new ('java.util.HashMap'); x.one = 1; x.two = 2; x.one",
-            "x = new ('java.util.HashMap'); x.one = 1; x.two = 2; x.one",
-            "x = new ('java.util.HashMap'); x.one = 1; x.two = 2; x['one']",
-            "var x = new ('java.util.HashMap'); x.one = 1; x.two = 2; x['one']"
-        };
-        JexlEngine jexl = new Engine();
-        for (String s : scripts) {
-            JexlContext jc = new MapContext();
-            Object o = jexl.createScript(s).execute(jc);
-            Assert.assertEquals(1, o);
-        }
-    }
-
-    @Test
-    public void test5115a() throws Exception {
-        String str = "{\n"
-                + "  var x = \"A comment\";\n"
-                + "  var y = \"A comment\";\n"
-                + "}";
-        try {
-            JexlEngine jexl = new Engine();
-            JexlScript s = jexl.createScript(str);
-        } catch (JexlException.Parsing xparse) {
-            throw xparse;
-        }
-    }
-
-    @Test
-    public void test5115b() throws Exception {
-        String str = "{\n"
-                + "  var x = \"A comment\";\n"
-                + "}";
-        try {
-            JexlEngine jexl = new Engine();
-            JexlScript s = jexl.createScript(str);
-        } catch (JexlException.Parsing xparse) {
-            throw xparse;
-        }
-    }
-
-    static final String TESTA = "src/test/scripts/testA.jexl";
-
-    @Test
-    public void test5115c() throws Exception {
-        URL testUrl = new File(TESTA).toURI().toURL();
-        try {
-            JexlEngine jexl = new Engine();
-            JexlScript s = jexl.createScript(testUrl);
-        } catch (JexlException.Parsing xparse) {
-            throw xparse;
-        }
-    }
-
-    public static class Utils {
-        public <T> List<T> asList(T[] array) {
-            return Arrays.asList(array);
-        }
-
-        public List<Integer> asList(int[] array) {
-            List<Integer> l = new ArrayList<Integer>(array.length);
-            for (int i : array) {
-                l.add(i);
-            }
-            return l;
-        }
-    }
-
-    @Test
-    public void test148a() throws Exception {
-        JexlEngine jexl = new Engine();
-        JexlContext jc = new MapContext();
-        jc.set("u", new Utils());
-
-        String src = "u.asList(['foo', 'bar'])";
-        JexlScript e = jexl.createScript(src);
-        Object o = e.execute(jc);
-        Assert.assertTrue(o instanceof List);
-        Assert.assertEquals(Arrays.asList("foo", "bar"), o);
-
-        src = "u.asList([1, 2])";
-        e = jexl.createScript(src);
-        o = e.execute(jc);
-        Assert.assertTrue(o instanceof List);
-        Assert.assertEquals(Arrays.asList(1, 2), o);
-    }
-
-    @Test
-    public void test155() throws Exception {
-        JexlEngine jexlEngine = new Engine();
-        JexlExpression jexlExpresssion = jexlEngine.createExpression("first.second.name");
-        JexlContext jc = new MapContext();
-        jc.set("first.second.name", "RIGHT");
-        jc.set("name", "WRONG");
-        Object value = jexlExpresssion.evaluate(jc);
-        Assert.assertEquals("RIGHT", value.toString());
-    }
-
-    public static class Question42 extends MapContext {
-        public String functionA(String arg) {
-            return "a".equals(arg) ? "A" : "";
-        }
-
-        public String functionB(String arg) {
-            return "b".equals(arg) ? "B" : "";
-        }
-
-        public String functionC(String arg) {
-            return "c".equals(arg) ? "C" : "";
-        }
-
-        public String functionD(String arg) {
-            return "d".equals(arg) ? "D" : "";
-        }
-    }
-
-    public static class Arithmetic42 extends JexlArithmetic {
-        public Arithmetic42() {
-            super(false);
-        }
-
-        public Object and(String lhs, String rhs) {
-            if (rhs.isEmpty()) {
-                return "";
-            }
-            if (lhs.isEmpty()) {
-                return "";
-            }
-            return lhs + rhs;
-        }
-
-        public Object or(String lhs, String rhs) {
-            if (rhs.isEmpty()) {
-                return lhs;
-            }
-            if (lhs.isEmpty()) {
-                return rhs;
-            }
-            return lhs + rhs;
-        }
-    }
-
-    @Test
-    public void testQuestion42() throws Exception {
-        JexlEngine jexl = new JexlBuilder().arithmetic(new Arithmetic42()).create();
-        JexlContext jc = new Question42();
-
-        String str0 = "(functionA('z') | functionB('b')) &  (functionC('c') |  functionD('d') ) ";
-        JexlExpression expr0 = jexl.createExpression(str0);
-        Object value0 = expr0.evaluate(jc);
-        Assert.assertEquals("BCD", value0);
-
-        String str1 = "(functionA('z') & functionB('b')) |  (functionC('c') &  functionD('d') ) ";
-        JexlExpression expr1 = jexl.createExpression(str1);
-        Object value1 = expr1.evaluate(jc);
-        Assert.assertEquals("CD", value1);
-    }
-
-    @Test
-    public void test179() throws Exception {
-        JexlContext jc = new MapContext();
-        JexlEngine jexl = new JexlBuilder().create();
-        String src = "x = new ('java.util.HashSet'); x.add(1); x";
-        JexlScript e = jexl.createScript(src);
-        Object o = e.execute(jc);
-        Assert.assertTrue(o instanceof Set);
-        Assert.assertTrue(((Set) o).contains(1));
-    }
-
-    public static class C192 {
-        public C192() {
-        }
-
-        public static Integer callme(Integer n) {
-            if (n == null) {
-                return null;
-            } else {
-                return n >= 0 ? 42 : -42;
-            }
-        }
-
-        public static Object kickme() {
-            return C192.class;
-        }
-    }
-
-    @Test
-    public void test192() throws Exception {
-        JexlContext jc = new MapContext();
-        jc.set("x.y.z", C192.class);
-        JexlEngine jexl = new JexlBuilder().create();
-        JexlExpression js0 = jexl.createExpression("x.y.z.callme(t)");
-        jc.set("t", null);
-        Assert.assertNull(js0.evaluate(jc));
-        jc.set("t", 10);
-        Assert.assertEquals(42, js0.evaluate(jc));
-        jc.set("t", -10);
-        Assert.assertEquals(-42, js0.evaluate(jc));
-        jc.set("t", null);
-        Assert.assertNull(js0.evaluate(jc));
-        js0 = jexl.createExpression("x.y.z.kickme().callme(t)");
-        jc.set("t", null);
-        Assert.assertNull(js0.evaluate(jc));
-        jc.set("t", 10);
-        Assert.assertEquals(42, js0.evaluate(jc));
-        jc.set("t", -10);
-        Assert.assertEquals(-42, js0.evaluate(jc));
-        jc.set("t", null);
-        Assert.assertNull(js0.evaluate(jc));
-    }
-
-    @Test
-    public void test199() throws Exception {
-        JexlContext jc = new MapContext();
-        JexlEngine jexl = new JexlBuilder().arithmetic(new JexlArithmetic(false)).create();
-
-        JexlScript e = jexl.createScript("(x, y)->{ x + y }");
-        Object r = e.execute(jc, true, "EURT");
-        Assert.assertEquals("trueEURT", r);
-        r = e.execute(jc, "ELSAF", false);
-        Assert.assertEquals("ELSAFfalse", r);
-    }
-
     public static class Eval {
         private JexlEngine jexl;
 
@@ -1291,11 +156,87 @@ public class IssuesTest extends JexlTest
         JexlEngine jexl = new JexlBuilder().cache(256).create();
         JexlScript e = jexl.createScript("(x)->{ map[x] }");
         Object r;
-        r = e.execute(jc, null);
+        r = e.execute(jc, (Object) null);
         Assert.assertEquals(null, r);
-        r = e.execute(jc, null);
+        r = e.execute(jc, (Object) null);
         Assert.assertEquals(null, r);
         r = e.execute(jc, "one");
         Assert.assertEquals(1, r);
     }
+
+
+    public static class JexlArithmetic224 extends JexlArithmetic {
+        public JexlArithmetic224(boolean astrict) {
+            super(astrict);
+        }
+
+        protected Object nth(Collection<?> c, int i) {
+            if (c instanceof List) {
+                // tell engine to use default
+                return JexlEngine.TRY_FAILED;
+            }
+            for (Object o : c) {
+                if (i-- == 0) {
+                    return o;
+                }
+            }
+            return null;
+        }
+
+        public Object propertyGet(Collection<?> c, Number n) {
+            return nth(c, n.intValue());
+        }
+
+        public Object arrayGet(Collection<?> c, Number n) {
+            return nth(c, n.intValue());
+        }
+
+        public Object call(Collection<?> c, Number n) {
+            if (c instanceof List) {
+                return ((List) c).get(n.intValue());
+            }
+            return nth(c, n.intValue());
+        }
+    }
+
+    @Test
+    public void test224() throws Exception {
+        List<String> a0 = Arrays.asList("one", "two");
+        Set<String> a1 = new TreeSet<String>(a0);
+        JexlContext jc = new MapContext();
+        JexlEngine jexl = new JexlBuilder().arithmetic(new JexlArithmetic224(true)).create();
+        Object r;
+        JexlScript e = jexl.createScript("(map, x)->{ map[x] }");
+        r = e.execute(jc, a0, 1);
+        Assert.assertEquals("two", r);
+        r = e.execute(jc, a1, 1);
+        Assert.assertEquals("two", r);
+        e = jexl.createScript("(map)->{ map.1 }");
+        r = e.execute(jc, a0);
+        Assert.assertEquals("two", r);
+        r = e.execute(jc, a1);
+        Assert.assertEquals("two", r);
+        e = jexl.createScript("(map, x)->{ map(x) }");
+        r = e.execute(jc, a0, 1);
+        Assert.assertEquals("two", r);
+        r = e.execute(jc, a1, 1);
+        Assert.assertEquals("two", r);
+    }
+
+    public static class Context225 extends MapContext {
+        public String bar(){
+            return "bar";
+        }
+    }
+
+    @Test
+    public void test225() throws Exception {
+        Context225 df = new Context225();
+        JexlEngine jexl = new JexlBuilder().create();
+
+        JexlExpression expression = jexl.createExpression("bar()");
+        Assert.assertEquals("bar", expression.evaluate(df));
+        ObjectContext<Object> context = new ObjectContext<Object>(jexl, df);
+        Assert.assertEquals("bar", expression.evaluate(context));
+    }
 }