blob: 63af1b364bb83cc126ecfa9a075d08ccf229a723 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.commons.jexl2;
import org.apache.commons.jexl2.junit.Asserter;
/**
* Tests for calling methods on objects
*
* @since 2.0
*/
public class MethodTest extends JexlTestCase {
private Asserter asserter;
private static final String METHOD_STRING = "Method string";
public static class TestClass {
public String testVarArgs(Integer[] args) {
return "Test";
}
}
public static class Functor {
public int ten() {
return 10;
}
public int plus10(int num) {
return num + 10;
}
public static int TWENTY() {
return 20;
}
public static int PLUS20(int num) {
return num + 20;
}
public static Class<?> NPEIfNull(Object x) {
return x.getClass();
}
}
public static class EnhancedContext extends MapContext {
int factor = 6;
}
public static class ContextualFunctor {
private final EnhancedContext context;
public ContextualFunctor(EnhancedContext theContext) {
context = theContext;
}
public int ratio(int n) {
context.factor -= 1;
return n / context.factor;
}
}
@Override
public void setUp() {
asserter = new Asserter(JEXL);
}
public void testCallVarArgMethod() throws Exception {
asserter.setVariable("test", new TestClass());
asserter.assertExpression("test.testVarArgs(1,2,3,4,5)", "Test");
}
public void testInvoke() throws Exception {
Functor func = new Functor();
assertEquals(Integer.valueOf(10), JEXL.invokeMethod(func, "ten"));
assertEquals(Integer.valueOf(42), JEXL.invokeMethod(func, "PLUS20", Integer.valueOf(22)));
try {
JEXL.invokeMethod(func, "nonExistentMethod");
fail("method does not exist!");
} catch(Exception xj0) {
// ignore
}
try {
JEXL.invokeMethod(func, "NPEIfNull", (Object[]) null);
fail("method should have thrown!");
} catch(Exception xj0) {
// ignore
}
}
/**
* test a simple method expression
*/
public void testMethod() throws Exception {
// tests a simple method expression
asserter.setVariable("foo", new Foo());
asserter.assertExpression("foo.bar()", METHOD_STRING);
}
public void testMulti() throws Exception {
asserter.setVariable("foo", new Foo());
asserter.assertExpression("foo.innerFoo.bar()", METHOD_STRING);
}
/**
* test some String method calls
*/
public void testStringMethods() throws Exception {
asserter.setVariable("foo", "abcdef");
asserter.assertExpression("foo.substring(3)", "def");
asserter.assertExpression("foo.substring(0,(size(foo)-3))", "abc");
asserter.assertExpression("foo.substring(0,size(foo)-3)", "abc");
asserter.assertExpression("foo.substring(0,foo.length()-3)", "abc");
asserter.assertExpression("foo.substring(0, 1+1)", "ab");
}
/**
* Ensures static methods on objects can be called.
*/
public void testStaticMethodInvocation() throws Exception {
asserter.setVariable("aBool", Boolean.FALSE);
asserter.assertExpression("aBool.valueOf('true')", Boolean.TRUE);
}
public void testStaticMethodInvocationOnClasses() throws Exception {
asserter.setVariable("Boolean", Boolean.class);
asserter.assertExpression("Boolean.valueOf('true')", Boolean.TRUE);
}
public static class MyMath {
public double cos(double x) {
return Math.cos(x);
}
}
public void testTopLevelCall() throws Exception {
java.util.Map<String, Object> funcs = new java.util.HashMap<String, Object>();
funcs.put(null, new Functor());
funcs.put("math", new MyMath());
funcs.put("cx", ContextualFunctor.class);
JEXL.setFunctions(funcs);
JexlContext jc = new EnhancedContext();
Expression e = JEXL.createExpression("ten()");
Object o = e.evaluate(jc);
assertEquals("Result is not 10", new Integer(10), o);
e = JEXL.createExpression("plus10(10)");
o = e.evaluate(jc);
assertEquals("Result is not 20", new Integer(20), o);
e = JEXL.createExpression("plus10(ten())");
o = e.evaluate(jc);
assertEquals("Result is not 20", new Integer(20), o);
jc.set("pi", new Double(Math.PI));
e = JEXL.createExpression("math:cos(pi)");
o = e.evaluate(jc);
assertEquals(Double.valueOf(-1),o);
e = JEXL.createExpression("cx:ratio(10) + cx:ratio(20)");
o = e.evaluate(jc);
assertEquals(Integer.valueOf(7),o);
}
public void testNamespaceCall() throws Exception {
java.util.Map<String, Object> funcs = new java.util.HashMap<String, Object>();
funcs.put("func", new Functor());
funcs.put("FUNC", Functor.class);
JEXL.setFunctions(funcs);
Expression e = JEXL.createExpression("func:ten()");
JexlContext jc = new MapContext();
Object o = e.evaluate(jc);
assertEquals("Result is not 10", new Integer(10), o);
e = JEXL.createExpression("func:plus10(10)");
jc = new MapContext();
o = e.evaluate(jc);
assertEquals("Result is not 20", new Integer(20), o);
e = JEXL.createExpression("func:plus10(func:ten())");
jc = new MapContext();
o = e.evaluate(jc);
assertEquals("Result is not 20", new Integer(20), o);
e = JEXL.createExpression("FUNC:PLUS20(10)");
jc = new MapContext();
o = e.evaluate(jc);
assertEquals("Result is not 30", new Integer(30), o);
e = JEXL.createExpression("FUNC:PLUS20(FUNC:TWENTY())");
jc = new MapContext();
o = e.evaluate(jc);
assertEquals("Result is not 40", new Integer(40), o);
}
}