/**
*
*/
package soottocfg.test.optimization_test;
import java.util.HashSet;
import java.util.Set;
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.EffectualSet;
import soottocfg.cfg.util.PostDominators;
/**
* @author schaef
*
*/
public class EffectualSetTest {
/**
*
*/
public EffectualSetTest() {
// TODO Auto-generated constructor stub
}
@Test
public void testWithLoops() {
// create a graph with two diamonds.
DirectedGraph<String, DefaultEdge> directedGraph = new DefaultDirectedGraph<String, DefaultEdge>(
DefaultEdge.class);
directedGraph.addVertex("0"); // src
directedGraph.addVertex("1");
directedGraph.addVertex("2"); // in effectual set
directedGraph.addVertex("3"); // in effectual set
directedGraph.addVertex("4");
directedGraph.addEdge("0", "1");
directedGraph.addEdge("1", "2");
directedGraph.addEdge("1", "3");
directedGraph.addEdge("3", "0"); // strange loop
directedGraph.addEdge("2", "4");
directedGraph.addEdge("3", "4");
directedGraph.addEdge("4", "2"); // strange loop
Set<String> expectedResult = new HashSet<String>();
expectedResult.add("2");
expectedResult.add("3");
Dominators<String> dom = new Dominators<String>(directedGraph, "0");
PostDominators<String> pdom = new PostDominators<String>(directedGraph, "4");
EffectualSet<String> effectualSet = new EffectualSet<String>(dom, pdom);
Assert.assertTrue(effectualSet.getEffectualSet().equals(expectedResult));
}
@Test
public void testSequentialDiamonds() {
int numberOfDiamonds = 5;
DirectedGraph<String, DefaultEdge> directedGraph = new DefaultDirectedGraph<String, DefaultEdge>(
DefaultEdge.class);
String src = "S";
String node = src;
nodeNumberer = 0;
Set<String> expectedResult = new HashSet<String>();
directedGraph.addVertex(node);
for (int i = 0; i < numberOfDiamonds; i++) {
String l = String.format("%d", nodeNumberer++);
String r = String.format("%d", nodeNumberer++);
directedGraph.addVertex(l);
directedGraph.addVertex(r);
directedGraph.addEdge(node, l);
directedGraph.addEdge(node, r);
String nextNode = String.format("%d", nodeNumberer++);
directedGraph.addVertex(nextNode);
directedGraph.addEdge(l, nextNode);
directedGraph.addEdge(r, nextNode);
expectedResult.add(l);
expectedResult.add(r);
node = nextNode;
}
String snk = node;
Dominators<String> dom = new Dominators<String>(directedGraph, src);
PostDominators<String> pdom = new PostDominators<String>(directedGraph, snk);
EffectualSet<String> effectualSet = new EffectualSet<String>(dom, pdom);
Assert.assertTrue(effectualSet.getEffectualSet().equals(expectedResult));
}
@Test
public void testNestedDiamonds() {
int depthOfNestedDiamonds = 4;
DirectedGraph<String, DefaultEdge> directedGraph = new DefaultDirectedGraph<String, DefaultEdge>(
DefaultEdge.class);
final String src = "S";
final String snk = "X";
directedGraph.addVertex(src);
directedGraph.addVertex(snk);
nodeNumberer = 0;
Set<String> expectedResult = createdNestedDiamonds(directedGraph, src, snk, depthOfNestedDiamonds);
Dominators<String> dom = new Dominators<String>(directedGraph, src);
PostDominators<String> pdom = new PostDominators<String>(directedGraph, snk);
EffectualSet<String> effectualSet = new EffectualSet<String>(dom, pdom);
// effectualSet.latticToDot(new File("lattice.dot"));
// try (FileOutputStream fileStream = new FileOutputStream(new
// File("prog.dot"));
// OutputStreamWriter writer = new OutputStreamWriter(fileStream,
// "UTF-8");) {
// DOTExporter<String, DefaultEdge> dot = new DOTExporter<String,
// DefaultEdge>(new StringNameProvider<String>(), null, null);
// dot.export(writer, directedGraph);
// } catch (IOException e) {
// e.printStackTrace();
// }
Assert.assertTrue(effectualSet.getEffectualSet().equals(expectedResult));
}
private int nodeNumberer = 0;
private Set<String> createdNestedDiamonds(DirectedGraph<String, DefaultEdge> graph, String src, String snk,
int depth) {
Set<String> result = new HashSet<String>();
final String label = String.format("%d", nodeNumberer++);
graph.addVertex(label);
graph.addEdge(src, label);
if (depth > 0) {
result.addAll(createdNestedDiamonds(graph, label, snk, depth - 1));
result.addAll(createdNestedDiamonds(graph, label, snk, depth - 1));
} else {
graph.addEdge(label, snk);
result.add(label);
}
return result;
}
}