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
commit e8cfc9181d7ae2512b2046f5316035086e2dd1cf Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Sat Jun 1 16:12:37 2024 -0400 Normalize formatting --- .../org/apache/commons/jexl3/Issues400Test.java | 763 +++++++++++---------- 1 file changed, 390 insertions(+), 373 deletions(-) diff --git a/src/test/java/org/apache/commons/jexl3/Issues400Test.java b/src/test/java/org/apache/commons/jexl3/Issues400Test.java index 688c6c08..b6cff99f 100644 --- a/src/test/java/org/apache/commons/jexl3/Issues400Test.java +++ b/src/test/java/org/apache/commons/jexl3/Issues400Test.java @@ -31,6 +31,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Objects; import java.util.concurrent.atomic.AtomicLong; @@ -43,407 +44,423 @@ import org.junit.jupiter.api.Test; */ public class Issues400Test { - public static class VinzCaller { - private final JexlContext context; - VinzCaller(final JexlContext context) { - this.context = context; - } - public Object execute(final JexlScript script) { - return script.execute(context); - } - } - - public static class VinzContext extends MapContext { - public String member(final String m, final String u) { - return m + '.' + u; - } - } + public static class VinzCaller { + private final JexlContext context; - /** - * Any function in a context can be used as a method of its first parameter. - * Overloads are respected. - */ - public static class XuContext extends MapContext { + VinzCaller(final JexlContext context) { + this.context = context; + } - public String join(final int[] list, final String str) { - return join(Arrays.stream(list).iterator(), str); + public Object execute(final JexlScript script) { + return script.execute(context); + } } - public String join(final Iterable<?> list, final String str) { - return join(list.iterator(), str); + public static class VinzContext extends MapContext { + public String member(final String m, final String u) { + return m + '.' + u; + } } - public String join(final Iterator<?> iterator, final String str) { - if (!iterator.hasNext()) { - return ""; - } - final StringBuilder strb = new StringBuilder(256); - strb.append(iterator.next().toString()); - while(iterator.hasNext()) { - strb.append(str); - strb.append(Objects.toString(iterator.next(), "?")); - } - return strb.toString(); + /** + * Any function in a context can be used as a method of its first parameter. Overloads are respected. + */ + public static class XuContext extends MapContext { + + public String join(final int[] list, final String str) { + return join(Arrays.stream(list).iterator(), str); + } + + public String join(final Iterable<?> list, final String str) { + return join(list.iterator(), str); + } + + public String join(final Iterator<?> iterator, final String str) { + if (!iterator.hasNext()) { + return ""; + } + final StringBuilder strb = new StringBuilder(256); + strb.append(iterator.next().toString()); + while (iterator.hasNext()) { + strb.append(str); + strb.append(Objects.toString(iterator.next(), "?")); + } + return strb.toString(); + } } - } - private static void run404(final JexlEngine jexl, final String src, final Object...a) { - try { - final JexlScript script = jexl.createScript(src, "a", "b"); - if (!src.endsWith(";")) { - assertEquals(script.getSourceText(), script.getParsedText()); - } - final Object result = script.execute(null, a); - assertEquals(42, result); - } catch(final JexlException.Parsing xparse) { - fail(src); + private static void run404(final JexlEngine jexl, final String src, final Object... a) { + try { + final JexlScript script = jexl.createScript(src, "a", "b"); + if (!src.endsWith(";")) { + assertEquals(script.getSourceText(), script.getParsedText()); + } + final Object result = script.execute(null, a); + assertEquals(42, result); + } catch (final JexlException.Parsing xparse) { + fail(src); + } } - } - @Test - public void test402() { - final JexlContext jc = new MapContext(); - final String[] sources = { + @Test + public void test402() { + final JexlContext jc = new MapContext(); + // @formatter:off + final String[] sources = { "if (true) { return }", "if (true) { 3; return }", "(x->{ 3; return })()" - }; - final JexlEngine jexl = new JexlBuilder().create(); - for (final String source : sources) { - final JexlScript e = jexl.createScript(source); - final Object o = e.execute(jc); - assertNull(o); + }; + // @formatter:on + final JexlEngine jexl = new JexlBuilder().create(); + for (final String source : sources) { + final JexlScript e = jexl.createScript(source); + final Object o = e.execute(jc); + assertNull(o); + } } - } - - @Test - public void test403() { - for(final String setmap : new String[]{ - " map1.`${item.a}` = 1;\n", - " map1[`${item.a}`] = 1;\n", - " map1[item.a] = 1;\n" - }) { - final String src = "var a = {'a': 1};\n" + - "var list = [a, a];\n" + - "let map1 = {:};\n" + - "for (var item : list) {\n" + - setmap + - "}\n " + - "map1"; - final JexlEngine jexl = new JexlBuilder().cache(64).create(); - final JexlScript script = jexl.createScript(src); - for (int i = 0; i < 2; ++i) { - final Object result = script.execute(null); - assertTrue(result instanceof Map); - final Map<?, ?> map = (Map<?, ?>) result; - assertEquals(1, map.size()); - assertTrue(map.containsKey(1)); - assertTrue(map.containsValue(1)); - } + + @Test + public void test403() { + // @formatter:off + final String[] strings = new String[]{ + " map1.`${item.a}` = 1;\n", + " map1[`${item.a}`] = 1;\n", + " map1[item.a] = 1;\n" + }; + // @formatter:on + for (final String setmap : strings) { + // @formatter:off + final String src = "var a = {'a': 1};\n" + + "var list = [a, a];\n" + + "let map1 = {:};\n" + + "for (var item : list) {\n" + + setmap + + "}\n " + + "map1"; + // @formatter:on + final JexlEngine jexl = new JexlBuilder().cache(64).create(); + final JexlScript script = jexl.createScript(src); + for (int i = 0; i < 2; ++i) { + final Object result = script.execute(null); + assertTrue(result instanceof Map); + final Map<?, ?> map = (Map<?, ?>) result; + assertEquals(1, map.size()); + assertTrue(map.containsKey(1)); + assertTrue(map.containsValue(1)); + } + } } - } - - @Test - public void test404a() { - final JexlEngine jexl = new JexlBuilder() - .cache(64) - .strict(true) - .safe(false) - .create(); - Map<String,Object> a = Collections.singletonMap("b", 42); - // access is constant - for(final String src : new String[]{ "a.b", "a?.b", "a['b']", "a?['b']", "a?.`b`"}) { - run404(jexl, src, a); - run404(jexl, src + ";", a); + + @Test + public void test404a() { + final JexlEngine jexl = new JexlBuilder().cache(64).strict(true).safe(false).create(); + Map<String, Object> a = Collections.singletonMap("b", 42); + // access is constant + for (final String src : new String[] { "a.b", "a?.b", "a['b']", "a?['b']", "a?.`b`" }) { + run404(jexl, src, a); + run404(jexl, src + ";", a); + } + // access is variable + for (final String src : new String[] { "a[b]", "a?[b]", "a?.`${b}`" }) { + run404(jexl, src, a, "b"); + run404(jexl, src + ";", a, "b"); + } + // add a 3rd access + final Map<String, Object> b = Collections.singletonMap("c", 42); + a = Collections.singletonMap("b", b); + for (final String src : new String[] { "a[b].c", "a?[b]?['c']", "a?.`${b}`.c" }) { + run404(jexl, src, a, "b"); + } } - // access is variable - for(final String src : new String[]{ "a[b]", "a?[b]", "a?.`${b}`"}) { - run404(jexl, src, a, "b"); - run404(jexl, src + ";", a, "b"); + + @Test + public void test404b() { + // @formatter:off + final JexlEngine jexl = new JexlBuilder() + .cache(64) + .strict(true) + .safe(false) + .create(); + // @formatter:on + final Map<String, Object> b = Collections.singletonMap("c", 42); + final Map<String, Object> a = Collections.singletonMap("b", b); + JexlScript script; + Object result = -42; + script = jexl.createScript("a?['B']?['C']", "a"); + result = script.execute(null, a); + assertEquals(script.getSourceText(), script.getParsedText()); + assertNull(result); + script = jexl.createScript("a?['b']?['C']", "a"); + assertEquals(script.getSourceText(), script.getParsedText()); + result = script.execute(null, a); + assertNull(result); + script = jexl.createScript("a?['b']?['c']", "a"); + assertEquals(script.getSourceText(), script.getParsedText()); + result = script.execute(null, a); + assertEquals(42, result); + script = jexl.createScript("a?['B']?['C']?: 1042", "a"); + assertEquals(script.getSourceText(), script.getParsedText()); + result = script.execute(null, a); + assertEquals(1042, result); + // can still do ternary, note the space between ? and [ + script = jexl.createScript("a? ['B']:['C']", "a"); + result = script.execute(null, a); + assertArrayEquals(new String[] { "B" }, (String[]) result); + script = jexl.createScript("a?['b'] ?: ['C']", "a"); + result = script.execute(null, a); + assertEquals(b, result); + script = jexl.createScript("a?['B'] ?: ['C']", "a"); + result = script.execute(null, a); + assertArrayEquals(new String[] { "C" }, (String[]) result); } - // add a 3rd access - final Map<String,Object> b = Collections.singletonMap("c", 42); - a = Collections.singletonMap("b", b); - for(final String src : new String[]{ "a[b].c", "a?[b]?['c']", "a?.`${b}`.c"}) { - run404(jexl, src, a, "b"); + + @Test + public void test406a() { + // @formatter:off + final JexlEngine jexl = new JexlBuilder() + .cache(64) + .strict(true) + .safe(false) + .create(); + // @formatter:on + + final JexlContext context = new XuContext(); + // @formatter:off + final List<String> list = Arrays.asList( + "[1, 2, 3, 4, ...].join('-')", // List<Integer> + "[1, 2, 3, 4,].join('-')", // int[] + "(1 .. 4).join('-')", // iterable<Integer> + "join([1, 2, 3, 4, ...], '-')", + "join([1, 2, 3, 4], '-')", + "join((1 .. 4), '-')"); + // @formatter:on + for (final String src : list) { + final JexlScript script = jexl.createScript(src); + final Object result = script.execute(context); + assertEquals("1-2-3-4", result, src); + } + + final String src0 = "x.join('*')"; + final JexlScript script0 = jexl.createScript(src0, "x"); + final String src1 = "join(x, '*')"; + final JexlScript script1 = jexl.createScript(src1, "x"); + for (final Object x : Arrays.asList(Arrays.asList(1, 2, 3, 4), new int[] { 1, 2, 3, 4 })) { + Object result = script0.execute(context, x); + assertEquals("1*2*3*4", result, src0); + result = script1.execute(context, x); + assertEquals("1*2*3*4", result, src1); + } } - } - - @Test - public void test404b() { - final JexlEngine jexl = new JexlBuilder() - .cache(64) - .strict(true) - .safe(false) - .create(); - final Map<String, Object> b = Collections.singletonMap("c", 42); - final Map<String, Object> a = Collections.singletonMap("b", b); - JexlScript script; - Object result = -42; - script = jexl.createScript("a?['B']?['C']", "a"); - result = script.execute(null, a); - assertEquals(script.getSourceText(), script.getParsedText()); - assertNull(result); - script = jexl.createScript("a?['b']?['C']", "a"); - assertEquals(script.getSourceText(), script.getParsedText()); - result = script.execute(null, a); - assertNull(result); - script = jexl.createScript("a?['b']?['c']", "a"); - assertEquals(script.getSourceText(), script.getParsedText()); - result = script.execute(null, a); - assertEquals(42, result); - script = jexl.createScript("a?['B']?['C']?: 1042", "a"); - assertEquals(script.getSourceText(), script.getParsedText()); - result = script.execute(null, a); - assertEquals(1042, result); - // can still do ternary, note the space between ? and [ - script = jexl.createScript("a? ['B']:['C']", "a"); - result = script.execute(null, a); - assertArrayEquals(new String[]{"B"}, (String[]) result); - script = jexl.createScript("a?['b'] ?: ['C']", "a"); - result = script.execute(null, a); - assertEquals(b, result); - script = jexl.createScript("a?['B'] ?: ['C']", "a"); - result = script.execute(null, a); - assertArrayEquals(new String[]{"C"}, (String[]) result); - } - - @Test - public void test406a() { - final JexlEngine jexl = new JexlBuilder() - .cache(64) - .strict(true) - .safe(false) - .create(); - - final JexlContext context = new XuContext(); - for(final String src : Arrays.asList( - "[1, 2, 3, 4, ...].join('-')", // List<Integer> - "[1, 2, 3, 4,].join('-')", // int[] - "(1 .. 4).join('-')", // iterable<Integer> - "join([1, 2, 3, 4, ...], '-')", - "join([1, 2, 3, 4], '-')", - "join((1 .. 4), '-')")) { - final JexlScript script = jexl.createScript(src); - final Object result = script.execute(context); - assertEquals("1-2-3-4", result, src); + + @Test + public void test407() { + // Java version + final double r = 99.0d + 7.82d - 99.0d - 7.82d; + assertEquals(0d, r, 8.e-15); // Not zero, IEEE 754 + // jexl + final JexlEngine jexl = new JexlBuilder().create(); + final JexlScript script = jexl.createScript("a + b - a - b", "a", "b"); + // using doubles, same as Java + Number result = (Number) script.execute(null, 99.0d, 7.82d); + assertEquals(0d, result.doubleValue(), 8.e-15); + // using BigdDecimal, more precise, still not zero + result = (Number) script.execute(null, new BigDecimal(99.0d), new BigDecimal(7.82d)); + assertEquals(0d, result.doubleValue(), 3.e-32); } - final String src0 = "x.join('*')"; - final JexlScript script0 = jexl.createScript(src0, "x"); - final String src1 = "join(x, '*')"; - final JexlScript script1 = jexl.createScript(src1, "x"); - for(final Object x : Arrays.asList( - Arrays.asList(1, 2, 3, 4), - new int[]{1, 2, 3, 4})) { - Object result = script0.execute(context, x); - assertEquals("1*2*3*4", result, src0); - result = script1.execute(context, x); - assertEquals("1*2*3*4", result, src1); + @Test + public void test412() { + final Map<Object, Object> ctl = new HashMap<>(); + ctl.put("one", 1); + ctl.put("two", 2); + final String fnsrc0 = "function f(x) { x }\n" + "let one = 'one', two = 'two';\n"; + // @formatter:off + final List<String> list = Arrays.asList( + "{ one : f(1), two:f(2) }", + "{ one: f(1), two: f(2) }", + "{ one: f(1), two:f(2) }", + "{ one :f(1), two:f(2) }"); + // @formatter:on + for (final String map0 : list) { + final String fnsrc = fnsrc0 + map0; + final JexlContext jc = new MapContext(); + final JexlEngine jexl = new JexlBuilder().create(); + try { + final JexlScript e = jexl.createScript(fnsrc); + final Object o = e.execute(jc); + assertTrue(o instanceof Map); + final Map<?, ?> map = (Map<?, ?>) o; + assertEquals(map, ctl); + } catch (final JexlException xother) { + fail(fnsrc + " : " + xother.getMessage()); + } + } } - } - - @Test - public void test407() { - // Java version - final double r = 99.0d + 7.82d -99.0d -7.82d; - assertEquals(0d, r, 8.e-15); // Not zero, IEEE 754 - // jexl - final JexlEngine jexl = new JexlBuilder().create(); - final JexlScript script = jexl.createScript("a + b - a - b", "a", "b"); - // using doubles, same as Java - Number result = (Number) script.execute(null, 99.0d, 7.82d); - assertEquals(0d, result.doubleValue(), 8.e-15); - // using BigdDecimal, more precise, still not zero - result = (Number) script.execute(null, new BigDecimal(99.0d), new BigDecimal(7.82d)); - assertEquals(0d, result.doubleValue(), 3.e-32); - } - - @Test - public void test412() { - final Map<Object, Object> ctl = new HashMap<>(); - ctl.put("one", 1); - ctl.put("two", 2); - final String fnsrc0 = "function f(x) { x }\n" + - "let one = 'one', two = 'two';\n"; - for(final String map0 : Arrays.asList( - "{ one : f(1), two:f(2) }", - "{ one: f(1), two: f(2) }", - "{ one: f(1), two:f(2) }", - "{ one :f(1), two:f(2) }")) { - final String fnsrc = fnsrc0 + map0; - final JexlContext jc = new MapContext(); - final JexlEngine jexl = new JexlBuilder().create(); - try { - final JexlScript e = jexl.createScript(fnsrc); - final Object o = e.execute(jc); - assertTrue(o instanceof Map); - final Map<?, ?> map = (Map<?, ?>) o; - assertEquals(map, ctl); - } catch (final JexlException xother) { - fail(fnsrc + " : " + xother.getMessage()); - } + + @Test + public void test413a() { + final JexlBuilder builder = new JexlBuilder(); + final JexlEngine jexl = builder.create(); + final JexlScript script = jexl.createScript("var c = 42; var f = y -> c += y; f(z)", "z"); + final Number result = (Number) script.execute(null, 12); + assertEquals(54, result); } - } - - @Test - public void test413a() { - final JexlBuilder builder = new JexlBuilder(); - final JexlEngine jexl = builder.create(); - final JexlScript script = jexl.createScript("var c = 42; var f = y -> c += y; f(z)", "z"); - final Number result = (Number) script.execute(null, 12); - assertEquals(54, result); - } - - @Test - public void test413b() { - final JexlBuilder builder = new JexlBuilder(); - final JexlOptions options = builder.options(); - options.setConstCapture(true); - options.setLexical(true); - final JexlEngine jexl = builder.create(); - final JexlScript script = jexl.createScript("var c = 42; var f = y -> c += y; f(z)", "z"); - try { - final Number result = (Number) script.execute(null, 12); - fail("c should be const"); - } catch(final JexlException.Variable xvar) { - assertEquals("c", xvar.getVariable()); + + @Test + public void test413b() { + final JexlBuilder builder = new JexlBuilder(); + final JexlOptions options = builder.options(); + options.setConstCapture(true); + options.setLexical(true); + final JexlEngine jexl = builder.create(); + final JexlScript script = jexl.createScript("var c = 42; var f = y -> c += y; f(z)", "z"); + try { + final Number result = (Number) script.execute(null, 12); + fail("c should be const"); + } catch (final JexlException.Variable xvar) { + assertEquals("c", xvar.getVariable()); + } } - } - - @Test - public void test413c() { - final JexlBuilder builder = new JexlBuilder(); - final JexlEngine jexl = builder.create(); - final JexlScript script = jexl.createScript("#pragma jexl.options '+constCapture'\nvar c = 42; var f = y -> c += y; f(z)", "z"); - try { - final Number result = (Number) script.execute(null, 12); - fail("c should be const"); - } catch(final JexlException.Variable xvar) { - assertEquals("c", xvar.getVariable()); + + @Test + public void test413c() { + final JexlBuilder builder = new JexlBuilder(); + final JexlEngine jexl = builder.create(); + final JexlScript script = jexl.createScript("#pragma jexl.options '+constCapture'\nvar c = 42; var f = y -> c += y; f(z)", "z"); + try { + final Number result = (Number) script.execute(null, 12); + fail("c should be const"); + } catch (final JexlException.Variable xvar) { + assertEquals("c", xvar.getVariable()); + } } - } - - @Test - public void test413d() { - final JexlBuilder builder = new JexlBuilder().features(new JexlFeatures().constCapture(true)); - final JexlEngine jexl = builder.create(); - try { - final JexlScript script = jexl.createScript("var c = 42; var f = y -> c += y; f(z)", "z"); - fail("c should be const"); - } catch(final JexlException.Parsing xvar) { - assertTrue(xvar.getMessage().contains("const")); + + @Test + public void test413d() { + final JexlBuilder builder = new JexlBuilder().features(new JexlFeatures().constCapture(true)); + final JexlEngine jexl = builder.create(); + try { + final JexlScript script = jexl.createScript("var c = 42; var f = y -> c += y; f(z)", "z"); + fail("c should be const"); + } catch (final JexlException.Parsing xvar) { + assertTrue(xvar.getMessage().contains("const")); + } } - } - - @Test - public void test415() { - final JexlBuilder builder = new JexlBuilder().features(new JexlFeatures().constCapture(true)); - final JexlEngine jexl = builder.create(); - JexlScript script; - Object result; - script = jexl.createScript("`#${c}`", "c"); - result = script.execute(null, 42); - assertEquals("#42",result.toString() ); - script = jexl.createScript("`$${c}`", "c"); - result = script.execute(null, 42); - assertEquals("$42",result.toString() ); - script = jexl.createScript("`$#{c}`", "c"); - result = script.execute(null, 42); - assertEquals("$42",result.toString() ); - script = jexl.createScript("`##{c}`", "c"); - result = script.execute(null, 42); - assertEquals("#42",result.toString() ); - script = jexl.createScript("`--##{c}`", "c"); - result = script.execute(null, 42); - assertEquals("--#42",result.toString() ); - } - - @Test - public void test419() throws NoSuchMethodException { - // check RESTRICTED permissions denies call to System::currentTimeMillis() - final Method currentTimeMillis = System.class.getMethod("currentTimeMillis"); - assertFalse(RESTRICTED.allow(currentTimeMillis)); - // compose using a positive class permission to allow just System::currentTimeMillis() - final JexlPermissions permissions = RESTRICTED.compose("java.lang { +System { currentTimeMillis(); } }"); - // check no side effect on compose - assertTrue(permissions.allow(currentTimeMillis)); - assertFalse(RESTRICTED.allow(currentTimeMillis)); - - // An engine with the System class as namespace and the positive permissions - final JexlEngine jexl = new JexlBuilder() - .namespaces(Collections.singletonMap("sns", System.class)) - .permissions(permissions) - .create(); - - final AtomicLong result = new AtomicLong(); - assertEquals(0, result.get()); - final long now = System.currentTimeMillis(); - // calling System::currentTimeMillis() is allowed and behaves as expected - jexl.createScript("result.set(sns:currentTimeMillis())", "result").execute(null, result); - assertTrue(result.get() >= now); - - // we still cant call anything else - try { - jexl.createScript("sns:gc()").execute(null); - } catch(final JexlException.Method method) { - assertEquals("gc", method.getMethod()); + + @Test + public void test415() { + final JexlBuilder builder = new JexlBuilder().features(new JexlFeatures().constCapture(true)); + final JexlEngine jexl = builder.create(); + JexlScript script; + Object result; + script = jexl.createScript("`#${c}`", "c"); + result = script.execute(null, 42); + assertEquals("#42", result.toString()); + script = jexl.createScript("`$${c}`", "c"); + result = script.execute(null, 42); + assertEquals("$42", result.toString()); + script = jexl.createScript("`$#{c}`", "c"); + result = script.execute(null, 42); + assertEquals("$42", result.toString()); + script = jexl.createScript("`##{c}`", "c"); + result = script.execute(null, 42); + assertEquals("#42", result.toString()); + script = jexl.createScript("`--##{c}`", "c"); + result = script.execute(null, 42); + assertEquals("--#42", result.toString()); + } + + @Test + public void test419() throws NoSuchMethodException { + // check RESTRICTED permissions denies call to System::currentTimeMillis() + final Method currentTimeMillis = System.class.getMethod("currentTimeMillis"); + assertFalse(RESTRICTED.allow(currentTimeMillis)); + // compose using a positive class permission to allow just System::currentTimeMillis() + final JexlPermissions permissions = RESTRICTED.compose("java.lang { +System { currentTimeMillis(); } }"); + // check no side effect on compose + assertTrue(permissions.allow(currentTimeMillis)); + assertFalse(RESTRICTED.allow(currentTimeMillis)); + + // An engine with the System class as namespace and the positive permissions + final JexlEngine jexl = new JexlBuilder().namespaces(Collections.singletonMap("sns", System.class)).permissions(permissions).create(); + + final AtomicLong result = new AtomicLong(); + assertEquals(0, result.get()); + final long now = System.currentTimeMillis(); + // calling System::currentTimeMillis() is allowed and behaves as expected + jexl.createScript("result.set(sns:currentTimeMillis())", "result").execute(null, result); + assertTrue(result.get() >= now); + + // we still cant call anything else + try { + jexl.createScript("sns:gc()").execute(null); + } catch (final JexlException.Method method) { + assertEquals("gc", method.getMethod()); + } } - } - - @Test public void testDocBreakContinue() { - final JexlBuilder builder = new JexlBuilder().features(new JexlFeatures().constCapture(true)); - final JexlEngine jexl = builder.create(); - JexlScript script; - Object result; - final String srcContinue = "let text = '';\n" + - "for (let i : (4..2)) { if (i == 3) continue; text += i; }\n" + - "text;"; - script = jexl.createScript(srcContinue); - result = script.execute(null); - assertEquals("42", result); - - final String srcBreak = "let i = 33;\n" + - "while (i < 66) { if (i == 42) { break; } i += 1; }\n" + - "i;"; - script = jexl.createScript(srcBreak); - result = script.execute(null); - assertEquals(42, result); - } - - @Test - public void testNamespaceVsTernary0() { - final VinzContext ctxt = new VinzContext(); - ctxt.set("Users", "USERS"); - final JexlEngine jexl = new JexlBuilder().safe(false).strict(true).silent(false).create(); - JexlScript script = jexl.createScript("() -> {\n" + + @Test + public void testDocBreakContinue() { + final JexlBuilder builder = new JexlBuilder().features(new JexlFeatures().constCapture(true)); + final JexlEngine jexl = builder.create(); + JexlScript script; + Object result; + // @formatter:off + final String srcContinue = "let text = '';\n" + + "for (let i : (4..2)) { if (i == 3) continue; text += i; }\n" + + "text;"; + // @formatter:on + script = jexl.createScript(srcContinue); + result = script.execute(null); + assertEquals("42", result); + // @formatter:off + final String srcBreak = "let i = 33;\n" + + "while (i < 66) { if (i == 42) { break; } i += 1; }\n" + + "i;"; + // @formatter:on + script = jexl.createScript(srcBreak); + result = script.execute(null); + assertEquals(42, result); + } + + @Test + public void testNamespaceVsTernary0() { + final VinzContext ctxt = new VinzContext(); + ctxt.set("Users", "USERS"); + final JexlEngine jexl = new JexlBuilder().safe(false).strict(true).silent(false).create(); + // @formatter:off + JexlScript script = jexl.createScript("() -> {\n" + " var fn = (user) -> {\n" + " user ? user : member(Users, 'user');\n" + " }\n" + "}"); - Object r = script.execute(ctxt); - assertNotNull(r); - script = (JexlScript) r; - r = script.execute(ctxt); - assertEquals("USERS.user", r); - } - - @Test - public void testNamespaceVsTernary1() { - final VinzContext ctxt = new VinzContext(); - ctxt.set("Users", "USERS"); - ctxt.set("vinz", new VinzCaller(ctxt)); - final JexlEngine jexl = new JexlBuilder().safe(false).strict(true).silent(false).create(); - final JexlScript script = jexl.createScript( - "vinz.execute(() -> {\n" - + " var test = 42;\n" - + " var user = useTest ? test : member(Users, 'user');\n" - + "})\n" , "useTest"); - Object r = script.execute(ctxt, false); - assertNotNull(r); - assertEquals("USERS.user", r); - r = script.execute(ctxt, true); - assertNotNull(r); - assertEquals(42, r); - } + // @formatter:on + Object r = script.execute(ctxt); + assertNotNull(r); + script = (JexlScript) r; + r = script.execute(ctxt); + assertEquals("USERS.user", r); + } + + @Test + public void testNamespaceVsTernary1() { + final VinzContext ctxt = new VinzContext(); + ctxt.set("Users", "USERS"); + ctxt.set("vinz", new VinzCaller(ctxt)); + final JexlEngine jexl = new JexlBuilder().safe(false).strict(true).silent(false).create(); + // @formatter:off + final JexlScript script = jexl.createScript( + "vinz.execute(() -> {\n" + + " var test = 42;\n" + + " var user = useTest ? test : member(Users, 'user');\n" + + "})\n" , "useTest"); + // @formatter:on + Object r = script.execute(ctxt, false); + assertNotNull(r); + assertEquals("USERS.user", r); + r = script.execute(ctxt, true); + assertNotNull(r); + assertEquals(42, r); + } }