new function invocation tests for normal and error behaviour
This commit is contained in:
parent
2fbb7ad327
commit
2f05d70067
|
|
@ -32,6 +32,7 @@ public class AllTests {
|
||||||
suite.addTestSuite(BooleanExpressionTests.class);
|
suite.addTestSuite(BooleanExpressionTests.class);
|
||||||
suite.addTestSuite(LiteralTests.class);
|
suite.addTestSuite(LiteralTests.class);
|
||||||
suite.addTestSuite(ParsingTests.class);
|
suite.addTestSuite(ParsingTests.class);
|
||||||
|
suite.addTestSuite(VariableAndFunctionTests.class);
|
||||||
suite.addTestSuite(ParserErrorMessagesTests.class);
|
suite.addTestSuite(ParserErrorMessagesTests.class);
|
||||||
suite.addTestSuite(EvaluationTests.class);
|
suite.addTestSuite(EvaluationTests.class);
|
||||||
suite.addTestSuite(OperatorTests.class);
|
suite.addTestSuite(OperatorTests.class);
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,9 @@ public abstract class ExpressionTestCase extends TestCase {
|
||||||
|
|
||||||
private final static boolean DEBUG = false;
|
private final static boolean DEBUG = false;
|
||||||
|
|
||||||
|
protected final static boolean SHOULD_BE_WRITABLE = true;
|
||||||
|
protected final static boolean SHOULD_NOT_BE_WRITABLE = false;
|
||||||
|
|
||||||
protected static SpelExpressionParser parser = new SpelExpressionParser();
|
protected static SpelExpressionParser parser = new SpelExpressionParser();
|
||||||
protected static StandardEvaluationContext eContext = TestScenarioCreator.getTestEvaluationContext();
|
protected static StandardEvaluationContext eContext = TestScenarioCreator.getTestEvaluationContext();
|
||||||
|
|
||||||
|
|
@ -159,8 +162,14 @@ public abstract class ExpressionTestCase extends TestCase {
|
||||||
null);
|
null);
|
||||||
}
|
}
|
||||||
Class<? extends Object> resultType = value.getClass();
|
Class<? extends Object> resultType = value.getClass();
|
||||||
|
if (expectedValue instanceof String) {
|
||||||
assertEquals("Did not get expected value for expression '" + expression + "'.", expectedValue,
|
assertEquals("Did not get expected value for expression '" + expression + "'.", expectedValue,
|
||||||
ExpressionTestCase.stringValueOf(value));
|
ExpressionTestCase.stringValueOf(value));
|
||||||
|
} else {
|
||||||
|
assertEquals("Did not get expected value for expression '" + expression + "'.", expectedValue, value);
|
||||||
|
}
|
||||||
|
// assertEquals("Did not get expected value for expression '" + expression + "'.", expectedValue,
|
||||||
|
// ExpressionTestCase.stringValueOf(value));
|
||||||
assertEquals("Type of the result was not as expected. Expected '" + expectedClassOfResult
|
assertEquals("Type of the result was not as expected. Expected '" + expectedClassOfResult
|
||||||
+ "' but result was of type '" + resultType + "'", expectedClassOfResult
|
+ "' but result was of type '" + resultType + "'", expectedClassOfResult
|
||||||
.equals/* isAssignableFrom */(resultType), true);
|
.equals/* isAssignableFrom */(resultType), true);
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,10 @@ public class TestScenarioCreator {
|
||||||
new Class[] { Integer.TYPE, Integer.TYPE, Integer.TYPE }));
|
new Class[] { Integer.TYPE, Integer.TYPE, Integer.TYPE }));
|
||||||
testContext.registerFunction("reverseString", TestScenarioCreator.class.getDeclaredMethod("reverseString",
|
testContext.registerFunction("reverseString", TestScenarioCreator.class.getDeclaredMethod("reverseString",
|
||||||
new Class[] { String.class }));
|
new Class[] { String.class }));
|
||||||
|
testContext.registerFunction("varargsFunctionReverseStringsAndMerge", TestScenarioCreator.class.getDeclaredMethod("varargsFunctionReverseStringsAndMerge",
|
||||||
|
new Class[] { String[].class }));
|
||||||
|
testContext.registerFunction("varargsFunctionReverseStringsAndMerge2", TestScenarioCreator.class.getDeclaredMethod("varargsFunctionReverseStringsAndMerge2",
|
||||||
|
new Class[] { Integer.TYPE,String[].class }));
|
||||||
} catch (SecurityException e) {
|
} catch (SecurityException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
} catch (NoSuchMethodException e) {
|
} catch (NoSuchMethodException e) {
|
||||||
|
|
@ -200,4 +204,25 @@ public class TestScenarioCreator {
|
||||||
}
|
}
|
||||||
return backwards.toString();
|
return backwards.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String varargsFunctionReverseStringsAndMerge(String...strings) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
if (strings!=null) {
|
||||||
|
for (int i=strings.length-1;i>=0;i--) {
|
||||||
|
sb.append(strings[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String varargsFunctionReverseStringsAndMerge2(int j, String...strings) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append(j);
|
||||||
|
if (strings!=null) {
|
||||||
|
for (int i=strings.length-1;i>=0;i--) {
|
||||||
|
sb.append(strings[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,78 @@
|
||||||
|
/*
|
||||||
|
* Copyright 2004-2008 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.expression.spel;
|
||||||
|
|
||||||
|
import org.springframework.expression.spel.standard.StandardEvaluationContext;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests the evaluation of expressions that access variables and functions (lambda/java).
|
||||||
|
*
|
||||||
|
* @author Andy Clement
|
||||||
|
*/
|
||||||
|
public class VariableAndFunctionTests extends ExpressionTestCase {
|
||||||
|
|
||||||
|
public void testVariableAccess() {
|
||||||
|
evaluate("#answer", "42", Integer.class, SHOULD_BE_WRITABLE);
|
||||||
|
evaluate("(#i=5;#i)", 5, Integer.class, SHOULD_BE_WRITABLE);
|
||||||
|
evaluate("#answer / 2", 21, Integer.class, SHOULD_NOT_BE_WRITABLE);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testFunctionAccess01() {
|
||||||
|
evaluate("#reverseInt(1,2,3)", "int[3]{3,2,1}", int[].class);
|
||||||
|
evaluate("#reverseInt('1',2,3)", "int[3]{3,2,1}", int[].class); // requires type conversion of '1' to 1
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testFunctionAccess02() {
|
||||||
|
evaluate("#reverseString('hello')", "olleh", String.class);
|
||||||
|
evaluate("#reverseString(37)", "73", String.class); // requires type conversion of 37 to '37'
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCallVarargsFunction() {
|
||||||
|
evaluate("#varargsFunctionReverseStringsAndMerge('a','b','c')","cba",String.class);
|
||||||
|
evaluate("#varargsFunctionReverseStringsAndMerge('a')","a",String.class);
|
||||||
|
evaluate("#varargsFunctionReverseStringsAndMerge()","",String.class);
|
||||||
|
evaluate("#varargsFunctionReverseStringsAndMerge('b',25)","25b",String.class);
|
||||||
|
evaluate("#varargsFunctionReverseStringsAndMerge(25)","25",String.class);
|
||||||
|
evaluate("#varargsFunctionReverseStringsAndMerge2(1,'a','b','c')","1cba",String.class);
|
||||||
|
evaluate("#varargsFunctionReverseStringsAndMerge2(2,'a')","2a",String.class);
|
||||||
|
evaluate("#varargsFunctionReverseStringsAndMerge2(3)","3",String.class);
|
||||||
|
evaluate("#varargsFunctionReverseStringsAndMerge2(4,'b',25)","425b",String.class);
|
||||||
|
evaluate("#varargsFunctionReverseStringsAndMerge2(5,25)","525",String.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCallingFunctionsIncorrectly() {
|
||||||
|
evaluateAndCheckError("#varargsFunctionReverseStringsAndMerge(new StringBuilder())",SpelMessages.TYPE_CONVERSION_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testCallingIllegalFunctions() throws Exception {
|
||||||
|
SpelExpressionParser parser = new SpelExpressionParser();
|
||||||
|
StandardEvaluationContext ctx = new StandardEvaluationContext();
|
||||||
|
ctx.setVariable("notStatic",this.getClass().getMethod("nonStatic"));
|
||||||
|
try {
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
Object v = parser.parseExpression("#notStatic()").getValue(ctx);
|
||||||
|
fail("Should have failed with exception - cannot call non static method that way");
|
||||||
|
} catch (SpelException se) {
|
||||||
|
if (se.getMessageUnformatted()!=SpelMessages.FUNCTION_MUST_BE_STATIC) {
|
||||||
|
se.printStackTrace();
|
||||||
|
fail("Should have failed a message about the function needing to be static, not: "+se.getMessageUnformatted());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void nonStatic() {}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue