package soottocfg.test.optimization_test; import java.util.HashSet; import java.util.Set; import java.util.TreeSet; import org.jgrapht.DirectedGraph; import org.jgrapht.graph.DefaultDirectedGraph; import org.jgrapht.graph.DefaultEdge; import org.junit.Assert; import org.junit.Test; import soottocfg.cfg.util.Dominators; import soottocfg.cfg.util.LoopFinder; public class LoopFinderTest { final DirectedGraph<String, DefaultEdge> graph; final Dominators<String> dom; final LoopFinder<String> loopFinder; public LoopFinderTest() { /** * Example from Modern Compiler Implementation in Java Fig 18.3a page 381 */ graph = new DefaultDirectedGraph<String, DefaultEdge>( DefaultEdge.class); for (int i=1;i<=12;i++) { graph.addVertex(String.valueOf(i)); } graph.addEdge("1", "2"); graph.addEdge("2", "3"); graph.addEdge("3", "2"); graph.addEdge("2", "4"); graph.addEdge("4", "2"); graph.addEdge("4", "5"); graph.addEdge("4", "6"); graph.addEdge("6", "7"); graph.addEdge("7", "11"); graph.addEdge("11", "12"); graph.addEdge("5", "7"); graph.addEdge("5", "8"); graph.addEdge("8", "9"); graph.addEdge("9", "8"); graph.addEdge("9", "10"); graph.addEdge("10", "5"); graph.addEdge("10", "12"); dom = new Dominators<String>(graph, "1"); loopFinder = new LoopFinder<String>(dom); } @Test public void testHeaders() { Set<String> expectedHeaders = new HashSet<String>(); expectedHeaders.add("2"); expectedHeaders.add("5"); expectedHeaders.add("8"); Set<String> headers = loopFinder.getLoopHeaders(); Assert.assertTrue(headers.equals(expectedHeaders)); } @Test public void testLoopFrom2() { Set<String> expectedLoopFrom2 = new HashSet<String>(); expectedLoopFrom2.add("2"); expectedLoopFrom2.add("3"); expectedLoopFrom2.add("4"); Set<String> loopFrom2 = loopFinder.getLoopBody("2"); Assert.assertTrue(loopFrom2.equals(expectedLoopFrom2)); } @Test public void testLoopFrom5() { Set<String> expectedLoopFrom5 = new HashSet<String>(); expectedLoopFrom5.add("5"); expectedLoopFrom5.add("8"); expectedLoopFrom5.add("9"); expectedLoopFrom5.add("10"); Set<String> loopFrom5 = loopFinder.getLoopBody("5"); Assert.assertTrue(loopFrom5.equals(expectedLoopFrom5)); } @Test public void testLoopFrom8() { Set<String> expectedLoopFrom8 = new HashSet<String>(); expectedLoopFrom8.add("8"); expectedLoopFrom8.add("9"); Set<String> loopFrom8 = loopFinder.getLoopBody("8"); Assert.assertTrue(loopFrom8.equals(expectedLoopFrom8)); } @Test public void testLoopNestTree() { TreeSet<String> lnt = loopFinder.getLoopNestTreeSet(); Assert.assertTrue(lnt.lower("5").equals("8")); Assert.assertTrue(lnt.higher("8").equals("5")); Assert.assertTrue(lnt.higher("2")==null); // while (!lnt.isEmpty()) { // System.err.println(lnt.pollFirst()); //TODO more testing needed. } }