From 64fc9ee301da74135364931e61638637ac51d9f0 Mon Sep 17 00:00:00 2001 From: Sam Brannen <104798+sbrannen@users.noreply.github.com> Date: Sat, 10 Feb 2024 16:55:21 +0100 Subject: [PATCH] Test function registration with SimpleEvaluationContext --- .../spel/SpelDocumentationTests.java | 48 +++++++++++-------- 1 file changed, 28 insertions(+), 20 deletions(-) diff --git a/spring-expression/src/test/java/org/springframework/expression/spel/SpelDocumentationTests.java b/spring-expression/src/test/java/org/springframework/expression/spel/SpelDocumentationTests.java index 36789d14d26..a1c66f7456a 100644 --- a/spring-expression/src/test/java/org/springframework/expression/spel/SpelDocumentationTests.java +++ b/spring-expression/src/test/java/org/springframework/expression/spel/SpelDocumentationTests.java @@ -19,6 +19,7 @@ package org.springframework.expression.spel; import java.lang.invoke.MethodHandle; import java.lang.invoke.MethodHandles; import java.lang.invoke.MethodType; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Date; import java.util.GregorianCalendar; @@ -39,6 +40,7 @@ import org.springframework.expression.spel.support.SimpleEvaluationContext; import org.springframework.expression.spel.support.StandardEvaluationContext; import org.springframework.expression.spel.testresources.Inventor; import org.springframework.expression.spel.testresources.PlaceOfBirth; +import org.springframework.util.ReflectionUtils; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.within; @@ -554,24 +556,34 @@ class SpelDocumentationTests extends AbstractExpressionTests { @Nested class Functions { + private final ExpressionParser parser = new SpelExpressionParser(); + + private final StandardEvaluationContext context = new StandardEvaluationContext(); + + private final Method reverseStringMethod = ReflectionUtils.findMethod(StringUtils.class, "reverseString", String.class); + @Test - void functions() throws Exception { - ExpressionParser parser = new SpelExpressionParser(); - StandardEvaluationContext context = new StandardEvaluationContext(); - context.registerFunction("reverseString", StringUtils.class.getDeclaredMethod("reverseString", String.class)); + void registerFunctionViaMethodWithStandardEvaluationContext() { + context.registerFunction("reverseString", reverseStringMethod); - String helloWorldReversed = parser.parseExpression("#reverseString('hello world')").getValue(context, String.class); - assertThat(helloWorldReversed).isEqualTo("dlrow olleh"); + String result = parser.parseExpression("#reverseString('hello world')").getValue(context, String.class); + assertThat(result).isEqualTo("dlrow olleh"); } @Test - void methodHandlesNotBound() throws Exception { - ExpressionParser parser = new SpelExpressionParser(); - StandardEvaluationContext context = new StandardEvaluationContext(); + void registerFunctionViaMethodWithSimpleEvaluationContext() { + SimpleEvaluationContext simpleContext = SimpleEvaluationContext.forReadOnlyDataBinding().build(); + simpleContext.setVariable("reverseString", reverseStringMethod); - MethodHandle mh = MethodHandles.lookup().findVirtual(String.class, "formatted", + String result = parser.parseExpression("#reverseString('hello world')").getValue(simpleContext, String.class); + assertThat(result).isEqualTo("dlrow olleh"); + } + + @Test + void registerFunctionViaMethodHandleNotBound() throws Exception { + MethodHandle methodHandle = MethodHandles.lookup().findVirtual(String.class, "formatted", MethodType.methodType(String.class, Object[].class)); - context.setVariable("message", mh); + context.registerFunction("message", methodHandle); String message = parser.parseExpression("#message('Simple message: <%s>', 'Hello World', 'ignored')") .getValue(context, String.class); @@ -579,20 +591,16 @@ class SpelDocumentationTests extends AbstractExpressionTests { } @Test - void methodHandlesFullyBound() throws Throwable { - ExpressionParser parser = new SpelExpressionParser(); - StandardEvaluationContext context = new StandardEvaluationContext(); - + void registerFunctionViaMethodHandleFullyBound() throws Exception { String template = "This is a %s message with %s words: <%s>"; Object varargs = new Object[] { "prerecorded", 3, "Oh Hello World!", "ignored" }; - MethodHandle mh = MethodHandles.lookup().findVirtual(String.class, "formatted", + MethodHandle methodHandle = MethodHandles.lookup().findVirtual(String.class, "formatted", MethodType.methodType(String.class, Object[].class)) .bindTo(template) - .bindTo(varargs); //here we have to provide arguments in a single array binding - context.setVariable("message", mh); + .bindTo(varargs); // here we have to provide arguments in a single array binding + context.registerFunction("message", methodHandle); - String message = parser.parseExpression("#message()") - .getValue(context, String.class); + String message = parser.parseExpression("#message()").getValue(context, String.class); assertThat(message).isEqualTo("This is a prerecorded message with 3 words: "); } }