Browse Source

Merge branch 'master' of https://github.com/migueldeicaza/gui.cs into combobox_fixes

Ross Ferguson 5 years ago
parent
commit
16db1215cb
2 changed files with 34 additions and 6 deletions
  1. 6 6
      Terminal.Gui/Core/View.cs
  2. 28 0
      UnitTests/ViewTests.cs

+ 6 - 6
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 {
 		/// <param name="hotPos">The returning hot-key position.</param>
 		/// <param name="showHotKey">The character immediately to the right relative to the hot-key position</param>
 		/// <returns>It aims to facilitate the preparation for <see cref="TextAlignment"/> procedures.</returns>
-		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;

+ 28 - 0
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<InvalidOperationException> (() => root.LayoutSubviews ());
+
+			sub2.Width = Dim.Width (sub1);
+
+			Assert.Throws<InvalidOperationException> (() => 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<InvalidOperationException> (() => root.LayoutSubviews ());
+		}
 	}
 }