@ -294,6 +294,50 @@ public class MethodInvocationTests extends AbstractExpressionTests {
evaluate ( "aVarargsMethod3('foo', 'bar,baz')" , "foo-bar,baz" , String . class ) ;
evaluate ( "aVarargsMethod3('foo', 'bar,baz')" , "foo-bar,baz" , String . class ) ;
}
}
@Test // gh-33013
void testVarargsWithObjectArrayType ( ) {
// Calling 'public String formatObjectVarargs(String format, Object... args)' -> String.format(format, args)
// No var-args and no conversion necessary
evaluate ( "formatObjectVarargs('x')" , "x" , String . class ) ;
// No var-args but conversion necessary
evaluate ( "formatObjectVarargs(9)" , "9" , String . class ) ;
// No conversion necessary
evaluate ( "formatObjectVarargs('x -> %s', '')" , "x -> " , String . class ) ;
evaluate ( "formatObjectVarargs('x -> %s', ' ')" , "x -> " , String . class ) ;
evaluate ( "formatObjectVarargs('x -> %s', 'a')" , "x -> a" , String . class ) ;
evaluate ( "formatObjectVarargs('x -> %s %s %s', 'a', 'b', 'c')" , "x -> a b c" , String . class ) ;
evaluate ( "formatObjectVarargs('x -> %s', new Object[]{''})" , "x -> " , String . class ) ;
evaluate ( "formatObjectVarargs('x -> %s', new Object[]{' '})" , "x -> " , String . class ) ;
evaluate ( "formatObjectVarargs('x -> %s', new Object[]{'a'})" , "x -> a" , String . class ) ;
evaluate ( "formatObjectVarargs('x -> %s %s %s', new Object[]{'a', 'b', 'c'})" , "x -> a b c" , String . class ) ;
// The following assertions were cherry-picked from 6.1.x; however, they are expected
// to fail on 6.0.x and 5.3.x, since gh-32704 (Support varargs invocations in SpEL for
// varargs array subtype) was not backported.
// evaluate("formatObjectVarargs('x -> %s', new String[]{''})", "x -> ", String.class);
// evaluate("formatObjectVarargs('x -> %s', new String[]{' '})", "x -> ", String.class);
// evaluate("formatObjectVarargs('x -> %s', new String[]{'a'})", "x -> a", String.class);
// evaluate("formatObjectVarargs('x -> %s %s %s', new String[]{'a', 'b', 'c'})", "x -> a b c", String.class);
// Conversion necessary
evaluate ( "formatObjectVarargs('x -> %s %s', 2, 3)" , "x -> 2 3" , String . class ) ;
evaluate ( "formatObjectVarargs('x -> %s %s', 'a', 3.0d)" , "x -> a 3.0" , String . class ) ;
// Individual string contains a comma with multiple varargs arguments
evaluate ( "formatObjectVarargs('foo -> %s %s', ',', 'baz')" , "foo -> , baz" , String . class ) ;
evaluate ( "formatObjectVarargs('foo -> %s %s', 'bar', ',baz')" , "foo -> bar ,baz" , String . class ) ;
evaluate ( "formatObjectVarargs('foo -> %s %s', 'bar,', 'baz')" , "foo -> bar, baz" , String . class ) ;
// Individual string contains a comma with single varargs argument.
evaluate ( "formatObjectVarargs('foo -> %s', ',')" , "foo -> ," , String . class ) ;
evaluate ( "formatObjectVarargs('foo -> %s', ',bar')" , "foo -> ,bar" , String . class ) ;
evaluate ( "formatObjectVarargs('foo -> %s', 'bar,')" , "foo -> bar," , String . class ) ;
evaluate ( "formatObjectVarargs('foo -> %s', 'bar,baz')" , "foo -> bar,baz" , String . class ) ;
}
@Test
@Test
public void testVarargsOptionalInvocation ( ) {
public void testVarargsOptionalInvocation ( ) {
// Calling 'public String optionalVarargsMethod(Optional<String>... values)'
// Calling 'public String optionalVarargsMethod(Optional<String>... values)'