Exemple #1
0
        public void ShouldSortCorrectly()
        {
            var n1 = new StrNode { Name = "1" };
            var n2 = new StrNode { Name = "2" };
            var n3 = new StrNode { Name = "3" };
            var n4 = new StrNode { Name = "4" };
            var n5 = new StrNode { Name = "5" };
            var n6 = new StrNode { Name = "6" };
            var n7 = new StrNode { Name = "7" };
            var n8 = new StrNode { Name = "8" };
            var n9 = new StrNode { Name = "9" };
            var n10 = new StrNode { Name = "10" };
            var n11 = new StrNode { Name = "11" };
            var n12 = new StrNode { Name = "12" };
            var n13 = new StrNode { Name = "13" };
            var n14 = new StrNode { Name = "14" };

            n1.DependsOn(n2, n3);
            n2.DependsOn(n4, n5);
            n5.DependsOn(n6);
            n6.DependsOn(n7);
            n7.DependsOn(n8, n9);
            n8.DependsOn(n10);
            n9.DependsOn(n10);
            n11.DependsOn(n1);
            n12.DependsOn(n13);
            n13.DependsOn(n14);
            n14.DependsOn(n12);

            var nodes = new[] { n1, n2, n3, n4, n5, n6, n7, n8, n9, n10, n11, n12, n13, n14 };

            var circular = new List<StrNode>();
            var sorted = Trees.TopoSort(nodes, n => n.Dependencies, c => circular.Add(c))
                .Select(n => n.Name)
                .ToArray();

            Assert.Less(sorted.IndexOf("10"), sorted.IndexOf("8"));
            Assert.Less(sorted.IndexOf("10"), sorted.IndexOf("9"));
            Assert.Less(sorted.IndexOf("8"), sorted.IndexOf("7"));
            Assert.Less(sorted.IndexOf("9"), sorted.IndexOf("7"));
            Assert.Less(sorted.IndexOf("7"), sorted.IndexOf("6"));
            Assert.Less(sorted.IndexOf("6"), sorted.IndexOf("5"));
            Assert.Less(sorted.IndexOf("5"), sorted.IndexOf("2"));
            Assert.Less(sorted.IndexOf("4"), sorted.IndexOf("2"));
            Assert.Less(sorted.IndexOf("2"), sorted.IndexOf("1"));
            Assert.Less(sorted.IndexOf("3"), sorted.IndexOf("1"));

            Assert.AreEqual(3, circular.Count);
            CollectionAssert.Contains(circular, n12);
            CollectionAssert.Contains(circular, n13);
            CollectionAssert.Contains(circular, n14);
        }