78 lines
2.1 KiB
Rust
78 lines
2.1 KiB
Rust
use super::super::tests::TestGraph;
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn diamond() {
|
|
let graph = TestGraph::new(0, &[(0, 1), (0, 2), (1, 3), (2, 3)]);
|
|
|
|
let d = dominators(&graph);
|
|
assert_eq!(d.immediate_dominator(0), None);
|
|
assert_eq!(d.immediate_dominator(1), Some(0));
|
|
assert_eq!(d.immediate_dominator(2), Some(0));
|
|
assert_eq!(d.immediate_dominator(3), Some(0));
|
|
}
|
|
|
|
#[test]
|
|
fn paper() {
|
|
// example from the paper:
|
|
let graph = TestGraph::new(
|
|
6,
|
|
&[(6, 5), (6, 4), (5, 1), (4, 2), (4, 3), (1, 2), (2, 3), (3, 2), (2, 1)],
|
|
);
|
|
|
|
let d = dominators(&graph);
|
|
assert_eq!(d.immediate_dominator(0), None); // <-- note that 0 is not in graph
|
|
assert_eq!(d.immediate_dominator(1), Some(6));
|
|
assert_eq!(d.immediate_dominator(2), Some(6));
|
|
assert_eq!(d.immediate_dominator(3), Some(6));
|
|
assert_eq!(d.immediate_dominator(4), Some(6));
|
|
assert_eq!(d.immediate_dominator(5), Some(6));
|
|
assert_eq!(d.immediate_dominator(6), None);
|
|
}
|
|
|
|
#[test]
|
|
fn paper_slt() {
|
|
// example from the paper:
|
|
let graph = TestGraph::new(
|
|
1,
|
|
&[(1, 2), (1, 3), (2, 3), (2, 7), (3, 4), (3, 6), (4, 5), (5, 4), (6, 7), (7, 8), (8, 5)],
|
|
);
|
|
|
|
dominators(&graph);
|
|
}
|
|
|
|
#[test]
|
|
fn immediate_dominator() {
|
|
let graph = TestGraph::new(1, &[(1, 2), (2, 3)]);
|
|
let d = dominators(&graph);
|
|
assert_eq!(d.immediate_dominator(0), None);
|
|
assert_eq!(d.immediate_dominator(1), None);
|
|
assert_eq!(d.immediate_dominator(2), Some(1));
|
|
assert_eq!(d.immediate_dominator(3), Some(2));
|
|
}
|
|
|
|
#[test]
|
|
fn transitive_dominator() {
|
|
let graph = TestGraph::new(
|
|
0,
|
|
&[
|
|
// First tree branch.
|
|
(0, 1),
|
|
(1, 2),
|
|
(2, 3),
|
|
(3, 4),
|
|
// Second tree branch.
|
|
(1, 5),
|
|
(5, 6),
|
|
// Third tree branch.
|
|
(0, 7),
|
|
// These links make 0 the dominator for 2 and 3.
|
|
(7, 2),
|
|
(5, 3),
|
|
],
|
|
);
|
|
|
|
let d = dominators(&graph);
|
|
assert_eq!(d.immediate_dominator(2), Some(0));
|
|
assert_eq!(d.immediate_dominator(3), Some(0)); // This used to return Some(1).
|
|
}
|