1 2 package org.quilt.cl; 3 4 import java.util.Comparator ; 5 import junit.framework.*; 6 import org.apache.bcel.generic.*; 7 import org.quilt.graph.*; 8 13 public class TestTryStacks extends TestCase { 14 15 private CodeExceptionGen[] handlers = null; 16 private ControlFlowGraph graph = null; 17 private InstructionList ilist = null; 18 private SortedBlocks blox = null; 19 private TryStacks ts = null; 20 21 private InstructionHandle 22 startMain, midMain, endMain, 23 tryStart2, tryEnd2, catch2A, catch2B, 24 tryMid1, tryEnd1, catch1A, catch1B, catch1C; 25 private CodeExceptionGen 26 handler1A, handler1B, handler1C, handler2A, handler2B; 27 28 public TestTryStacks (String name) { 29 super(name); 30 } 31 32 public void setUp () { 33 blox = new SortedBlocks(); 34 graph = new ControlFlowGraph(); 35 ilist = new InstructionList(); 36 37 startMain = ilist.append ( new NOP() ); ilist.append ( new NOP() ); 59 tryStart2 = ilist.append ( new NOP() ); ilist.append ( new NOP() ); 61 tryEnd2 = ilist.append ( new NOP() ); ilist.append ( new NOP() ); 63 catch2A = ilist.append ( new NOP() ); ilist.append ( new NOP() ); 65 catch2B = ilist.append ( new NOP() ); ilist.append ( new NOP() ); 67 tryMid1 = ilist.append ( new NOP() ); ilist.append ( new NOP() ); 69 tryEnd1 = ilist.append ( new NOP() ); ilist.append ( new NOP() ); 71 catch1A = ilist.append ( new NOP() ); ilist.append ( new NOP() ); 73 catch1B = ilist.append ( new NOP() ); ilist.append ( new NOP() ); 75 catch1C = ilist.append ( new NOP() ); ilist.append ( new NOP() ); 77 midMain = ilist.append ( new NOP() ); ilist.append ( new NOP() ); 79 endMain = ilist.append ( new NOP() ); 81 ilist.setPositions(); 82 handler1A = new CodeExceptionGen (tryStart2, tryEnd1, catch1A, 83 new ObjectType("Exception")); 84 handler1B = new CodeExceptionGen (tryStart2, tryEnd1, catch1B, 85 new ObjectType("Exception")); 86 handler1C = new CodeExceptionGen (tryStart2, tryEnd1, catch1C, 87 new ObjectType("Exception")); 88 89 handler2A = new CodeExceptionGen (tryStart2, tryEnd2, catch2A, 90 new ObjectType("Exception")); 91 handler2B = new CodeExceptionGen (tryStart2, tryEnd2, catch2B, 92 new ObjectType("Exception")); 93 } 94 95 public void testPositions () { 96 assertEquals ("startMain offset wrong", 0, startMain.getPosition() ); 97 assertEquals ("tryStart2 offset wrong", 2, tryStart2.getPosition() ); 98 assertEquals ("tryEnd1 offset wrong", 12, tryEnd1.getPosition() ); 99 assertEquals ("midMain offset wrong", 20, midMain.getPosition() ); 100 assertEquals ("endMain offset wrong", 22, endMain.getPosition() ); 101 } 102 public void testNewEmpty () { 103 assertEquals ("new graph has wrong number of vertices", 104 2, graph.size()); 105 handlers = new CodeExceptionGen[0]; 106 ts = new TryStacks (handlers, blox, graph); 107 assertEquals ("no handlers, but TryStacks constructor changed graph", 108 2, graph.size()); 109 } 110 public void testComparator () { 111 CodeExceptionGen[] handlers = { 112 handler1A, handler1B, handler1C, handler2A, handler2B }; 113 ts = new TryStacks (handlers, blox, graph); 114 Comparator cmp = ts.getComparator(); 115 assertEquals ("handler1A doesn't equal itself ;-)", 116 0, cmp.compare(handler1A, handler1A) ); 117 assertEquals ("handler1A doesn't sort before 1B", 118 -1, cmp.compare(handler1A, handler1B) ); 119 assertEquals ("handler1C doesn't sort after 1B", 120 1, cmp.compare(handler1C, handler1B) ); 121 assertEquals ("shorter try block doesn't sort after longer", 122 1, cmp.compare(handler2A, handler1B) ); 123 assertEquals ("longer try block doesn't sort before shorter", 124 -1, cmp.compare(handler1C, handler2B) ); 125 } 126 137 private void checkScrambledHandlers (int n) { 138 Entry e0, e1, e2; Connector connE0, connE1, connE2; Edge e0out, e1out, e2out; Edge connE1out0, connE1out1, connE1out2; 143 Edge connE2out0, connE2out1; 144 145 Exit x0, x1, x2; Connector connX0, connX1, connX2; 147 Edge x0out, x1out, x2out; 148 149 CodeVertex v1A, v1B, v1C, v2A, v2B; Edge v1Aout, v1Bout, v1Cout, v2Aout, v2Bout; 151 152 CodeVertex v2; Connector connV2; 154 Edge v2out; 155 156 GraphTalker talker = new GraphTalker(); 157 talker.xform (null, null, graph); 158 System.out.print (ts); 159 160 e0 = graph.getEntry(); connE0 = e0.getConnector(); 162 e0out = e0.getEdge(); 163 assertEquals ("graph Entry should have 1 edge out", 164 1, connE0.size() ); 165 166 e1 = (Entry)e0out.getTarget(); connE1 = e1.getConnector(); 168 e1out = e1.getEdge(); 169 assertEquals ("first try block should have 3 edges out", 170 3, connE1.size() ); 171 172 e2 = (Entry)e1out.getTarget(); connE2 = e2.getConnector(); 174 e2out = e2.getEdge(); 175 assertEquals ("second try block should have 2 edges out", 176 2, connE2.size() ); 177 178 v2 = (CodeVertex)e2out.getTarget(); connV2 = v2.getConnector(); 180 e2out = v2.getEdge(); 181 assertEquals ("code vertex should have 1 edge out", 182 1, connV2.size() ); 183 assertEquals ("catch block has wrong offset", 184 tryStart2.getPosition(), v2.getPosition() ); 185 186 assertEquals ("graph Entry has wrong index", 0, e0.getIndex()); 187 assertEquals ("graph Entry has wrong index", 0, e1.getIndex()); 188 assertEquals ("graph Entry has wrong index", 0, e2.getIndex()); 189 190 assertEquals ("e0's target should be e1", e1, e0.getTarget()); 191 assertEquals ("e1's target should be e2", e2, e1.getTarget()); 192 assertEquals ("e2's target should be v2", v2, e2.getTarget()); 193 194 assertEquals ("v2 should be in graph 2", 2, v2.getGraph().getIndex()); 195 assertEquals ("v2 has wrong index", 4, v2.getIndex() ); 197 198 x2 = (Exit)e2out.getTarget(); connX2 = x2.getConnector(); 200 x2out = x2.getEdge(); 201 assertEquals ("second subgraph exit should have 1 edge out", 202 1, connX2.size() ); 203 204 x1 = (Exit)x2out.getTarget(); connX1 = x1.getConnector(); 206 x1out = x1.getEdge(); 207 assertEquals ("first subgraph exit should have 1 edge out", 208 1, connX1.size() ); 209 210 x0 = (Exit)x1out.getTarget(); connX0 = x0.getConnector(); 212 x0out = x0.getEdge(); 213 assertEquals ("main graph exit should have 1 edge out", 214 1, connX0.size() ); 215 assertEquals ("graph exit doesn't loop back to graph e0", 216 e0, x0out.getTarget() ); 217 218 assertEquals ("v2's target should be x2", x2, v2.getTarget()); 219 assertEquals ("x2's target should be x1", x1, x2.getTarget()); 220 assertEquals ("x2's target should be x0", x0, x1.getTarget()); 221 222 assertEquals ("graph exit has wrong index", 1, x2.getIndex()); 223 assertEquals ("graph exit has wrong index", 1, x1.getIndex()); 224 assertEquals ("graph exit has wrong index", 1, x0.getIndex()); 225 226 ComplexConnector cc = (ComplexConnector) connE1; 228 connE1out0 = cc.getEdge(0); 229 v1A = (CodeVertex)connE1out0.getTarget(); v1Aout = v1A.getEdge(); 231 assertEquals ("catch block edge doesn't go to exit", 232 v1Aout.getTarget(), x1 ); 233 assertEquals ("catch block has wrong offset", 234 catch1A.getPosition(), v1A.getPosition() ); 235 assertEquals ("catch block has wrong index", 2, v1A.getIndex()); 236 237 connE1out1 = cc.getEdge(1); 238 v1B = (CodeVertex)connE1out1.getTarget(); v1Bout = v1B.getEdge(); 240 assertEquals ("catch block edge doesn't go to exit", 241 v1Bout.getTarget(), x1 ); 242 assertEquals ("catch block has wrong offset", 243 catch1B.getPosition(), v1B.getPosition() ); 244 assertEquals ("catch block has wrong index", 3, v1B.getIndex()); 245 246 connE1out2 = cc.getEdge(2); 247 v1C = (CodeVertex)connE1out2.getTarget(); v1Cout = v1C.getEdge(); 249 assertEquals ("catch block edge doesn't go to exit", 250 v1Cout.getTarget(), x1 ); 251 assertEquals ("catch block has wrong offset", 252 catch1C.getPosition(), v1C.getPosition() ); 253 assertEquals ("catch block has wrong index", 4, v1C.getIndex()); 254 255 cc = (ComplexConnector) e2.getConnector(); 257 connE2out0 = cc.getEdge(0); 258 v2A = (CodeVertex)connE2out0.getTarget(); v2Aout = v2A.getEdge(); 260 assertEquals ("catch block edge doesn't go to exit", 261 v2Aout.getTarget(), x2 ); 262 assertEquals ("catch block has wrong offset", 263 catch2A.getPosition(), v2A.getPosition() ); 264 assertEquals ("catch block has wrong index", 2, v2A.getIndex()); 265 266 connE2out1 = cc.getEdge(1); 267 v2B = (CodeVertex)connE2out1.getTarget(); v2Bout = v2B.getEdge(); 269 assertEquals ("catch block edge doesn't go to exit", 270 v2Bout.getTarget(), x2 ); 271 assertEquals ("catch block has wrong offset", 272 catch2B.getPosition(), v2B.getPosition() ); 273 assertEquals ("catch block has wrong index", 3, v2B.getIndex()); 274 275 } 276 public void testGraphSize() { 277 CodeExceptionGen[] handlers = { 278 handler1B, handler2B, handler1C, handler2A, handler1A}; 279 ts = new TryStacks (handlers, blox, graph); 280 assertEquals ("wrong number of vertices in complex graph ", 286 12, graph.size() ); 287 } 288 public void testScrambledHandlers1 () { 289 CodeExceptionGen[] handlers = { 290 handler1B, handler2B, handler1C, handler2A, handler1A}; 291 ts = new TryStacks (handlers, blox, graph); 292 checkScrambledHandlers (1); 293 } 294 public void testScrambledHandlers2 () { 295 CodeExceptionGen[] handlers = { 296 handler2B, handler1C, handler2A, handler1A, handler1B}; 297 ts = new TryStacks (handlers, blox, graph); 298 checkScrambledHandlers (2); 299 } 300 public void testScrambledHandlers3 () { 301 CodeExceptionGen[] handlers = { 302 handler2B, handler2A, handler1C, handler1B, handler1A}; 303 ts = new TryStacks (handlers, blox, graph); 304 checkScrambledHandlers (3); 305 } 306 } 307 | Popular Tags |