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 2019/11/19 10:56:45 UTC
[commons-jexl] branch master updated: JEXL-307: added test case on
contextually exposed options Task #JEXL-307 - Variable redeclaration option
This is an automated email from the ASF dual-hosted git repository.
henrib pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-jexl.git
The following commit(s) were added to refs/heads/master by this push:
new 2b63192 JEXL-307: added test case on contextually exposed options Task #JEXL-307 - Variable redeclaration option
2b63192 is described below
commit 2b63192c9485c75ea2cfff51bb6d153479a1c7ea
Author: henrib <he...@apache.org>
AuthorDate: Tue Nov 19 11:42:43 2019 +0100
JEXL-307: added test case on contextually exposed options
Task #JEXL-307 - Variable redeclaration option
---
.../java/org/apache/commons/jexl3/JexlOptions.java | 2 +-
.../java/org/apache/commons/jexl3/LexicalTest.java | 57 +++++++++++++++++++++-
2 files changed, 57 insertions(+), 2 deletions(-)
diff --git a/src/main/java/org/apache/commons/jexl3/JexlOptions.java b/src/main/java/org/apache/commons/jexl3/JexlOptions.java
index 98c46ef..7d3df9e 100644
--- a/src/main/java/org/apache/commons/jexl3/JexlOptions.java
+++ b/src/main/java/org/apache/commons/jexl3/JexlOptions.java
@@ -31,7 +31,7 @@ import org.apache.commons.jexl3.internal.Engine;
* <li>lexicalShade: whether local variables shade global ones even outside their scope</li>
* <li>strict: whether unknown or unsolvable identifiers are errors</li>
* <li>strictArithmetic: whether null as operand is an error</li>
- * <li>immutable: whether these options can be modified at runtime during execution (expert)</li>
+ * <li>sharedInstance: whether these options can be modified at runtime during execution (expert)</li>
* </ul>
* The sensible default is cancellable, strict and strictArithmetic.
* <p>This interface replaces the now deprecated JexlEngine.Options.
diff --git a/src/test/java/org/apache/commons/jexl3/LexicalTest.java b/src/test/java/org/apache/commons/jexl3/LexicalTest.java
index 9f7b9c9..2c6b2f7 100644
--- a/src/test/java/org/apache/commons/jexl3/LexicalTest.java
+++ b/src/test/java/org/apache/commons/jexl3/LexicalTest.java
@@ -18,6 +18,7 @@ package org.apache.commons.jexl3;
import java.io.StringReader;
import java.io.StringWriter;
+import java.util.Map;
import java.util.Set;
import org.apache.commons.jexl3.internal.LexicalScope;
import org.junit.Assert;
@@ -388,7 +389,7 @@ public class LexicalTest {
}
@Test
- public void testLexicalOption() throws Exception {
+ public void testContextualOptions0() throws Exception {
JexlFeatures f= new JexlFeatures();
JexlEngine jexl = new JexlBuilder().features(f).strict(true).create();
JexlEvalContext ctxt = new JexlEvalContext();
@@ -405,4 +406,58 @@ public class LexicalTest {
Assert.assertNotNull(xf);
}
}
+
+ /**
+ * Context augmented with a tryCatch.
+ */
+ public static class TestContext extends JexlEvalContext {
+ public TestContext() {}
+ public TestContext(Map<String, Object> map) {
+ super(map);
+ }
+
+ /**
+ * Allows calling a script and catching its raised exception.
+ * @param tryFn the lambda to call
+ * @param catchFn the lambda catching the exception
+ * @param args the arguments to the lambda
+ * @return the tryFn result or the catchFn if an exception was raised
+ */
+ public Object tryCatch(JexlScript tryFn, JexlScript catchFn, Object... args) {
+ Object result;
+ try {
+ result = tryFn.execute(this, args);
+ } catch (Throwable xthrow) {
+ result = catchFn != null ? catchFn.execute(this, xthrow) : xthrow;
+ }
+ return result;
+ }
+ }
+
+ @Test
+ public void testContextualOptions1() throws Exception {
+ JexlFeatures f = new JexlFeatures();
+ JexlEngine jexl = new JexlBuilder().features(f).strict(true).create();
+ JexlEvalContext ctxt = new TestContext();
+ JexlOptions options = ctxt.getEngineOptions();
+ options.setSharedInstance(true);
+ options.setLexical(true);
+ options.setLexicalShade(true);
+ ctxt.set("options", options);
+ JexlScript runner = jexl.createScript(
+ "options.lexical = flag; options.lexicalShade = flag;"
+ + "tryCatch(test, catch, 42);",
+ "flag", "test", "catch");
+ JexlScript tested = jexl.createScript("(y)->{ {var x = y;} x }");
+ JexlScript catchFn = jexl.createScript("(xany)-> { xany }");
+ Object result;
+ // run it once, old 3.1 semantics, lexical/shade = false
+ result = runner.execute(ctxt, false, tested, catchFn);
+ // result 42
+ Assert.assertEquals(42, result);
+ // run it a second time, new 3.2 semantics, lexical/shade = true
+ result = runner.execute(ctxt, true, tested, catchFn);
+ // result is exception!
+ Assert.assertTrue(result instanceof JexlException.Variable);
+ }
}