diff --git a/Terminal.Gui/View/Adornment/Adornment.cs b/Terminal.Gui/View/Adornment/Adornment.cs index addb02f2e..46401dbca 100644 --- a/Terminal.Gui/View/Adornment/Adornment.cs +++ b/Terminal.Gui/View/Adornment/Adornment.cs @@ -91,7 +91,7 @@ public class Adornment : View public override View SuperView { get => null; - set => throw new NotImplementedException (); + set => throw new InvalidOperationException (@"Adornments can not be Subviews or have SuperViews. Use Parent instead."); } //internal override Adornment CreateAdornment (Type adornmentType) @@ -109,10 +109,14 @@ public class Adornment : View /// Gets the rectangle that describes the area of the Adornment. The Location is always (0,0). /// The size is the size of the . /// + /// + /// The Viewport of an Adornment cannot be modified. Attempting to set this property will throw an + /// . + /// public override Rectangle Viewport { get => Frame with { Location = Point.Empty }; - set => throw new InvalidOperationException ("It makes no sense to set Viewport of a Thickness."); + set => throw new InvalidOperationException (@"The Viewport of an Adornment cannot be modified."); } /// @@ -183,8 +187,8 @@ public class Adornment : View /// public override bool SuperViewRendersLineCanvas { - get => false; // throw new NotImplementedException (); - set => throw new NotImplementedException (); + get => false; + set => throw new InvalidOperationException (@"Adornment can only render to their Parent or Parent's Superview."); } #endregion View Overrides diff --git a/UnitTests/View/Adornment/AdornmentTests.cs b/UnitTests/View/Adornment/AdornmentTests.cs index 7010a2bc4..9979702ff 100644 --- a/UnitTests/View/Adornment/AdornmentTests.cs +++ b/UnitTests/View/Adornment/AdornmentTests.cs @@ -24,7 +24,7 @@ public class AdornmentTests (ITestOutputHelper output) Assert.Equal (new (0, 0, 20, 20), view.Viewport); var marginThickness = 1; - view.Margin.Thickness = new (marginThickness); + view.Margin.Thickness = new (marginThickness); Assert.Equal (new (0, 0, 18, 18), view.Viewport); var borderThickness = 2; @@ -39,7 +39,7 @@ public class AdornmentTests (ITestOutputHelper output) Assert.Equal (new (0, 0, view.Border.Frame.Width, view.Border.Frame.Height), view.Border.Viewport); - Assert.Equal (new (0, 0, view.Padding.Frame.Width , view.Padding.Frame.Height), view.Padding.Viewport); + Assert.Equal (new (0, 0, view.Padding.Frame.Width, view.Padding.Frame.Height), view.Padding.Viewport); } // Test that Adornment.Viewport_get override returns Frame.Size minus Thickness @@ -291,14 +291,14 @@ public class AdornmentTests (ITestOutputHelper output) public void Setting_SuperView_Throws () { var adornment = new Adornment (null); - Assert.Throws (() => adornment.SuperView = new View ()); + Assert.Throws (() => adornment.SuperView = new View ()); } [Fact] public void Setting_SuperViewRendersLineCanvas_Throws () { var adornment = new Adornment (null); - Assert.Throws (() => adornment.SuperViewRendersLineCanvas = true); + Assert.Throws (() => adornment.SuperViewRendersLineCanvas = true); } [Fact] @@ -340,8 +340,8 @@ public class AdornmentTests (ITestOutputHelper output) { var view = new View (); var raised = false; - view.BeginInit(); - view.EndInit(); + view.BeginInit (); + view.EndInit (); view.LayoutStarted += LayoutStarted; view.Margin.Thickness = new Thickness (1, 2, 3, 4); @@ -373,4 +373,15 @@ public class AdornmentTests (ITestOutputHelper output) raised = true; } } + + [Fact] + public void Set_Viewport_Throws () + { + View view = new (); + + view.BeginInit (); + view.EndInit (); + view.Padding.Thickness = new (2, 2, 2, 2); + Assert.Throws (() => view.Padding.Viewport = view.Padding.Viewport with { Location = new (1, 1) }); + } } diff --git a/UnitTests/View/Adornment/ToScreenTests.cs b/UnitTests/View/Adornment/ToScreenTests.cs index 4a550f7c7..ca8895724 100644 --- a/UnitTests/View/Adornment/ToScreenTests.cs +++ b/UnitTests/View/Adornment/ToScreenTests.cs @@ -234,14 +234,14 @@ public class AdornmentToScreenTests (ITestOutputHelper output) Assert.Equal (expectedX + view.Margin.Thickness.Left + view.Border.Thickness.Left, paddingScreen.X); } - + // Adornment.ViewportToScreen tests ============================ [Theory] [InlineData (0, 0, 0)] [InlineData (1, 0, 1)] [InlineData (-1, 0, -1)] [InlineData (11, 0, 11)] - public void BoundsToScreen_NoSuperView_WithoutAdornments (int frameX, int boundsX, int expectedX) + public void ViewportToScreen_NoSuperView_WithoutAdornments (int frameX, int testX, int expectedX) { // We test with only X because Y is equivalent. Height/Width are irrelevant. // Arrange @@ -251,9 +251,9 @@ public class AdornmentToScreenTests (ITestOutputHelper output) view.Frame = frame; // Act - var marginScreen = view.Margin.ViewportToScreen (new (boundsX, 0, 0, 0)); - var borderScreen = view.Border.ViewportToScreen (new (boundsX, 0, 0, 0)); - var paddingScreen = view.Padding.ViewportToScreen (new (boundsX, 0, 0, 0)); + var marginScreen = view.Margin.ViewportToScreen (new (testX, 0, 0, 0)); + var borderScreen = view.Border.ViewportToScreen (new (testX, 0, 0, 0)); + var paddingScreen = view.Padding.ViewportToScreen (new (testX, 0, 0, 0)); // Assert Assert.Equal (expectedX, marginScreen.X); @@ -276,7 +276,7 @@ public class AdornmentToScreenTests (ITestOutputHelper output) [InlineData (1, -1, 0)] [InlineData (-1, -1, -2)] [InlineData (11, -1, 10)] - public void BoundsToScreen_NoSuperView_WithAdornments (int frameX, int boundsX, int expectedX) + public void ViewportToScreen_NoSuperView_WithAdornments (int frameX, int testX, int expectedX) { // We test with only X because Y is equivalent. Height/Width are irrelevant. // Arrange @@ -292,9 +292,9 @@ public class AdornmentToScreenTests (ITestOutputHelper output) Assert.Equal(4, view.Viewport.Width); // Act - var marginScreen = view.Margin.ViewportToScreen (new (boundsX, 0, 0, 0)); - var borderScreen = view.Border.ViewportToScreen (new (boundsX, 0, 0, 0)); - var paddingScreen = view.Padding.ViewportToScreen (new (boundsX, 0, 0, 0)); + var marginScreen = view.Margin.ViewportToScreen (new (testX, 0, 0, 0)); + var borderScreen = view.Border.ViewportToScreen (new (testX, 0, 0, 0)); + var paddingScreen = view.Padding.ViewportToScreen (new (testX, 0, 0, 0)); // Assert Assert.Equal (expectedX, marginScreen.X); @@ -317,7 +317,7 @@ public class AdornmentToScreenTests (ITestOutputHelper output) [InlineData (1, -1, 0)] [InlineData (-1, -1, -2)] [InlineData (11, -1, 10)] - public void BoundsToScreen_SuperView_WithoutAdornments (int frameX, int boundsX, int expectedX) + public void ViewportToScreen_SuperView_WithoutAdornments (int frameX, int testX, int expectedX) { // We test with only X because Y is equivalent. Height/Width are irrelevant. // Arrange @@ -338,9 +338,9 @@ public class AdornmentToScreenTests (ITestOutputHelper output) superView.LayoutSubviews (); // Act - var marginScreen = view.Margin.ViewportToScreen (new (boundsX, 0, 0, 0)); - var borderScreen = view.Border.ViewportToScreen (new (boundsX, 0, 0, 0)); - var paddingScreen = view.Padding.ViewportToScreen (new (boundsX, 0, 0, 0)); + var marginScreen = view.Margin.ViewportToScreen (new (testX, 0, 0, 0)); + var borderScreen = view.Border.ViewportToScreen (new (testX, 0, 0, 0)); + var paddingScreen = view.Padding.ViewportToScreen (new (testX, 0, 0, 0)); // Assert Assert.Equal (expectedX, marginScreen.X); @@ -363,7 +363,7 @@ public class AdornmentToScreenTests (ITestOutputHelper output) [InlineData (1, -1, 1)] [InlineData (-1, -1, -1)] [InlineData (11, -1, 11)] - public void BoundsToScreen_SuperView_WithAdornments (int frameX, int boundsX, int expectedX) + public void ViewportToScreen_SuperView_WithAdornments (int frameX, int testX, int expectedX) { // We test with only X because Y is equivalent. Height/Width are irrelevant. // Arrange @@ -385,9 +385,9 @@ public class AdornmentToScreenTests (ITestOutputHelper output) superView.LayoutSubviews (); // Act - var marginScreen = view.Margin.ViewportToScreen (new (boundsX, 0, 0, 0)); - var borderScreen = view.Border.ViewportToScreen (new (boundsX, 0, 0, 0)); - var paddingScreen = view.Padding.ViewportToScreen (new (boundsX, 0, 0, 0)); + var marginScreen = view.Margin.ViewportToScreen (new (testX, 0, 0, 0)); + var borderScreen = view.Border.ViewportToScreen (new (testX, 0, 0, 0)); + var paddingScreen = view.Padding.ViewportToScreen (new (testX, 0, 0, 0)); // Assert Assert.Equal (expectedX, marginScreen.X); @@ -410,7 +410,7 @@ public class AdornmentToScreenTests (ITestOutputHelper output) [InlineData (1, -1, 0)] [InlineData (-1, -1, -2)] [InlineData (11, -1, 10)] - public void BoundsToScreen_NestedSuperView_WithoutAdornments (int frameX, int boundsX, int expectedX) + public void ViewportToScreen_NestedSuperView_WithoutAdornments (int frameX, int testX, int expectedX) { // We test with only X because Y is equivalent. Height/Width are irrelevant. // Arrange @@ -441,9 +441,9 @@ public class AdornmentToScreenTests (ITestOutputHelper output) superView.LayoutSubviews (); // Act - var marginScreen = view.Margin.ViewportToScreen (new (boundsX, 0, 0, 0)); - var borderScreen = view.Border.ViewportToScreen (new (boundsX, 0, 0, 0)); - var paddingScreen = view.Padding.ViewportToScreen (new (boundsX, 0, 0, 0)); + var marginScreen = view.Margin.ViewportToScreen (new (testX, 0, 0, 0)); + var borderScreen = view.Border.ViewportToScreen (new (testX, 0, 0, 0)); + var paddingScreen = view.Padding.ViewportToScreen (new (testX, 0, 0, 0)); // Assert Assert.Equal (expectedX, marginScreen.X); @@ -466,7 +466,7 @@ public class AdornmentToScreenTests (ITestOutputHelper output) [InlineData (1, -1, 6)] [InlineData (-1, -1, 4)] [InlineData (11, -1, 16)] - public void BoundsToScreen_NestedSuperView_WithAdornments (int frameX, int boundsX, int expectedX) + public void ViewportToScreen_NestedSuperView_WithAdornments (int frameX, int testX, int expectedX) { // We test with only X because Y is equivalent. Height/Width are irrelevant. // Arrange @@ -502,14 +502,13 @@ public class AdornmentToScreenTests (ITestOutputHelper output) superView.LayoutSubviews (); // Act - var marginScreen = view.Margin.ViewportToScreen (new (boundsX, 0, 0, 0)); - var borderScreen = view.Border.ViewportToScreen (new (boundsX, 0, 0, 0)); - var paddingScreen = view.Padding.ViewportToScreen (new (boundsX, 0, 0, 0)); + var marginScreen = view.Margin.ViewportToScreen (new (testX, 0, 0, 0)); + var borderScreen = view.Border.ViewportToScreen (new (testX, 0, 0, 0)); + var paddingScreen = view.Padding.ViewportToScreen (new (testX, 0, 0, 0)); // Assert Assert.Equal (expectedX, marginScreen.X); Assert.Equal (expectedX + view.Margin.Thickness.Left, borderScreen.X); Assert.Equal (expectedX + view.Margin.Thickness.Left + view.Border.Thickness.Left, paddingScreen.X); } - } diff --git a/UnitTests/View/Layout/ToScreenTests.cs b/UnitTests/View/Layout/ToScreenTests.cs index 7b7df328f..559993607 100644 --- a/UnitTests/View/Layout/ToScreenTests.cs +++ b/UnitTests/View/Layout/ToScreenTests.cs @@ -507,4 +507,60 @@ public class ToScreenTests (ITestOutputHelper output) Assert.Equal (expectedX, screen.X); } + + [Theory] + [InlineData (0, 0, 3)] + [InlineData (1, 0, 4)] + [InlineData (-1, 0, 2)] + [InlineData (11, 0, 14)] + + [InlineData (0, 1, 4)] + [InlineData (1, 1, 5)] + [InlineData (-1, 1, 3)] + [InlineData (11, 1, 15)] + + [InlineData (0, -1, 2)] + [InlineData (1, -1, 3)] + [InlineData (-1, -1, 1)] + [InlineData (11, -1, 13)] + public void ViewportToScreen_Positive_NestedSuperView_WithAdornments (int frameX, int testX, int expectedX) + { + // We test with only X because Y is equivalent. Height/Width are irrelevant. + // Arrange + var frame = new Rectangle (frameX, 0, 10, 10); + + var superSuperView = new View () + { + X = 0, + Y = 0, + Height = Dim.Fill (), + Width = Dim.Fill () + }; + superSuperView.BorderStyle = LineStyle.Single; + + var superView = new View () + { + X = 0, + Y = 0, + Height = Dim.Fill (), + Width = Dim.Fill () + }; + + superSuperView.Add (superView); + superView.BorderStyle = LineStyle.Single; + + var view = new View (); + view.Frame = frame; + view.ContentSize = new (11, 11); + view.Viewport = view.Viewport with { Location = new (1, 1) }; + + superView.Add (view); + superView.LayoutSubviews (); + + // Act + var screen = view.ViewportToScreen (new (testX, 0, 0, 0)); + + // Assert + Assert.Equal (expectedX, screen.X); + } }