use super::*; use super::super::tests::TestGraph; #[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). }