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.*;
50 import org.codehaus.groovy.ast.expr.VariableExpression;
51 import org.codehaus.groovy.ast.stmt.ForStatement;
52 import org.codehaus.groovy.ast.stmt.BlockStatement;
53 import org.codehaus.groovy.ast.stmt.Statement;
54 import org.codehaus.groovy.runtime.InvokerHelper;
55 import org.codehaus.groovy.runtime.InvokerInvocationException;
56
57 /***
58 * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
59 * @author Pilho Kim
60 * @version $Revision: 1.12 $
61 */
62 public class ForTest extends TestSupport {
63
64 public void testNonLoop() throws Exception {
65 ClassNode classNode = new ClassNode("Foo", ACC_PUBLIC, ClassHelper.OBJECT_TYPE);
66 classNode.addConstructor(new ConstructorNode(ACC_PUBLIC, null));
67
68 Parameter[] parameters = {new Parameter(ClassHelper.OBJECT_TYPE, "coll")};
69
70 Statement statement = createPrintlnStatement(new VariableExpression("coll"));
71 classNode.addMethod(new MethodNode("oneParamDemo", ACC_PUBLIC, ClassHelper.VOID_TYPE, parameters, ClassNode.EMPTY_ARRAY, statement));
72
73 Class fooClass = loadClass(classNode);
74 assertTrue("Loaded a new class", fooClass != null);
75
76 Object bean = fooClass.newInstance();
77 assertTrue("Managed to create bean", bean != null);
78
79 System.out.println("################ Now about to invoke a method without looping");
80 Object value = new Integer(10000);
81
82 try {
83 InvokerHelper.invokeMethod(bean, "oneParamDemo", new Object[] {value});
84 } catch (InvokerInvocationException e) {
85 System.out.println("Caught: " + e.getCause());
86 e.getCause().printStackTrace();
87 fail("Should not have thrown an exception");
88 }
89 System.out.println("################ Done");
90 }
91
92
93 public void testLoop() throws Exception {
94 ClassNode classNode = new ClassNode("Foo", ACC_PUBLIC, ClassHelper.OBJECT_TYPE);
95 classNode.addConstructor(new ConstructorNode(ACC_PUBLIC, null));
96
97 Parameter[] parameters = {new Parameter(ClassHelper.OBJECT_TYPE.makeArray(), "coll")};
98
99 Statement loopStatement = createPrintlnStatement(new VariableExpression("i"));
100
101 ForStatement statement = new ForStatement(new Parameter(ClassHelper.OBJECT_TYPE,"i"), new VariableExpression("coll"), loopStatement);
102 classNode.addMethod(new MethodNode("iterateDemo", ACC_PUBLIC, ClassHelper.VOID_TYPE, parameters, ClassNode.EMPTY_ARRAY, statement));
103
104 Class fooClass = loadClass(classNode);
105 assertTrue("Loaded a new class", fooClass != null);
106
107 Object bean = fooClass.newInstance();
108 assertTrue("Managed to create bean", bean != null);
109
110 System.out.println("################ Now about to invoke a method with looping");
111 Object[] array = {new Integer(1234), "abc", "def"};
112
113 try {
114 InvokerHelper.invokeMethod(bean, "iterateDemo", new Object[]{array});
115 } catch (InvokerInvocationException e) {
116 System.out.println("Caught: " + e.getCause());
117 e.getCause().printStackTrace();
118 fail("Should not have thrown an exception");
119 }
120 System.out.println("################ Done");
121 }
122
123 public void testManyParam() throws Exception {
124 ClassNode classNode = new ClassNode("Foo", ACC_PUBLIC, ClassHelper.OBJECT_TYPE);
125 classNode.addConstructor(new ConstructorNode(ACC_PUBLIC, null));
126
127 Parameter[] parameters = { new Parameter(ClassHelper.OBJECT_TYPE, "coll1"), new Parameter(ClassHelper.OBJECT_TYPE, "coll2"), new Parameter(ClassHelper.OBJECT_TYPE, "coll3") };
128
129 BlockStatement statement = new BlockStatement();
130 statement.addStatement(createPrintlnStatement(new VariableExpression("coll1")));
131 statement.addStatement(createPrintlnStatement(new VariableExpression("coll2")));
132 statement.addStatement(createPrintlnStatement(new VariableExpression("coll3")));
133
134 classNode.addMethod(new MethodNode("manyParamDemo", ACC_PUBLIC, ClassHelper.VOID_TYPE, parameters, ClassNode.EMPTY_ARRAY, statement));
135
136 Class fooClass = loadClass(classNode);
137 assertTrue("Loaded a new class", fooClass != null);
138
139 Object bean = fooClass.newInstance();
140 assertTrue("Managed to create bean", bean != null);
141
142 System.out.println("################ Now about to invoke a method with many parameters");
143 Object[] array = {new Integer(1000*1000), "foo-", "bar~"};
144
145 try {
146 InvokerHelper.invokeMethod(bean, "manyParamDemo", array);
147 } catch (InvokerInvocationException e) {
148 System.out.println("Caught: " + e.getCause());
149 e.getCause().printStackTrace();
150 fail("Should not have thrown an exception");
151 }
152 System.out.println("################ Done");
153 }
154 }