Skip to content

Commit 7237d87

Browse files
committed
test method pruning for reachability
1 parent 470d32e commit 7237d87

File tree

1 file changed

+42
-5
lines changed

1 file changed

+42
-5
lines changed

src/main/java/gr/gousiosg/javacg/stat/graph/Pruning.java

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,13 @@
1010
import org.slf4j.LoggerFactory;
1111

1212
import java.util.Collection;
13+
import java.util.Map;
1314
import java.util.Optional;
1415
import java.util.Set;
1516
import java.util.stream.Collectors;
1617

18+
import static gr.gousiosg.javacg.stat.graph.Utilities.nodeMap;
19+
1720
public class Pruning {
1821
private static final Logger LOGGER = LoggerFactory.getLogger(Pruning.class);
1922

@@ -27,12 +30,11 @@ public static void pruneOriginalGraph(StaticCallgraph callgraph, JacocoCoverage
2730
markConcreteBridgeTargets(callgraph.graph, callgraph.metadata);
2831
pruneBridgeMethods(callgraph.graph, callgraph.metadata);
2932
pruneConcreteMethods(callgraph.graph, callgraph.metadata, coverage);
30-
pruneMethodsFromTests(callgraph.graph, callgraph.metadata, testArguments, coverage);
33+
// pruneMethodsFromTests(callgraph.graph, callgraph.metadata, testArguments, coverage);
3134
}
3235

3336
public static void pruneReachabilityGraph(Graph<ColoredNode, DefaultEdge> reachability, JarMetadata metadata, JacocoCoverage coverage, TestArguments testArguments) {
34-
pruneMethodsFromTestsThatAreReachable(reachability, metadata, testArguments, coverage);
35-
37+
// pruneMethodsFromTestsThatAreReachable(reachability, metadata, testArguments, coverage);
3638
}
3739

3840
/**
@@ -167,7 +169,42 @@ private static void pruneMethodsFromTests(Graph<String, DefaultEdge> graph, JarM
167169
* @param metadata the metadata of the graph
168170
*/
169171
private static void pruneMethodsFromTestsThatAreReachable(Graph<ColoredNode, DefaultEdge> graph, JarMetadata metadata, TestArguments testArguments, JacocoCoverage coverage) {
170-
// TODO @WCYGAN: similar to the above, this will take the reachability graph and prune all nodes reachable ONLY from
171-
// test methods within the reachability graph
172+
Map<String, ColoredNode> nodeMap = nodeMap(graph.vertexSet());
173+
174+
var testTargetNodes = metadata.testMethods.stream()
175+
.filter(nodeMap::containsKey)
176+
.map(target -> graph.outgoingEdgesOf(nodeMap.get(target)))
177+
.flatMap(Collection::stream)
178+
.map(graph::getEdgeTarget)
179+
.collect(Collectors.toSet());
180+
181+
var targetsToRemove = testTargetNodes.stream()
182+
.filter(graph::containsVertex)
183+
.filter(targetNode -> {
184+
185+
if (targetNode.covered()) {
186+
return false;
187+
}
188+
189+
if (coverage.containsMethod(targetNode.getLabel())) {
190+
return false;
191+
}
192+
193+
if (metadata.testMethods.contains(targetNode.getLabel())) {
194+
return false;
195+
}
196+
197+
for (var e : graph.incomingEdgesOf(targetNode)) {
198+
if (!metadata.testMethods.contains(graph.getEdgeSource(e).getLabel())) {
199+
return false;
200+
}
201+
}
202+
203+
return true;
204+
})
205+
.filter(targetNode -> !metadata.testMethods.contains(targetNode.getLabel()))
206+
.collect(Collectors.toSet());
207+
208+
targetsToRemove.forEach(graph::removeVertex);
172209
}
173210
}

0 commit comments

Comments
 (0)