From a7449df5af1decdf5ee58f9259279d8a8c5ffe38 Mon Sep 17 00:00:00 2001 From: Tig Kindel Date: Sat, 6 Jan 2024 09:35:55 -0700 Subject: [PATCH] Dim/Pos != null WIP --- Terminal.Gui/View/Layout/ViewLayout.cs | 100 +- Terminal.Gui/View/View.cs | 10 +- Terminal.Gui/View/ViewSubViews.cs | 8 +- UnitTests/View/Layout/AbsoluteLayoutTests.cs | 316 +-- UnitTests/View/Layout/AutoSizeTests.cs | 2307 +++++++++++------ UnitTests/View/Layout/DimTests.cs | 2 - UnitTests/View/Layout/LayoutTests.cs | 678 +---- .../View/Layout/SetRelativeLayoutTests.cs | 132 +- 8 files changed, 1672 insertions(+), 1881 deletions(-) diff --git a/Terminal.Gui/View/Layout/ViewLayout.cs b/Terminal.Gui/View/Layout/ViewLayout.cs index c65d6cbe4..bd658eee3 100644 --- a/Terminal.Gui/View/Layout/ViewLayout.cs +++ b/Terminal.Gui/View/Layout/ViewLayout.cs @@ -29,15 +29,11 @@ public enum LayoutStyle { public partial class View { bool _autoSize; - // The frame for the object. Relative to the SuperView's Bounds. + /// + /// Backing property for Frame - The frame for the object. Relative to the SuperView's Bounds. + /// Rect _frame; - LayoutStyle _layoutStyle; - - Dim _width, _height; - - Pos _x, _y; - /// /// Gets or sets location and size of the view. The frame is relative to the 's /// . @@ -65,10 +61,10 @@ public partial class View { get => _frame; set { _frame = new Rect (value.X, value.Y, Math.Max (value.Width, 0), Math.Max (value.Height, 0)); - //X = _frame.X; - //Y = _frame.Y; - //Width = _frame.Width; - //Height = _frame.Height; + _x = _frame.X; + _y = _frame.Y; + _width = _frame.Width; + _height = _frame.Height; if (IsInitialized || LayoutStyle == LayoutStyle.Absolute) { LayoutFrames (); TextFormatter.Size = GetTextFormatterSizeNeededForTextAndHotKey (); @@ -201,31 +197,16 @@ public partial class View { /// /// The layout style. public LayoutStyle LayoutStyle { - get => _layoutStyle; - //if ((X == null || X is Pos.PosAbsolute) && (Y == null || Y is Pos.PosAbsolute) && - //(Width == null || Width is Dim.DimAbsolute) && (Height == null || Height is Dim.DimAbsolute)) { - // return LayoutStyle.Absolute; - //} else { - // return LayoutStyle.Computed; - //} + get { + if (_x is Pos.PosAbsolute && _y is Pos.PosAbsolute && _width is Dim.DimAbsolute && _height is Dim.DimAbsolute) { + return LayoutStyle.Absolute; + } else { + return LayoutStyle.Computed; + } + } set { - _layoutStyle = value; - //switch (_layoutStyle) { - //case LayoutStyle.Absolute: - // X = Frame.X; - // Y = Frame.Y; - // Width = Frame.Width; - // Height = Frame.Height; - // break; - - //case LayoutStyle.Computed: - // X ??= Frame.X; - // Y ??= Frame.Y; - // Width ??= Frame.Width; - // Height ??= Frame.Height; - // break; - //} - SetNeedsLayout (); + // TODO: Remove this setter and make LayoutStyle read-only for real. + throw new InvalidOperationException ("LayoutStyle is read-only."); } } @@ -278,6 +259,8 @@ public partial class View { } } + Pos _x = Pos.At (0); + /// /// Gets or sets the X position for the view (the column). /// @@ -306,13 +289,13 @@ public partial class View { public Pos X { get => VerifyIsInitialized (_x, nameof (X)); set { - // BUGBUG: null is the sames a Pos.Absolute(0). Should we be explicit and set it? - _x = value; - + _x = value ?? throw new ArgumentNullException (nameof (value), @$"{nameof (X)} cannot be null"); OnResizeNeeded (); } } + Pos _y = Pos.At (0); + /// /// Gets or sets the Y position for the view (the row). /// @@ -341,13 +324,13 @@ public partial class View { public Pos Y { get => VerifyIsInitialized (_y, nameof (Y)); set { - // BUGBUG: null is the sames a Pos.Absolute(0). Should we be explicit and set it? - _y = value; - + _y = value ?? throw new ArgumentNullException (nameof (value), @$"{nameof (Y)} cannot be null"); OnResizeNeeded (); } } + Dim _width = Dim.Sized (0); + /// /// Gets or sets the width of the view. /// @@ -373,8 +356,7 @@ public partial class View { public Dim Width { get => VerifyIsInitialized (_width, nameof (Width)); set { - // BUGBUG: null is the sames a Dim.Fill(0). Should we be explicit and set it? - _width = value; + _width = value ?? throw new ArgumentNullException (nameof (value), @$"{nameof (Width)} cannot be null"); if (ValidatePosDim) { var isValidNewAutSize = AutoSize && IsValidAutoSizeWidth (_width); @@ -387,6 +369,8 @@ public partial class View { } } + Dim _height = Dim.Sized (0); + /// /// Gets or sets the height of the view. /// @@ -412,8 +396,7 @@ public partial class View { public Dim Height { get => VerifyIsInitialized (_height, nameof (Height)); set { - // BUGBUG: null is the sames a Dim.Fill(0). Should we be explicit and set it? - _height = value; + _height = value ?? throw new ArgumentNullException (nameof (value), @$"{nameof (Height)} cannot be null"); if (ValidatePosDim) { var isValidNewAutSize = AutoSize && IsValidAutoSizeHeight (_height); @@ -542,7 +525,7 @@ public partial class View { if (Margin == null || Border == null || Padding == null) { return new Rect (default, Frame.Size); } - var width = Math.Max (0, Frame.Size.Width - Margin.Thickness.Horizontal - Border.Thickness.Horizontal - Padding.Thickness.Horizontal); + var width = Math.Max (0, Frame.Size.Width - Margin.Thickness.Horizontal - Border.Thickness.Horizontal - Padding.Thickness.Horizontal); var height = Math.Max (0, Frame.Size.Height - Margin.Thickness.Vertical - Border.Thickness.Vertical - Padding.Thickness.Vertical); return new Rect (Point.Empty, new Size (width, height)); } @@ -614,8 +597,8 @@ public partial class View { } else { var w = _width is Dim.DimAbsolute ? _width.Anchor (0) : _frame.Width; var h = _height is Dim.DimAbsolute ? _height.Anchor (0) : _frame.Height; - // BUGBUG: v2 - ? - If layoutstyle is absolute, this overwrites the current frame h/w with 0. Hmmm... - // This is needed for DimAbsolute values by setting the frame before LayoutSubViews. + //// BUGBUG: v2 - ? - If layoutstyle is absolute, this overwrites the current frame h/w with 0. Hmmm... + //// This is needed for DimAbsolute values by setting the frame before LayoutSubViews. _frame = new Rect (new Point (actX, actY), new Size (w, h)); // Set frame, not Frame! } //// BUGBUG: I think these calls are redundant or should be moved into just the AutoSize case @@ -750,6 +733,11 @@ public partial class View { /// internal void SetRelativeLayout (Rect superviewBounds) { + Debug.Assert (_x != null); + Debug.Assert (_y != null); + Debug.Assert (_width != null); + Debug.Assert (_height != null); + int newX, newW, newY, newH; var autosize = Size.Empty; @@ -775,13 +763,9 @@ public partial class View { { int newDimension; switch (d) { - case null: - // dim == null is the same as dim == Dim.FIll (0) - newDimension = AutoSize ? autosize : dimension; - break; case Dim.DimCombine combine: - var leftNewDim = GetNewDimension (combine._left, location, dimension, autosize); + var leftNewDim = GetNewDimension (combine._left, location, dimension, autosize); var rightNewDim = GetNewDimension (combine._right, location, dimension, autosize); if (combine._add) { newDimension = leftNewDim + rightNewDim; @@ -797,6 +781,7 @@ public partial class View { break; case Dim.DimFill: + case Dim.DimAbsolute: default: newDimension = Math.Max (d.Anchor (dimension - location), 0); newDimension = AutoSize && autosize > newDimension ? autosize : newDimension; @@ -821,7 +806,7 @@ public partial class View { case Pos.PosCombine combine: int left, right; - (left, newDimension) = GetNewLocationAndDimension (width, superviewBounds, combine._left, dim, autosizeDimension); + (left, newDimension) = GetNewLocationAndDimension (width, superviewBounds, combine._left, dim, autosizeDimension); (right, newDimension) = GetNewLocationAndDimension (width, superviewBounds, combine._right, dim, autosizeDimension); if (combine._add) { newLocation = left + right; @@ -833,7 +818,6 @@ public partial class View { case Pos.PosAnchorEnd: case Pos.PosAbsolute: - case null: case Pos.PosFactor: case Pos.PosFunc: case Pos.PosView: @@ -907,7 +891,7 @@ public partial class View { } return; case Pos.PosCombine pc: - CollectPos (pc._left, from, ref nNodes, ref nEdges); + CollectPos (pc._left, from, ref nNodes, ref nEdges); CollectPos (pc._right, from, ref nNodes, ref nEdges); break; } @@ -926,7 +910,7 @@ public partial class View { } return; case Dim.DimCombine dc: - CollectDim (dc._left, from, ref nNodes, ref nEdges); + CollectDim (dc._left, from, ref nNodes, ref nEdges); CollectDim (dc._right, from, ref nNodes, ref nEdges); break; } @@ -942,7 +926,7 @@ public partial class View { } CollectPos (v.X, v, ref nNodes, ref nEdges); CollectPos (v.Y, v, ref nNodes, ref nEdges); - CollectDim (v.Width, v, ref nNodes, ref nEdges); + CollectDim (v.Width, v, ref nNodes, ref nEdges); CollectDim (v.Height, v, ref nNodes, ref nEdges); } } diff --git a/Terminal.Gui/View/View.cs b/Terminal.Gui/View/View.cs index d6e798c03..d6dc3bef2 100644 --- a/Terminal.Gui/View/View.cs +++ b/Terminal.Gui/View/View.cs @@ -218,10 +218,8 @@ public partial class View : Responder, ISupportInitializeNotification { CanFocus = false; TabIndex = -1; TabStop = false; - LayoutStyle = layoutStyle; Text = text == null ? string.Empty : text; - LayoutStyle = layoutStyle; Frame = rect.IsEmpty ? TextFormatter.CalcRect (0, 0, text, direction) : rect; OnResizeNeeded (); @@ -497,10 +495,10 @@ public partial class View : Responder, ISupportInitializeNotification { Padding?.Dispose (); Padding = null; - _height = null; - _width = null; - _x = null; - _y = null; + //_height = null; + //_width = null; + //_x = null; + //_y = null; for (int i = InternalSubviews.Count - 1; i >= 0; i--) { var subview = InternalSubviews [i]; diff --git a/Terminal.Gui/View/ViewSubViews.cs b/Terminal.Gui/View/ViewSubViews.cs index c546200ed..a7f15c0f5 100644 --- a/Terminal.Gui/View/ViewSubViews.cs +++ b/Terminal.Gui/View/ViewSubViews.cs @@ -120,10 +120,10 @@ namespace Terminal.Gui { var view = e.Child; view.IsAdded = true; view.OnResizeNeeded (); - view._x ??= view._frame.X; - view._y ??= view._frame.Y; - view._width ??= view._frame.Width; - view._height ??= view._frame.Height; + //view._x ??= view._frame.X; + //view._y ??= view._frame.Y; + //view._width ??= view._frame.Width; + //view._height ??= view._frame.Height; view.Added?.Invoke (this, e); } diff --git a/UnitTests/View/Layout/AbsoluteLayoutTests.cs b/UnitTests/View/Layout/AbsoluteLayoutTests.cs index 3b730266a..a38f2a4e0 100644 --- a/UnitTests/View/Layout/AbsoluteLayoutTests.cs +++ b/UnitTests/View/Layout/AbsoluteLayoutTests.cs @@ -1,5 +1,6 @@ using Xunit; using Xunit.Abstractions; + //using GraphViewTests = Terminal.Gui.Views.GraphViewTests; // Alias Console to MockConsole so we don't accidentally use Console @@ -9,193 +10,196 @@ namespace Terminal.Gui.ViewTests; public class AbsoluteLayoutTests { readonly ITestOutputHelper _output; - public AbsoluteLayoutTests (ITestOutputHelper output) => this._output = output; + public AbsoluteLayoutTests (ITestOutputHelper output) => _output = output; - [Fact] [TestRespondersDisposed] + [Fact] + [TestRespondersDisposed] public void AbsoluteLayout_Constructor () { - var frame = new Rect (1, 2, 3, 4); + var frame = Rect.Empty; var v = new View (frame); Assert.True (v.LayoutStyle == LayoutStyle.Absolute); - Assert.Equal (frame, v.Frame); + Assert.Equal (frame, v.Frame); Assert.Equal (new Rect (0, 0, frame.Width, frame.Height), v.Bounds); // With Absolute Bounds *is* deterministic before Layout - Assert.Null (v.X); - Assert.Null (v.Y); - Assert.Null (v.Height); - Assert.Null (v.Width); + Assert.Equal (Pos.At (0), v.X); + Assert.Equal (Pos.At (0), v.Y); + Assert.Equal (Dim.Sized (0), v.Width); + Assert.Equal (Dim.Sized (0), v.Height); + v.Dispose (); + + frame = new Rect (1, 2, 3, 4); + v = new View (frame); + Assert.True (v.LayoutStyle == LayoutStyle.Absolute); + Assert.Equal (frame, v.Frame); + Assert.Equal (new Rect (0, 0, frame.Width, frame.Height), v.Bounds); // With Absolute Bounds *is* deterministic before Layout + Assert.Equal (Pos.At (1), v.X); + Assert.Equal (Pos.At (2), v.Y); + Assert.Equal (Dim.Sized (3), v.Width); + Assert.Equal (Dim.Sized (4), v.Height); v.Dispose (); v = new View (frame, "v"); Assert.True (v.LayoutStyle == LayoutStyle.Absolute); - Assert.Equal (frame, v.Frame); + Assert.Equal (frame, v.Frame); Assert.Equal (new Rect (0, 0, frame.Width, frame.Height), v.Bounds); // With Absolute Bounds *is* deterministic before Layout - Assert.Null (v.X); - Assert.Null (v.Y); - Assert.Null (v.Height); - Assert.Null (v.Width); + Assert.Equal (Pos.At (1), v.X); + Assert.Equal (Pos.At (2), v.Y); + Assert.Equal (Dim.Sized (3), v.Width); + Assert.Equal (Dim.Sized (4), v.Height); v.Dispose (); v = new View (frame.X, frame.Y, "v"); Assert.True (v.LayoutStyle == LayoutStyle.Absolute); - // BUGBUG: v2 - I think the default size should be 0,0 + // BUGBUG: v2 - I think the default size should be 0,0 not 1,1 Assert.Equal (new Rect (frame.X, frame.Y, 1, 1), v.Frame); - Assert.Equal (new Rect (0, 0, 1, 1), v.Bounds); // With Absolute Bounds *is* deterministic before Layout - Assert.Null (v.X); - Assert.Null (v.Y); - Assert.Null (v.Height); - Assert.Null (v.Width); + Assert.Equal (new Rect (0, 0, 1, 1), v.Bounds); // With Absolute Bounds *is* deterministic before Layout + Assert.Equal (Pos.At (1), v.X); + Assert.Equal (Pos.At (2), v.Y); + Assert.Equal (Dim.Sized (1), v.Width); + Assert.Equal (Dim.Sized (1), v.Height); + v.Dispose (); + + v = new View (); + Assert.True (v.LayoutStyle == LayoutStyle.Absolute); + Assert.Equal (new Rect (0, 0, 0, 0), v.Frame); + Assert.Equal (new Rect (0, 0, 0, 0), v.Bounds); // With Absolute Bounds *is* deterministic before Layout + Assert.Equal (Pos.At (0), v.X); + Assert.Equal (Pos.At (0), v.Y); + Assert.Equal (Dim.Sized (0), v.Width); + Assert.Equal (Dim.Sized (0), v.Height); + v.Dispose (); + + v = new View { + X = frame.X, + Y = frame.Y, + Width = frame.Width, + Height = frame.Height + }; + Assert.True (v.LayoutStyle == LayoutStyle.Absolute); + Assert.Equal (new Rect (frame.X, frame.Y, 3, 4), v.Frame); + Assert.Equal (new Rect (0, 0, 3, 4), v.Bounds); // With Absolute Bounds *is* deterministic before Layout + Assert.Equal (Pos.At (1), v.X); + Assert.Equal (Pos.At (2), v.Y); + Assert.Equal (Dim.Sized (3), v.Width); + Assert.Equal (Dim.Sized (4), v.Height); v.Dispose (); } - [Fact] [TestRespondersDisposed] + [Fact] + [TestRespondersDisposed] public void AbsoluteLayout_Change_Frame () { - var frame = new Rect (1, 2, 3, 4); + var frame = new Rect (1, 2, 3, 4); var newFrame = new Rect (1, 2, 30, 40); var v = new View (frame); v.Frame = newFrame; Assert.True (v.LayoutStyle == LayoutStyle.Absolute); - Assert.Equal (newFrame, v.Frame); + Assert.Equal (newFrame, v.Frame); Assert.Equal (new Rect (0, 0, newFrame.Width, newFrame.Height), v.Bounds); // With Absolute Bounds *is* deterministic before Layout - Assert.Null (v.X); - Assert.Null (v.Y); - Assert.Null (v.Height); - Assert.Null (v.Width); + Assert.Equal (Pos.At (1), v.X); + Assert.Equal (Pos.At (2), v.Y); + Assert.Equal (Dim.Sized (30), v.Width); + Assert.Equal (Dim.Sized (40), v.Height); v.Dispose (); v = new View (frame.X, frame.Y, "v"); v.Frame = newFrame; - Assert.Equal (newFrame, v.Frame); + Assert.Equal (newFrame, v.Frame); Assert.Equal (new Rect (0, 0, newFrame.Width, newFrame.Height), v.Bounds); // With Absolute Bounds *is* deterministic before Layout - Assert.Null (v.X); - Assert.Null (v.Y); - Assert.Null (v.Height); - Assert.Null (v.Width); + Assert.Equal (Pos.At (1), v.X); + Assert.Equal (Pos.At (2), v.Y); + Assert.Equal (Dim.Sized (30), v.Width); + Assert.Equal (Dim.Sized (40), v.Height); v.Dispose (); newFrame = new Rect (10, 20, 30, 40); v = new View (frame); v.Frame = newFrame; - Assert.Equal (newFrame, v.Frame); + Assert.Equal (newFrame, v.Frame); Assert.Equal (new Rect (0, 0, newFrame.Width, newFrame.Height), v.Bounds); // With Absolute Bounds *is* deterministic before Layout - Assert.Null (v.X); - Assert.Null (v.Y); - Assert.Null (v.Height); - Assert.Null (v.Width); + Assert.Equal (Pos.At (10), v.X); + Assert.Equal (Pos.At (20), v.Y); + Assert.Equal (Dim.Sized (30), v.Width); + Assert.Equal (Dim.Sized (40), v.Height); v.Dispose (); v = new View (frame.X, frame.Y, "v"); v.Frame = newFrame; - Assert.Equal (newFrame, v.Frame); + Assert.Equal (newFrame, v.Frame); Assert.Equal (new Rect (0, 0, newFrame.Width, newFrame.Height), v.Bounds); // With Absolute Bounds *is* deterministic before Layout - Assert.Null (v.X); - Assert.Null (v.Y); - Assert.Null (v.Height); - Assert.Null (v.Width); + Assert.Equal (Pos.At (10), v.X); + Assert.Equal (Pos.At (20), v.Y); + Assert.Equal (Dim.Sized (30), v.Width); + Assert.Equal (Dim.Sized (40), v.Height); v.Dispose (); } - [Fact] [TestRespondersDisposed] + [Fact] + [TestRespondersDisposed] public void AbsoluteLayout_Change_Height_or_Width_Absolute () { - var frame = new Rect (1, 2, 3, 4); + var frame = new Rect (1, 2, 3, 4); var newFrame = new Rect (1, 2, 30, 40); var v = new View (frame); v.Height = newFrame.Height; v.Width = newFrame.Width; Assert.True (v.LayoutStyle == LayoutStyle.Absolute); - Assert.Equal (newFrame, v.Frame); + Assert.Equal (newFrame, v.Frame); Assert.Equal (new Rect (0, 0, newFrame.Width, newFrame.Height), v.Bounds); // With Absolute Bounds *is* deterministic before Layout - Assert.Null (v.X); - Assert.Null (v.Y); - Assert.Equal ($"Absolute({newFrame.Height})", v.Height.ToString ()); - Assert.Equal ($"Absolute({newFrame.Width})", v.Width.ToString ()); + Assert.Equal (Pos.At (1), v.X); + Assert.Equal (Pos.At (2), v.Y); + Assert.Equal ($"Absolute({newFrame.Height})", v.Height.ToString ()); + Assert.Equal ($"Absolute({newFrame.Width})", v.Width.ToString ()); v.Dispose (); } - [Fact] [TestRespondersDisposed] - public void AbsoluteLayout_Change_Height_or_Width_NotAbsolute () + [Fact] + [TestRespondersDisposed] + public void AbsoluteLayout_Change_Height_or_Width_MakesComputed () { var v = new View (Rect.Empty); v.Height = Dim.Fill (); v.Width = Dim.Fill (); - Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // BUGBUG: v2 - Changing the Height or Width should change the LayoutStyle + Assert.True (v.LayoutStyle == LayoutStyle.Computed); v.Dispose (); } - [Fact] [TestRespondersDisposed] - public void AbsoluteLayout_Change_Height_or_Width_Null () - { - var v = new View (Rect.Empty); - v.Height = null; - v.Width = null; - Assert.True (v.LayoutStyle == LayoutStyle.Absolute); - v.Dispose (); - } - - [Fact] [TestRespondersDisposed] + [Fact] + [TestRespondersDisposed] public void AbsoluteLayout_Change_X_or_Y_Absolute () { - var frame = new Rect (1, 2, 3, 4); + var frame = new Rect (1, 2, 3, 4); var newFrame = new Rect (10, 20, 3, 4); var v = new View (frame); v.X = newFrame.X; v.Y = newFrame.Y; Assert.True (v.LayoutStyle == LayoutStyle.Absolute); - Assert.Equal (newFrame, v.Frame); + Assert.Equal (newFrame, v.Frame); Assert.Equal (new Rect (0, 0, newFrame.Width, newFrame.Height), v.Bounds); // With Absolute Bounds *is* deterministic before Layout - Assert.Equal ($"Absolute({newFrame.X})", v.X.ToString ()); - Assert.Equal ($"Absolute({newFrame.Y})", v.Y.ToString ()); - Assert.Null (v.Height); - Assert.Null (v.Width); + Assert.Equal ($"Absolute({newFrame.X})", v.X.ToString ()); + Assert.Equal ($"Absolute({newFrame.Y})", v.Y.ToString ()); + Assert.Equal (Dim.Sized (3), v.Width); + Assert.Equal (Dim.Sized (4), v.Height); v.Dispose (); } - [Fact] [TestRespondersDisposed] - public void AbsoluteLayout_Change_X_or_Y_NotAbsolute () + [Fact] + [TestRespondersDisposed] + public void AbsoluteLayout_Change_X_or_Y_MakesComputed () { var v = new View (Rect.Empty); v.X = Pos.Center (); v.Y = Pos.Center (); - Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // BUGBUG: v2 - Changing the Height or Width should change the LayoutStyle + Assert.True (v.LayoutStyle == LayoutStyle.Computed); v.Dispose (); } - - [Fact] [TestRespondersDisposed] - public void AbsoluteLayout_Change_X_or_Y_Null () - { - var v = new View (Rect.Empty); - v.X = null; - Assert.True (v.LayoutStyle == LayoutStyle.Absolute); - v.Dispose (); - - v = new View (Rect.Empty); - v.X = Pos.Center (); - Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // BUGBUG: v2 - Changing the Height or Width should change the LayoutStyle - - v.X = null; - Assert.True (v.LayoutStyle == LayoutStyle.Absolute); - v.Dispose (); - - v = new View (Rect.Empty); - v.Y = null; - Assert.True (v.LayoutStyle == LayoutStyle.Absolute); - v.Dispose (); - - v = new View (Rect.Empty); - v.Y = Pos.Center (); - Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // BUGBUG: v2 - Changing the Height or Width should change the LayoutStyle - - v.Y = null; - Assert.True (v.LayoutStyle == LayoutStyle.Absolute); - v.Dispose (); - } - - [Fact] [TestRespondersDisposed] + + [Fact] + [TestRespondersDisposed] public void AbsoluteLayout_Change_X_Y_Height_Width_Absolute () { var v = new View (Rect.Empty); @@ -211,14 +215,7 @@ public class AbsoluteLayoutTests { v.Y = Pos.Center (); v.Width = Dim.Fill (); v.Height = Dim.Fill (); - Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // BUGBUG: v2 - Changing the Height or Width should change the LayoutStyle - - // BUGBUG: v2 - If all of X, Y, Width, and Height are null or Absolute(n), isn't that the same as LayoutStyle.Absoulte? - v.X = null; - v.Y = null; - v.Height = null; - v.Width = null; - Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // We never automatically change to Absolute from Computed?? + Assert.True (v.LayoutStyle == LayoutStyle.Computed); v.Dispose (); v = new View (Rect.Empty); @@ -226,14 +223,10 @@ public class AbsoluteLayoutTests { v.Y = Pos.Center (); v.Width = Dim.Fill (); v.Height = Dim.Fill (); - Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // BUGBUG: v2 - Changing the Height or Width should change the LayoutStyle + Assert.True (v.LayoutStyle == LayoutStyle.Computed); - // BUGBUG: v2 - If all of X, Y, Width, and Height are null or Absolute(n), isn't that the same as LayoutStyle.Absoulte? v.X = 1; - v.Y = null; - v.Height = null; - v.Width = null; - Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // We never automatically change to Absolute from Computed?? + Assert.True (v.LayoutStyle == LayoutStyle.Computed); v.Dispose (); v = new View (Rect.Empty); @@ -241,14 +234,10 @@ public class AbsoluteLayoutTests { v.Y = Pos.Center (); v.Width = Dim.Fill (); v.Height = Dim.Fill (); - Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // BUGBUG: v2 - Changing the Height or Width should change the LayoutStyle - - // BUGBUG: v2 - If all of X, Y, Width, and Height are null or Absolute(n), isn't that the same as LayoutStyle.Absoulte? - v.X = null; + Assert.True (v.LayoutStyle == LayoutStyle.Computed); + v.Y = 2; - v.Height = null; - v.Width = null; - Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // We never automatically change to Absolute from Computed?? + Assert.True (v.LayoutStyle == LayoutStyle.Computed); v.Dispose (); v = new View (Rect.Empty); @@ -256,14 +245,21 @@ public class AbsoluteLayoutTests { v.Y = Pos.Center (); v.Width = Dim.Fill (); v.Height = Dim.Fill (); - Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // BUGBUG: v2 - Changing the Height or Width should change the LayoutStyle + Assert.True (v.LayoutStyle == LayoutStyle.Computed); + + v.Width = 3; + Assert.True (v.LayoutStyle == LayoutStyle.Computed); + v.Dispose (); + + v = new View (Rect.Empty); + v.X = Pos.Center (); + v.Y = Pos.Center (); + v.Width = Dim.Fill (); + v.Height = Dim.Fill (); + Assert.True (v.LayoutStyle == LayoutStyle.Computed); - // BUGBUG: v2 - If all of X, Y, Width, and Height are null or Absolute(n), isn't that the same as LayoutStyle.Absoulte? - v.X = null; - v.Y = null; v.Height = 3; - v.Width = null; - Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // We never automatically change to Absolute from Computed?? + Assert.True (v.LayoutStyle == LayoutStyle.Computed); v.Dispose (); v = new View (Rect.Empty); @@ -271,71 +267,45 @@ public class AbsoluteLayoutTests { v.Y = Pos.Center (); v.Width = Dim.Fill (); v.Height = Dim.Fill (); - Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // BUGBUG: v2 - Changing the Height or Width should change the LayoutStyle + Assert.True (v.LayoutStyle == LayoutStyle.Computed); - // BUGBUG: v2 - If all of X, Y, Width, and Height are null or Absolute(n), isn't that the same as LayoutStyle.Absoulte? - v.X = null; - v.Y = null; - v.Height = null; + v.X = 1; + v.Y = 2; + v.Height = 3; v.Width = 4; - Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // We never automatically change to Absolute from Computed?? + Assert.True (v.LayoutStyle == LayoutStyle.Absolute); v.Dispose (); } - - [Fact] [TestRespondersDisposed] - public void AbsoluteLayout_Change_X_Y_Height_Width_Null () - { - var v = new View (Rect.Empty); - v.X = null; - v.Y = null; - v.Height = null; - v.Width = null; - Assert.True (v.LayoutStyle == LayoutStyle.Absolute); - - v.Dispose (); - v = new View (Rect.Empty); - v.X = Pos.Center (); - v.Y = Pos.Center (); - v.Width = Dim.Fill (); - v.Height = Dim.Fill (); - Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // BUGBUG: v2 - Changing the Height or Width should change the LayoutStyle - - // BUGBUG: v2 - If all of X, Y, Width, and Height are null or Absolute(n), isn't that the same as LayoutStyle.Absoulte? - v.X = null; - v.Y = null; - v.Height = null; - v.Width = null; - Assert.True (v.LayoutStyle == LayoutStyle.Absolute); // We never automatically change to Absolute from Computed?? - v.Dispose (); - } - - [Fact] [TestRespondersDisposed] - public void AbsoluteLayout_Layout () + + [Fact] + [TestRespondersDisposed] + public void AbsoluteLayout_LayoutSubviews () { var superRect = new Rect (0, 0, 100, 100); var super = new View (superRect, "super"); Assert.True (super.LayoutStyle == LayoutStyle.Absolute); - var v1 = new View () { + var v1 = new View { X = 0, Y = 0, Width = 10, Height = 10 }; - // BUGBUG: v2 - This should be LayoutStyle.Absolute - Assert.True (v1.LayoutStyle == LayoutStyle.Computed); + Assert.True (v1.LayoutStyle == LayoutStyle.Absolute); - var v2 = new View () { + var v2 = new View { X = 10, Y = 10, Width = 10, Height = 10 }; - // BUGBUG: v2 - This should be LayoutStyle.Absolute - Assert.True (v1.LayoutStyle == LayoutStyle.Computed); + Assert.True (v2.LayoutStyle == LayoutStyle.Absolute); super.Add (v1, v2); + Assert.True (v1.LayoutStyle == LayoutStyle.Absolute); + Assert.True (v2.LayoutStyle == LayoutStyle.Absolute); + super.LayoutSubviews (); - Assert.Equal (new Rect (0, 0, 10, 10), v1.Frame); + Assert.Equal (new Rect (0, 0, 10, 10), v1.Frame); Assert.Equal (new Rect (10, 10, 10, 10), v2.Frame); super.Dispose (); } diff --git a/UnitTests/View/Layout/AutoSizeTests.cs b/UnitTests/View/Layout/AutoSizeTests.cs index 9484c4c81..056e68408 100644 --- a/UnitTests/View/Layout/AutoSizeTests.cs +++ b/UnitTests/View/Layout/AutoSizeTests.cs @@ -1,838 +1,1477 @@ -using System.Text; -using System; -using System.Collections.Generic; +using System.Collections.Generic; using Xunit; using Xunit.Abstractions; -namespace Terminal.Gui.ViewTests { - public class AutoSizeTests { - readonly ITestOutputHelper output; - - public AutoSizeTests (ITestOutputHelper output) - { - this.output = output; - } - - [Fact, AutoInitShutdown] - public void AutoSize_GetAutoSize_Horizontal () - { - var text = "text"; - var view = new View () { - Text = text, - AutoSize = true - }; - var win = new Window () { - Width = Dim.Fill (), - Height = Dim.Fill () - }; - win.Add (view); - Application.Top.Add (win); - Application.Begin (Application.Top); - ((FakeDriver)Application.Driver).SetBufferSize (10, 4); - - var size = view.GetAutoSize (); - Assert.Equal (new Size (text.Length, 1), size); - - view.Text = $"{text}\n{text}"; - size = view.GetAutoSize (); - Assert.Equal (new Size (text.Length, 2), size); - - view.Text = $"{text}\n{text}\n{text}+"; - size = view.GetAutoSize (); - Assert.Equal (new Size (text.Length + 1, 3), size); - - text = string.Empty; - view.Text = text; - size = view.GetAutoSize (); - Assert.Equal (new Size (0, 0), size); - - text = "1"; - view.Text = text; - size = view.GetAutoSize (); - Assert.Equal (new Size (1, 1), size); - - text = "界"; - view.Text = text; - size = view.GetAutoSize (); - Assert.Equal (new Size (2, 1), size); - } - - [Fact, AutoInitShutdown] - public void AutoSize_GetAutoSize_Vertical() - { - var text = "text"; - var view = new View () { - Text = text, - TextDirection = TextDirection.TopBottom_LeftRight, - AutoSize = true - }; - var win = new Window () { - Width = Dim.Fill (), - Height = Dim.Fill () - }; - win.Add (view); - Application.Top.Add (win); - Application.Begin (Application.Top); - ((FakeDriver)Application.Driver).SetBufferSize (10, 4); - - var size = view.GetAutoSize (); - Assert.Equal (new Size (1, text.Length), size); - - view.Text = $"{text}\n{text}"; - size = view.GetAutoSize (); - Assert.Equal (new Size (2, text.Length), size); - - view.Text = $"{text}\n{text}\n{text}+"; - size = view.GetAutoSize (); - Assert.Equal (new Size (3, text.Length + 1), size); - - text = string.Empty; - view.Text = text; - size = view.GetAutoSize (); - Assert.Equal (new Size (0, 0), size); - - text = "1"; - view.Text = text; - size = view.GetAutoSize (); - Assert.Equal (new Size (1, 1), size); - - text = "界"; - view.Text = text; - size = view.GetAutoSize (); - Assert.Equal (new Size (2, 1), size); - } - - [Fact, AutoInitShutdown] - public void AutoSize_GetAutoSize_Left() - { - var text = "This is some text."; - var view = new View () { - Text = text, - TextAlignment = TextAlignment.Left, - AutoSize = true - }; - var win = new Window () { - Width = Dim.Fill (), - Height = Dim.Fill () - }; - win.Add (view); - Application.Top.Add (win); - Application.Begin (Application.Top); - ((FakeDriver)Application.Driver).SetBufferSize (10, 4); - - var size = view.GetAutoSize (); - Assert.Equal (new Size (text.Length, 1), size); - - view.Text = $"{text}\n{text}"; - size = view.GetAutoSize (); - Assert.Equal (new Size (text.Length, 2), size); - - view.Text = $"{text}\n{text}\n{text}+"; - size = view.GetAutoSize (); - Assert.Equal (new Size (text.Length + 1, 3), size); - - text = string.Empty; - view.Text = text; - size = view.GetAutoSize (); - Assert.Equal (new Size (0, 0), size); - - text = "1"; - view.Text = text; - size = view.GetAutoSize (); - Assert.Equal (new Size (1, 1), size); - - text = "界"; - view.Text = text; - size = view.GetAutoSize (); - Assert.Equal (new Size (2, 1), size); - } - - [Fact, AutoInitShutdown] - public void AutoSize_GetAutoSize_Right () - { - var text = "This is some text."; - var view = new View () { - Text = text, - TextAlignment = TextAlignment.Right, - AutoSize = true - }; - var win = new Window () { - Width = Dim.Fill (), - Height = Dim.Fill () - }; - win.Add (view); - Application.Top.Add (win); - Application.Begin (Application.Top); - ((FakeDriver)Application.Driver).SetBufferSize (10, 4); - - var size = view.GetAutoSize (); - Assert.Equal (new Size (text.Length, 1), size); - - view.Text = $"{text}\n{text}"; - size = view.GetAutoSize (); - Assert.Equal (new Size (text.Length, 2), size); - - view.Text = $"{text}\n{text}\n{text}+"; - size = view.GetAutoSize (); - Assert.Equal (new Size (text.Length + 1, 3), size); - - text = string.Empty; - view.Text = text; - size = view.GetAutoSize (); - Assert.Equal (new Size (0, 0), size); - - text = "1"; - view.Text = text; - size = view.GetAutoSize (); - Assert.Equal (new Size (1, 1), size); - - text = "界"; - view.Text = text; - size = view.GetAutoSize (); - Assert.Equal (new Size (2, 1), size); - } - - [Fact, AutoInitShutdown] - public void AutoSize_GetAutoSize_Centered () - { - var text = "This is some text."; - var view = new View () { - Text = text, - TextAlignment = TextAlignment.Centered, - AutoSize = true - }; - var win = new Window () { - Width = Dim.Fill (), - Height = Dim.Fill () - }; - win.Add (view); - Application.Top.Add (win); - Application.Begin (Application.Top); - ((FakeDriver)Application.Driver).SetBufferSize (10, 4); - - var size = view.GetAutoSize (); - Assert.Equal (new Size (text.Length, 1), size); - - view.Text = $"{text}\n{text}"; - size = view.GetAutoSize (); - Assert.Equal (new Size (text.Length, 2), size); - - view.Text = $"{text}\n{text}\n{text}+"; - size = view.GetAutoSize (); - Assert.Equal (new Size (text.Length + 1, 3), size); - - text = string.Empty; - view.Text = text; - size = view.GetAutoSize (); - Assert.Equal (new Size (0, 0), size); - - text = "1"; - view.Text = text; - size = view.GetAutoSize (); - Assert.Equal (new Size (1, 1), size); - - text = "界"; - view.Text = text; - size = view.GetAutoSize (); - Assert.Equal (new Size (2, 1), size); - } - - [Fact, AutoInitShutdown] - public void AutoSize_False_View_IsEmpty_False_Return_Null_Lines () - { - var text = "Views"; - var view = new View () { - Width = Dim.Fill () - text.Length, - Height = 1, - Text = text - }; - var win = new Window () { - Width = Dim.Fill (), - Height = Dim.Fill () - }; - win.Add (view); - Application.Top.Add (win); - Application.Begin (Application.Top); - ((FakeDriver)Application.Driver).SetBufferSize (10, 4); - - Assert.Equal (5, text.Length); - Assert.False (view.AutoSize); - Assert.Equal (new Rect (0, 0, 3, 1), view.Frame); - Assert.Equal (new Size (3, 1), view.TextFormatter.Size); - Assert.Equal (new List () { "Vie" }, view.TextFormatter.Lines); - Assert.Equal (new Rect (0, 0, 10, 4), win.Frame); - Assert.Equal (new Rect (0, 0, 10, 4), Application.Top.Frame); - var expected = @" -┌────────┐ -│Vie │ -│ │ -└────────┘ -"; - - var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output); - Assert.Equal (new Rect (0, 0, 10, 4), pos); - - text = "0123456789"; - Assert.Equal (10, text.Length); - view.Width = Dim.Fill () - text.Length; - Application.Refresh (); - - Assert.Equal (new Rect (0, 0, 0, 1), view.Frame); - Assert.Equal (new Size (0, 1), view.TextFormatter.Size); - Assert.Equal (new List () { string.Empty }, view.TextFormatter.Lines); - expected = @" -┌────────┐ -│ │ -│ │ -└────────┘ -"; - - pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output); - Assert.Equal (new Rect (0, 0, 10, 4), pos); - } - - [Fact, AutoInitShutdown] - public void AutoSize_False_View_IsEmpty_True_Minimum_Height () - { - var text = "Views"; - var view = new View () { - Width = Dim.Fill () - text.Length, - Text = text - }; - var win = new Window () { - Width = Dim.Fill (), - Height = Dim.Fill () - }; - win.Add (view); - Application.Top.Add (win); - Application.Begin (Application.Top); - ((FakeDriver)Application.Driver).SetBufferSize (10, 4); - - Assert.Equal (5, text.Length); - Assert.False (view.AutoSize); - Assert.Equal (new Rect (0, 0, 3, 1), view.Frame); - Assert.Equal (new Size (3, 1), view.TextFormatter.Size); - Assert.Single (view.TextFormatter.Lines); - Assert.Equal (new Rect (0, 0, 10, 4), win.Frame); - Assert.Equal (new Rect (0, 0, 10, 4), Application.Top.Frame); - var expected = @" -┌────────┐ -│Vie │ -│ │ -└────────┘ -"; - - var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output); - Assert.Equal (new Rect (0, 0, 10, 4), pos); - - text = "0123456789"; - Assert.Equal (10, text.Length); - view.Width = Dim.Fill () - text.Length; - Application.Refresh (); - - Assert.Equal (new Rect (0, 0, 0, 1), view.Frame); - Assert.Equal (new Size (0, 1), view.TextFormatter.Size); - var exception = Record.Exception (() => Assert.Equal (new List () { string.Empty }, view.TextFormatter.Lines)); - Assert.Null (exception); - expected = @" -┌────────┐ -│ │ -│ │ -└────────┘ -"; - - pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output); - Assert.Equal (new Rect (0, 0, 10, 4), pos); - } - - [Fact, AutoInitShutdown] - public void AutoSize_True_Label_IsEmpty_False_Never_Return_Null_Lines () - { - var text = "Label"; - var label = new Label () { - Width = Dim.Fill () - text.Length, - Height = 1, - Text = text - }; - var win = new Window () { - Width = Dim.Fill (), - Height = Dim.Fill () - }; - win.Add (label); - Application.Top.Add (win); - Application.Begin (Application.Top); - ((FakeDriver)Application.Driver).SetBufferSize (10, 4); - - Assert.Equal (5, text.Length); - Assert.True (label.AutoSize); - Assert.Equal (new Rect (0, 0, 5, 1), label.Frame); - Assert.Equal (new Size (5, 1), label.TextFormatter.Size); - Assert.Equal (new List () { "Label" }, label.TextFormatter.Lines); - Assert.Equal (new Rect (0, 0, 10, 4), win.Frame); - Assert.Equal (new Rect (0, 0, 10, 4), Application.Top.Frame); - var expected = @" -┌────────┐ -│Label │ -│ │ -└────────┘ -"; - - var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output); - Assert.Equal (new Rect (0, 0, 10, 4), pos); - - text = "0123456789"; - Assert.Equal (10, text.Length); - label.Width = Dim.Fill () - text.Length; - Application.Refresh (); - - Assert.True (label.AutoSize); - Assert.Equal (new Rect (0, 0, 5, 1), label.Frame); - Assert.Equal (new Size (5, 1), label.TextFormatter.Size); - Assert.Single (label.TextFormatter.Lines); - expected = @" -┌────────┐ -│Label │ -│ │ -└────────┘ -"; - - pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output); - Assert.Equal (new Rect (0, 0, 10, 4), pos); - } - - [Fact, AutoInitShutdown] - public void AutoSize_False_Label_IsEmpty_True_Return_Null_Lines () - { - var text = "Label"; - var label = new Label () { - Width = Dim.Fill () - text.Length, - Height = 1, - Text = text, - AutoSize = false - }; - var win = new Window () { - Width = Dim.Fill (), - Height = Dim.Fill () - }; - win.Add (label); - Application.Top.Add (win); - Application.Begin (Application.Top); - ((FakeDriver)Application.Driver).SetBufferSize (10, 4); - - Assert.Equal (5, text.Length); - Assert.False (label.AutoSize); - Assert.Equal (new Rect (0, 0, 3, 1), label.Frame); - Assert.Equal (new Size (3, 1), label.TextFormatter.Size); - Assert.Equal (new List () { "Lab" }, label.TextFormatter.Lines); - Assert.Equal (new Rect (0, 0, 10, 4), win.Frame); - Assert.Equal (new Rect (0, 0, 10, 4), Application.Top.Frame); - var expected = @" -┌────────┐ -│Lab │ -│ │ -└────────┘ -"; - - var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output); - Assert.Equal (new Rect (0, 0, 10, 4), pos); - - text = "0123456789"; - Assert.Equal (10, text.Length); - label.Width = Dim.Fill () - text.Length; - Application.Refresh (); - - Assert.False (label.AutoSize); - Assert.Equal (new Rect (0, 0, 0, 1), label.Frame); - Assert.Equal (new Size (0, 1), label.TextFormatter.Size); - Assert.Equal (new List { string.Empty }, label.TextFormatter.Lines); - expected = @" -┌────────┐ -│ │ -│ │ -└────────┘ -"; - - pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output); - Assert.Equal (new Rect (0, 0, 10, 4), pos); - } - - [Fact, AutoInitShutdown] - public void AutoSize_True_Label_IsEmpty_False_Minimum_Height () - { - var text = "Label"; - var label = new Label () { - Width = Dim.Fill () - text.Length, - Text = text - }; - var win = new Window () { - Width = Dim.Fill (), - Height = Dim.Fill () - }; - win.Add (label); - Application.Top.Add (win); - Application.Begin (Application.Top); - ((FakeDriver)Application.Driver).SetBufferSize (10, 4); - - Assert.Equal (5, text.Length); - Assert.True (label.AutoSize); - Assert.Equal (new Rect (0, 0, 5, 1), label.Frame); - Assert.Equal (new Size (5, 1), label.TextFormatter.Size); - Assert.Equal (new List () { "Label" }, label.TextFormatter.Lines); - Assert.Equal (new Rect (0, 0, 10, 4), win.Frame); - Assert.Equal (new Rect (0, 0, 10, 4), Application.Top.Frame); - var expected = @" -┌────────┐ -│Label │ -│ │ -└────────┘ -"; - - var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output); - Assert.Equal (new Rect (0, 0, 10, 4), pos); - - text = "0123456789"; - Assert.Equal (10, text.Length); - label.Width = Dim.Fill () - text.Length; - Application.Refresh (); - - Assert.Equal (new Rect (0, 0, 5, 1), label.Frame); - Assert.Equal (new Size (5, 1), label.TextFormatter.Size); - var exception = Record.Exception (() => Assert.Single (label.TextFormatter.Lines)); - Assert.Null (exception); - expected = @" -┌────────┐ -│Label │ -│ │ -└────────┘ -"; - - pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output); - Assert.Equal (new Rect (0, 0, 10, 4), pos); - } - - [Fact, AutoInitShutdown] - public void AutoSize_False_Label_Height_Zero_Returns_Minimum_Height () - { - var text = "Label"; - var label = new Label () { - Width = Dim.Fill () - text.Length, - Text = text, - AutoSize = false - }; - var win = new Window () { - Width = Dim.Fill (), - Height = Dim.Fill () - }; - win.Add (label); - Application.Top.Add (win); - Application.Begin (Application.Top); - ((FakeDriver)Application.Driver).SetBufferSize (10, 4); - - Assert.Equal (5, text.Length); - Assert.False (label.AutoSize); - Assert.Equal (new Rect (0, 0, 3, 1), label.Frame); - Assert.Equal (new Size (3, 1), label.TextFormatter.Size); - Assert.Single (label.TextFormatter.Lines); - Assert.Equal (new Rect (0, 0, 10, 4), win.Frame); - Assert.Equal (new Rect (0, 0, 10, 4), Application.Top.Frame); - var expected = @" -┌────────┐ -│Lab │ -│ │ -└────────┘ -"; - - var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output); - Assert.Equal (new Rect (0, 0, 10, 4), pos); - - text = "0123456789"; - Assert.Equal (10, text.Length); - label.Width = Dim.Fill () - text.Length; - Application.Refresh (); - - Assert.Equal (new Rect (0, 0, 0, 1), label.Frame); - Assert.Equal (new Size (0, 1), label.TextFormatter.Size); - var exception = Record.Exception (() => Assert.Equal (new List () { string.Empty }, label.TextFormatter.Lines)); - Assert.Null (exception); - expected = @" -┌────────┐ -│ │ -│ │ -└────────┘ -"; - - pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output); - Assert.Equal (new Rect (0, 0, 10, 4), pos); - } - - [Fact, AutoInitShutdown] - public void AutoSize_True_View_IsEmpty_False_Minimum_Width () - { - var text = "Views"; - var view = new View () { - TextDirection = TextDirection.TopBottom_LeftRight, - Height = Dim.Fill () - text.Length, - Text = text, - AutoSize = true - }; - var win = new Window () { - Width = Dim.Fill (), - Height = Dim.Fill () - }; - win.Add (view); - Application.Top.Add (win); - Application.Begin (Application.Top); - ((FakeDriver)Application.Driver).SetBufferSize (4, 10); - - Assert.Equal (5, text.Length); - Assert.True (view.AutoSize); - Assert.Equal (new Rect (0, 0, 1, 5), view.Frame); - Assert.Equal (new Size (1, 5), view.TextFormatter.Size); - Assert.Equal (new List () { "Views" }, view.TextFormatter.Lines); - Assert.Equal (new Rect (0, 0, 4, 10), win.Frame); - Assert.Equal (new Rect (0, 0, 4, 10), Application.Top.Frame); - var expected = @" -┌──┐ -│V │ -│i │ -│e │ -│w │ -│s │ -│ │ -│ │ -│ │ -└──┘ -"; - - var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output); - Assert.Equal (new Rect (0, 0, 4, 10), pos); - - text = "0123456789"; - Assert.Equal (10, text.Length); - view.Height = Dim.Fill () - text.Length; - Application.Refresh (); - - Assert.Equal (new Rect (0, 0, 1, 5), view.Frame); - Assert.Equal (new Size (1, 5), view.TextFormatter.Size); - var exception = Record.Exception (() => Assert.Single (view.TextFormatter.Lines)); - Assert.Null (exception); - expected = @" -┌──┐ -│V │ -│i │ -│e │ -│w │ -│s │ -│ │ -│ │ -│ │ -└──┘ -"; - - pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output); - Assert.Equal (new Rect (0, 0, 4, 10), pos); - } - - [Fact, AutoInitShutdown] - public void AutoSize_False_View_Width_Null_Returns_Host_Frame_Width () - { - var text = "Views"; - var view = new View () { - TextDirection = TextDirection.TopBottom_LeftRight, - Height = Dim.Fill () - text.Length, - Text = text - }; - var win = new Window () { - Width = Dim.Fill (), - Height = Dim.Fill () - }; - win.Add (view); - Application.Top.Add (win); - Application.Begin (Application.Top); - ((FakeDriver)Application.Driver).SetBufferSize (4, 10); - - Assert.Equal (5, text.Length); - Assert.False (view.AutoSize); - Assert.Equal (new Rect (0, 0, 1, 3), view.Frame); - Assert.Equal (new Size (1, 3), view.TextFormatter.Size); - Assert.Single (view.TextFormatter.Lines); - Assert.Equal (new Rect (0, 0, 4, 10), win.Frame); - Assert.Equal (new Rect (0, 0, 4, 10), Application.Top.Frame); - var expected = @" -┌──┐ -│V │ -│i │ -│e │ -│ │ -│ │ -│ │ -│ │ -│ │ -└──┘ -"; - - var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output); - Assert.Equal (new Rect (0, 0, 4, 10), pos); - - text = "0123456789"; - Assert.Equal (10, text.Length); - view.Height = Dim.Fill () - text.Length; - Application.Refresh (); - - Assert.Equal (new Rect (0, 0, 1, 0), view.Frame); - Assert.Equal (new Size (1, 0), view.TextFormatter.Size); - var exception = Record.Exception (() => Assert.Equal (new List () { string.Empty }, view.TextFormatter.Lines)); - Assert.Null (exception); - expected = @" -┌──┐ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -└──┘ -"; - - pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output); - Assert.Equal (new Rect (0, 0, 4, 10), pos); - } - - [Fact, AutoInitShutdown] - public void AutoSize_True_View_IsEmpty_False_Minimum_Width_Wide_Rune () - { - var text = "界View"; - var view = new View () { - TextDirection = TextDirection.TopBottom_LeftRight, - Height = Dim.Fill () - text.Length, - Text = text, - AutoSize = true - }; - var win = new Window () { - Width = Dim.Fill (), - Height = Dim.Fill () - }; - win.Add (view); - Application.Top.Add (win); - Application.Begin (Application.Top); - ((FakeDriver)Application.Driver).SetBufferSize (4, 10); - - Assert.Equal (5, text.Length); - Assert.True (view.AutoSize); - Assert.Equal (new Rect (0, 0, 2, 5), view.Frame); - Assert.Equal (new Size (2, 5), view.TextFormatter.Size); - Assert.Equal (new List () { "界View" }, view.TextFormatter.Lines); - Assert.Equal (new Rect (0, 0, 4, 10), win.Frame); - Assert.Equal (new Rect (0, 0, 4, 10), Application.Top.Frame); - var expected = @" -┌──┐ -│界│ -│V │ -│i │ -│e │ -│w │ -│ │ -│ │ -│ │ -└──┘ -"; - - var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output); - Assert.Equal (new Rect (0, 0, 4, 10), pos); - - text = "0123456789"; - Assert.Equal (10, text.Length); - view.Height = Dim.Fill () - text.Length; - Application.Refresh (); - - Assert.Equal (new Rect (0, 0, 2, 5), view.Frame); - Assert.Equal (new Size (2, 5), view.TextFormatter.Size); - var exception = Record.Exception (() => Assert.Equal (new List () { "界View" }, view.TextFormatter.Lines)); - Assert.Null (exception); - expected = @" -┌──┐ -│界│ -│V │ -│i │ -│e │ -│w │ -│ │ -│ │ -│ │ -└──┘ -"; - - pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output); - Assert.Equal (new Rect (0, 0, 4, 10), pos); - } - - [Fact, AutoInitShutdown] - public void AutoSize_False_View_Width_Zero_Returns_Minimum_Width_With_Wide_Rune () - { - var text = "界View"; - var view = new View () { - TextDirection = TextDirection.TopBottom_LeftRight, - Height = Dim.Fill () - text.Length, - Text = text - }; - var win = new Window () { - Width = Dim.Fill (), - Height = Dim.Fill () - }; - win.Add (view); - Application.Top.Add (win); - Application.Begin (Application.Top); - ((FakeDriver)Application.Driver).SetBufferSize (4, 10); - - Assert.Equal (5, text.Length); - Assert.False (view.AutoSize); - Assert.Equal (new Rect (0, 0, 2, 3), view.Frame); - Assert.Equal (new Size (2, 3), view.TextFormatter.Size); - Assert.Single (view.TextFormatter.Lines); - Assert.Equal (new Rect (0, 0, 4, 10), win.Frame); - Assert.Equal (new Rect (0, 0, 4, 10), Application.Top.Frame); - var expected = @" -┌──┐ -│界│ -│V │ -│i │ -│ │ -│ │ -│ │ -│ │ -│ │ -└──┘ -"; - - var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output); - Assert.Equal (new Rect (0, 0, 4, 10), pos); - - text = "0123456789"; - Assert.Equal (10, text.Length); - view.Height = Dim.Fill () - text.Length; - Application.Refresh (); - - Assert.Equal (new Rect (0, 0, 2, 0), view.Frame); - Assert.Equal (new Size (2, 0), view.TextFormatter.Size); - var exception = Record.Exception (() => Assert.Equal (new List () { string.Empty }, view.TextFormatter.Lines)); - Assert.Null (exception); - expected = @" -┌──┐ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -│ │ -└──┘ -"; - - pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, output); - Assert.Equal (new Rect (0, 0, 4, 10), pos); - } +namespace Terminal.Gui.ViewTests; + +public class AutoSizeTests { + readonly ITestOutputHelper _output; + + public AutoSizeTests (ITestOutputHelper output) => _output = output; + + [Fact] [AutoInitShutdown] + public void AutoSize_GetAutoSize_Horizontal () + { + var text = "text"; + var view = new View { + Text = text, + AutoSize = true + }; + var win = new Window { + Width = Dim.Fill (), + Height = Dim.Fill () + }; + win.Add (view); + Application.Top.Add (win); + Application.Begin (Application.Top); + ((FakeDriver)Application.Driver).SetBufferSize (10, 4); + + var size = view.GetAutoSize (); + Assert.Equal (new Size (text.Length, 1), size); + + view.Text = $"{text}\n{text}"; + size = view.GetAutoSize (); + Assert.Equal (new Size (text.Length, 2), size); + + view.Text = $"{text}\n{text}\n{text}+"; + size = view.GetAutoSize (); + Assert.Equal (new Size (text.Length + 1, 3), size); + + text = string.Empty; + view.Text = text; + size = view.GetAutoSize (); + Assert.Equal (new Size (0, 0), size); + + text = "1"; + view.Text = text; + size = view.GetAutoSize (); + Assert.Equal (new Size (1, 1), size); + + text = "界"; + view.Text = text; + size = view.GetAutoSize (); + Assert.Equal (new Size (2, 1), size); } -} + + [Fact] [AutoInitShutdown] + public void AutoSize_GetAutoSize_Vertical () + { + var text = "text"; + var view = new View { + Text = text, + TextDirection = TextDirection.TopBottom_LeftRight, + AutoSize = true + }; + var win = new Window { + Width = Dim.Fill (), + Height = Dim.Fill () + }; + win.Add (view); + Application.Top.Add (win); + Application.Begin (Application.Top); + ((FakeDriver)Application.Driver).SetBufferSize (10, 4); + + var size = view.GetAutoSize (); + Assert.Equal (new Size (1, text.Length), size); + + view.Text = $"{text}\n{text}"; + size = view.GetAutoSize (); + Assert.Equal (new Size (2, text.Length), size); + + view.Text = $"{text}\n{text}\n{text}+"; + size = view.GetAutoSize (); + Assert.Equal (new Size (3, text.Length + 1), size); + + text = string.Empty; + view.Text = text; + size = view.GetAutoSize (); + Assert.Equal (new Size (0, 0), size); + + text = "1"; + view.Text = text; + size = view.GetAutoSize (); + Assert.Equal (new Size (1, 1), size); + + text = "界"; + view.Text = text; + size = view.GetAutoSize (); + Assert.Equal (new Size (2, 1), size); + } + + [Fact] [AutoInitShutdown] + public void AutoSize_GetAutoSize_Left () + { + var text = "This is some text."; + var view = new View { + Text = text, + TextAlignment = TextAlignment.Left, + AutoSize = true + }; + var win = new Window { + Width = Dim.Fill (), + Height = Dim.Fill () + }; + win.Add (view); + Application.Top.Add (win); + Application.Begin (Application.Top); + ((FakeDriver)Application.Driver).SetBufferSize (10, 4); + + var size = view.GetAutoSize (); + Assert.Equal (new Size (text.Length, 1), size); + + view.Text = $"{text}\n{text}"; + size = view.GetAutoSize (); + Assert.Equal (new Size (text.Length, 2), size); + + view.Text = $"{text}\n{text}\n{text}+"; + size = view.GetAutoSize (); + Assert.Equal (new Size (text.Length + 1, 3), size); + + text = string.Empty; + view.Text = text; + size = view.GetAutoSize (); + Assert.Equal (new Size (0, 0), size); + + text = "1"; + view.Text = text; + size = view.GetAutoSize (); + Assert.Equal (new Size (1, 1), size); + + text = "界"; + view.Text = text; + size = view.GetAutoSize (); + Assert.Equal (new Size (2, 1), size); + } + + [Fact] [AutoInitShutdown] + public void AutoSize_GetAutoSize_Right () + { + var text = "This is some text."; + var view = new View { + Text = text, + TextAlignment = TextAlignment.Right, + AutoSize = true + }; + var win = new Window { + Width = Dim.Fill (), + Height = Dim.Fill () + }; + win.Add (view); + Application.Top.Add (win); + Application.Begin (Application.Top); + ((FakeDriver)Application.Driver).SetBufferSize (10, 4); + + var size = view.GetAutoSize (); + Assert.Equal (new Size (text.Length, 1), size); + + view.Text = $"{text}\n{text}"; + size = view.GetAutoSize (); + Assert.Equal (new Size (text.Length, 2), size); + + view.Text = $"{text}\n{text}\n{text}+"; + size = view.GetAutoSize (); + Assert.Equal (new Size (text.Length + 1, 3), size); + + text = string.Empty; + view.Text = text; + size = view.GetAutoSize (); + Assert.Equal (new Size (0, 0), size); + + text = "1"; + view.Text = text; + size = view.GetAutoSize (); + Assert.Equal (new Size (1, 1), size); + + text = "界"; + view.Text = text; + size = view.GetAutoSize (); + Assert.Equal (new Size (2, 1), size); + } + + [Fact] [AutoInitShutdown] + public void AutoSize_GetAutoSize_Centered () + { + var text = "This is some text."; + var view = new View { + Text = text, + TextAlignment = TextAlignment.Centered, + AutoSize = true + }; + var win = new Window { + Width = Dim.Fill (), + Height = Dim.Fill () + }; + win.Add (view); + Application.Top.Add (win); + Application.Begin (Application.Top); + ((FakeDriver)Application.Driver).SetBufferSize (10, 4); + + var size = view.GetAutoSize (); + Assert.Equal (new Size (text.Length, 1), size); + + view.Text = $"{text}\n{text}"; + size = view.GetAutoSize (); + Assert.Equal (new Size (text.Length, 2), size); + + view.Text = $"{text}\n{text}\n{text}+"; + size = view.GetAutoSize (); + Assert.Equal (new Size (text.Length + 1, 3), size); + + text = string.Empty; + view.Text = text; + size = view.GetAutoSize (); + Assert.Equal (new Size (0, 0), size); + + text = "1"; + view.Text = text; + size = view.GetAutoSize (); + Assert.Equal (new Size (1, 1), size); + + text = "界"; + view.Text = text; + size = view.GetAutoSize (); + Assert.Equal (new Size (2, 1), size); + } + + [Fact] [AutoInitShutdown] + public void AutoSize_False_View_IsEmpty_False_Return_Null_Lines () + { + var text = "Views"; + var view = new View { + Width = Dim.Fill () - text.Length, + Height = 1, + Text = text + }; + var win = new Window { + Width = Dim.Fill (), + Height = Dim.Fill () + }; + win.Add (view); + Application.Top.Add (win); + Application.Begin (Application.Top); + ((FakeDriver)Application.Driver).SetBufferSize (10, 4); + + Assert.Equal (5, text.Length); + Assert.False (view.AutoSize); + Assert.Equal (new Rect (0, 0, 3, 1), view.Frame); + Assert.Equal (new Size (3, 1), view.TextFormatter.Size); + Assert.Equal (new List { "Vie" }, view.TextFormatter.Lines); + Assert.Equal (new Rect (0, 0, 10, 4), win.Frame); + Assert.Equal (new Rect (0, 0, 10, 4), Application.Top.Frame); + var expected = @" +┌────────┐ +│Vie │ +│ │ +└────────┘ +"; + + var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); + Assert.Equal (new Rect (0, 0, 10, 4), pos); + + text = "0123456789"; + Assert.Equal (10, text.Length); + view.Width = Dim.Fill () - text.Length; + Application.Refresh (); + + Assert.Equal (new Rect (0, 0, 0, 1), view.Frame); + Assert.Equal (new Size (0, 1), view.TextFormatter.Size); + Assert.Equal (new List { string.Empty }, view.TextFormatter.Lines); + expected = @" +┌────────┐ +│ │ +│ │ +└────────┘ +"; + + pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); + Assert.Equal (new Rect (0, 0, 10, 4), pos); + } + + [Fact] [AutoInitShutdown] + public void AutoSize_False_View_IsEmpty_True_Minimum_Height () + { + var text = "Views"; + var view = new View { + Width = Dim.Fill () - text.Length, + Text = text + }; + var win = new Window { + Width = Dim.Fill (), + Height = Dim.Fill () + }; + win.Add (view); + Application.Top.Add (win); + Application.Begin (Application.Top); + ((FakeDriver)Application.Driver).SetBufferSize (10, 4); + + Assert.Equal (5, text.Length); + Assert.False (view.AutoSize); + Assert.Equal (new Rect (0, 0, 3, 1), view.Frame); + Assert.Equal (new Size (3, 1), view.TextFormatter.Size); + Assert.Single (view.TextFormatter.Lines); + Assert.Equal (new Rect (0, 0, 10, 4), win.Frame); + Assert.Equal (new Rect (0, 0, 10, 4), Application.Top.Frame); + var expected = @" +┌────────┐ +│Vie │ +│ │ +└────────┘ +"; + + var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); + Assert.Equal (new Rect (0, 0, 10, 4), pos); + + text = "0123456789"; + Assert.Equal (10, text.Length); + view.Width = Dim.Fill () - text.Length; + Application.Refresh (); + + Assert.Equal (new Rect (0, 0, 0, 1), view.Frame); + Assert.Equal (new Size (0, 1), view.TextFormatter.Size); + var exception = Record.Exception (() => Assert.Equal (new List { string.Empty }, view.TextFormatter.Lines)); + Assert.Null (exception); + expected = @" +┌────────┐ +│ │ +│ │ +└────────┘ +"; + + pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); + Assert.Equal (new Rect (0, 0, 10, 4), pos); + } + + [Fact] [AutoInitShutdown] + public void AutoSize_True_Label_IsEmpty_False_Never_Return_Null_Lines () + { + var text = "Label"; + var label = new Label { + Width = Dim.Fill () - text.Length, + Height = 1, + Text = text + }; + var win = new Window { + Width = Dim.Fill (), + Height = Dim.Fill () + }; + win.Add (label); + Application.Top.Add (win); + Application.Begin (Application.Top); + ((FakeDriver)Application.Driver).SetBufferSize (10, 4); + + Assert.Equal (5, text.Length); + Assert.True (label.AutoSize); + Assert.Equal (new Rect (0, 0, 5, 1), label.Frame); + Assert.Equal (new Size (5, 1), label.TextFormatter.Size); + Assert.Equal (new List { "Label" }, label.TextFormatter.Lines); + Assert.Equal (new Rect (0, 0, 10, 4), win.Frame); + Assert.Equal (new Rect (0, 0, 10, 4), Application.Top.Frame); + var expected = @" +┌────────┐ +│Label │ +│ │ +└────────┘ +"; + + var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); + Assert.Equal (new Rect (0, 0, 10, 4), pos); + + text = "0123456789"; + Assert.Equal (10, text.Length); + label.Width = Dim.Fill () - text.Length; + Application.Refresh (); + + Assert.True (label.AutoSize); + Assert.Equal (new Rect (0, 0, 5, 1), label.Frame); + Assert.Equal (new Size (5, 1), label.TextFormatter.Size); + Assert.Single (label.TextFormatter.Lines); + expected = @" +┌────────┐ +│Label │ +│ │ +└────────┘ +"; + + pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); + Assert.Equal (new Rect (0, 0, 10, 4), pos); + } + + [Fact] [AutoInitShutdown] + public void AutoSize_False_Label_IsEmpty_True_Return_Null_Lines () + { + var text = "Label"; + var label = new Label { + Width = Dim.Fill () - text.Length, + Height = 1, + Text = text, + AutoSize = false + }; + var win = new Window { + Width = Dim.Fill (), + Height = Dim.Fill () + }; + win.Add (label); + Application.Top.Add (win); + Application.Begin (Application.Top); + ((FakeDriver)Application.Driver).SetBufferSize (10, 4); + + Assert.Equal (5, text.Length); + Assert.False (label.AutoSize); + Assert.Equal (new Rect (0, 0, 3, 1), label.Frame); + Assert.Equal (new Size (3, 1), label.TextFormatter.Size); + Assert.Equal (new List { "Lab" }, label.TextFormatter.Lines); + Assert.Equal (new Rect (0, 0, 10, 4), win.Frame); + Assert.Equal (new Rect (0, 0, 10, 4), Application.Top.Frame); + var expected = @" +┌────────┐ +│Lab │ +│ │ +└────────┘ +"; + + var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); + Assert.Equal (new Rect (0, 0, 10, 4), pos); + + text = "0123456789"; + Assert.Equal (10, text.Length); + label.Width = Dim.Fill () - text.Length; + Application.Refresh (); + + Assert.False (label.AutoSize); + Assert.Equal (new Rect (0, 0, 0, 1), label.Frame); + Assert.Equal (new Size (0, 1), label.TextFormatter.Size); + Assert.Equal (new List { string.Empty }, label.TextFormatter.Lines); + expected = @" +┌────────┐ +│ │ +│ │ +└────────┘ +"; + + pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); + Assert.Equal (new Rect (0, 0, 10, 4), pos); + } + + [Fact] [AutoInitShutdown] + public void AutoSize_True_Label_IsEmpty_False_Minimum_Height () + { + var text = "Label"; + var label = new Label { + Width = Dim.Fill () - text.Length, + Text = text + }; + var win = new Window { + Width = Dim.Fill (), + Height = Dim.Fill () + }; + win.Add (label); + Application.Top.Add (win); + Application.Begin (Application.Top); + ((FakeDriver)Application.Driver).SetBufferSize (10, 4); + + Assert.Equal (5, text.Length); + Assert.True (label.AutoSize); + Assert.Equal (new Rect (0, 0, 5, 1), label.Frame); + Assert.Equal (new Size (5, 1), label.TextFormatter.Size); + Assert.Equal (new List { "Label" }, label.TextFormatter.Lines); + Assert.Equal (new Rect (0, 0, 10, 4), win.Frame); + Assert.Equal (new Rect (0, 0, 10, 4), Application.Top.Frame); + var expected = @" +┌────────┐ +│Label │ +│ │ +└────────┘ +"; + + var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); + Assert.Equal (new Rect (0, 0, 10, 4), pos); + + text = "0123456789"; + Assert.Equal (10, text.Length); + label.Width = Dim.Fill () - text.Length; + Application.Refresh (); + + Assert.Equal (new Rect (0, 0, 5, 1), label.Frame); + Assert.Equal (new Size (5, 1), label.TextFormatter.Size); + var exception = Record.Exception (() => Assert.Single (label.TextFormatter.Lines)); + Assert.Null (exception); + expected = @" +┌────────┐ +│Label │ +│ │ +└────────┘ +"; + + pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); + Assert.Equal (new Rect (0, 0, 10, 4), pos); + } + + [Fact] [AutoInitShutdown] + public void AutoSize_False_Label_Height_Zero_Returns_Minimum_Height () + { + var text = "Label"; + var label = new Label { + Width = Dim.Fill () - text.Length, + Text = text, + AutoSize = false + }; + var win = new Window { + Width = Dim.Fill (), + Height = Dim.Fill () + }; + win.Add (label); + Application.Top.Add (win); + Application.Begin (Application.Top); + ((FakeDriver)Application.Driver).SetBufferSize (10, 4); + + Assert.Equal (5, text.Length); + Assert.False (label.AutoSize); + Assert.Equal (new Rect (0, 0, 3, 1), label.Frame); + Assert.Equal (new Size (3, 1), label.TextFormatter.Size); + Assert.Single (label.TextFormatter.Lines); + Assert.Equal (new Rect (0, 0, 10, 4), win.Frame); + Assert.Equal (new Rect (0, 0, 10, 4), Application.Top.Frame); + var expected = @" +┌────────┐ +│Lab │ +│ │ +└────────┘ +"; + + var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); + Assert.Equal (new Rect (0, 0, 10, 4), pos); + + text = "0123456789"; + Assert.Equal (10, text.Length); + label.Width = Dim.Fill () - text.Length; + Application.Refresh (); + + Assert.Equal (new Rect (0, 0, 0, 1), label.Frame); + Assert.Equal (new Size (0, 1), label.TextFormatter.Size); + var exception = Record.Exception (() => Assert.Equal (new List { string.Empty }, label.TextFormatter.Lines)); + Assert.Null (exception); + expected = @" +┌────────┐ +│ │ +│ │ +└────────┘ +"; + + pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); + Assert.Equal (new Rect (0, 0, 10, 4), pos); + } + + [Fact] [AutoInitShutdown] + public void AutoSize_True_View_IsEmpty_False_Minimum_Width () + { + var text = "Views"; + var view = new View { + TextDirection = TextDirection.TopBottom_LeftRight, + Height = Dim.Fill () - text.Length, + Text = text, + AutoSize = true + }; + var win = new Window { + Width = Dim.Fill (), + Height = Dim.Fill () + }; + win.Add (view); + Application.Top.Add (win); + Application.Begin (Application.Top); + ((FakeDriver)Application.Driver).SetBufferSize (4, 10); + + Assert.Equal (5, text.Length); + Assert.True (view.AutoSize); + Assert.Equal (new Rect (0, 0, 1, 5), view.Frame); + Assert.Equal (new Size (1, 5), view.TextFormatter.Size); + Assert.Equal (new List { "Views" }, view.TextFormatter.Lines); + Assert.Equal (new Rect (0, 0, 4, 10), win.Frame); + Assert.Equal (new Rect (0, 0, 4, 10), Application.Top.Frame); + var expected = @" +┌──┐ +│V │ +│i │ +│e │ +│w │ +│s │ +│ │ +│ │ +│ │ +└──┘ +"; + + var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); + Assert.Equal (new Rect (0, 0, 4, 10), pos); + + text = "0123456789"; + Assert.Equal (10, text.Length); + view.Height = Dim.Fill () - text.Length; + Application.Refresh (); + + Assert.Equal (new Rect (0, 0, 1, 5), view.Frame); + Assert.Equal (new Size (1, 5), view.TextFormatter.Size); + var exception = Record.Exception (() => Assert.Single (view.TextFormatter.Lines)); + Assert.Null (exception); + expected = @" +┌──┐ +│V │ +│i │ +│e │ +│w │ +│s │ +│ │ +│ │ +│ │ +└──┘ +"; + + pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); + Assert.Equal (new Rect (0, 0, 4, 10), pos); + } + + [Fact] [AutoInitShutdown] + public void AutoSize_False_View_Width_Null_Returns_Host_Frame_Width () + { + var text = "Views"; + var view = new View { + TextDirection = TextDirection.TopBottom_LeftRight, + Height = Dim.Fill () - text.Length, + Text = text + }; + var win = new Window { + Width = Dim.Fill (), + Height = Dim.Fill () + }; + win.Add (view); + Application.Top.Add (win); + Application.Begin (Application.Top); + ((FakeDriver)Application.Driver).SetBufferSize (4, 10); + + Assert.Equal (5, text.Length); + Assert.False (view.AutoSize); + Assert.Equal (new Rect (0, 0, 1, 3), view.Frame); + Assert.Equal (new Size (1, 3), view.TextFormatter.Size); + Assert.Single (view.TextFormatter.Lines); + Assert.Equal (new Rect (0, 0, 4, 10), win.Frame); + Assert.Equal (new Rect (0, 0, 4, 10), Application.Top.Frame); + var expected = @" +┌──┐ +│V │ +│i │ +│e │ +│ │ +│ │ +│ │ +│ │ +│ │ +└──┘ +"; + + var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); + Assert.Equal (new Rect (0, 0, 4, 10), pos); + + text = "0123456789"; + Assert.Equal (10, text.Length); + view.Height = Dim.Fill () - text.Length; + Application.Refresh (); + + Assert.Equal (new Rect (0, 0, 1, 0), view.Frame); + Assert.Equal (new Size (1, 0), view.TextFormatter.Size); + var exception = Record.Exception (() => Assert.Equal (new List { string.Empty }, view.TextFormatter.Lines)); + Assert.Null (exception); + expected = @" +┌──┐ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +└──┘ +"; + + pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); + Assert.Equal (new Rect (0, 0, 4, 10), pos); + } + + [Fact] [AutoInitShutdown] + public void AutoSize_True_View_IsEmpty_False_Minimum_Width_Wide_Rune () + { + var text = "界View"; + var view = new View { + TextDirection = TextDirection.TopBottom_LeftRight, + Height = Dim.Fill () - text.Length, + Text = text, + AutoSize = true + }; + var win = new Window { + Width = Dim.Fill (), + Height = Dim.Fill () + }; + win.Add (view); + Application.Top.Add (win); + Application.Begin (Application.Top); + ((FakeDriver)Application.Driver).SetBufferSize (4, 10); + + Assert.Equal (5, text.Length); + Assert.True (view.AutoSize); + Assert.Equal (new Rect (0, 0, 2, 5), view.Frame); + Assert.Equal (new Size (2, 5), view.TextFormatter.Size); + Assert.Equal (new List { "界View" }, view.TextFormatter.Lines); + Assert.Equal (new Rect (0, 0, 4, 10), win.Frame); + Assert.Equal (new Rect (0, 0, 4, 10), Application.Top.Frame); + var expected = @" +┌──┐ +│界│ +│V │ +│i │ +│e │ +│w │ +│ │ +│ │ +│ │ +└──┘ +"; + + var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); + Assert.Equal (new Rect (0, 0, 4, 10), pos); + + text = "0123456789"; + Assert.Equal (10, text.Length); + view.Height = Dim.Fill () - text.Length; + Application.Refresh (); + + Assert.Equal (new Rect (0, 0, 2, 5), view.Frame); + Assert.Equal (new Size (2, 5), view.TextFormatter.Size); + var exception = Record.Exception (() => Assert.Equal (new List { "界View" }, view.TextFormatter.Lines)); + Assert.Null (exception); + expected = @" +┌──┐ +│界│ +│V │ +│i │ +│e │ +│w │ +│ │ +│ │ +│ │ +└──┘ +"; + + pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); + Assert.Equal (new Rect (0, 0, 4, 10), pos); + } + + [Fact] [AutoInitShutdown] + public void AutoSize_False_View_Width_Zero_Returns_Minimum_Width_With_Wide_Rune () + { + var text = "界View"; + var view = new View { + TextDirection = TextDirection.TopBottom_LeftRight, + Height = Dim.Fill () - text.Length, + Text = text + }; + var win = new Window { + Width = Dim.Fill (), + Height = Dim.Fill () + }; + win.Add (view); + Application.Top.Add (win); + Application.Begin (Application.Top); + ((FakeDriver)Application.Driver).SetBufferSize (4, 10); + + Assert.Equal (5, text.Length); + Assert.False (view.AutoSize); + Assert.Equal (new Rect (0, 0, 2, 3), view.Frame); + Assert.Equal (new Size (2, 3), view.TextFormatter.Size); + Assert.Single (view.TextFormatter.Lines); + Assert.Equal (new Rect (0, 0, 4, 10), win.Frame); + Assert.Equal (new Rect (0, 0, 4, 10), Application.Top.Frame); + var expected = @" +┌──┐ +│界│ +│V │ +│i │ +│ │ +│ │ +│ │ +│ │ +│ │ +└──┘ +"; + + var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); + Assert.Equal (new Rect (0, 0, 4, 10), pos); + + text = "0123456789"; + Assert.Equal (10, text.Length); + view.Height = Dim.Fill () - text.Length; + Application.Refresh (); + + Assert.Equal (new Rect (0, 0, 2, 0), view.Frame); + Assert.Equal (new Size (2, 0), view.TextFormatter.Size); + var exception = Record.Exception (() => Assert.Equal (new List { string.Empty }, view.TextFormatter.Lines)); + Assert.Null (exception); + expected = @" +┌──┐ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +│ │ +└──┘ +"; + + pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); + Assert.Equal (new Rect (0, 0, 4, 10), pos); + } + + + [Fact] + public void AutoSize_False_If_Text_Emmpty () + { + var view1 = new View (); + var view2 = new View (""); + var view3 = new View { Text = "" }; + + Assert.False (view1.AutoSize); + Assert.False (view2.AutoSize); + Assert.False (view3.AutoSize); + view1.Dispose (); + view2.Dispose (); + view3.Dispose (); + } + + [Fact] + public void AutoSize_False_If_Text_Is_Not_Emmpty () + { + var view1 = new View (); + view1.Text = "Hello World"; + var view2 = new View ("Hello World"); + var view3 = new View { Text = "Hello World" }; + + Assert.False (view1.AutoSize); + Assert.False (view2.AutoSize); + Assert.False (view3.AutoSize); + view1.Dispose (); + view2.Dispose (); + view3.Dispose (); + } + + [Fact] + public void AutoSize_True_Label_If_Text_Emmpty () + { + var label1 = new Label (); + var label2 = new Label (""); + var label3 = new Label { Text = "" }; + + Assert.True (label1.AutoSize); + Assert.True (label2.AutoSize); + Assert.True (label3.AutoSize); + label1.Dispose (); + label2.Dispose (); + label3.Dispose (); + } + + [Fact] + public void AutoSize_True_Label_If_Text_Is_Not_Emmpty () + { + var label1 = new Label (); + label1.Text = "Hello World"; + var label2 = new Label ("Hello World"); + var label3 = new Label { Text = "Hello World" }; + + Assert.True (label1.AutoSize); + Assert.True (label2.AutoSize); + Assert.True (label3.AutoSize); + label1.Dispose (); + label2.Dispose (); + label3.Dispose (); + } + + [Fact] + public void AutoSize_False_ResizeView_Is_Always_False () + { + var super = new View (); + var label = new Label { AutoSize = false }; + super.Add (label); + + label.Text = "New text"; + super.LayoutSubviews (); + + Assert.False (label.AutoSize); + Assert.Equal ("(0,0,0,1)", label.Bounds.ToString ()); + super.Dispose (); + } + + [Fact] + public void AutoSize_True_ResizeView_With_Dim_Absolute () + { + var super = new View (); + var label = new Label (); + + label.Text = "New text"; + // BUGBUG: v2 - label was never added to super, so it was never laid out. + super.Add (label); + super.LayoutSubviews (); + + Assert.True (label.AutoSize); + Assert.Equal ("(0,0,8,1)", label.Bounds.ToString ()); + super.Dispose (); + } + + [Fact] + [AutoInitShutdown] + public void AutoSize_False_ResizeView_With_Dim_Fill_After_IsInitialized () + { + var win = new Window (new Rect (0, 0, 30, 80)); + var label = new Label { AutoSize = false, Width = Dim.Fill (), Height = Dim.Fill () }; + win.Add (label); + Application.Top.Add (win); + + // Text is empty but height=1 by default, see Label view + Assert.False (label.AutoSize); + Assert.Equal ("(0,0,0,1)", label.Bounds.ToString ()); + + label.Text = "New text\nNew line"; + Application.Top.LayoutSubviews (); + + Assert.False (label.AutoSize); + Assert.Equal ("(0,0,28,78)", label.Bounds.ToString ()); + Assert.False (label.IsInitialized); + + var rs = Application.Begin (Application.Top); + Assert.True (label.IsInitialized); + Assert.False (label.AutoSize); + Assert.Equal ("(0,0,28,78)", label.Bounds.ToString ()); + Application.End (rs); + } + + [Fact] + [AutoInitShutdown] + public void AutoSize_False_SetWidthHeight_With_Dim_Fill_And_Dim_Absolute_After_IsAdded_And_IsInitialized () + { + var win = new Window (new Rect (0, 0, 30, 80)); + var label = new Label { Width = Dim.Fill () }; + win.Add (label); + Application.Top.Add (win); + + Assert.True (label.IsAdded); + + // Text is empty but height=1 by default, see Label view + Assert.True (label.AutoSize); + // BUGBUG: LayoutSubviews has not been called, so this test is not really valid (pos/dim are indeterminate, not 0) + // Not really a bug because View call OnResizeNeeded method on the SetInitialProperties method + Assert.Equal ("(0,0,0,1)", label.Bounds.ToString ()); + + label.Text = "First line\nSecond line"; + Application.Top.LayoutSubviews (); + + Assert.True (label.AutoSize); + // BUGBUG: This test is bogus: label has not been initialized. pos/dim is indeterminate! + Assert.Equal ("(0,0,28,2)", label.Bounds.ToString ()); + Assert.False (label.IsInitialized); + + var rs = Application.Begin (Application.Top); + + Assert.True (label.AutoSize); + Assert.Equal ("(0,0,28,2)", label.Bounds.ToString ()); + Assert.True (label.IsInitialized); + + label.AutoSize = false; + Application.Refresh (); + + Assert.False (label.AutoSize); + Assert.Equal ("(0,0,28,1)", label.Bounds.ToString ()); + Application.End (rs); + } + + [Fact] + [AutoInitShutdown] + public void AutoSize_False_SetWidthHeight_With_Dim_Fill_And_Dim_Absolute_With_Initialization () + { + var win = new Window (new Rect (0, 0, 30, 80)); + var label = new Label { Width = Dim.Fill () }; + win.Add (label); + Application.Top.Add (win); + + // Text is empty but height=1 by default, see Label view + Assert.True (label.AutoSize); + Assert.Equal ("(0,0,0,1)", label.Bounds.ToString ()); + + var rs = Application.Begin (Application.Top); + + Assert.True (label.AutoSize); + // Here the AutoSize ensuring the right size with width 28 (Dim.Fill) + // and height 0 because wasn't set and the text is empty + // BUGBUG: Because of #2450, this test is bogus: pos/dim is indeterminate! + //Assert.Equal ("(0,0,28,0)", label.Bounds.ToString ()); + + label.Text = "First line\nSecond line"; + Application.Refresh (); + + // Here the AutoSize ensuring the right size with width 28 (Dim.Fill) + // and height 2 because wasn't set and the text has 2 lines + Assert.True (label.AutoSize); + Assert.Equal ("(0,0,28,2)", label.Bounds.ToString ()); + + label.AutoSize = false; + Application.Refresh (); + + // Here the SetMinWidthHeight ensuring the minimum height + Assert.False (label.AutoSize); + Assert.Equal ("(0,0,28,1)", label.Bounds.ToString ()); + + label.Text = "First changed line\nSecond changed line\nNew line"; + Application.Refresh (); + + // Here the AutoSize is false and the width 28 (Dim.Fill) and + // height 1 because wasn't set and SetMinWidthHeight ensuring the minimum height + Assert.False (label.AutoSize); + Assert.Equal ("(0,0,28,1)", label.Bounds.ToString ()); + + label.AutoSize = true; + Application.Refresh (); + + // Here the AutoSize ensuring the right size with width 28 (Dim.Fill) + // and height 3 because wasn't set and the text has 3 lines + Assert.True (label.AutoSize); + // BUGBUG: v2 - AutoSize is broken - temporarily disabling test See #2432 + //Assert.Equal ("(0,0,28,3)", label.Bounds.ToString ()); + Application.End (rs); + } + + [Fact] + [AutoInitShutdown] + public void AutoSize_True_Setting_With_Height_Horizontal () + { + var label = new Label ("Hello") { Width = 10, Height = 2 }; + var viewX = new View ("X") { X = Pos.Right (label) }; + var viewY = new View ("Y") { Y = Pos.Bottom (label) }; + + Application.Top.Add (label, viewX, viewY); + var rs = Application.Begin (Application.Top); + + Assert.True (label.AutoSize); + Assert.Equal (new Rect (0, 0, 10, 2), label.Frame); + + var expected = @" +Hello X + +Y +" + ; + + var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); + Assert.Equal (new Rect (0, 0, 11, 3), pos); + + label.AutoSize = false; + Application.Refresh (); + + Assert.False (label.AutoSize); + Assert.Equal (new Rect (0, 0, 10, 2), label.Frame); + + expected = @" +Hello X + +Y +" + ; + + pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); + Assert.Equal (new Rect (0, 0, 11, 3), pos); + Application.End (rs); + } + + [Fact] + [AutoInitShutdown] + public void AutoSize_True_Setting_With_Height_Vertical () + { + var label = new Label ("Hello") { Width = 2, Height = 10, TextDirection = TextDirection.TopBottom_LeftRight }; + var viewX = new View ("X") { X = Pos.Right (label) }; + var viewY = new View ("Y") { Y = Pos.Bottom (label) }; + + Application.Top.Add (label, viewX, viewY); + var rs = Application.Begin (Application.Top); + + Assert.True (label.AutoSize); + Assert.Equal (new Rect (0, 0, 2, 10), label.Frame); + + var expected = @" +H X +e +l +l +o + + + + + +Y +" + ; + + var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); + Assert.Equal (new Rect (0, 0, 3, 11), pos); + + label.AutoSize = false; + Application.Refresh (); + + Assert.False (label.AutoSize); + Assert.Equal (new Rect (0, 0, 2, 10), label.Frame); + + expected = @" +H X +e +l +l +o + + + + + +Y +" + ; + + pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); + Assert.Equal (new Rect (0, 0, 3, 11), pos); + Application.End (rs); + } + + [Fact] + [AutoInitShutdown] + public void Excess_Text_Is_Erased_When_The_Width_Is_Reduced () + { + var lbl = new Label ("123"); + Application.Top.Add (lbl); + var rs = Application.Begin (Application.Top); + + Assert.True (lbl.AutoSize); + Assert.Equal ("123 ", GetContents ()); + + lbl.Text = "12"; + // Here the AutoSize ensuring the right size with width 3 (Dim.Absolute) + // that was set on the OnAdded method with the text length of 3 + // and height 1 because wasn't set and the text has 1 line + Assert.Equal (new Rect (0, 0, 3, 1), lbl.Frame); + Assert.Equal (new Rect (0, 0, 3, 1), lbl._needsDisplayRect); + Assert.Equal (new Rect (0, 0, 0, 0), lbl.SuperView._needsDisplayRect); + Assert.True (lbl.SuperView.LayoutNeeded); + lbl.SuperView.Draw (); + Assert.Equal ("12 ", GetContents ()); + + string GetContents () + { + var text = ""; + for (var i = 0; i < 4; i++) { + text += Application.Driver.Contents [0, i].Rune; + } + return text; + } + Application.End (rs); + } + + + [Fact] + [AutoInitShutdown] + public void AutoSize_False_Equal_Before_And_After_IsInitialized_With_Differents_Orders () + { + var view1 = new View () { Text = "Say Hello view1 你", AutoSize = false, Width = 10, Height = 5 }; + var view2 = new View () { Text = "Say Hello view2 你", Width = 10, Height = 5, AutoSize = false }; + var view3 = new View () { AutoSize = false, Width = 10, Height = 5, Text = "Say Hello view3 你" }; + var view4 = new View () { + Text = "Say Hello view4 你", + AutoSize = false, + Width = 10, + Height = 5, + TextDirection = TextDirection.TopBottom_LeftRight + }; + var view5 = new View () { + Text = "Say Hello view5 你", + Width = 10, + Height = 5, + AutoSize = false, + TextDirection = TextDirection.TopBottom_LeftRight + }; + var view6 = new View () { + AutoSize = false, + Width = 10, + Height = 5, + TextDirection = TextDirection.TopBottom_LeftRight, + Text = "Say Hello view6 你" + }; + Application.Top.Add (view1, view2, view3, view4, view5, view6); + + Assert.False (view1.IsInitialized); + Assert.False (view2.IsInitialized); + Assert.False (view3.IsInitialized); + Assert.False (view4.IsInitialized); + Assert.False (view5.IsInitialized); + Assert.False (view1.AutoSize); + Assert.Equal (new Rect (0, 0, 10, 5), view1.Frame); + Assert.Equal ("Absolute(10)", view1.Width.ToString ()); + Assert.Equal ("Absolute(5)", view1.Height.ToString ()); + Assert.False (view2.AutoSize); + Assert.Equal (new Rect (0, 0, 10, 5), view2.Frame); + Assert.Equal ("Absolute(10)", view2.Width.ToString ()); + Assert.Equal ("Absolute(5)", view2.Height.ToString ()); + Assert.False (view3.AutoSize); + Assert.Equal (new Rect (0, 0, 10, 5), view3.Frame); + Assert.Equal ("Absolute(10)", view3.Width.ToString ()); + Assert.Equal ("Absolute(5)", view3.Height.ToString ()); + Assert.False (view4.AutoSize); + Assert.Equal (new Rect (0, 0, 10, 5), view4.Frame); + Assert.Equal ("Absolute(10)", view4.Width.ToString ()); + Assert.Equal ("Absolute(5)", view4.Height.ToString ()); + Assert.False (view5.AutoSize); + Assert.Equal (new Rect (0, 0, 10, 5), view5.Frame); + Assert.Equal ("Absolute(10)", view5.Width.ToString ()); + Assert.Equal ("Absolute(5)", view5.Height.ToString ()); + Assert.False (view6.AutoSize); + Assert.Equal (new Rect (0, 0, 10, 5), view6.Frame); + Assert.Equal ("Absolute(10)", view6.Width.ToString ()); + Assert.Equal ("Absolute(5)", view6.Height.ToString ()); + + var rs = Application.Begin (Application.Top); + + Assert.True (view1.IsInitialized); + Assert.True (view2.IsInitialized); + Assert.True (view3.IsInitialized); + Assert.True (view4.IsInitialized); + Assert.True (view5.IsInitialized); + Assert.False (view1.AutoSize); + Assert.Equal (new Rect (0, 0, 10, 5), view1.Frame); + Assert.Equal ("Absolute(10)", view1.Width.ToString ()); + Assert.Equal ("Absolute(5)", view1.Height.ToString ()); + Assert.False (view2.AutoSize); + Assert.Equal (new Rect (0, 0, 10, 5), view2.Frame); + Assert.Equal ("Absolute(10)", view2.Width.ToString ()); + Assert.Equal ("Absolute(5)", view2.Height.ToString ()); + Assert.False (view3.AutoSize); + Assert.Equal (new Rect (0, 0, 10, 5), view3.Frame); + Assert.Equal ("Absolute(10)", view3.Width.ToString ()); + Assert.Equal ("Absolute(5)", view3.Height.ToString ()); + Assert.False (view4.AutoSize); + Assert.Equal (new Rect (0, 0, 10, 5), view4.Frame); + Assert.Equal ("Absolute(10)", view4.Width.ToString ()); + Assert.Equal ("Absolute(5)", view4.Height.ToString ()); + Assert.False (view5.AutoSize); + Assert.Equal (new Rect (0, 0, 10, 5), view5.Frame); + Assert.Equal ("Absolute(10)", view5.Width.ToString ()); + Assert.Equal ("Absolute(5)", view5.Height.ToString ()); + Assert.False (view6.AutoSize); + Assert.Equal (new Rect (0, 0, 10, 5), view6.Frame); + Assert.Equal ("Absolute(10)", view6.Width.ToString ()); + Assert.Equal ("Absolute(5)", view6.Height.ToString ()); + Application.End (rs); + } + + [Fact] + [AutoInitShutdown] + public void AutoSize_True_Equal_Before_And_After_IsInitialized_With_Different_Orders () + { + var view1 = new View () { Text = "Say Hello view1 你", AutoSize = true, Width = 10, Height = 5 }; + var view2 = new View () { Text = "Say Hello view2 你", Width = 10, Height = 5, AutoSize = true }; + var view3 = new View () { AutoSize = true, Width = 10, Height = 5, Text = "Say Hello view3 你" }; + var view4 = new View () { + Text = "Say Hello view4 你", + AutoSize = true, + Width = 10, + Height = 5, + TextDirection = TextDirection.TopBottom_LeftRight + }; + var view5 = new View () { + Text = "Say Hello view5 你", + Width = 10, + Height = 5, + AutoSize = true, + TextDirection = TextDirection.TopBottom_LeftRight + }; + var view6 = new View () { + AutoSize = true, + Width = 10, + Height = 5, + TextDirection = TextDirection.TopBottom_LeftRight, + Text = "Say Hello view6 你" + }; + Application.Top.Add (view1, view2, view3, view4, view5, view6); + + Assert.False (view1.IsInitialized); + Assert.False (view2.IsInitialized); + Assert.False (view3.IsInitialized); + Assert.False (view4.IsInitialized); + Assert.False (view5.IsInitialized); + Assert.True (view1.AutoSize); + Assert.Equal (new Rect (0, 0, 18, 5), view1.Frame); + Assert.Equal ("Absolute(10)", view1.Width.ToString ()); + Assert.Equal ("Absolute(5)", view1.Height.ToString ()); + Assert.True (view2.AutoSize); + // BUGBUG: v2 - Autosize is broken when setting Width/Height AutoSize. Disabling test for now. + //Assert.Equal (new Rect (0, 0, 18, 5), view2.Frame); + //Assert.Equal ("Absolute(10)", view2.Width.ToString ()); + //Assert.Equal ("Absolute(5)", view2.Height.ToString ()); + //Assert.True (view3.AutoSize); + //Assert.Equal (new Rect (0, 0, 18, 5), view3.Frame); + //Assert.Equal ("Absolute(10)", view3.Width.ToString ()); + //Assert.Equal ("Absolute(5)", view3.Height.ToString ()); + //Assert.True (view4.AutoSize); + //Assert.Equal (new Rect (0, 0, 10, 17), view4.Frame); + //Assert.Equal ("Absolute(10)", view4.Width.ToString ()); + //Assert.Equal ("Absolute(5)", view4.Height.ToString ()); + //Assert.True (view5.AutoSize); + //Assert.Equal (new Rect (0, 0, 10, 17), view5.Frame); + //Assert.Equal ("Absolute(10)", view5.Width.ToString ()); + //Assert.Equal ("Absolute(5)", view5.Height.ToString ()); + //Assert.True (view6.AutoSize); + //Assert.Equal (new Rect (0, 0, 10, 17), view6.Frame); + //Assert.Equal ("Absolute(10)", view6.Width.ToString ()); + //Assert.Equal ("Absolute(5)", view6.Height.ToString ()); + + var rs = Application.Begin (Application.Top); + + Assert.True (view1.IsInitialized); + Assert.True (view2.IsInitialized); + Assert.True (view3.IsInitialized); + Assert.True (view4.IsInitialized); + Assert.True (view5.IsInitialized); + Assert.True (view1.AutoSize); + Assert.Equal (new Rect (0, 0, 18, 5), view1.Frame); + Assert.Equal ("Absolute(10)", view1.Width.ToString ()); + Assert.Equal ("Absolute(5)", view1.Height.ToString ()); + Assert.True (view2.AutoSize); + // BUGBUG: v2 - Autosize is broken when setting Width/Height AutoSize. Disabling test for now. + //Assert.Equal (new Rect (0, 0, 18, 5), view2.Frame); + //Assert.Equal ("Absolute(10)", view2.Width.ToString ()); + //Assert.Equal ("Absolute(5)", view2.Height.ToString ()); + //Assert.True (view3.AutoSize); + //Assert.Equal (new Rect (0, 0, 18, 5), view3.Frame); + //Assert.Equal ("Absolute(10)", view3.Width.ToString ()); + //Assert.Equal ("Absolute(5)", view3.Height.ToString ()); + //Assert.True (view4.AutoSize); + //Assert.Equal (new Rect (0, 0, 10, 17), view4.Frame); + //Assert.Equal ("Absolute(10)", view4.Width.ToString ()); + //Assert.Equal ("Absolute(5)", view4.Height.ToString ()); + //Assert.True (view5.AutoSize); + //Assert.Equal (new Rect (0, 0, 10, 17), view5.Frame); + //Assert.Equal ("Absolute(10)", view5.Width.ToString ()); + //Assert.Equal ("Absolute(5)", view5.Height.ToString ()); + //Assert.True (view6.AutoSize); + //Assert.Equal (new Rect (0, 0, 10, 17), view6.Frame); + //Assert.Equal ("Absolute(10)", view6.Width.ToString ()); + //Assert.Equal ("Absolute(5)", view6.Height.ToString ()); + Application.End (rs); + } + + [Fact] + [AutoInitShutdown] + public void Setting_Frame_Dont_Respect_AutoSize_True_On_Layout_Absolute () + { + var view1 = new View (new Rect (0, 0, 10, 0)) { Text = "Say Hello view1 你", AutoSize = true }; + var view2 = new View (new Rect (0, 0, 0, 10)) { + Text = "Say Hello view2 你", + AutoSize = true, + TextDirection = TextDirection.TopBottom_LeftRight + }; + Application.Top.Add (view1, view2); + + var rs = Application.Begin (Application.Top); + + Assert.True (view1.AutoSize); + Assert.Equal (LayoutStyle.Absolute, view1.LayoutStyle); + Assert.Equal (new Rect (0, 0, 18, 1), view1.Frame); + Assert.Equal ("Absolute(0)", view1.X.ToString ()); + Assert.Equal ("Absolute(0)", view1.Y.ToString ()); + Assert.Equal ("Absolute(18)", view1.Width.ToString ()); + Assert.Equal ("Absolute(1)", view1.Height.ToString ()); + Assert.True (view2.AutoSize); + // BUGBUG: v2 - Autosize is broken when setting Width/Height AutoSize. Disabling test for now. + //Assert.Equal (LayoutStyle.Absolute, view2.LayoutStyle); + //Assert.Equal (new Rect (0, 0, 2, 17), view2.Frame); + //Assert.Equal ("Absolute(0)", view2.X.ToString ()); + //Assert.Equal ("Absolute(0)", view2.Y.ToString ()); + //Assert.Equal ("Absolute(2)", view2.Width.ToString ()); + //Assert.Equal ("Absolute(17)", view2.Height.ToString ()); + + view1.Frame = new Rect (0, 0, 25, 4); + bool firstIteration = false; + Application.RunIteration (ref rs, ref firstIteration); + + Assert.True (view1.AutoSize); + Assert.Equal (LayoutStyle.Absolute, view1.LayoutStyle); + Assert.Equal (new Rect (0, 0, 25, 4), view1.Frame); + Assert.Equal ("Absolute(0)", view1.X.ToString ()); + Assert.Equal ("Absolute(0)", view1.Y.ToString ()); + Assert.Equal ("Absolute(18)", view1.Width.ToString ()); + Assert.Equal ("Absolute(1)", view1.Height.ToString ()); + + view2.Frame = new Rect (0, 0, 1, 25); + Application.RunIteration (ref rs, ref firstIteration); + + Assert.True (view2.AutoSize); + Assert.Equal (LayoutStyle.Absolute, view2.LayoutStyle); + Assert.Equal (new Rect (0, 0, 1, 25), view2.Frame); + Assert.Equal ("Absolute(0)", view2.X.ToString ()); + Assert.Equal ("Absolute(0)", view2.Y.ToString ()); + // BUGBUG: v2 - Autosize is broken when setting Width/Height AutoSize. Disabling test for now. + //Assert.Equal ("Absolute(2)", view2.Width.ToString ()); + //Assert.Equal ("Absolute(17)", view2.Height.ToString ()); + Application.End (rs); + } + + [Fact] + [AutoInitShutdown] + public void AutoSize_Stays_True_Center_HotKeySpecifier () + { + var label = new Label () { + X = Pos.Center (), + Y = Pos.Center (), + Text = "Say Hello 你" + }; + + var win = new Window () { + Width = Dim.Fill (), + Height = Dim.Fill (), + Title = "Test Demo 你" + }; + win.Add (label); + Application.Top.Add (win); + + Assert.True (label.AutoSize); + + var rs = Application.Begin (Application.Top); + ((FakeDriver)Application.Driver).SetBufferSize (30, 5); + string expected = @$" +┌┤Test Demo 你├──────────────┐ +│ │ +│ Say Hello 你 │ +│ │ +└────────────────────────────┘ +"; + + TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); + + Assert.True (label.AutoSize); + label.Text = "Say Hello 你 changed"; + Assert.True (label.AutoSize); + Application.Refresh (); + expected = @" +┌┤Test Demo 你├──────────────┐ +│ │ +│ Say Hello 你 changed │ +│ │ +└────────────────────────────┘ +"; + + TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); + Application.End (rs); + } + +} \ No newline at end of file diff --git a/UnitTests/View/Layout/DimTests.cs b/UnitTests/View/Layout/DimTests.cs index e017a2170..654bdd245 100644 --- a/UnitTests/View/Layout/DimTests.cs +++ b/UnitTests/View/Layout/DimTests.cs @@ -1010,8 +1010,6 @@ public class DimTests { { var top = Application.Top; - // BUGBUG: v2 - If a View's height is zero, it should not be drawn. - //// Although view height is zero the text it's draw due the SetMinWidthHeight method var view = new View ("View with long text") { X = 0, Y = 0, Width = 20, Height = 1 }; var field = new TextField { X = 0, Y = Pos.Bottom (view), Width = 20 }; var count = 0; diff --git a/UnitTests/View/Layout/LayoutTests.cs b/UnitTests/View/Layout/LayoutTests.cs index d5c9dadf0..ea2a5a3b0 100644 --- a/UnitTests/View/Layout/LayoutTests.cs +++ b/UnitTests/View/Layout/LayoutTests.cs @@ -129,7 +129,7 @@ public class LayoutTests { Assert.False (v.TrySetWidth (70, out rWidth)); Assert.Equal (69, rWidth); - v.Width = null; + v.Width = 0; Assert.True (v.TrySetWidth (70, out rWidth)); Assert.Equal (70, rWidth); Assert.False (v.IsInitialized); @@ -138,10 +138,7 @@ public class LayoutTests { Application.Begin (Application.Top); Assert.True (v.IsInitialized); - v.Width = Dim.Fill (1); - v.LayoutStyle = LayoutStyle.Computed; v.Width = 75; - v.LayoutStyle = LayoutStyle.Absolute; Assert.True (v.TrySetWidth (60, out rWidth)); Assert.Equal (60, rWidth); } @@ -168,7 +165,7 @@ public class LayoutTests { Assert.False (v.TrySetHeight (10, out rHeight)); Assert.Equal (9, rHeight); - v.Height = null; + v.Height = 0; Assert.True (v.TrySetHeight (10, out rHeight)); Assert.Equal (10, rHeight); Assert.False (v.IsInitialized); @@ -178,10 +175,6 @@ public class LayoutTests { Assert.True (v.IsInitialized); - v.Height = Dim.Fill (1); - v.LayoutStyle = LayoutStyle.Computed; - v.Height = 15; - v.LayoutStyle = LayoutStyle.Absolute; v.Height = 15; Assert.True (v.TrySetHeight (5, out rHeight)); Assert.Equal (5, rHeight); @@ -255,344 +248,6 @@ public class LayoutTests { top.Dispose (); } - [Fact] - public void AutoSize_False_If_Text_Emmpty () - { - var view1 = new View (); - var view2 = new View (""); - var view3 = new View () { Text = "" }; - - Assert.False (view1.AutoSize); - Assert.False (view2.AutoSize); - Assert.False (view3.AutoSize); - view1.Dispose (); - view2.Dispose (); - view3.Dispose (); - } - - [Fact] - public void AutoSize_False_If_Text_Is_Not_Emmpty () - { - var view1 = new View (); - view1.Text = "Hello World"; - var view2 = new View ("Hello World"); - var view3 = new View () { Text = "Hello World" }; - - Assert.False (view1.AutoSize); - Assert.False (view2.AutoSize); - Assert.False (view3.AutoSize); - view1.Dispose (); - view2.Dispose (); - view3.Dispose (); - } - - [Fact] - public void AutoSize_True_Label_If_Text_Emmpty () - { - var label1 = new Label (); - var label2 = new Label (""); - var label3 = new Label () { Text = "" }; - - Assert.True (label1.AutoSize); - Assert.True (label2.AutoSize); - Assert.True (label3.AutoSize); - label1.Dispose (); - label2.Dispose (); - label3.Dispose (); - } - - [Fact] - public void AutoSize_True_Label_If_Text_Is_Not_Emmpty () - { - var label1 = new Label (); - label1.Text = "Hello World"; - var label2 = new Label ("Hello World"); - var label3 = new Label () { Text = "Hello World" }; - - Assert.True (label1.AutoSize); - Assert.True (label2.AutoSize); - Assert.True (label3.AutoSize); - label1.Dispose (); - label2.Dispose (); - label3.Dispose (); - } - - [Fact] - public void AutoSize_False_ResizeView_Is_Always_False () - { - var super = new View (); - var label = new Label () { AutoSize = false }; - super.Add (label); - - label.Text = "New text"; - super.LayoutSubviews (); - - Assert.False (label.AutoSize); - Assert.Equal ("(0,0,0,1)", label.Bounds.ToString ()); - super.Dispose (); - } - - [Fact] - public void AutoSize_True_ResizeView_With_Dim_Absolute () - { - var super = new View (); - var label = new Label (); - - label.Text = "New text"; - // BUGBUG: v2 - label was never added to super, so it was never laid out. - super.Add (label); - super.LayoutSubviews (); - - Assert.True (label.AutoSize); - Assert.Equal ("(0,0,8,1)", label.Bounds.ToString ()); - super.Dispose (); - } - - [Fact] [AutoInitShutdown] - public void AutoSize_False_ResizeView_With_Dim_Fill_After_IsInitialized () - { - var win = new Window (new Rect (0, 0, 30, 80)); - var label = new Label () { AutoSize = false, Width = Dim.Fill (), Height = Dim.Fill () }; - win.Add (label); - Application.Top.Add (win); - - // Text is empty but height=1 by default, see Label view - Assert.False (label.AutoSize); - Assert.Equal ("(0,0,0,1)", label.Bounds.ToString ()); - - label.Text = "New text\nNew line"; - Application.Top.LayoutSubviews (); - - Assert.False (label.AutoSize); - Assert.Equal ("(0,0,28,78)", label.Bounds.ToString ()); - Assert.False (label.IsInitialized); - - var rs = Application.Begin (Application.Top); - Assert.True (label.IsInitialized); - Assert.False (label.AutoSize); - Assert.Equal ("(0,0,28,78)", label.Bounds.ToString ()); - Application.End (rs); - } - - [Fact] [AutoInitShutdown] - public void AutoSize_False_SetWidthHeight_With_Dim_Fill_And_Dim_Absolute_After_IsAdded_And_IsInitialized () - { - var win = new Window (new Rect (0, 0, 30, 80)); - var label = new Label () { Width = Dim.Fill () }; - win.Add (label); - Application.Top.Add (win); - - Assert.True (label.IsAdded); - - // Text is empty but height=1 by default, see Label view - Assert.True (label.AutoSize); - // BUGBUG: LayoutSubviews has not been called, so this test is not really valid (pos/dim are indeterminate, not 0) - // Not really a bug because View call OnResizeNeeded method on the SetInitialProperties method - Assert.Equal ("(0,0,0,1)", label.Bounds.ToString ()); - - label.Text = "First line\nSecond line"; - Application.Top.LayoutSubviews (); - - Assert.True (label.AutoSize); - // BUGBUG: This test is bogus: label has not been initialized. pos/dim is indeterminate! - Assert.Equal ("(0,0,28,2)", label.Bounds.ToString ()); - Assert.False (label.IsInitialized); - - var rs = Application.Begin (Application.Top); - - Assert.True (label.AutoSize); - Assert.Equal ("(0,0,28,2)", label.Bounds.ToString ()); - Assert.True (label.IsInitialized); - - label.AutoSize = false; - Application.Refresh (); - - Assert.False (label.AutoSize); - Assert.Equal ("(0,0,28,1)", label.Bounds.ToString ()); - Application.End (rs); - } - - [Fact] [AutoInitShutdown] - public void AutoSize_False_SetWidthHeight_With_Dim_Fill_And_Dim_Absolute_With_Initialization () - { - var win = new Window (new Rect (0, 0, 30, 80)); - var label = new Label () { Width = Dim.Fill () }; - win.Add (label); - Application.Top.Add (win); - - // Text is empty but height=1 by default, see Label view - Assert.True (label.AutoSize); - Assert.Equal ("(0,0,0,1)", label.Bounds.ToString ()); - - var rs = Application.Begin (Application.Top); - - Assert.True (label.AutoSize); - // Here the AutoSize ensuring the right size with width 28 (Dim.Fill) - // and height 0 because wasn't set and the text is empty - // BUGBUG: Because of #2450, this test is bogus: pos/dim is indeterminate! - //Assert.Equal ("(0,0,28,0)", label.Bounds.ToString ()); - - label.Text = "First line\nSecond line"; - Application.Refresh (); - - // Here the AutoSize ensuring the right size with width 28 (Dim.Fill) - // and height 2 because wasn't set and the text has 2 lines - Assert.True (label.AutoSize); - Assert.Equal ("(0,0,28,2)", label.Bounds.ToString ()); - - label.AutoSize = false; - Application.Refresh (); - - // Here the SetMinWidthHeight ensuring the minimum height - Assert.False (label.AutoSize); - Assert.Equal ("(0,0,28,1)", label.Bounds.ToString ()); - - label.Text = "First changed line\nSecond changed line\nNew line"; - Application.Refresh (); - - // Here the AutoSize is false and the width 28 (Dim.Fill) and - // height 1 because wasn't set and SetMinWidthHeight ensuring the minimum height - Assert.False (label.AutoSize); - Assert.Equal ("(0,0,28,1)", label.Bounds.ToString ()); - - label.AutoSize = true; - Application.Refresh (); - - // Here the AutoSize ensuring the right size with width 28 (Dim.Fill) - // and height 3 because wasn't set and the text has 3 lines - Assert.True (label.AutoSize); - // BUGBUG: v2 - AutoSize is broken - temporarily disabling test See #2432 - //Assert.Equal ("(0,0,28,3)", label.Bounds.ToString ()); - Application.End (rs); - } - - [Fact] [AutoInitShutdown] - public void AutoSize_True_Setting_With_Height_Horizontal () - { - var label = new Label ("Hello") { Width = 10, Height = 2 }; - var viewX = new View ("X") { X = Pos.Right (label) }; - var viewY = new View ("Y") { Y = Pos.Bottom (label) }; - - Application.Top.Add (label, viewX, viewY); - var rs = Application.Begin (Application.Top); - - Assert.True (label.AutoSize); - Assert.Equal (new Rect (0, 0, 10, 2), label.Frame); - - string expected = @" -Hello X - -Y -"; - - var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); - Assert.Equal (new Rect (0, 0, 11, 3), pos); - - label.AutoSize = false; - Application.Refresh (); - - Assert.False (label.AutoSize); - Assert.Equal (new Rect (0, 0, 10, 2), label.Frame); - - expected = @" -Hello X - -Y -"; - - pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); - Assert.Equal (new Rect (0, 0, 11, 3), pos); - Application.End (rs); - } - - [Fact] [AutoInitShutdown] - public void AutoSize_True_Setting_With_Height_Vertical () - { - var label = new Label ("Hello") { Width = 2, Height = 10, TextDirection = TextDirection.TopBottom_LeftRight }; - var viewX = new View ("X") { X = Pos.Right (label) }; - var viewY = new View ("Y") { Y = Pos.Bottom (label) }; - - Application.Top.Add (label, viewX, viewY); - var rs = Application.Begin (Application.Top); - - Assert.True (label.AutoSize); - Assert.Equal (new Rect (0, 0, 2, 10), label.Frame); - - string expected = @" -H X -e -l -l -o - - - - - -Y -"; - - var pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); - Assert.Equal (new Rect (0, 0, 3, 11), pos); - - label.AutoSize = false; - Application.Refresh (); - - Assert.False (label.AutoSize); - Assert.Equal (new Rect (0, 0, 2, 10), label.Frame); - - expected = @" -H X -e -l -l -o - - - - - -Y -"; - - pos = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); - Assert.Equal (new Rect (0, 0, 3, 11), pos); - Application.End (rs); - } - - [Fact] - [AutoInitShutdown] - public void Excess_Text_Is_Erased_When_The_Width_Is_Reduced () - { - var lbl = new Label ("123"); - Application.Top.Add (lbl); - var rs = Application.Begin (Application.Top); - - Assert.True (lbl.AutoSize); - Assert.Equal ("123 ", GetContents ()); - - lbl.Text = "12"; - // Here the AutoSize ensuring the right size with width 3 (Dim.Absolute) - // that was set on the OnAdded method with the text length of 3 - // and height 1 because wasn't set and the text has 1 line - Assert.Equal (new Rect (0, 0, 3, 1), lbl.Frame); - Assert.Equal (new Rect (0, 0, 3, 1), lbl._needsDisplayRect); - Assert.Equal (new Rect (0, 0, 0, 0), lbl.SuperView._needsDisplayRect); - Assert.True (lbl.SuperView.LayoutNeeded); - lbl.SuperView.Draw (); - Assert.Equal ("12 ", GetContents ()); - - string GetContents () - { - string text = ""; - for (int i = 0; i < 4; i++) { - text += Application.Driver.Contents [0, i].Rune; - } - return text; - } - Application.End (rs); - } - [Fact] [AutoInitShutdown] public void Width_Height_SetMinWidthHeight_Narrow_Wide_Runes () { @@ -1130,333 +785,8 @@ Y Application.End (rs); } - [Fact] [AutoInitShutdown] - public void AutoSize_Stays_True_Center_HotKeySpecifier () - { - var label = new Label () { - X = Pos.Center (), - Y = Pos.Center (), - Text = "Say Hello 你" - }; - - var win = new Window () { - Width = Dim.Fill (), - Height = Dim.Fill (), - Title = "Test Demo 你" - }; - win.Add (label); - Application.Top.Add (win); - - Assert.True (label.AutoSize); - - var rs = Application.Begin (Application.Top); - ((FakeDriver)Application.Driver).SetBufferSize (30, 5); - string expected = @$" -┌┤Test Demo 你├──────────────┐ -│ │ -│ Say Hello 你 │ -│ │ -└────────────────────────────┘ -"; - - TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); - - Assert.True (label.AutoSize); - label.Text = "Say Hello 你 changed"; - Assert.True (label.AutoSize); - Application.Refresh (); - expected = @" -┌┤Test Demo 你├──────────────┐ -│ │ -│ Say Hello 你 changed │ -│ │ -└────────────────────────────┘ -"; - - TestHelpers.AssertDriverContentsWithFrameAre (expected, _output); - Application.End (rs); - } - - [Fact] [AutoInitShutdown] - public void AutoSize_False_Equal_Before_And_After_IsInitialized_With_Differents_Orders () - { - var view1 = new View () { Text = "Say Hello view1 你", AutoSize = false, Width = 10, Height = 5 }; - var view2 = new View () { Text = "Say Hello view2 你", Width = 10, Height = 5, AutoSize = false }; - var view3 = new View () { AutoSize = false, Width = 10, Height = 5, Text = "Say Hello view3 你" }; - var view4 = new View () { - Text = "Say Hello view4 你", - AutoSize = false, - Width = 10, - Height = 5, - TextDirection = TextDirection.TopBottom_LeftRight - }; - var view5 = new View () { - Text = "Say Hello view5 你", - Width = 10, - Height = 5, - AutoSize = false, - TextDirection = TextDirection.TopBottom_LeftRight - }; - var view6 = new View () { - AutoSize = false, - Width = 10, - Height = 5, - TextDirection = TextDirection.TopBottom_LeftRight, - Text = "Say Hello view6 你" - }; - Application.Top.Add (view1, view2, view3, view4, view5, view6); - - Assert.False (view1.IsInitialized); - Assert.False (view2.IsInitialized); - Assert.False (view3.IsInitialized); - Assert.False (view4.IsInitialized); - Assert.False (view5.IsInitialized); - Assert.False (view1.AutoSize); - Assert.Equal (new Rect (0, 0, 10, 5), view1.Frame); - Assert.Equal ("Absolute(10)", view1.Width.ToString ()); - Assert.Equal ("Absolute(5)", view1.Height.ToString ()); - Assert.False (view2.AutoSize); - Assert.Equal (new Rect (0, 0, 10, 5), view2.Frame); - Assert.Equal ("Absolute(10)", view2.Width.ToString ()); - Assert.Equal ("Absolute(5)", view2.Height.ToString ()); - Assert.False (view3.AutoSize); - Assert.Equal (new Rect (0, 0, 10, 5), view3.Frame); - Assert.Equal ("Absolute(10)", view3.Width.ToString ()); - Assert.Equal ("Absolute(5)", view3.Height.ToString ()); - Assert.False (view4.AutoSize); - Assert.Equal (new Rect (0, 0, 10, 5), view4.Frame); - Assert.Equal ("Absolute(10)", view4.Width.ToString ()); - Assert.Equal ("Absolute(5)", view4.Height.ToString ()); - Assert.False (view5.AutoSize); - Assert.Equal (new Rect (0, 0, 10, 5), view5.Frame); - Assert.Equal ("Absolute(10)", view5.Width.ToString ()); - Assert.Equal ("Absolute(5)", view5.Height.ToString ()); - Assert.False (view6.AutoSize); - Assert.Equal (new Rect (0, 0, 10, 5), view6.Frame); - Assert.Equal ("Absolute(10)", view6.Width.ToString ()); - Assert.Equal ("Absolute(5)", view6.Height.ToString ()); - - var rs = Application.Begin (Application.Top); - - Assert.True (view1.IsInitialized); - Assert.True (view2.IsInitialized); - Assert.True (view3.IsInitialized); - Assert.True (view4.IsInitialized); - Assert.True (view5.IsInitialized); - Assert.False (view1.AutoSize); - Assert.Equal (new Rect (0, 0, 10, 5), view1.Frame); - Assert.Equal ("Absolute(10)", view1.Width.ToString ()); - Assert.Equal ("Absolute(5)", view1.Height.ToString ()); - Assert.False (view2.AutoSize); - Assert.Equal (new Rect (0, 0, 10, 5), view2.Frame); - Assert.Equal ("Absolute(10)", view2.Width.ToString ()); - Assert.Equal ("Absolute(5)", view2.Height.ToString ()); - Assert.False (view3.AutoSize); - Assert.Equal (new Rect (0, 0, 10, 5), view3.Frame); - Assert.Equal ("Absolute(10)", view3.Width.ToString ()); - Assert.Equal ("Absolute(5)", view3.Height.ToString ()); - Assert.False (view4.AutoSize); - Assert.Equal (new Rect (0, 0, 10, 5), view4.Frame); - Assert.Equal ("Absolute(10)", view4.Width.ToString ()); - Assert.Equal ("Absolute(5)", view4.Height.ToString ()); - Assert.False (view5.AutoSize); - Assert.Equal (new Rect (0, 0, 10, 5), view5.Frame); - Assert.Equal ("Absolute(10)", view5.Width.ToString ()); - Assert.Equal ("Absolute(5)", view5.Height.ToString ()); - Assert.False (view6.AutoSize); - Assert.Equal (new Rect (0, 0, 10, 5), view6.Frame); - Assert.Equal ("Absolute(10)", view6.Width.ToString ()); - Assert.Equal ("Absolute(5)", view6.Height.ToString ()); - Application.End (rs); - } - - [Fact] [AutoInitShutdown] - public void AutoSize_True_Equal_Before_And_After_IsInitialized_With_Different_Orders () - { - var view1 = new View () { Text = "Say Hello view1 你", AutoSize = true, Width = 10, Height = 5 }; - var view2 = new View () { Text = "Say Hello view2 你", Width = 10, Height = 5, AutoSize = true }; - var view3 = new View () { AutoSize = true, Width = 10, Height = 5, Text = "Say Hello view3 你" }; - var view4 = new View () { - Text = "Say Hello view4 你", - AutoSize = true, - Width = 10, - Height = 5, - TextDirection = TextDirection.TopBottom_LeftRight - }; - var view5 = new View () { - Text = "Say Hello view5 你", - Width = 10, - Height = 5, - AutoSize = true, - TextDirection = TextDirection.TopBottom_LeftRight - }; - var view6 = new View () { - AutoSize = true, - Width = 10, - Height = 5, - TextDirection = TextDirection.TopBottom_LeftRight, - Text = "Say Hello view6 你" - }; - Application.Top.Add (view1, view2, view3, view4, view5, view6); - - Assert.False (view1.IsInitialized); - Assert.False (view2.IsInitialized); - Assert.False (view3.IsInitialized); - Assert.False (view4.IsInitialized); - Assert.False (view5.IsInitialized); - Assert.True (view1.AutoSize); - Assert.Equal (new Rect (0, 0, 18, 5), view1.Frame); - Assert.Equal ("Absolute(10)", view1.Width.ToString ()); - Assert.Equal ("Absolute(5)", view1.Height.ToString ()); - Assert.True (view2.AutoSize); - // BUGBUG: v2 - Autosize is broken when setting Width/Height AutoSize. Disabling test for now. - //Assert.Equal (new Rect (0, 0, 18, 5), view2.Frame); - //Assert.Equal ("Absolute(10)", view2.Width.ToString ()); - //Assert.Equal ("Absolute(5)", view2.Height.ToString ()); - //Assert.True (view3.AutoSize); - //Assert.Equal (new Rect (0, 0, 18, 5), view3.Frame); - //Assert.Equal ("Absolute(10)", view3.Width.ToString ()); - //Assert.Equal ("Absolute(5)", view3.Height.ToString ()); - //Assert.True (view4.AutoSize); - //Assert.Equal (new Rect (0, 0, 10, 17), view4.Frame); - //Assert.Equal ("Absolute(10)", view4.Width.ToString ()); - //Assert.Equal ("Absolute(5)", view4.Height.ToString ()); - //Assert.True (view5.AutoSize); - //Assert.Equal (new Rect (0, 0, 10, 17), view5.Frame); - //Assert.Equal ("Absolute(10)", view5.Width.ToString ()); - //Assert.Equal ("Absolute(5)", view5.Height.ToString ()); - //Assert.True (view6.AutoSize); - //Assert.Equal (new Rect (0, 0, 10, 17), view6.Frame); - //Assert.Equal ("Absolute(10)", view6.Width.ToString ()); - //Assert.Equal ("Absolute(5)", view6.Height.ToString ()); - - var rs = Application.Begin (Application.Top); - - Assert.True (view1.IsInitialized); - Assert.True (view2.IsInitialized); - Assert.True (view3.IsInitialized); - Assert.True (view4.IsInitialized); - Assert.True (view5.IsInitialized); - Assert.True (view1.AutoSize); - Assert.Equal (new Rect (0, 0, 18, 5), view1.Frame); - Assert.Equal ("Absolute(10)", view1.Width.ToString ()); - Assert.Equal ("Absolute(5)", view1.Height.ToString ()); - Assert.True (view2.AutoSize); - // BUGBUG: v2 - Autosize is broken when setting Width/Height AutoSize. Disabling test for now. - //Assert.Equal (new Rect (0, 0, 18, 5), view2.Frame); - //Assert.Equal ("Absolute(10)", view2.Width.ToString ()); - //Assert.Equal ("Absolute(5)", view2.Height.ToString ()); - //Assert.True (view3.AutoSize); - //Assert.Equal (new Rect (0, 0, 18, 5), view3.Frame); - //Assert.Equal ("Absolute(10)", view3.Width.ToString ()); - //Assert.Equal ("Absolute(5)", view3.Height.ToString ()); - //Assert.True (view4.AutoSize); - //Assert.Equal (new Rect (0, 0, 10, 17), view4.Frame); - //Assert.Equal ("Absolute(10)", view4.Width.ToString ()); - //Assert.Equal ("Absolute(5)", view4.Height.ToString ()); - //Assert.True (view5.AutoSize); - //Assert.Equal (new Rect (0, 0, 10, 17), view5.Frame); - //Assert.Equal ("Absolute(10)", view5.Width.ToString ()); - //Assert.Equal ("Absolute(5)", view5.Height.ToString ()); - //Assert.True (view6.AutoSize); - //Assert.Equal (new Rect (0, 0, 10, 17), view6.Frame); - //Assert.Equal ("Absolute(10)", view6.Width.ToString ()); - //Assert.Equal ("Absolute(5)", view6.Height.ToString ()); - Application.End (rs); - } - - [Fact] [AutoInitShutdown] - public void Setting_Frame_Dont_Respect_AutoSize_True_On_Layout_Absolute () - { - var view1 = new View (new Rect (0, 0, 10, 0)) { Text = "Say Hello view1 你", AutoSize = true }; - var view2 = new View (new Rect (0, 0, 0, 10)) { - Text = "Say Hello view2 你", - AutoSize = true, - TextDirection = TextDirection.TopBottom_LeftRight - }; - Application.Top.Add (view1, view2); - - var rs = Application.Begin (Application.Top); - - Assert.True (view1.AutoSize); - Assert.Equal (LayoutStyle.Absolute, view1.LayoutStyle); - Assert.Equal (new Rect (0, 0, 18, 1), view1.Frame); - Assert.Equal ("Absolute(0)", view1.X.ToString ()); - Assert.Equal ("Absolute(0)", view1.Y.ToString ()); - Assert.Equal ("Absolute(18)", view1.Width.ToString ()); - Assert.Equal ("Absolute(1)", view1.Height.ToString ()); - Assert.True (view2.AutoSize); - // BUGBUG: v2 - Autosize is broken when setting Width/Height AutoSize. Disabling test for now. - //Assert.Equal (LayoutStyle.Absolute, view2.LayoutStyle); - //Assert.Equal (new Rect (0, 0, 2, 17), view2.Frame); - //Assert.Equal ("Absolute(0)", view2.X.ToString ()); - //Assert.Equal ("Absolute(0)", view2.Y.ToString ()); - //Assert.Equal ("Absolute(2)", view2.Width.ToString ()); - //Assert.Equal ("Absolute(17)", view2.Height.ToString ()); - - view1.Frame = new Rect (0, 0, 25, 4); - bool firstIteration = false; - Application.RunIteration (ref rs, ref firstIteration); - - Assert.True (view1.AutoSize); - Assert.Equal (LayoutStyle.Absolute, view1.LayoutStyle); - Assert.Equal (new Rect (0, 0, 25, 4), view1.Frame); - Assert.Equal ("Absolute(0)", view1.X.ToString ()); - Assert.Equal ("Absolute(0)", view1.Y.ToString ()); - Assert.Equal ("Absolute(18)", view1.Width.ToString ()); - Assert.Equal ("Absolute(1)", view1.Height.ToString ()); - - view2.Frame = new Rect (0, 0, 1, 25); - Application.RunIteration (ref rs, ref firstIteration); - - Assert.True (view2.AutoSize); - Assert.Equal (LayoutStyle.Absolute, view2.LayoutStyle); - Assert.Equal (new Rect (0, 0, 1, 25), view2.Frame); - Assert.Equal ("Absolute(0)", view2.X.ToString ()); - Assert.Equal ("Absolute(0)", view2.Y.ToString ()); - // BUGBUG: v2 - Autosize is broken when setting Width/Height AutoSize. Disabling test for now. - //Assert.Equal ("Absolute(2)", view2.Width.ToString ()); - //Assert.Equal ("Absolute(17)", view2.Height.ToString ()); - Application.End (rs); - } - - [Fact] [AutoInitShutdown] - public void Pos_Dim_Are_Null_If_Not_Initialized_On_Constructor_IsAdded_False () - { - var top = Application.Top; - var view1 = new View (); - Assert.False (view1.IsAdded); - Assert.Null (view1.X); - Assert.Null (view1.Y); - Assert.Null (view1.Width); - Assert.Null (view1.Height); - top.Add (view1); - Assert.True (view1.IsAdded); - Assert.Equal ("Absolute(0)", view1.X.ToString ()); - Assert.Equal ("Absolute(0)", view1.Y.ToString ()); - Assert.Equal ("Absolute(0)", view1.Width.ToString ()); - Assert.Equal ("Absolute(0)", view1.Height.ToString ()); - - var view2 = new View () { - X = Pos.Center (), - Y = Pos.Center (), - Width = Dim.Fill (), - Height = Dim.Fill () - }; - Assert.False (view2.IsAdded); - Assert.Equal ("Center", view2.X.ToString ()); - Assert.Equal ("Center", view2.Y.ToString ()); - Assert.Equal ("Fill(0)", view2.Width.ToString ()); - Assert.Equal ("Fill(0)", view2.Height.ToString ()); - top.Add (view2); - Assert.True (view2.IsAdded); - Assert.Equal ("Center", view2.X.ToString ()); - Assert.Equal ("Center", view2.Y.ToString ()); - Assert.Equal ("Fill(0)", view2.Width.ToString ()); - Assert.Equal ("Fill(0)", view2.Height.ToString ()); - - } - + // Tested in AbsoluteLayoutTests.cs + // public void Pos_Dim_Are_Null_If_Not_Initialized_On_Constructor_IsAdded_False () [Theory] [AutoInitShutdown] [InlineData (1)] diff --git a/UnitTests/View/Layout/SetRelativeLayoutTests.cs b/UnitTests/View/Layout/SetRelativeLayoutTests.cs index 1f0ef550d..cb6cc46a4 100644 --- a/UnitTests/View/Layout/SetRelativeLayoutTests.cs +++ b/UnitTests/View/Layout/SetRelativeLayoutTests.cs @@ -10,135 +10,7 @@ public class SetRelativeLayoutTests { readonly ITestOutputHelper _output; public SetRelativeLayoutTests (ITestOutputHelper output) => _output = output; - - [Fact] - public void Null_Pos_Is_Same_As_PosAbsolute0 () - { - var view = new View () { - X = null, - Y = null, - }; - - // Default layout style is Computed - Assert.Equal (LayoutStyle.Computed, view.LayoutStyle); - Assert.Null (view.X); - Assert.Null (view.Y); - - view.BeginInit(); view.EndInit(); - - Assert.Equal (LayoutStyle.Computed, view.LayoutStyle); - Assert.Null (view.X); - Assert.Null (view.Y); - - view.SetRelativeLayout (new Rect (5, 5, 10, 10)); - Assert.Equal (LayoutStyle.Computed, view.LayoutStyle); - Assert.Null (view.X); - Assert.Null (view.Y); - - Assert.Equal (0, view.Frame.X); - Assert.Equal (0, view.Frame.Y); - } - - [Theory] - [InlineData (1, 1)] - [InlineData (0, 0)] - public void NonNull_Pos (int pos, int expectedPos) - { - var view = new View () { - X = pos, - Y = pos, - }; - - // Default layout style is Computed - Assert.Equal (LayoutStyle.Computed, view.LayoutStyle); - Assert.NotNull (view.X); - Assert.NotNull (view.Y); - - view.BeginInit (); view.EndInit (); - - Assert.Equal (LayoutStyle.Computed, view.LayoutStyle); - Assert.NotNull (view.X); - Assert.NotNull (view.Y); - - view.SetRelativeLayout (new Rect (5, 5, 10, 10)); - Assert.Equal (LayoutStyle.Computed, view.LayoutStyle); - Assert.NotNull (view.X); - Assert.NotNull (view.Y); - - Assert.Equal (expectedPos, view.Frame.X); - Assert.Equal (expectedPos, view.Frame.Y); - } - - [Fact] - public void Null_Dim_Is_Same_As_DimFill0 () - { - var view = new View () { - Width = null, - Height = null, - }; - - // Default layout style is Computed - Assert.Equal (LayoutStyle.Computed, view.LayoutStyle); - Assert.Null (view.Width); - Assert.Null (view.Height); - view.BeginInit (); view.EndInit (); - - Assert.Equal (LayoutStyle.Computed, view.LayoutStyle); - Assert.Null (view.Width); - Assert.Null (view.Height); - - view.SetRelativeLayout (new Rect (5, 5, 10, 10)); - Assert.Equal (LayoutStyle.Computed, view.LayoutStyle); - Assert.Null (view.Width); - Assert.Null (view.Height); - - Assert.Equal (0, view.Frame.X); - Assert.Equal (0, view.Frame.Y); - - Assert.Equal (10, view.Frame.Width); - Assert.Equal (10, view.Frame.Height); - - view.Width = Dim.Fill (0); - view.Height = Dim.Fill (0); - view.SetRelativeLayout (new Rect (5, 5, 10, 10)); - Assert.Equal (10, view.Frame.Width); - Assert.Equal (10, view.Frame.Height); - - } - - - [Theory] - [InlineData(1, 1)] - [InlineData (0, 0)] - public void NonNull_Dim (int dim, int expectedDim) - { - var view = new View () { - Width = dim, - Height = dim, - }; - - // Default layout style is Computed - Assert.Equal (LayoutStyle.Computed, view.LayoutStyle); - Assert.NotNull (view.Width); - Assert.NotNull (view.Height); - view.BeginInit (); view.EndInit (); - - Assert.Equal (LayoutStyle.Computed, view.LayoutStyle); - Assert.NotNull (view.Width); - Assert.NotNull (view.Height); - - view.SetRelativeLayout (new Rect (5, 5, 10, 10)); - Assert.Equal (LayoutStyle.Computed, view.LayoutStyle); - Assert.NotNull (view.Width); - Assert.NotNull (view.Height); - - Assert.Equal (0, view.Frame.X); - Assert.Equal (0, view.Frame.Y); - // BUGBUG: Width == null is same as Dim.Absolute (0) (or should be). Thus this is a bug. - Assert.Equal (expectedDim, view.Frame.Width); - Assert.Equal (expectedDim, view.Frame.Height); - } - + [Fact] public void Fill_Pos_Within_Bounds () { @@ -263,7 +135,7 @@ public class SetRelativeLayoutTests { } [Fact] - public void FIll_And_PosCenter () + public void Fill_And_PosCenter () { var screen = new Rect (0, 0, 80, 25); var view = new View () {