Change the immediate_dominator return type to Option, and use None to indicate that node has no immediate dominator. Also fix the issue where the start node would be returned as its own immediate dominator.
55 lines
1.7 KiB
Rust
55 lines
1.7 KiB
Rust
use super::*;
|
|
|
|
use super::super::tests::TestGraph;
|
|
|
|
#[test]
|
|
fn diamond() {
|
|
let graph = TestGraph::new(0, &[(0, 1), (0, 2), (1, 3), (2, 3)]);
|
|
|
|
let dominators = dominators(&graph);
|
|
let immediate_dominators = &dominators.immediate_dominators;
|
|
assert_eq!(immediate_dominators[0], None);
|
|
assert_eq!(immediate_dominators[1], Some(0));
|
|
assert_eq!(immediate_dominators[2], Some(0));
|
|
assert_eq!(immediate_dominators[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 dominators = dominators(&graph);
|
|
let immediate_dominators = &dominators.immediate_dominators;
|
|
assert_eq!(immediate_dominators[0], None); // <-- note that 0 is not in graph
|
|
assert_eq!(immediate_dominators[1], Some(6));
|
|
assert_eq!(immediate_dominators[2], Some(6));
|
|
assert_eq!(immediate_dominators[3], Some(6));
|
|
assert_eq!(immediate_dominators[4], Some(6));
|
|
assert_eq!(immediate_dominators[5], Some(6));
|
|
assert_eq!(immediate_dominators[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 dominators = dominators(&graph);
|
|
assert_eq!(dominators.immediate_dominator(0), None);
|
|
assert_eq!(dominators.immediate_dominator(1), None);
|
|
assert_eq!(dominators.immediate_dominator(2), Some(1));
|
|
assert_eq!(dominators.immediate_dominator(3), Some(2));
|
|
}
|