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 ());
+ }
}
}