You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2022/08/28 16:14:41 UTC

[commons-jexl] branch master updated: Fix typo independantly -> independently

This is an automated email from the ASF dual-hosted git repository.

ggregory 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 4956b104 Fix typo independantly -> independently
4956b104 is described below

commit 4956b10403b42d933e411ca86d019c17bc09241b
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Sun Aug 28 12:14:37 2022 -0400

    Fix typo independantly -> independently
---
 src/test/java/org/apache/commons/jexl3/IfTest.java | 900 ++++++++++-----------
 1 file changed, 450 insertions(+), 450 deletions(-)

diff --git a/src/test/java/org/apache/commons/jexl3/IfTest.java b/src/test/java/org/apache/commons/jexl3/IfTest.java
index 7f4077e9..d160907a 100644
--- a/src/test/java/org/apache/commons/jexl3/IfTest.java
+++ b/src/test/java/org/apache/commons/jexl3/IfTest.java
@@ -1,450 +1,450 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.commons.jexl3;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- * Test cases for the if statement.
- *
- * @since 1.1
- */
-@SuppressWarnings({"UnnecessaryBoxing", "AssertEqualsBetweenInconvertibleTypes"})
-public class IfTest extends JexlTestCase {
-    public IfTest() {
-        super("IfTest");
-    }
-
-    /**
-     * Make sure if true executes the true statement
-     *
-     * @throws Exception on any error
-     */
-    @Test
-    public void testSimpleIfTrue() throws Exception {
-        final JexlScript e = JEXL.createScript("if (true) 1");
-        final JexlContext jc = new MapContext();
-
-        final Object o = e.execute(jc);
-        Assert.assertEquals("Result is not 1", new Integer(1), o);
-    }
-
-    /**
-     * Make sure if false doesn't execute the true statement
-     *
-     * @throws Exception on any error
-     */
-    @Test
-    public void testSimpleIfFalse() throws Exception {
-        final JexlScript e = JEXL.createScript("if (false) 1");
-        final JexlContext jc = new MapContext();
-
-        final Object o = e.execute(jc);
-        Assert.assertNull("Return value is not empty", o);
-    }
-
-    /**
-     * Make sure if false executes the false statement
-     *
-     * @throws Exception on any error
-     */
-    @Test
-    public void testSimpleElse() throws Exception {
-        final JexlScript e = JEXL.createScript("if (false) 1 else 2;");
-        final JexlContext jc = new MapContext();
-
-        final Object o = e.execute(jc);
-        Assert.assertEquals("Result is not 2", new Integer(2), o);
-    }
-
-    /**
-     * Test the if statement handles blocks correctly
-     *
-     * @throws Exception on any error
-     */
-    @Test
-    public void testBlockIfTrue() throws Exception {
-        final JexlScript e = JEXL.createScript("if (true) { 'hello'; }");
-        final JexlContext jc = new MapContext();
-
-        final Object o = e.execute(jc);
-        Assert.assertEquals("Result is wrong", "hello", o);
-    }
-
-    /**
-     * Test the if statement handles blocks in the else statement correctly
-     *
-     * @throws Exception on any error
-     */
-    @Test
-    public void testBlockElse() throws Exception {
-        final JexlScript e = JEXL.createScript("if (false) {1} else {2 ; 3}");
-        final JexlContext jc = new MapContext();
-
-        final Object o = e.execute(jc);
-        Assert.assertEquals("Result is wrong", new Integer(3), o);
-    }
-
-    /**
-     * Test the if statement evaluates expressions correctly
-     *
-     * @throws Exception on any error
-     */
-    @Test
-    public void testIfWithSimpleExpression() throws Exception {
-        final JexlScript e = JEXL.createScript("if (x == 1) true;");
-        final JexlContext jc = new MapContext();
-        jc.set("x", new Integer(1));
-
-        final Object o = e.execute(jc);
-        Assert.assertEquals("Result is not true", Boolean.TRUE, o);
-    }
-
-    @Test
-    public void testIfElseIfExpression() throws Exception {
-        final JexlScript e = JEXL.createScript("if (x == 1) { 10; } else if (x == 2) 20  else 30", "x");
-        Object o = e.execute(null, 1);
-        Assert.assertEquals(10, o);
-        o = e.execute(null, 2);
-        Assert.assertEquals(20, o);
-        o = e.execute(null, 4);
-        Assert.assertEquals(30, o);
-    }
-
-    @Test
-    public void testIfElseIfReturnExpression0() throws Exception {
-        final JexlScript e = JEXL.createScript(
-                "if (x == 1) return 10; if (x == 2)  return 20; else if (x == 3) return 30  else { return 40 }",
-                "x");
-        Object o = e.execute(null, 1);
-        Assert.assertEquals(10, o);
-        o = e.execute(null, 2);
-        Assert.assertEquals(20, o);
-        o = e.execute(null, 3);
-        Assert.assertEquals(30, o);
-        o = e.execute(null, 4);
-        Assert.assertEquals(40, o);
-    }
-
-    @Test
-    public void testIfElseIfReturnExpression() throws Exception {
-        final JexlScript e = JEXL.createScript(
-                "if (x == 1) return 10;  if (x == 2) return 20  else if (x == 3) return 30; else return 40;",
-                "x");
-        Object o = e.execute(null, 1);
-        Assert.assertEquals(10, o);
-        o = e.execute(null, 2);
-        Assert.assertEquals(20, o);
-        o = e.execute(null, 3);
-        Assert.assertEquals(30, o);
-        o = e.execute(null, 4);
-        Assert.assertEquals(40, o);
-    }
-
-    /**
-     * Test the if statement evaluates arithmetic expressions correctly
-     *
-     * @throws Exception on any error
-     */
-    @Test
-    public void testIfWithArithmeticExpression() throws Exception {
-        final JexlScript e = JEXL.createScript("if ((x * 2) + 1 == 5) true;");
-        final JexlContext jc = new MapContext();
-        jc.set("x", new Integer(2));
-
-        final Object o = e.execute(jc);
-        Assert.assertEquals("Result is not true", Boolean.TRUE, o);
-    }
-
-    /**
-     * Test the if statement evaluates decimal arithmetic expressions correctly
-     *
-     * @throws Exception on any error
-     */
-    @Test
-    public void testIfWithDecimalArithmeticExpression() throws Exception {
-        final JexlScript e = JEXL.createScript("if ((x * 2) == 5) true");
-        final JexlContext jc = new MapContext();
-        jc.set("x", new Float(2.5f));
-
-        final Object o = e.execute(jc);
-        Assert.assertEquals("Result is not true", Boolean.TRUE, o);
-    }
-
-    /**
-     * Test the if statement works with assignment
-     *
-     * @throws Exception on any error
-     */
-    @Test
-    public void testIfWithAssignment() throws Exception {
-        final JexlScript e = JEXL.createScript("if ((x * 2) == 5) {y = 1} else {y = 2;}");
-        final JexlContext jc = new MapContext();
-        jc.set("x", new Float(2.5f));
-
-        e.execute(jc);
-        final Object result = jc.get("y");
-        Assert.assertEquals("y has the wrong value", new Integer(1), result);
-    }
-
-    /**
-     * Ternary operator condition undefined or null evaluates to false
-     * independantly of engine flags.
-     * @throws Exception
-     */
-    @Test
-    public void testTernary() throws Exception {
-        final JexlEngine jexl = JEXL;
-
-        final JexlEvalContext jc = new JexlEvalContext();
-        final JexlOptions options = jc.getEngineOptions();
-        final JexlExpression e = jexl.createExpression("x.y.z = foo ?'bar':'quux'");
-        Object o;
-
-        // undefined foo
-        for (int l = 0; l < 4; ++l) {
-            options.setStrict((l & 1) == 0);
-            options.setSilent((l & 2) != 0);
-            o = e.evaluate(jc);
-            Assert.assertEquals("Should be quux", "quux", o);
-            o = jc.get("x.y.z");
-            Assert.assertEquals("Should be quux", "quux", o);
-        }
-
-        jc.set("foo", null);
-
-        for (int l = 0; l < 4; ++l) {
-            options.setStrict((l & 1) == 0);
-            options.setSilent((l & 2) != 0);
-            o = e.evaluate(jc);
-            Assert.assertEquals("Should be quux", "quux", o);
-            o = jc.get("x.y.z");
-            Assert.assertEquals("Should be quux", "quux", o);
-        }
-
-        jc.set("foo", Boolean.FALSE);
-
-        for (int l = 0; l < 4; ++l) {
-            options.setStrict((l & 1) == 0);
-            options.setSilent((l & 2) != 0);
-            o = e.evaluate(jc);
-            Assert.assertEquals("Should be quux", "quux", o);
-            o = jc.get("x.y.z");
-            Assert.assertEquals("Should be quux", "quux", o);
-        }
-
-        jc.set("foo", Boolean.TRUE);
-
-        for (int l = 0; l < 4; ++l) {
-            options.setStrict((l & 1) == 0);
-            options.setSilent((l & 2) != 0);
-            o = e.evaluate(jc);
-            Assert.assertEquals("Should be bar", "bar", o);
-            o = jc.get("x.y.z");
-            Assert.assertEquals("Should be bar", "bar", o);
-        }
-
-        debuggerCheck(jexl);
-    }
-
-    /**
-     * Ternary operator condition undefined or null evaluates to false
-     * independently of engine flags; same for null coalescing operator.
-     * @throws Exception
-     */
-    @Test
-    public void testTernaryShorthand() throws Exception {
-        final JexlEvalContext jc = new JexlEvalContext();
-        final JexlOptions options = jc.getEngineOptions();
-        final JexlExpression e = JEXL.createExpression("x.y.z = foo?:'quux'");
-        final JexlExpression f = JEXL.createExpression("foo??'quux'");
-        Object o;
-
-        // undefined foo
-        for (int l = 0; l < 4; ++l) {
-            options.setStrict((l & 1) == 0);
-            options.setSilent((l & 2) != 0);
-            o = e.evaluate(jc);
-            Assert.assertEquals("Should be quux", "quux", o);
-            o = jc.get("x.y.z");
-            Assert.assertEquals("Should be quux", "quux", o);
-            o = f.evaluate(jc);
-            Assert.assertEquals("Should be quux", "quux", o);
-        }
-
-        jc.set("foo", null);
-
-        for (int l = 0; l < 4; ++l) {
-            options.setStrict((l & 1) == 0);
-            options.setSilent((l & 2) != 0);
-            o = e.evaluate(jc);
-            Assert.assertEquals("Should be quux", "quux", o);
-            o = jc.get("x.y.z");
-            Assert.assertEquals("Should be quux", "quux", o);
-            o = f.evaluate(jc);
-            Assert.assertEquals("Should be quux", "quux", o);
-        }
-
-        jc.set("foo", Boolean.FALSE);
-
-        for (int l = 0; l < 4; ++l) {
-            options.setStrict((l & 1) == 0);
-            options.setSilent((l & 2) != 0);
-            o = e.evaluate(jc);
-            Assert.assertEquals("Should be quux", "quux", o);
-            o = jc.get("x.y.z");
-            Assert.assertEquals("Should be quux", "quux", o);
-            o = f.evaluate(jc);
-            Assert.assertEquals("Should be false", false, o);
-        }
-
-        jc.set("foo", Double.NaN);
-
-        for (int l = 0; l < 4; ++l) {
-            options.setStrict((l & 1) == 0);
-            options.setSilent((l & 2) != 0);
-            o = e.evaluate(jc);
-            Assert.assertEquals("Should be quux", "quux", o);
-            o = jc.get("x.y.z");
-            Assert.assertEquals("Should be quux", "quux", o);
-            o = f.evaluate(jc);
-            Assert.assertTrue("Should be NaN", Double.isNaN((Double) o));
-        }
-
-        jc.set("foo", "");
-
-        for (int l = 0; l < 4; ++l) {
-            options.setStrict((l & 1) == 0);
-            options.setSilent((l & 2) != 0);
-            o = e.evaluate(jc);
-            Assert.assertEquals("Should be quux", "quux", o);
-            o = jc.get("x.y.z");
-            Assert.assertEquals("Should be quux", "quux", o);
-            o = f.evaluate(jc);
-            Assert.assertEquals("Should be empty string", "", o);
-        }
-
-        jc.set("foo", "false");
-
-        for (int l = 0; l < 4; ++l) {
-            options.setStrict((l & 1) == 0);
-            options.setSilent((l & 2) != 0);
-            o = e.evaluate(jc);
-            Assert.assertEquals("Should be quux", "quux", o);
-            o = jc.get("x.y.z");
-            Assert.assertEquals("Should be quux", "quux", o);
-            o = f.evaluate(jc);
-            Assert.assertEquals("Should be 'false'", "false", o);
-        }
-
-        jc.set("foo", 0d);
-
-        for (int l = 0; l < 4; ++l) {
-            options.setStrict((l & 1) == 0);
-            options.setSilent((l & 2) != 0);
-            o = e.evaluate(jc);
-            Assert.assertEquals("Should be quux", "quux", o);
-            o = jc.get("x.y.z");
-            Assert.assertEquals("Should be quux", "quux", o);
-            o = f.evaluate(jc);
-            Assert.assertEquals("Should be 0", 0.d, o);
-        }
-
-        jc.set("foo", 0);
-
-        for (int l = 0; l < 4; ++l) {
-            options.setStrict((l & 1) == 0);
-            options.setSilent((l & 2) != 0);
-            o = e.evaluate(jc);
-            Assert.assertEquals("Should be quux", "quux", o);
-            o = jc.get("x.y.z");
-            Assert.assertEquals("Should be quux", "quux", o);
-            o = f.evaluate(jc);
-            Assert.assertEquals("Should be 0", 0, o);
-        }
-
-        jc.set("foo", "bar");
-
-        for (int l = 0; l < 4; ++l) {
-            options.setStrict((l & 1) == 0);
-            options.setSilent((l & 2) != 0);
-            o = e.evaluate(jc);
-            Assert.assertEquals("Should be bar", "bar", o);
-            o = jc.get("x.y.z");
-            Assert.assertEquals("Should be bar", "bar", o);
-        }
-
-        debuggerCheck(JEXL);
-    }
-
-    @Test
-    public void testNullCoaelescing() throws Exception {
-        Object o;
-        final JexlEvalContext jc = new JexlEvalContext();
-        final JexlExpression xtrue = JEXL.createExpression("x??true");
-        o = xtrue.evaluate(jc);
-        Assert.assertEquals("Should be true", true, o);
-        jc.set("x", false);
-        o = xtrue.evaluate(jc);
-        Assert.assertEquals("Should be false", false, o);
-        final JexlExpression yone = JEXL.createExpression("y??1");
-        o = yone.evaluate(jc);
-        Assert.assertEquals("Should be 1", 1, o);
-        jc.set("y", 0);
-        o = yone.evaluate(jc);
-        Assert.assertEquals("Should be 0", 0, o);
-        debuggerCheck(JEXL);
-    }
-
-    @Test
-    public void testNullCoaelescingScript() throws Exception {
-        Object o;
-        final JexlEvalContext jc = new JexlEvalContext();
-        final JexlScript xtrue = JEXL.createScript("x??true");
-        o = xtrue.execute(jc);
-        Assert.assertEquals("Should be true", true, o);
-        jc.set("x", false);
-        o = xtrue.execute(jc);
-        Assert.assertEquals("Should be false", false, o);
-        final JexlScript yone = JEXL.createScript("y??1");
-        o = yone.execute(jc);
-        Assert.assertEquals("Should be 1", 1, o);
-        jc.set("y", 0);
-        o = yone.execute(jc);
-        Assert.assertEquals("Should be 0", 0, o);
-        debuggerCheck(JEXL);
-    }
-
-
-    @Test
-    public void testTernaryFail() throws Exception {
-        final JexlEvalContext jc = new JexlEvalContext();
-        final JexlOptions options = jc.getEngineOptions();
-        final JexlExpression e = JEXL.createExpression("false ? bar : quux");
-        Object o;
-        options.setStrict(true);
-        options.setSilent(false);
-        try {
-           o = e.evaluate(jc);
-           Assert.fail("Should have failed");
-        } catch (final JexlException xjexl) {
-           // OK
-           Assert.assertTrue(xjexl.toString().contains("quux"));
-        }
-    }
-}
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.jexl3;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+/**
+ * Test cases for the if statement.
+ *
+ * @since 1.1
+ */
+@SuppressWarnings({"UnnecessaryBoxing", "AssertEqualsBetweenInconvertibleTypes"})
+public class IfTest extends JexlTestCase {
+    public IfTest() {
+        super("IfTest");
+    }
+
+    /**
+     * Make sure if true executes the true statement
+     *
+     * @throws Exception on any error
+     */
+    @Test
+    public void testSimpleIfTrue() throws Exception {
+        final JexlScript e = JEXL.createScript("if (true) 1");
+        final JexlContext jc = new MapContext();
+
+        final Object o = e.execute(jc);
+        Assert.assertEquals("Result is not 1", new Integer(1), o);
+    }
+
+    /**
+     * Make sure if false doesn't execute the true statement
+     *
+     * @throws Exception on any error
+     */
+    @Test
+    public void testSimpleIfFalse() throws Exception {
+        final JexlScript e = JEXL.createScript("if (false) 1");
+        final JexlContext jc = new MapContext();
+
+        final Object o = e.execute(jc);
+        Assert.assertNull("Return value is not empty", o);
+    }
+
+    /**
+     * Make sure if false executes the false statement
+     *
+     * @throws Exception on any error
+     */
+    @Test
+    public void testSimpleElse() throws Exception {
+        final JexlScript e = JEXL.createScript("if (false) 1 else 2;");
+        final JexlContext jc = new MapContext();
+
+        final Object o = e.execute(jc);
+        Assert.assertEquals("Result is not 2", new Integer(2), o);
+    }
+
+    /**
+     * Test the if statement handles blocks correctly
+     *
+     * @throws Exception on any error
+     */
+    @Test
+    public void testBlockIfTrue() throws Exception {
+        final JexlScript e = JEXL.createScript("if (true) { 'hello'; }");
+        final JexlContext jc = new MapContext();
+
+        final Object o = e.execute(jc);
+        Assert.assertEquals("Result is wrong", "hello", o);
+    }
+
+    /**
+     * Test the if statement handles blocks in the else statement correctly
+     *
+     * @throws Exception on any error
+     */
+    @Test
+    public void testBlockElse() throws Exception {
+        final JexlScript e = JEXL.createScript("if (false) {1} else {2 ; 3}");
+        final JexlContext jc = new MapContext();
+
+        final Object o = e.execute(jc);
+        Assert.assertEquals("Result is wrong", new Integer(3), o);
+    }
+
+    /**
+     * Test the if statement evaluates expressions correctly
+     *
+     * @throws Exception on any error
+     */
+    @Test
+    public void testIfWithSimpleExpression() throws Exception {
+        final JexlScript e = JEXL.createScript("if (x == 1) true;");
+        final JexlContext jc = new MapContext();
+        jc.set("x", new Integer(1));
+
+        final Object o = e.execute(jc);
+        Assert.assertEquals("Result is not true", Boolean.TRUE, o);
+    }
+
+    @Test
+    public void testIfElseIfExpression() throws Exception {
+        final JexlScript e = JEXL.createScript("if (x == 1) { 10; } else if (x == 2) 20  else 30", "x");
+        Object o = e.execute(null, 1);
+        Assert.assertEquals(10, o);
+        o = e.execute(null, 2);
+        Assert.assertEquals(20, o);
+        o = e.execute(null, 4);
+        Assert.assertEquals(30, o);
+    }
+
+    @Test
+    public void testIfElseIfReturnExpression0() throws Exception {
+        final JexlScript e = JEXL.createScript(
+                "if (x == 1) return 10; if (x == 2)  return 20; else if (x == 3) return 30  else { return 40 }",
+                "x");
+        Object o = e.execute(null, 1);
+        Assert.assertEquals(10, o);
+        o = e.execute(null, 2);
+        Assert.assertEquals(20, o);
+        o = e.execute(null, 3);
+        Assert.assertEquals(30, o);
+        o = e.execute(null, 4);
+        Assert.assertEquals(40, o);
+    }
+
+    @Test
+    public void testIfElseIfReturnExpression() throws Exception {
+        final JexlScript e = JEXL.createScript(
+                "if (x == 1) return 10;  if (x == 2) return 20  else if (x == 3) return 30; else return 40;",
+                "x");
+        Object o = e.execute(null, 1);
+        Assert.assertEquals(10, o);
+        o = e.execute(null, 2);
+        Assert.assertEquals(20, o);
+        o = e.execute(null, 3);
+        Assert.assertEquals(30, o);
+        o = e.execute(null, 4);
+        Assert.assertEquals(40, o);
+    }
+
+    /**
+     * Test the if statement evaluates arithmetic expressions correctly
+     *
+     * @throws Exception on any error
+     */
+    @Test
+    public void testIfWithArithmeticExpression() throws Exception {
+        final JexlScript e = JEXL.createScript("if ((x * 2) + 1 == 5) true;");
+        final JexlContext jc = new MapContext();
+        jc.set("x", new Integer(2));
+
+        final Object o = e.execute(jc);
+        Assert.assertEquals("Result is not true", Boolean.TRUE, o);
+    }
+
+    /**
+     * Test the if statement evaluates decimal arithmetic expressions correctly
+     *
+     * @throws Exception on any error
+     */
+    @Test
+    public void testIfWithDecimalArithmeticExpression() throws Exception {
+        final JexlScript e = JEXL.createScript("if ((x * 2) == 5) true");
+        final JexlContext jc = new MapContext();
+        jc.set("x", new Float(2.5f));
+
+        final Object o = e.execute(jc);
+        Assert.assertEquals("Result is not true", Boolean.TRUE, o);
+    }
+
+    /**
+     * Test the if statement works with assignment
+     *
+     * @throws Exception on any error
+     */
+    @Test
+    public void testIfWithAssignment() throws Exception {
+        final JexlScript e = JEXL.createScript("if ((x * 2) == 5) {y = 1} else {y = 2;}");
+        final JexlContext jc = new MapContext();
+        jc.set("x", new Float(2.5f));
+
+        e.execute(jc);
+        final Object result = jc.get("y");
+        Assert.assertEquals("y has the wrong value", new Integer(1), result);
+    }
+
+    /**
+     * Ternary operator condition undefined or null evaluates to false
+     * independently of engine flags.
+     * @throws Exception
+     */
+    @Test
+    public void testTernary() throws Exception {
+        final JexlEngine jexl = JEXL;
+
+        final JexlEvalContext jc = new JexlEvalContext();
+        final JexlOptions options = jc.getEngineOptions();
+        final JexlExpression e = jexl.createExpression("x.y.z = foo ?'bar':'quux'");
+        Object o;
+
+        // undefined foo
+        for (int l = 0; l < 4; ++l) {
+            options.setStrict((l & 1) == 0);
+            options.setSilent((l & 2) != 0);
+            o = e.evaluate(jc);
+            Assert.assertEquals("Should be quux", "quux", o);
+            o = jc.get("x.y.z");
+            Assert.assertEquals("Should be quux", "quux", o);
+        }
+
+        jc.set("foo", null);
+
+        for (int l = 0; l < 4; ++l) {
+            options.setStrict((l & 1) == 0);
+            options.setSilent((l & 2) != 0);
+            o = e.evaluate(jc);
+            Assert.assertEquals("Should be quux", "quux", o);
+            o = jc.get("x.y.z");
+            Assert.assertEquals("Should be quux", "quux", o);
+        }
+
+        jc.set("foo", Boolean.FALSE);
+
+        for (int l = 0; l < 4; ++l) {
+            options.setStrict((l & 1) == 0);
+            options.setSilent((l & 2) != 0);
+            o = e.evaluate(jc);
+            Assert.assertEquals("Should be quux", "quux", o);
+            o = jc.get("x.y.z");
+            Assert.assertEquals("Should be quux", "quux", o);
+        }
+
+        jc.set("foo", Boolean.TRUE);
+
+        for (int l = 0; l < 4; ++l) {
+            options.setStrict((l & 1) == 0);
+            options.setSilent((l & 2) != 0);
+            o = e.evaluate(jc);
+            Assert.assertEquals("Should be bar", "bar", o);
+            o = jc.get("x.y.z");
+            Assert.assertEquals("Should be bar", "bar", o);
+        }
+
+        debuggerCheck(jexl);
+    }
+
+    /**
+     * Ternary operator condition undefined or null evaluates to false
+     * independently of engine flags; same for null coalescing operator.
+     * @throws Exception
+     */
+    @Test
+    public void testTernaryShorthand() throws Exception {
+        final JexlEvalContext jc = new JexlEvalContext();
+        final JexlOptions options = jc.getEngineOptions();
+        final JexlExpression e = JEXL.createExpression("x.y.z = foo?:'quux'");
+        final JexlExpression f = JEXL.createExpression("foo??'quux'");
+        Object o;
+
+        // undefined foo
+        for (int l = 0; l < 4; ++l) {
+            options.setStrict((l & 1) == 0);
+            options.setSilent((l & 2) != 0);
+            o = e.evaluate(jc);
+            Assert.assertEquals("Should be quux", "quux", o);
+            o = jc.get("x.y.z");
+            Assert.assertEquals("Should be quux", "quux", o);
+            o = f.evaluate(jc);
+            Assert.assertEquals("Should be quux", "quux", o);
+        }
+
+        jc.set("foo", null);
+
+        for (int l = 0; l < 4; ++l) {
+            options.setStrict((l & 1) == 0);
+            options.setSilent((l & 2) != 0);
+            o = e.evaluate(jc);
+            Assert.assertEquals("Should be quux", "quux", o);
+            o = jc.get("x.y.z");
+            Assert.assertEquals("Should be quux", "quux", o);
+            o = f.evaluate(jc);
+            Assert.assertEquals("Should be quux", "quux", o);
+        }
+
+        jc.set("foo", Boolean.FALSE);
+
+        for (int l = 0; l < 4; ++l) {
+            options.setStrict((l & 1) == 0);
+            options.setSilent((l & 2) != 0);
+            o = e.evaluate(jc);
+            Assert.assertEquals("Should be quux", "quux", o);
+            o = jc.get("x.y.z");
+            Assert.assertEquals("Should be quux", "quux", o);
+            o = f.evaluate(jc);
+            Assert.assertEquals("Should be false", false, o);
+        }
+
+        jc.set("foo", Double.NaN);
+
+        for (int l = 0; l < 4; ++l) {
+            options.setStrict((l & 1) == 0);
+            options.setSilent((l & 2) != 0);
+            o = e.evaluate(jc);
+            Assert.assertEquals("Should be quux", "quux", o);
+            o = jc.get("x.y.z");
+            Assert.assertEquals("Should be quux", "quux", o);
+            o = f.evaluate(jc);
+            Assert.assertTrue("Should be NaN", Double.isNaN((Double) o));
+        }
+
+        jc.set("foo", "");
+
+        for (int l = 0; l < 4; ++l) {
+            options.setStrict((l & 1) == 0);
+            options.setSilent((l & 2) != 0);
+            o = e.evaluate(jc);
+            Assert.assertEquals("Should be quux", "quux", o);
+            o = jc.get("x.y.z");
+            Assert.assertEquals("Should be quux", "quux", o);
+            o = f.evaluate(jc);
+            Assert.assertEquals("Should be empty string", "", o);
+        }
+
+        jc.set("foo", "false");
+
+        for (int l = 0; l < 4; ++l) {
+            options.setStrict((l & 1) == 0);
+            options.setSilent((l & 2) != 0);
+            o = e.evaluate(jc);
+            Assert.assertEquals("Should be quux", "quux", o);
+            o = jc.get("x.y.z");
+            Assert.assertEquals("Should be quux", "quux", o);
+            o = f.evaluate(jc);
+            Assert.assertEquals("Should be 'false'", "false", o);
+        }
+
+        jc.set("foo", 0d);
+
+        for (int l = 0; l < 4; ++l) {
+            options.setStrict((l & 1) == 0);
+            options.setSilent((l & 2) != 0);
+            o = e.evaluate(jc);
+            Assert.assertEquals("Should be quux", "quux", o);
+            o = jc.get("x.y.z");
+            Assert.assertEquals("Should be quux", "quux", o);
+            o = f.evaluate(jc);
+            Assert.assertEquals("Should be 0", 0.d, o);
+        }
+
+        jc.set("foo", 0);
+
+        for (int l = 0; l < 4; ++l) {
+            options.setStrict((l & 1) == 0);
+            options.setSilent((l & 2) != 0);
+            o = e.evaluate(jc);
+            Assert.assertEquals("Should be quux", "quux", o);
+            o = jc.get("x.y.z");
+            Assert.assertEquals("Should be quux", "quux", o);
+            o = f.evaluate(jc);
+            Assert.assertEquals("Should be 0", 0, o);
+        }
+
+        jc.set("foo", "bar");
+
+        for (int l = 0; l < 4; ++l) {
+            options.setStrict((l & 1) == 0);
+            options.setSilent((l & 2) != 0);
+            o = e.evaluate(jc);
+            Assert.assertEquals("Should be bar", "bar", o);
+            o = jc.get("x.y.z");
+            Assert.assertEquals("Should be bar", "bar", o);
+        }
+
+        debuggerCheck(JEXL);
+    }
+
+    @Test
+    public void testNullCoaelescing() throws Exception {
+        Object o;
+        final JexlEvalContext jc = new JexlEvalContext();
+        final JexlExpression xtrue = JEXL.createExpression("x??true");
+        o = xtrue.evaluate(jc);
+        Assert.assertEquals("Should be true", true, o);
+        jc.set("x", false);
+        o = xtrue.evaluate(jc);
+        Assert.assertEquals("Should be false", false, o);
+        final JexlExpression yone = JEXL.createExpression("y??1");
+        o = yone.evaluate(jc);
+        Assert.assertEquals("Should be 1", 1, o);
+        jc.set("y", 0);
+        o = yone.evaluate(jc);
+        Assert.assertEquals("Should be 0", 0, o);
+        debuggerCheck(JEXL);
+    }
+
+    @Test
+    public void testNullCoaelescingScript() throws Exception {
+        Object o;
+        final JexlEvalContext jc = new JexlEvalContext();
+        final JexlScript xtrue = JEXL.createScript("x??true");
+        o = xtrue.execute(jc);
+        Assert.assertEquals("Should be true", true, o);
+        jc.set("x", false);
+        o = xtrue.execute(jc);
+        Assert.assertEquals("Should be false", false, o);
+        final JexlScript yone = JEXL.createScript("y??1");
+        o = yone.execute(jc);
+        Assert.assertEquals("Should be 1", 1, o);
+        jc.set("y", 0);
+        o = yone.execute(jc);
+        Assert.assertEquals("Should be 0", 0, o);
+        debuggerCheck(JEXL);
+    }
+
+
+    @Test
+    public void testTernaryFail() throws Exception {
+        final JexlEvalContext jc = new JexlEvalContext();
+        final JexlOptions options = jc.getEngineOptions();
+        final JexlExpression e = JEXL.createExpression("false ? bar : quux");
+        Object o;
+        options.setStrict(true);
+        options.setSilent(false);
+        try {
+           o = e.evaluate(jc);
+           Assert.fail("Should have failed");
+        } catch (final JexlException xjexl) {
+           // OK
+           Assert.assertTrue(xjexl.toString().contains("quux"));
+        }
+    }
+}