diff --git a/Terminal.Gui/Core/View.cs b/Terminal.Gui/Core/View.cs index c612d16b8..be4260f32 100644 --- a/Terminal.Gui/Core/View.cs +++ b/Terminal.Gui/Core/View.cs @@ -1385,10 +1385,12 @@ namespace Terminal.Gui { } } - // if graph has edges then if (edges.Any ()) { - // return error (graph has at least one cycle) - return null; + if (!object.ReferenceEquals(edges.First ().From, edges.First ().To)) { + throw new InvalidOperationException ($"TopologicalSort (for Pos/Dim) cannot find {edges.First ().From}. Did you forget to add it to {this}?"); + } else { + throw new InvalidOperationException ("TopologicalSort encountered a recursive cycle in the relative Pos/Dim in the views of " + this); + } } else { // return L (a topologically sorted order) return result; @@ -1454,8 +1456,6 @@ namespace Terminal.Gui { } var ordered = TopologicalSort (nodes, edges); - if (ordered == null) - throw new Exception ("There is a recursive cycle in the relative Pos/Dim in the views of " + this); foreach (var v in ordered) { if (v.LayoutStyle == LayoutStyle.Computed) @@ -1483,7 +1483,7 @@ namespace Terminal.Gui { /// The returning hot-key position. /// The character immediately to the right relative to the hot-key position /// It aims to facilitate the preparation for procedures. - public virtual ustring GetTextFromHotKey(ustring text, Rune hotKey, out int hotPos, out Rune showHotKey) + public virtual ustring GetTextFromHotKey (ustring text, Rune hotKey, out int hotPos, out Rune showHotKey) { Rune hot_key = (Rune)0; int hot_pos = -1; diff --git a/UnitTests/ViewTests.cs b/UnitTests/ViewTests.cs index 059544090..f89cbf6d3 100644 --- a/UnitTests/ViewTests.cs +++ b/UnitTests/ViewTests.cs @@ -107,5 +107,33 @@ namespace Terminal.Gui { // TODO: Add more } + + [Fact] + public void TopologicalSort_Missing_Add () + { + var root = new View (); + var sub1 = new View (); + root.Add (sub1); + var sub2 = new View (); + sub1.Width = Dim.Width(sub2); + + Assert.Throws (() => root.LayoutSubviews ()); + + sub2.Width = Dim.Width (sub1); + + Assert.Throws (() => root.LayoutSubviews ()); + } + + [Fact] + public void TopologicalSort_Recursive_Ref () + { + var root = new View (); + var sub1 = new View (); + root.Add (sub1); + var sub2 = new View (); + root.Add (sub2); + sub2.Width = Dim.Width (sub2); + Assert.Throws (() => root.LayoutSubviews ()); + } } }