1 /* TestGraphTransformer.java */
2 package org.quilt.cl;
3
4 import java.util.List;
5 import java.util.Vector;
6 import junit.framework.*;
7 import org.apache.bcel.classfile.Method;
8 import org.apache.bcel.generic.*;
9
10 import org.quilt.graph.*;
11
12 /***
13 * Test GraphTransformer using runTest methods from classes synthesized
14 * by ClassFactory.
15 *
16 * @author <a href="jddixon@users.sourceforge.net">Jim Dixon</a>
17 */
18 public class TestGraphTransformer extends TestCase {
19
20 private ClassFactory factory = ClassFactory.getInstance();
21
22 private ClassGen clazz;
23
24 private GraphTransformer xformer;
25
26 private GraphSpy spy;
27
28 private GraphTalker talker;
29
30 private ControlFlowGraph theGraph;
31
32 public TestGraphTransformer (String name) {
33 super(name);
34 GraphSpy.setName("the spy");
35 }
36
37 public void setUp () {
38 List gxf = new Vector();
39 spy = new GraphSpy();
40 talker = new GraphTalker();
41 gxf.add ( spy );
42 // uncomment if things stop working
43 // gxf.add ( talker );
44 xformer = new GraphTransformer ( gxf );
45 }
46
47 private MethodGen loadAndExtractRunTest (String name) {
48 clazz = factory.makeClass(name, name);
49 Method [] methods = clazz.getMethods();
50 for (int i = 0 ; i < methods.length; i++) {
51 if ( methods[i].getName().equals("runTest") ) {
52 return new MethodGen (methods[i], clazz.getClassName(),
53 clazz.getConstantPool());
54 }
55 }
56 return null; // not found
57 }
58 public void testDefault () {
59 MethodGen
60 mgDefault = loadAndExtractRunTest ("test.data.TestDefault");
61 assertNotNull ("extracted method is null", mgDefault);
62
63 // build the graph, get the instruction list from it
64 mgDefault.setInstructionList(xformer.xform ( clazz, mgDefault));
65 mgDefault.removeNOPs();
66 InstructionList ilist = mgDefault.getInstructionList();
67 Instruction [] inst = ilist.getInstructions();
68 assertEquals ("wrong number of instructions", 2, ilist.getLength() );
69 assertTrue ("", inst[0] instanceof ICONST);
70 assertTrue ("", inst[1] instanceof IRETURN);
71
72 theGraph = GraphSpy.getTheGraph();
73 // DEBUG
74 //GraphTalker talker = new GraphTalker();
75 //talker.xform (null, null, theGraph);
76 // END
77 assertNotNull ("failed to get reference to method CFG", theGraph);
78 assertNotNull ("graph exit vertex is null", theGraph.getExit());
79 assertEquals ("TestDefault graph has wrong size", 3, theGraph.size() );
80 }
81
82 public void testIfThen () {
83 MethodGen
84 mgIfThen = loadAndExtractRunTest ("test.data.TestIfThen");
85 assertNotNull ("extracted method is null", mgIfThen);
86
87 // build the graph, get the instruction list from it
88 InstructionList ilist = xformer.xform ( clazz, mgIfThen);
89 assertEquals ("wrong number of instructions", 6, ilist.getLength() );
90 Instruction [] inst = ilist.getInstructions();
91 assertTrue ("should be ILOAD: " + inst[0],
92 inst[0] instanceof ILOAD);
93 assertTrue ("should be IFGT: " + inst[1],
94 inst[1] instanceof IFGT);
95 assertTrue ("should be ICONST: " + inst[2],
96 inst[2] instanceof ICONST);
97 assertTrue ("should be IRETURN: " + inst[3],
98 inst[3] instanceof IRETURN);
99 assertTrue ("should be ICONST: " + inst[4],
100 inst[4] instanceof ICONST);
101 assertTrue ("should be IRETURN: " + inst[5],
102 inst[5] instanceof IRETURN);
103
104 // EXAMINE GRAPH
105 theGraph = GraphSpy.getTheGraph();
106 assertNotNull ("failed to get reference to method CFG", theGraph);
107 assertNotNull ("graph exit vertex is null", theGraph.getExit());
108 assertEquals ("TestIfThen graph has wrong size", 5, theGraph.size() );
109 }
110
111 public void testWhile () {
112 MethodGen
113 mgWhile = loadAndExtractRunTest ("test.data.TestWhile");
114 assertNotNull ("extracted method is null", mgWhile);
115
116 // build the graph, get the instruction list from it
117 mgWhile.setInstructionList(xformer.xform ( clazz, mgWhile));
118 mgWhile.removeNOPs();
119 InstructionList ilist = mgWhile.getInstructionList();
120 assertEquals ("wrong number of instructions", 7, ilist.getLength() );
121 Instruction [] inst = ilist.getInstructions();
122 assertTrue ("", inst[0] instanceof ILOAD);
123 assertTrue ("", inst[1] instanceof DUP);
124 assertTrue ("", inst[2] instanceof IFLE);
125 assertTrue ("", inst[3] instanceof ICONST);
126 assertTrue ("", inst[4] instanceof ISUB);
127 assertTrue ("", inst[5] instanceof GOTO);
128 assertTrue ("", inst[6] instanceof IRETURN);
129
130 // EXAMINE GRAPH
131 theGraph = GraphSpy.getTheGraph();
132 assertNotNull ("failed to get reference to method CFG", theGraph);
133 assertNotNull ("graph exit vertex is null", theGraph.getExit());
134 assertEquals ("TestWhile graph has wrong size", 6, theGraph.size() );
135 } // GEEP
136
137 private void dumpInstructions (Instruction [] ilist) {
138 System.out.println("Instructions returned:");
139 for (int i = 0; i < ilist.length; i++) {
140 System.out.println (" " + ilist[i] );
141 }
142 }
143 public void testNPEWithCatch () {
144 MethodGen
145 mgNPEWithCatch = loadAndExtractRunTest ("test.data.TestNPEWithCatch");
146 assertNotNull ("extracted method is null", mgNPEWithCatch);
147
148 // build the graph, get the instruction list from it
149 mgNPEWithCatch.setInstructionList(xformer.xform ( clazz,
150 mgNPEWithCatch));
151 mgNPEWithCatch.removeNOPs();
152 InstructionList ilist = mgNPEWithCatch.getInstructionList();
153 Instruction [] inst = ilist.getInstructions();
154
155 theGraph = GraphSpy.getTheGraph();
156 // talker.xform (null, null, theGraph);
157
158 assertNotNull ("failed to get reference to method CFG", theGraph);
159 assertNotNull ("graph exit vertex is null", theGraph.getExit());
160 assertEquals ("TestNPEWithCatch graph has wrong size",
161 8, theGraph.size() );
162
163 assertEquals ("wrong number of instructions", 7, ilist.getLength() );
164 assertTrue ("expected ACONST_NULL", inst[0] instanceof ACONST_NULL);
165 assertTrue ("expected ICONST", inst[1] instanceof ICONST);
166 assertTrue ("expected INVOKEVIRTUAL", inst[2] instanceof INVOKEVIRTUAL);
167 assertTrue ("expected ICONST", inst[3] instanceof ICONST);
168 assertTrue ("expected IRETURN", inst[4] instanceof IRETURN);
169 assertTrue ("expected ICONST", inst[5] instanceof ICONST);
170 assertTrue ("expected IRETURN", inst[6] instanceof IRETURN);
171 }
172
173 public void testNPENoCatch () {
174 MethodGen
175 mgNPENoCatch = loadAndExtractRunTest ("test.data.TestNPENoCatch");
176 assertNotNull ("extracted method is null", mgNPENoCatch);
177
178 // build the graph, get the instruction list from it
179 InstructionList ilist = xformer.xform ( clazz, mgNPENoCatch);
180 assertEquals ("wrong number of instructions", 5, ilist.getLength() );
181 Instruction [] inst = ilist.getInstructions();
182 assertTrue ("expected ACONST_NULL", inst[0] instanceof ACONST_NULL);
183 assertTrue ("expected ICONST", inst[1] instanceof ICONST);
184 assertTrue ("expected INVOKEVIRTUAL", inst[2] instanceof INVOKEVIRTUAL);
185 assertTrue ("expected ICONST", inst[3] instanceof ICONST);
186 assertTrue ("expected IRETURN", inst[4] instanceof IRETURN);
187
188 theGraph = GraphSpy.getTheGraph();
189 // DEBUG
190 //GraphTalker talker = new GraphTalker();
191 //talker.xform (null, null, theGraph);
192 // END
193 assertNotNull ("failed to get reference to method CFG", theGraph);
194 assertNotNull ("graph exit vertex is null", theGraph.getExit());
195 assertEquals ("TestNPENoCatch graph has wrong size",
196 4, theGraph.size() );
197 }
198
199 public void testSelect () {
200 MethodGen
201 mgSelect = loadAndExtractRunTest ("test.data.TestSelect");
202 assertNotNull ("extracted method is null", mgSelect);
203
204 // build the graph, get the instruction list from it
205 mgSelect.setInstructionList(xformer.xform ( clazz, mgSelect));
206 mgSelect.removeNOPs();
207 InstructionList ilist = mgSelect.getInstructionList();
208 Instruction [] inst = ilist.getInstructions();
209 // DEBUG
210 //dumpInstructions(inst);
211 // END
212 assertEquals ("wrong number of instructions", 10, inst.length );
213 assertTrue ("expected ILOAD", inst[0] instanceof ILOAD);
214 assertTrue ("expected LOOKUPSWITCH", inst[1] instanceof LOOKUPSWITCH);
215 assertTrue ("expected SIPUSH", inst[2] instanceof SIPUSH);
216 assertTrue ("expected IRETURN", inst[3] instanceof IRETURN);
217 assertTrue ("expected SIPUSH", inst[4] instanceof SIPUSH);
218 assertTrue ("expected IRETURN", inst[5] instanceof IRETURN);
219 assertTrue ("expected SIPUSH", inst[6] instanceof SIPUSH);
220 assertTrue ("expected IRETURN", inst[7] instanceof IRETURN);
221 assertTrue ("expected SIPUSH", inst[8] instanceof SIPUSH);
222 assertTrue ("expected IRETURN", inst[9] instanceof IRETURN);
223
224 theGraph = GraphSpy.getTheGraph();
225 // DEBUG
226 //GraphTalker talker = new GraphTalker();
227 //talker.xform (null, null, theGraph);
228 // END
229 assertNotNull ("failed to get reference to method CFG", theGraph);
230 assertNotNull ("graph exit vertex is null", theGraph.getExit());
231 assertEquals ("TestSelect graph has wrong size", 7, theGraph.size() );
232 }
233 }
This page was automatically generated by Maven