| 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). |
| } |