about summary refs log tree commit diff stats
path: root/test/core/graph.py
diff options
context:
space:
mode:
authorserpilliere <serpilliere@users.noreply.github.com>2015-09-06 23:38:46 +0200
committerserpilliere <serpilliere@users.noreply.github.com>2015-09-06 23:38:46 +0200
commitcc20f3d79c641d929865f12471a70a2575b8cf54 (patch)
treed9afdd811ebd9b767bffeb2be8d15bda476015d2 /test/core/graph.py
parente58c094050a1873d9eec4b609804f3e1d6cbb6bd (diff)
parent8a4238aaf13366284acf66e47fa0ba5a150ed2a0 (diff)
downloadmiasm-cc20f3d79c641d929865f12471a70a2575b8cf54.tar.gz
miasm-cc20f3d79c641d929865f12471a70a2575b8cf54.zip
Merge pull request #218 from mrphrazer/digraph_loops
Extend digraph with loop detection algorithms
Diffstat (limited to 'test/core/graph.py')
-rw-r--r--test/core/graph.py30
1 files changed, 29 insertions, 1 deletions
diff --git a/test/core/graph.py b/test/core/graph.py
index 5100cf8d..86175c91 100644
--- a/test/core/graph.py
+++ b/test/core/graph.py
@@ -163,4 +163,32 @@ assert(frontier == {7: set([9]),
 
 frontier = g2.compute_dominance_frontier(5)
 assert(frontier == {7: set([9]),
-                    8: set([9])})
\ No newline at end of file
+                    8: set([9])})
+
+# Regression test with natural loops and irreducible loops
+g3 = DiGraph()
+g3.add_edge(1, 2)
+g3.add_edge(1, 3)
+g3.add_edge(2, 4)
+g3.add_edge(2, 5)
+g3.add_edge(3, 7)
+g3.add_edge(3, 8)
+g3.add_edge(4, 9)
+g3.add_edge(5, 9)
+g3.add_edge(7, 6)
+g3.add_edge(8, 6)
+g3.add_edge(9, 6)
+g3.add_edge(9, 2)
+g3.add_edge(9, 1)
+g3.add_edge(7, 8)
+g3.add_edge(8, 7)
+
+loops = set([(backedge, frozenset(body)) for backedge, body in g3.compute_natural_loops(1)])
+assert(loops == {((1, 9), frozenset({1, 2, 4, 5, 9})),
+                 ((2, 9), frozenset({2, 4, 5, 9}))})
+
+sccs = set([frozenset(scc) for scc in g3.compute_strongly_connected_components()])
+assert(sccs == {frozenset({6}),
+                frozenset({7, 8}),
+                frozenset({3}),
+                frozenset({1, 2, 4, 5, 9})})