Document support for varargs invocations in SpEL

Closes gh-33332
This commit is contained in:
Sam Brannen
2024-11-15 17:38:08 +01:00
parent 5ac56bda87
commit 807e1e6126
6 changed files with 231 additions and 10 deletions

View File

@@ -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 {