Example #1
0
        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"]));
        }
Example #2
0
        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"]));
        }