public void Can_detect_cycles()
        {
            /*
             *              A
             |
             |      ----------
             |        |
             |      B        C
             |
             |              -----------
             |
             |              D         E<-
             |		  |  |
             |              G		  F--
             */

            var a = new SortableItem {
                Key = "A"
            };
            var b = new SortableItem {
                Key = "B", DependsOn = new string[] { "A" }
            };
            var c = new SortableItem {
                Key = "C", DependsOn = new string[] { "a" }
            };
            var d = new SortableItem {
                Key = "D", DependsOn = new string[] { "C" }
            };
            var e = new SortableItem {
                Key = "E", DependsOn = new string[] { "f" }
            };
            var f = new SortableItem {
                Key = "F", DependsOn = new string[] { "e" }
            };
            var g = new SortableItem {
                Key = "G", DependsOn = new string[] { "D" }
            };

            var items = new SortableItem[] { c, e, b, d, a, g, f };

            Assert.Throws <CyclicDependencyException>(() => items.SortTopological(StringComparer.OrdinalIgnoreCase));
        }
        public void Can_sort_topological()
        {
            /*
             *              A
             |
             |      ----------
             |        |
             |      B        C
             |
             |              -----------
             |         |
             |              D         E
             |		  |
             |              H		  F
             |		  |
             |              I		  G
             */

            var a = new SortableItem {
                Key = "A"
            };
            var b = new SortableItem {
                Key = "B", DependsOn = new string[] { "A" }
            };
            var c = new SortableItem {
                Key = "C", DependsOn = new string[] { "a" }
            };
            var d = new SortableItem {
                Key = "D", DependsOn = new string[] { "C" }
            };
            var e = new SortableItem {
                Key = "E", DependsOn = new string[] { "c" }
            };
            var f = new SortableItem {
                Key = "F", DependsOn = new string[] { "e" }
            };
            var g = new SortableItem {
                Key = "G", DependsOn = new string[] { "f" }
            };
            var h = new SortableItem {
                Key = "H", DependsOn = new string[] { "D" }
            };
            var i = new SortableItem {
                Key = "I", DependsOn = new string[] { "H" }
            };

            var items = new SortableItem[] { c, e, b, d, a, i, g, f, h };

            var sortedItems = items.SortTopological(StringComparer.OrdinalIgnoreCase);

            Console.WriteLine(String.Join(", ", sortedItems.Select(x => x.Key).ToArray()));

            Assert.AreEqual(items.Length, sortedItems.Length);
            Assert.Less(Array.IndexOf(sortedItems, a), Array.IndexOf(sortedItems, b));
            Assert.Less(Array.IndexOf(sortedItems, a), Array.IndexOf(sortedItems, c));
            Assert.Less(Array.IndexOf(sortedItems, a), Array.IndexOf(sortedItems, d));
            Assert.Less(Array.IndexOf(sortedItems, a), Array.IndexOf(sortedItems, e));
            Assert.Less(Array.IndexOf(sortedItems, c), Array.IndexOf(sortedItems, d));
            Assert.Less(Array.IndexOf(sortedItems, c), Array.IndexOf(sortedItems, e));
            Assert.Less(Array.IndexOf(sortedItems, d), Array.IndexOf(sortedItems, h));
            Assert.Less(Array.IndexOf(sortedItems, h), Array.IndexOf(sortedItems, i));
            Assert.Less(Array.IndexOf(sortedItems, e), Array.IndexOf(sortedItems, f));
            Assert.Less(Array.IndexOf(sortedItems, f), Array.IndexOf(sortedItems, g));
        }