1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 package org.codehaus.groovy.classgen;
48
49 import org.codehaus.groovy.ast.ClassHelper;
50 import org.codehaus.groovy.ast.ClassNode;
51 import org.codehaus.groovy.ast.ConstructorNode;
52 import org.codehaus.groovy.ast.MethodNode;
53 import org.codehaus.groovy.ast.Parameter;
54 import org.codehaus.groovy.ast.expr.ConstantExpression;
55 import org.codehaus.groovy.ast.stmt.BlockStatement;
56 import org.codehaus.groovy.ast.stmt.ReturnStatement;
57 import org.codehaus.groovy.ast.stmt.Statement;
58 import org.codehaus.groovy.runtime.InvokerHelper;
59
60 /***
61 *
62 * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
63 * @version $Revision: 1.9 $
64 */
65 public class MethodTest extends TestSupport {
66
67 public void testMethods() throws Exception {
68 ClassNode classNode = new ClassNode("Foo", ACC_PUBLIC, ClassHelper.OBJECT_TYPE);
69 classNode.addConstructor(new ConstructorNode(ACC_PUBLIC, null));
70
71 Statement statementA = new ReturnStatement(new ConstantExpression("calledA"));
72 Statement statementB = new ReturnStatement(new ConstantExpression("calledB"));
73 Statement emptyStatement = new BlockStatement();
74
75 classNode.addMethod(new MethodNode("a", ACC_PUBLIC, ClassHelper.OBJECT_TYPE, Parameter.EMPTY_ARRAY, ClassNode.EMPTY_ARRAY, statementA));
76 classNode.addMethod(new MethodNode("b", ACC_PUBLIC, null, Parameter.EMPTY_ARRAY, ClassNode.EMPTY_ARRAY, statementB));
77
78 classNode.addMethod(new MethodNode("noReturnMethodA", ACC_PUBLIC, null, Parameter.EMPTY_ARRAY, ClassNode.EMPTY_ARRAY, emptyStatement));
79 classNode.addMethod(new MethodNode("noReturnMethodB", ACC_PUBLIC, ClassHelper.OBJECT_TYPE, Parameter.EMPTY_ARRAY, ClassNode.EMPTY_ARRAY, emptyStatement));
80
81 classNode.addMethod(new MethodNode("c", ACC_PUBLIC, ClassHelper.VOID_TYPE, Parameter.EMPTY_ARRAY, ClassNode.EMPTY_ARRAY, emptyStatement));
82
83 Class fooClass = loadClass(classNode);
84 assertTrue("Loaded a new class", fooClass != null);
85
86 Object bean = fooClass.newInstance();
87 assertTrue("Created instance of class: " + bean, bean != null);
88
89 assertCallMethod(bean, "a", "calledA");
90 assertCallMethod(bean, "b", "calledB");
91 assertCallMethod(bean, "noReturnMethodA", null);
92 assertCallMethod(bean, "noReturnMethodB", null);
93 assertCallMethod(bean, "c", null);
94 }
95
96 protected void assertCallMethod(Object object, String method, Object expected) {
97 Object value = InvokerHelper.invokeMethod(object, method, new Object[0]);
98 assertEquals("Result of calling method: " + method + " on: " + object + " with empty list", expected, value);
99
100 value = InvokerHelper.invokeMethod(object, method, null);
101 assertEquals("Result of calling method: " + method + " on: " + object + " with null", expected, value);
102 }
103 }