public void ComplexLoopTest() { var reader = new DotReader(new StringReader(@" strict digraph { 1 -> 2 -> 3 -> 4 -> 3 -> 5 -> 6 -> 7 }")); var cfg = reader.Read(); var info = new DominatorInfo(cfg.Nodes["1"]); Assert.True(info.Dominates(cfg.Nodes["1"], cfg.Nodes["1"])); Assert.True(info.Dominates(cfg.Nodes["1"], cfg.Nodes["2"])); Assert.True(info.Dominates(cfg.Nodes["1"], cfg.Nodes["3"])); Assert.True(info.Dominates(cfg.Nodes["1"], cfg.Nodes["4"])); Assert.True(info.Dominates(cfg.Nodes["1"], cfg.Nodes["5"])); Assert.True(info.Dominates(cfg.Nodes["1"], cfg.Nodes["6"])); Assert.True(info.Dominates(cfg.Nodes["1"], cfg.Nodes["7"])); Assert.False(info.Dominates(cfg.Nodes["2"], cfg.Nodes["1"])); Assert.True(info.Dominates(cfg.Nodes["2"], cfg.Nodes["2"])); Assert.True(info.Dominates(cfg.Nodes["2"], cfg.Nodes["3"])); Assert.True(info.Dominates(cfg.Nodes["2"], cfg.Nodes["4"])); Assert.True(info.Dominates(cfg.Nodes["2"], cfg.Nodes["5"])); Assert.True(info.Dominates(cfg.Nodes["2"], cfg.Nodes["6"])); Assert.True(info.Dominates(cfg.Nodes["2"], cfg.Nodes["7"])); Assert.False(info.Dominates(cfg.Nodes["3"], cfg.Nodes["1"])); Assert.False(info.Dominates(cfg.Nodes["3"], cfg.Nodes["2"])); Assert.True(info.Dominates(cfg.Nodes["3"], cfg.Nodes["3"])); Assert.True(info.Dominates(cfg.Nodes["3"], cfg.Nodes["4"])); Assert.True(info.Dominates(cfg.Nodes["3"], cfg.Nodes["5"])); Assert.True(info.Dominates(cfg.Nodes["3"], cfg.Nodes["6"])); Assert.True(info.Dominates(cfg.Nodes["3"], cfg.Nodes["7"])); Assert.False(info.Dominates(cfg.Nodes["4"], cfg.Nodes["1"])); Assert.False(info.Dominates(cfg.Nodes["4"], cfg.Nodes["2"])); Assert.False(info.Dominates(cfg.Nodes["4"], cfg.Nodes["3"])); Assert.True(info.Dominates(cfg.Nodes["4"], cfg.Nodes["4"])); Assert.False(info.Dominates(cfg.Nodes["4"], cfg.Nodes["5"])); Assert.False(info.Dominates(cfg.Nodes["4"], cfg.Nodes["6"])); Assert.False(info.Dominates(cfg.Nodes["4"], cfg.Nodes["7"])); Assert.False(info.Dominates(cfg.Nodes["5"], cfg.Nodes["1"])); Assert.False(info.Dominates(cfg.Nodes["5"], cfg.Nodes["2"])); Assert.False(info.Dominates(cfg.Nodes["5"], cfg.Nodes["3"])); Assert.False(info.Dominates(cfg.Nodes["5"], cfg.Nodes["4"])); Assert.True(info.Dominates(cfg.Nodes["5"], cfg.Nodes["5"])); Assert.True(info.Dominates(cfg.Nodes["5"], cfg.Nodes["6"])); Assert.True(info.Dominates(cfg.Nodes["5"], cfg.Nodes["7"])); Assert.False(info.Dominates(cfg.Nodes["6"], cfg.Nodes["1"])); Assert.False(info.Dominates(cfg.Nodes["6"], cfg.Nodes["2"])); Assert.False(info.Dominates(cfg.Nodes["6"], cfg.Nodes["3"])); Assert.False(info.Dominates(cfg.Nodes["6"], cfg.Nodes["4"])); Assert.False(info.Dominates(cfg.Nodes["6"], cfg.Nodes["5"])); Assert.True(info.Dominates(cfg.Nodes["6"], cfg.Nodes["6"])); Assert.True(info.Dominates(cfg.Nodes["6"], cfg.Nodes["7"])); Assert.False(info.Dominates(cfg.Nodes["7"], cfg.Nodes["1"])); Assert.False(info.Dominates(cfg.Nodes["7"], cfg.Nodes["2"])); Assert.False(info.Dominates(cfg.Nodes["7"], cfg.Nodes["3"])); Assert.False(info.Dominates(cfg.Nodes["7"], cfg.Nodes["4"])); Assert.False(info.Dominates(cfg.Nodes["7"], cfg.Nodes["5"])); Assert.False(info.Dominates(cfg.Nodes["7"], cfg.Nodes["6"])); Assert.True(info.Dominates(cfg.Nodes["7"], cfg.Nodes["7"])); }
public void Dominates() { var cfg = new Graph(); cfg.Nodes.Add("1"); cfg.Nodes.Add("2"); cfg.Nodes.Add("3"); cfg.Nodes.Add("4"); cfg.Edges.Add("1", "2"); cfg.Edges.Add("2", "3"); cfg.Edges.Add("3", "4"); var info = new DominatorInfo(cfg.Nodes["1"]); Assert.True(info.Dominates(cfg.Nodes["1"], cfg.Nodes["1"])); Assert.True(info.Dominates(cfg.Nodes["1"], cfg.Nodes["2"])); Assert.True(info.Dominates(cfg.Nodes["1"], cfg.Nodes["3"])); Assert.True(info.Dominates(cfg.Nodes["1"], cfg.Nodes["4"])); Assert.False(info.Dominates(cfg.Nodes["2"], cfg.Nodes["1"])); Assert.True(info.Dominates(cfg.Nodes["2"], cfg.Nodes["2"])); Assert.True(info.Dominates(cfg.Nodes["2"], cfg.Nodes["3"])); Assert.True(info.Dominates(cfg.Nodes["2"], cfg.Nodes["4"])); Assert.False(info.Dominates(cfg.Nodes["3"], cfg.Nodes["1"])); Assert.False(info.Dominates(cfg.Nodes["3"], cfg.Nodes["2"])); Assert.True(info.Dominates(cfg.Nodes["3"], cfg.Nodes["3"])); Assert.True(info.Dominates(cfg.Nodes["3"], cfg.Nodes["4"])); Assert.False(info.Dominates(cfg.Nodes["4"], cfg.Nodes["1"])); Assert.False(info.Dominates(cfg.Nodes["4"], cfg.Nodes["2"])); Assert.False(info.Dominates(cfg.Nodes["4"], cfg.Nodes["3"])); Assert.True(info.Dominates(cfg.Nodes["4"], cfg.Nodes["4"])); }