/** * */ package soottocfg.test.optimization_test; 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.DominanceFrontier; import soottocfg.cfg.util.Dominators; import soottocfg.cfg.util.GraphUtil; import soottocfg.cfg.util.Tree; /** * @author schaef * */ public class DominatorTest { /** * */ public DominatorTest() { // TODO Auto-generated constructor stub } @Test public void irreducibleTest() { DirectedGraph<String, DefaultEdge> directedGraph = new DefaultDirectedGraph<String, DefaultEdge>( DefaultEdge.class); directedGraph.addVertex("1");// src directedGraph.addVertex("2"); directedGraph.addVertex("3"); directedGraph.addVertex("4"); directedGraph.addVertex("5"); directedGraph.addVertex("6"); //sink directedGraph.addEdge("1", "2");//makes it irreducible directedGraph.addEdge("1", "3"); directedGraph.addEdge("2", "4"); directedGraph.addEdge("3", "4"); directedGraph.addEdge("4", "5"); directedGraph.addEdge("5", "2"); directedGraph.addEdge("3", "6"); Assert.assertFalse(GraphUtil.isReducibleGraph(directedGraph, "1")); directedGraph.removeEdge("1", "2"); Assert.assertTrue(GraphUtil.isReducibleGraph(directedGraph, "1")); } @Test public void testTextbookExample() { // create a graph with two diamonds. DirectedGraph<String, DefaultEdge> directedGraph = new DefaultDirectedGraph<String, DefaultEdge>( DefaultEdge.class); directedGraph.addVertex("1");// src directedGraph.addVertex("2"); directedGraph.addVertex("3"); directedGraph.addVertex("4"); directedGraph.addVertex("5"); directedGraph.addVertex("6"); directedGraph.addVertex("7"); directedGraph.addEdge("1", "2"); directedGraph.addEdge("2", "3"); directedGraph.addEdge("2", "4"); directedGraph.addEdge("3", "5"); directedGraph.addEdge("3", "6"); directedGraph.addEdge("5", "7"); directedGraph.addEdge("6", "7"); directedGraph.addEdge("7", "2"); Dominators<String> dom = new Dominators<String>(directedGraph, "1"); Tree<String> domTree = dom.getDominatorTree(); Assert.assertTrue(domTree.getRoot().equals("1")); Assert.assertTrue(domTree.getChildrenOf("1").size()==1 && domTree.getChildrenOf("1").iterator().next().equals("2")); Assert.assertTrue(domTree.getChildrenOf("2").size()==2 && domTree.getChildrenOf("2").contains("3") && domTree.getChildrenOf("2").contains("4")); Assert.assertTrue(domTree.getChildrenOf("3").size()==3 && domTree.getChildrenOf("3").contains("5") && domTree.getChildrenOf("3").contains("7")&& domTree.getChildrenOf("3").contains("6")); DominanceFrontier<String> df = new DominanceFrontier<String>(dom); Assert.assertTrue(df.getDominanceFrontier().get("1").isEmpty()); Assert.assertTrue(df.getDominanceFrontier().get("2").size()==1 && df.getDominanceFrontier().get("2").iterator().next().equals("2")); Assert.assertTrue(df.getDominanceFrontier().get("3").size()==1 && df.getDominanceFrontier().get("3").iterator().next().equals("2")); Assert.assertTrue(df.getDominanceFrontier().get("4").isEmpty()); Assert.assertTrue(df.getDominanceFrontier().get("5").size()==1 && df.getDominanceFrontier().get("5").iterator().next().equals("7")); Assert.assertTrue(df.getDominanceFrontier().get("6").size()==1 && df.getDominanceFrontier().get("6").iterator().next().equals("7")); Assert.assertTrue(df.getDominanceFrontier().get("7").size()==1 && df.getDominanceFrontier().get("7").iterator().next().equals("2")); } }