Browse Source

Merge pull request #1728 from BDisp/button-width-fix

Fixes GetMaxLengthforWidth on Button.
Tig Kindel 3 years ago
parent
commit
e987332b55
3 changed files with 55 additions and 9 deletions
  1. 6 3
      Terminal.Gui/Views/Button.cs
  2. 44 4
      UnitTests/ButtonTests.cs
  3. 5 2
      UnitTests/TextFormatterTests.cs

+ 6 - 3
Terminal.Gui/Views/Button.cs

@@ -137,7 +137,8 @@ namespace Terminal.Gui {
 				if (hotKey != hk) {
 					HotKey = hk;
 				}
-				Update ();
+				if (IsInitialized)
+					Update ();
 			}
 		}
 
@@ -149,7 +150,8 @@ namespace Terminal.Gui {
 			get => is_default;
 			set {
 				is_default = value;
-				Update ();
+				if (IsInitialized)
+					Update ();
 			}
 		}
 
@@ -186,7 +188,8 @@ namespace Terminal.Gui {
 			get => base.AutoSize;
 			set {
 				base.AutoSize = value;
-				Update ();
+				if (IsInitialized)
+					Update ();
 			}
 		}
 

+ 44 - 4
UnitTests/ButtonTests.cs

@@ -1,12 +1,16 @@
 using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
 using Xunit;
+using Xunit.Abstractions;
 
 namespace Terminal.Gui.Views {
 	public class ButtonTests {
+		readonly ITestOutputHelper output;
+
+		public ButtonTests (ITestOutputHelper output)
+		{
+			this.output = output;
+		}
+
 		[Fact, AutoInitShutdown]
 		public void Constructors_Defaults ()
 		{
@@ -185,5 +189,41 @@ namespace Terminal.Gui.Views {
 			Assert.Equal ("Te_st", btn.Text);
 			Assert.Equal (Key.S, btn.HotKey);
 		}
+
+		[Fact, AutoInitShutdown]
+		public void Update_Only_On_Or_After_Initialize ()
+		{
+			var btn = new Button ("Say Hello 你") {
+				X = Pos.Center (),
+				Y = Pos.Center ()
+			};
+			var win = new Window ("Test Demo 你") {
+				Width = Dim.Fill (),
+				Height = Dim.Fill ()
+			};
+			win.Add (btn);
+			Application.Top.Add (win);
+
+			Assert.False (btn.IsInitialized);
+
+			Application.Begin (Application.Top);
+			((FakeDriver)Application.Driver).SetBufferSize (30, 5);
+
+			Assert.True (btn.IsInitialized);
+			Assert.Equal ("Say Hello 你", btn.Text);
+			Assert.Equal ("[ Say Hello 你 ]", btn.TextFormatter.Text);
+			Assert.Equal (new Rect (0, 0, 16, 1), btn.Bounds);
+
+			var expected = @"
+┌ Test Demo 你 ──────────────┐
+│                            │
+│      [ Say Hello 你 ]      │
+│                            │
+└────────────────────────────┘
+";
+
+			var pos = GraphViewTests.AssertDriverContentsWithFrameAre (expected, output);
+			Assert.Equal (new Rect (0, 0, 30, 5), pos);
+		}
 	}
 }

+ 5 - 2
UnitTests/TextFormatterTests.cs

@@ -2065,7 +2065,8 @@ namespace Terminal.Gui.Core {
 			}
 			var label = new Label (breakLines) {
 				TextDirection = TextDirection.TopBottom_LeftRight,
-				Width = Dim.Fill (), Height = Dim.Fill () 
+				Width = Dim.Fill (),
+				Height = Dim.Fill ()
 			};
 			var frame = new FrameView () { Width = Dim.Fill (), Height = Dim.Fill () };
 
@@ -3153,7 +3154,7 @@ e
 		[Fact]
 		public void GetSumMaxCharWidth_List_Simple_And_Wide_Runes ()
 		{
-			List<ustring> text =new List<ustring>() { "Hello", "World" };
+			List<ustring> text = new List<ustring> () { "Hello", "World" };
 			Assert.Equal (2, TextFormatter.GetSumMaxCharWidth (text));
 			Assert.Equal (1, TextFormatter.GetSumMaxCharWidth (text, 1, 1));
 			text = new List<ustring> () { "こんにちは", "世界" };
@@ -3177,6 +3178,8 @@ e
 			Assert.Equal (6, TextFormatter.GetMaxLengthForWidth (runes, 6));
 			runes = ustring.Make ("こんにちは 世界").ToRuneList ();
 			Assert.Equal (3, TextFormatter.GetMaxLengthForWidth (runes, 6));
+			runes = ustring.Make ("[ Say Hello 你 ]").ToRuneList ();
+			Assert.Equal (15, TextFormatter.GetMaxLengthForWidth (runes, 16));
 		}
 
 		[Fact]