Document support for varargs invocations in SpEL
Closes gh-33332
This commit is contained in:
@@ -21,10 +21,13 @@ import java.lang.invoke.MethodHandles;
|
||||
import java.lang.invoke.MethodType;
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.GregorianCalendar;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import example.Color;
|
||||
import example.FruitMap;
|
||||
@@ -667,6 +670,59 @@ class SpelDocumentationTests extends AbstractExpressionTests {
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
class Varargs {
|
||||
|
||||
@Test
|
||||
void varargsMethodInvocationWithIndividualArguments() {
|
||||
// evaluates to "blue is color #1"
|
||||
String expression = "'%s is color #%d'.formatted('blue', 1)";
|
||||
String message = parser.parseExpression(expression)
|
||||
.getValue(String.class);
|
||||
assertThat(message).isEqualTo("blue is color #1");
|
||||
}
|
||||
|
||||
@Test
|
||||
void varargsMethodInvocationWithArgumentsAsObjectArray() {
|
||||
// evaluates to "blue is color #1"
|
||||
String expression = "'%s is color #%d'.formatted(new Object[] {'blue', 1})";
|
||||
String message = parser.parseExpression(expression)
|
||||
.getValue(String.class);
|
||||
assertThat(message).isEqualTo("blue is color #1");
|
||||
}
|
||||
|
||||
@Test
|
||||
void varargsMethodInvocationWithArgumentsAsInlineList() {
|
||||
// evaluates to "blue is color #1"
|
||||
String expression = "'%s is color #%d'.formatted({'blue', 1})";
|
||||
String message = parser.parseExpression(expression).getValue(String.class);
|
||||
assertThat(message).isEqualTo("blue is color #1");
|
||||
}
|
||||
|
||||
@Test
|
||||
void varargsMethodInvocationWithTypeConversion() {
|
||||
Method reverseStringsMethod = ReflectionUtils.findMethod(StringUtils.class, "reverseStrings", String[].class);
|
||||
SimpleEvaluationContext evaluationContext = SimpleEvaluationContext.forReadOnlyDataBinding().build();
|
||||
evaluationContext.setVariable("reverseStrings", reverseStringsMethod);
|
||||
|
||||
// String reverseStrings(String... strings)
|
||||
// evaluates to "3.0, 2.0, 1.0, SpEL"
|
||||
String expression = "#reverseStrings('SpEL', 1, 10F / 5, 3.0000)";
|
||||
String message = parser.parseExpression(expression)
|
||||
.getValue(evaluationContext, String.class);
|
||||
assertThat(message).isEqualTo("3.0, 2.0, 1, SpEL");
|
||||
}
|
||||
|
||||
@Test
|
||||
void varargsMethodInvocationWithArgumentsAsStringArray() {
|
||||
// evaluates to "blue is color #1"
|
||||
String expression = "'%s is color #%s'.formatted(new String[] {'blue', 1})";
|
||||
String message = parser.parseExpression(expression).getValue(String.class);
|
||||
assertThat(message).isEqualTo("blue is color #1");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Nested
|
||||
class TernaryOperator {
|
||||
|
||||
@@ -906,6 +962,12 @@ class SpelDocumentationTests extends AbstractExpressionTests {
|
||||
public static String reverseString(String input) {
|
||||
return new StringBuilder(input).reverse().toString();
|
||||
}
|
||||
|
||||
public static String reverseStrings(String... strings) {
|
||||
List<String> list = Arrays.asList(strings);
|
||||
Collections.reverse(list);
|
||||
return list.stream().collect(Collectors.joining(", "));
|
||||
}
|
||||
}
|
||||
|
||||
private static class ListConcatenation implements OperatorOverloader {
|
||||
|
||||
Reference in New Issue
Block a user