|
@@ -3,33 +3,166 @@ using static Unix.Terminal.Delegates;
|
|
|
|
|
|
namespace Terminal.Gui.ViewsTests;
|
|
|
|
|
|
-public class ScrollBarTests
|
|
|
+public class ScrollBarTests (ITestOutputHelper output)
|
|
|
{
|
|
|
- public ScrollBarTests (ITestOutputHelper output) { _output = output; }
|
|
|
- private readonly ITestOutputHelper _output;
|
|
|
+ [Fact]
|
|
|
+ public void Constructor_Defaults ()
|
|
|
+ {
|
|
|
+ var scrollBar = new ScrollBar ();
|
|
|
+ Assert.False (scrollBar.CanFocus);
|
|
|
+ Assert.Equal (Orientation.Vertical, scrollBar.Orientation);
|
|
|
+ Assert.Equal (0, scrollBar.ScrollableContentSize);
|
|
|
+ Assert.Equal (0, scrollBar.VisibleContentSize);
|
|
|
+ Assert.Equal (0, scrollBar.GetSliderPosition ());
|
|
|
+ Assert.Equal (0, scrollBar.Position);
|
|
|
+ Assert.True (scrollBar.AutoHide);
|
|
|
+ }
|
|
|
|
|
|
+ #region AutoHide
|
|
|
[Fact]
|
|
|
[AutoInitShutdown]
|
|
|
- public void AutoHideScrollBar_CheckScrollBarVisibility ()
|
|
|
+ public void AutoHide_True_Is_Default_CorrectlyHidesAndShows ()
|
|
|
{
|
|
|
- var scrollBar = new ScrollBar { Width = 2, Height = Dim.Fill (), Size = 30 };
|
|
|
- View scrollBarSuperView = ScrollBarSuperView ();
|
|
|
- scrollBarSuperView.Add (scrollBar);
|
|
|
- Application.Begin ((scrollBarSuperView.SuperView as Toplevel)!);
|
|
|
+ var super = new Toplevel ()
|
|
|
+ {
|
|
|
+ Id = "super",
|
|
|
+ Width = 1,
|
|
|
+ Height = 20
|
|
|
+ };
|
|
|
+
|
|
|
+ var scrollBar = new ScrollBar
|
|
|
+ {
|
|
|
+ ScrollableContentSize = 20,
|
|
|
+ };
|
|
|
+ super.Add (scrollBar);
|
|
|
+ Assert.True (scrollBar.AutoHide);
|
|
|
+ Assert.True (scrollBar.Visible); // Before Init
|
|
|
+
|
|
|
+ RunState rs = Application.Begin (super);
|
|
|
+
|
|
|
+ // Should Show
|
|
|
+ scrollBar.ScrollableContentSize = 21;
|
|
|
+ Application.RunIteration (ref rs);
|
|
|
+ Assert.True (scrollBar.Visible);
|
|
|
+
|
|
|
+ // Should Hide
|
|
|
+ scrollBar.ScrollableContentSize = 10;
|
|
|
+ Assert.False (scrollBar.Visible);
|
|
|
+
|
|
|
+ super.Dispose ();
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ [AutoInitShutdown]
|
|
|
+ public void AutoHide_False_CorrectlyHidesAndShows ()
|
|
|
+ {
|
|
|
+ var super = new Toplevel ()
|
|
|
+ {
|
|
|
+ Id = "super",
|
|
|
+ Width = 1,
|
|
|
+ Height = 20
|
|
|
+ };
|
|
|
+
|
|
|
+ var scrollBar = new ScrollBar
|
|
|
+ {
|
|
|
+ ScrollableContentSize = 20,
|
|
|
+ AutoHide = false
|
|
|
+ };
|
|
|
+ super.Add (scrollBar);
|
|
|
+ Assert.False (scrollBar.AutoHide);
|
|
|
+ Assert.True (scrollBar.Visible);
|
|
|
+
|
|
|
+ RunState rs = Application.Begin (super);
|
|
|
+
|
|
|
+ // Should Hide if AutoSize = true, but should not hide if AutoSize = false
|
|
|
+ scrollBar.ScrollableContentSize = 10;
|
|
|
+ Assert.True (scrollBar.Visible);
|
|
|
+
|
|
|
+ super.Dispose ();
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ [AutoInitShutdown]
|
|
|
+ public void AutoHide_Change_AutoSize_CorrectlyHidesAndShows ()
|
|
|
+ {
|
|
|
+ var super = new Toplevel ()
|
|
|
+ {
|
|
|
+ Id = "super",
|
|
|
+ Width = 1,
|
|
|
+ Height = 20
|
|
|
+ };
|
|
|
+
|
|
|
+ var scrollBar = new ScrollBar
|
|
|
+ {
|
|
|
+ ScrollableContentSize = 20,
|
|
|
+ };
|
|
|
+ super.Add (scrollBar);
|
|
|
+ Assert.True (scrollBar.AutoHide);
|
|
|
+ Assert.True (scrollBar.Visible); // Before Init
|
|
|
+
|
|
|
+ RunState rs = Application.Begin (super);
|
|
|
+
|
|
|
+ Assert.False (scrollBar.Visible);
|
|
|
+ Assert.Equal (1, scrollBar.Frame.Width);
|
|
|
+ Assert.Equal (20, scrollBar.Frame.Height);
|
|
|
+
|
|
|
+ scrollBar.ScrollableContentSize = 10;
|
|
|
+ Application.RunIteration (ref rs);
|
|
|
+ Assert.False (scrollBar.Visible);
|
|
|
+
|
|
|
+ scrollBar.ScrollableContentSize = 30;
|
|
|
+ Assert.True (scrollBar.Visible);
|
|
|
+
|
|
|
+ scrollBar.AutoHide = false;
|
|
|
+ Assert.True (scrollBar.Visible);
|
|
|
+
|
|
|
+ scrollBar.ScrollableContentSize = 10;
|
|
|
+ Assert.True (scrollBar.Visible);
|
|
|
+
|
|
|
+ super.Dispose ();
|
|
|
+ }
|
|
|
+
|
|
|
+ [Fact]
|
|
|
+ [AutoInitShutdown]
|
|
|
+ public void AutoHide_Change_Size_CorrectlyHidesAndShows ()
|
|
|
+ {
|
|
|
+ var super = new Toplevel ()
|
|
|
+ {
|
|
|
+ Id = "super",
|
|
|
+ Width = 1,
|
|
|
+ Height = 20
|
|
|
+ };
|
|
|
+
|
|
|
+ var scrollBar = new ScrollBar
|
|
|
+ {
|
|
|
+ ScrollableContentSize = 20,
|
|
|
+ };
|
|
|
+ super.Add (scrollBar);
|
|
|
+
|
|
|
+ RunState rs = Application.Begin (super);
|
|
|
|
|
|
Assert.Equal (Orientation.Vertical, scrollBar.Orientation);
|
|
|
+ Assert.Equal (20, scrollBar.VisibleContentSize);
|
|
|
+ //Assert.True (scrollBar.ShowScrollIndicator);
|
|
|
+ Assert.False (scrollBar.Visible);
|
|
|
+ Assert.Equal (1, scrollBar.Frame.Width);
|
|
|
+ Assert.Equal (20, scrollBar.Frame.Height);
|
|
|
+
|
|
|
+ scrollBar.ScrollableContentSize = 10;
|
|
|
+ Application.RunIteration (ref rs);
|
|
|
+ //Assert.False (scrollBar.ShowScrollIndicator);
|
|
|
+ Assert.False (scrollBar.Visible);
|
|
|
+
|
|
|
+ scrollBar.ScrollableContentSize = 30;
|
|
|
//Assert.True (scrollBar.ShowScrollIndicator);
|
|
|
Assert.True (scrollBar.Visible);
|
|
|
- Assert.Equal ("Absolute(2)", scrollBar.Width!.ToString ());
|
|
|
- Assert.Equal (2, scrollBar.Viewport.Width);
|
|
|
- Assert.Equal ("Fill(Absolute(0))", scrollBar.Height!.ToString ());
|
|
|
- Assert.Equal (25, scrollBar.Viewport.Height);
|
|
|
|
|
|
- scrollBar.Size = 10;
|
|
|
+ scrollBar.ScrollableContentSize = 10;
|
|
|
+ Application.RunIteration (ref rs);
|
|
|
//Assert.False (scrollBar.ShowScrollIndicator);
|
|
|
Assert.False (scrollBar.Visible);
|
|
|
|
|
|
- scrollBar.Size = 30;
|
|
|
+ scrollBar.ScrollableContentSize = 21;
|
|
|
//Assert.True (scrollBar.ShowScrollIndicator);
|
|
|
Assert.True (scrollBar.Visible);
|
|
|
|
|
@@ -37,37 +170,25 @@ public class ScrollBarTests
|
|
|
//Assert.True (scrollBar.ShowScrollIndicator);
|
|
|
Assert.True (scrollBar.Visible);
|
|
|
|
|
|
- scrollBar.Size = 10;
|
|
|
+ scrollBar.ScrollableContentSize = 10;
|
|
|
//Assert.True (scrollBar.ShowScrollIndicator);
|
|
|
Assert.True (scrollBar.Visible);
|
|
|
|
|
|
- scrollBarSuperView.SuperView!.Dispose ();
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- [Fact]
|
|
|
- public void Constructor_Defaults ()
|
|
|
- {
|
|
|
- var scrollBar = new ScrollBar ();
|
|
|
- Assert.False (scrollBar.CanFocus);
|
|
|
- Assert.Equal (Orientation.Vertical, scrollBar.Orientation);
|
|
|
- Assert.Equal (0, scrollBar.Size);
|
|
|
- Assert.Equal (0, scrollBar.ViewportDimension);
|
|
|
- Assert.Equal (0, scrollBar.GetSliderPosition ());
|
|
|
- Assert.Equal (0, scrollBar.ContentPosition);
|
|
|
- Assert.True (scrollBar.AutoHide);
|
|
|
+ super.Dispose ();
|
|
|
}
|
|
|
|
|
|
+ #endregion AutoHide
|
|
|
|
|
|
+ #region Orientation
|
|
|
[Fact]
|
|
|
public void OnOrientationChanged_Keeps_Size ()
|
|
|
{
|
|
|
var scroll = new ScrollBar ();
|
|
|
scroll.Layout ();
|
|
|
- scroll.Size = 1;
|
|
|
+ scroll.ScrollableContentSize = 1;
|
|
|
|
|
|
scroll.Orientation = Orientation.Horizontal;
|
|
|
- Assert.Equal (1, scroll.Size);
|
|
|
+ Assert.Equal (1, scroll.ScrollableContentSize);
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
@@ -84,23 +205,391 @@ public class ScrollBarTests
|
|
|
};
|
|
|
super.Add (scrollBar);
|
|
|
scrollBar.Layout ();
|
|
|
- scrollBar.ContentPosition = 1;
|
|
|
+ scrollBar.Position = 1;
|
|
|
scrollBar.Orientation = Orientation.Horizontal;
|
|
|
|
|
|
Assert.Equal (0, scrollBar.GetSliderPosition ());
|
|
|
}
|
|
|
|
|
|
+ #endregion Orientation
|
|
|
+
|
|
|
+ #region Slider
|
|
|
+
|
|
|
+ [Theory]
|
|
|
+ [InlineData (-1, 10, 1)]
|
|
|
+ [InlineData (0, 10, 1)]
|
|
|
+ [InlineData (10, 15, 5)]
|
|
|
+ [InlineData (10, 5, 8)]
|
|
|
+ [InlineData (10, 3, 8)]
|
|
|
+ [InlineData (10, 2, 8)]
|
|
|
+ [InlineData (10, 1, 8)]
|
|
|
+ [InlineData (10, 0, 8)]
|
|
|
+ [InlineData (10, 10, 8)]
|
|
|
+ [InlineData (10, 20, 4)]
|
|
|
+ [InlineData (10, 100, 1)]
|
|
|
+ [InlineData (15, 0, 13)]
|
|
|
+ [InlineData (15, 1, 13)]
|
|
|
+ [InlineData (15, 2, 13)]
|
|
|
+ [InlineData (15, 3, 13)]
|
|
|
+ [InlineData (15, 5, 13)]
|
|
|
+ [InlineData (15, 10, 13)]
|
|
|
+ [InlineData (15, 14, 13)]
|
|
|
+ [InlineData (15, 15, 13)]
|
|
|
+ [InlineData (15, 16, 12)]
|
|
|
+ [InlineData (20, 10, 18)]
|
|
|
+ [InlineData (100, 10, 98)]
|
|
|
+ public void CalculateSliderSize_Width_Is_VisibleContentSize_CalculatesCorrectly (int visibleContentSize, int scrollableContentSize, int expectedSliderSize)
|
|
|
+ {
|
|
|
+ // Arrange
|
|
|
+ var scrollBar = new ScrollBar
|
|
|
+ {
|
|
|
+ VisibleContentSize = visibleContentSize,
|
|
|
+ ScrollableContentSize = scrollableContentSize,
|
|
|
+ Orientation = Orientation.Horizontal // Assuming horizontal for simplicity
|
|
|
+ };
|
|
|
+ scrollBar.Width = visibleContentSize;
|
|
|
+
|
|
|
+ // Act
|
|
|
+ var sliderSize = scrollBar.CalculateSliderSize ();
|
|
|
+
|
|
|
+ // Assert
|
|
|
+ Assert.Equal (expectedSliderSize, sliderSize);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Theory]
|
|
|
+ // 0123456789
|
|
|
+ // -
|
|
|
+ // **********
|
|
|
+ // ◄███►
|
|
|
+ [InlineData (5, 10, 1, 3)]
|
|
|
+
|
|
|
+ // 01234567890
|
|
|
+ // ----------
|
|
|
+ // **********
|
|
|
+ // ◄██░►
|
|
|
+ [InlineData (5, 10, 11, 2)]
|
|
|
+
|
|
|
+
|
|
|
+ [InlineData (20, 10, 1, 18)]
|
|
|
+
|
|
|
+ //// ◄█░░░░░░░►
|
|
|
+ //[InlineData (1, 10, 1)]
|
|
|
+
|
|
|
+ //// ---------
|
|
|
+ //// ◄████░░░░►
|
|
|
+ //[InlineData (5, 10, 4)]
|
|
|
+
|
|
|
+ //// ----------
|
|
|
+ //// ◄███░░░░░►
|
|
|
+ //[InlineData (5, 11, 3)]
|
|
|
+ //[InlineData (5, 12, 3)]
|
|
|
+ //[InlineData (5, 13, 3)]
|
|
|
+
|
|
|
+ //// 012345678901234
|
|
|
+ //// --------------
|
|
|
+ //// ◄██░░░░░░►
|
|
|
+ //[InlineData (5, 14, 2)]
|
|
|
+ //[InlineData (5, 15, 2)]
|
|
|
+ //[InlineData (5, 16, 2)]
|
|
|
+
|
|
|
+ //// 012345678901234567890
|
|
|
+ //// ----------------
|
|
|
+ //// ◄██░░░░░░►
|
|
|
+ //[InlineData (5, 18, 2)]
|
|
|
+ //[InlineData (5, 19, 2)]
|
|
|
+ //[InlineData (5, 20, 2)]
|
|
|
+
|
|
|
+
|
|
|
+ //// 012345678901234567890
|
|
|
+ //// --------------------
|
|
|
+ //// ◄█░░░░░░░►
|
|
|
+ //[InlineData (5, 21, 1)]
|
|
|
+ //[InlineData (5, 22, 1)]
|
|
|
+ //[InlineData (5, 23, 1)]
|
|
|
+ public void CalculateSliderSize_Width_Is_LT_VisibleContentSize_CalculatesCorrectly (int width, int visibleContentSize, int scrollableContentSize, int expectedSliderSize)
|
|
|
+ {
|
|
|
+ // Arrange
|
|
|
+ var scrollBar = new ScrollBar
|
|
|
+ {
|
|
|
+ VisibleContentSize = visibleContentSize,
|
|
|
+ ScrollableContentSize = scrollableContentSize,
|
|
|
+ Orientation = Orientation.Horizontal // Assuming horizontal for simplicity
|
|
|
+ };
|
|
|
+ scrollBar.Width = width;
|
|
|
+
|
|
|
+ // Act
|
|
|
+ var sliderSize = scrollBar.CalculateSliderSize ();
|
|
|
+
|
|
|
+ // Assert
|
|
|
+ Assert.Equal (expectedSliderSize, sliderSize);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ [Theory]
|
|
|
+ // 0123456789
|
|
|
+ // ---------
|
|
|
+ // ◄█░░░░░░░►
|
|
|
+ [InlineData (0, 10, 1)]
|
|
|
+ // ◄█░░░░░░░►
|
|
|
+ [InlineData (1, 10, 1)]
|
|
|
+
|
|
|
+ // ---------
|
|
|
+ // ◄████░░░░►
|
|
|
+ [InlineData (5, 10, 4)]
|
|
|
+
|
|
|
+ // ----------
|
|
|
+ // ◄███░░░░░►
|
|
|
+ [InlineData (5, 11, 3)]
|
|
|
+ [InlineData (5, 12, 3)]
|
|
|
+ [InlineData (5, 13, 3)]
|
|
|
+
|
|
|
+ // 012345678901234
|
|
|
+ // --------------
|
|
|
+ // ◄██░░░░░░►
|
|
|
+ [InlineData (5, 14, 2)]
|
|
|
+ [InlineData (5, 15, 2)]
|
|
|
+ [InlineData (5, 16, 2)]
|
|
|
+
|
|
|
+ // 012345678901234567890
|
|
|
+ // ----------------
|
|
|
+ // ◄██░░░░░░►
|
|
|
+ [InlineData (5, 18, 2)]
|
|
|
+ [InlineData (5, 19, 2)]
|
|
|
+ [InlineData (5, 20, 2)]
|
|
|
+
|
|
|
+
|
|
|
+ // 012345678901234567890
|
|
|
+ // --------------------
|
|
|
+ // ◄█░░░░░░░►
|
|
|
+ [InlineData (5, 21, 1)]
|
|
|
+ [InlineData (5, 22, 1)]
|
|
|
+ [InlineData (5, 23, 1)]
|
|
|
+
|
|
|
+ public void CalculateSliderSize_Width_Is_GT_VisibleContentSize_CalculatesCorrectly (int visibleContentSize, int scrollableContentSize, int expectedSliderSize)
|
|
|
+ {
|
|
|
+ // Arrange
|
|
|
+ var scrollBar = new ScrollBar
|
|
|
+ {
|
|
|
+ VisibleContentSize = visibleContentSize,
|
|
|
+ ScrollableContentSize = scrollableContentSize,
|
|
|
+ Orientation = Orientation.Horizontal // Assuming horizontal for simplicity
|
|
|
+ };
|
|
|
+ scrollBar.Width = 10;
|
|
|
+
|
|
|
+ // Act
|
|
|
+ var sliderSize = scrollBar.CalculateSliderSize ();
|
|
|
+
|
|
|
+ // Assert
|
|
|
+ Assert.Equal (expectedSliderSize, sliderSize);
|
|
|
+ }
|
|
|
+
|
|
|
+ [Theory]
|
|
|
+ // 0123456789
|
|
|
+ // ---------
|
|
|
+ // ◄█►
|
|
|
+ [InlineData (3, 3, 0, 0)]
|
|
|
+ [InlineData (3, 3, 1, 0)]
|
|
|
+ [InlineData (3, 3, 2, 0)]
|
|
|
+
|
|
|
+ // 0123456789
|
|
|
+ // ---------
|
|
|
+ // ◄██►
|
|
|
+ [InlineData (4, 4, 0, 0)]
|
|
|
+ [InlineData (4, 4, 1, 0)]
|
|
|
+ [InlineData (4, 4, 2, 0)]
|
|
|
+ [InlineData (4, 4, 3, 0)]
|
|
|
+ [InlineData (4, 4, 4, 0)]
|
|
|
+
|
|
|
+
|
|
|
+ // 012345
|
|
|
+ // ^----
|
|
|
+ // ◄█░►
|
|
|
+ [InlineData (4, 5, 0, 0)]
|
|
|
+ // -^---
|
|
|
+ // ◄█░►
|
|
|
+ [InlineData (4, 5, 1, 0)]
|
|
|
+ // --^--
|
|
|
+ // ◄░█►
|
|
|
+ [InlineData (4, 5, 2, 1)]
|
|
|
+ // ---^-
|
|
|
+ // ◄░█►
|
|
|
+ [InlineData (4, 5, 3, 1)]
|
|
|
+ // ----^
|
|
|
+ // ◄░█►
|
|
|
+ [InlineData (4, 5, 4, 1)]
|
|
|
+
|
|
|
+ // 01234
|
|
|
+ // ^---------
|
|
|
+ // ◄█░░►
|
|
|
+ [InlineData (5, 10, 0, 0)]
|
|
|
+ // -^--------
|
|
|
+ // ◄█░░►
|
|
|
+ [InlineData (5, 10, 1, 0)]
|
|
|
+ // --^-------
|
|
|
+ // ◄█░░►
|
|
|
+ [InlineData (5, 10, 2, 0)]
|
|
|
+ // ---^------
|
|
|
+ // ◄█░░►
|
|
|
+ [InlineData (5, 10, 3, 0)]
|
|
|
+ // ----^----
|
|
|
+ // ◄░█░►
|
|
|
+ [InlineData (5, 10, 4, 1)]
|
|
|
+ // -----^---
|
|
|
+ // ◄░█░►
|
|
|
+ [InlineData (5, 10, 5, 1)]
|
|
|
+ // ------^--
|
|
|
+ // ◄░░█►
|
|
|
+ [InlineData (5, 10, 6, 2)]
|
|
|
+ // ------^--
|
|
|
+ // ◄░░█►
|
|
|
+ [InlineData (5, 10, 7, 2)]
|
|
|
+ // -------^-
|
|
|
+ // ◄░░█►
|
|
|
+ [InlineData (5, 10, 8, 2)]
|
|
|
+ // --------^
|
|
|
+ // ◄░░█►
|
|
|
+ [InlineData (5, 10, 9, 2)]
|
|
|
+
|
|
|
+
|
|
|
+ [InlineData (10, 20, 0, 0)]
|
|
|
+ [InlineData (10, 20, 1, 0)]
|
|
|
+ [InlineData (10, 20, 2, 0)]
|
|
|
+ [InlineData (10, 20, 3, 1)]
|
|
|
+ [InlineData (10, 20, 4, 2)]
|
|
|
+ [InlineData (10, 20, 5, 2)]
|
|
|
+ [InlineData (10, 20, 6, 3)]
|
|
|
+ [InlineData (10, 20, 7, 4)]
|
|
|
+ [InlineData (10, 20, 8, 4)]
|
|
|
+
|
|
|
+ public void CalculateSliderPosition_Calculates_Correctly (int visibleContentSize, int scrollableContentSize, int contentPosition, int expectedSliderPosition)
|
|
|
+ {
|
|
|
+ // Arrange
|
|
|
+ var scrollBar = new ScrollBar
|
|
|
+ {
|
|
|
+ ScrollableContentSize = scrollableContentSize,
|
|
|
+ VisibleContentSize = visibleContentSize,
|
|
|
+ Orientation = Orientation.Horizontal // Assuming horizontal for simplicity
|
|
|
+ };
|
|
|
+ scrollBar.Width = visibleContentSize;
|
|
|
+
|
|
|
+ // Act
|
|
|
+ var sliderPosition= scrollBar.CalculateSliderPosition (contentPosition, NavigationDirection.Forward);
|
|
|
+
|
|
|
+ // Assert
|
|
|
+ Assert.Equal (expectedSliderPosition, sliderPosition);
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
+ #endregion Slider
|
|
|
+
|
|
|
+ #region Size
|
|
|
+
|
|
|
+ // TODO: Add tests.
|
|
|
+
|
|
|
+ #endregion Size
|
|
|
+
|
|
|
+ #region Position
|
|
|
+
|
|
|
+ // 012345678901
|
|
|
+ // ◄█░░░░░░░░░►
|
|
|
+ [Theory]
|
|
|
+ // ◄█►
|
|
|
+ [InlineData (3, 3, -1, 0)]
|
|
|
+ [InlineData (3, 3, 0, 0)]
|
|
|
+ // 012
|
|
|
+ // ---
|
|
|
+ // ◄█►
|
|
|
+ [InlineData (3, 3, 1, 0)]
|
|
|
+ [InlineData (3, 3, 2, 0)]
|
|
|
+
|
|
|
+ // ◄██►
|
|
|
+ [InlineData (4, 2, 1, 0)]
|
|
|
+ [InlineData (4, 2, 2, 0)]
|
|
|
+
|
|
|
+ // 0123
|
|
|
+ // ---
|
|
|
+ // ◄██►
|
|
|
+ [InlineData (4, 3, 0, 0)] // scrollBarWidth/VisibleContentSize > size - scrolling doesn't make sense. Size should clamp to scrollSlider.Size.
|
|
|
+ // ◄██►
|
|
|
+ [InlineData (4, 3, 1, 0)]
|
|
|
+ // ◄██►
|
|
|
+ [InlineData (4, 3, 2, 0)]
|
|
|
+
|
|
|
+
|
|
|
+ // 01234
|
|
|
+ // ----
|
|
|
+ // ◄██►
|
|
|
+ [InlineData (4, 4, 0, 0)] // scrollBarWidth/VisibleContentSize == size - scrolling doesn't make sense. Size should clamp to scrollSlider.Size.
|
|
|
+ // ◄██►
|
|
|
+ [InlineData (4, 4, 1, 0)]
|
|
|
+ // ◄██►
|
|
|
+ [InlineData (4, 4, 2, 0)]
|
|
|
+
|
|
|
+ // 012345
|
|
|
+ // ◄███►
|
|
|
+ // -----
|
|
|
+ [InlineData (5, 5, 3, 0)]
|
|
|
+ [InlineData (5, 5, 4, 0)]
|
|
|
+
|
|
|
+ // 0123456
|
|
|
+ // ◄██░►
|
|
|
+ // ^-----
|
|
|
+ [InlineData (5, 6, 0, 0)]
|
|
|
+ // ◄░██►
|
|
|
+ // -^----
|
|
|
+ [InlineData (5, 6, 1, 1)]
|
|
|
+ [InlineData (5, 6, 2, 1)]
|
|
|
+
|
|
|
+ // 012346789
|
|
|
+ // ◄█░░►
|
|
|
+ // ^--------
|
|
|
+ [InlineData (5, 10, -1, 0)]
|
|
|
+ [InlineData (5, 10, 0, 0)]
|
|
|
+
|
|
|
+ // 0123456789
|
|
|
+ // ◄░█░►
|
|
|
+ // --^-------
|
|
|
+ [InlineData (5, 10, 1, 3)]
|
|
|
+
|
|
|
+ // ◄░░█►
|
|
|
+ // ----^----
|
|
|
+ [InlineData (5, 10, 2, 5)]
|
|
|
+
|
|
|
+ // ◄░░█►
|
|
|
+ // ------^---
|
|
|
+ [InlineData (5, 10, 4, 5)]
|
|
|
+
|
|
|
+ // ◄░████░░░►
|
|
|
+ // --------------------
|
|
|
+ [InlineData (10, 20, 0, 0)]
|
|
|
+
|
|
|
+ public void CalculatePosition_Calculates (int visibleContentSize, int scrollableContentSize, int sliderPosition, int expectedContentPosition)
|
|
|
+ {
|
|
|
+ // Arrange
|
|
|
+ var scrollBar = new ScrollBar
|
|
|
+ {
|
|
|
+ VisibleContentSize = visibleContentSize,
|
|
|
+ ScrollableContentSize = scrollableContentSize,
|
|
|
+ Orientation = Orientation.Horizontal // Use Horizontal because it's easier to visualize
|
|
|
+ };
|
|
|
+ scrollBar.Frame = new (0, 0, visibleContentSize, 0);
|
|
|
+
|
|
|
+ // Act
|
|
|
+ var contentPosition = scrollBar.CalculatePosition (sliderPosition);
|
|
|
+
|
|
|
+ // Assert
|
|
|
+ Assert.Equal (expectedContentPosition, contentPosition);
|
|
|
+ }
|
|
|
[Fact]
|
|
|
- public void ContentPosition_Event_Cancelables ()
|
|
|
+ public void Position_Event_Cancelables ()
|
|
|
{
|
|
|
var changingCount = 0;
|
|
|
var changedCount = 0;
|
|
|
var scrollBar = new ScrollBar { };
|
|
|
- scrollBar.Size = 4;
|
|
|
+ scrollBar.ScrollableContentSize = 5;
|
|
|
scrollBar.Frame = new Rectangle (0, 0, 1, 4); // Needs to be at least 4 for slider to move
|
|
|
|
|
|
- scrollBar.ContentPositionChanging += (s, e) =>
|
|
|
+ scrollBar.PositionChanging += (s, e) =>
|
|
|
{
|
|
|
if (changingCount == 0)
|
|
|
{
|
|
@@ -109,79 +598,49 @@ public class ScrollBarTests
|
|
|
|
|
|
changingCount++;
|
|
|
};
|
|
|
- scrollBar.ContentPositionChanged += (s, e) => changedCount++;
|
|
|
+ scrollBar.PositionChanged += (s, e) => changedCount++;
|
|
|
|
|
|
- scrollBar.ContentPosition = 1;
|
|
|
- Assert.Equal (0, scrollBar.ContentPosition);
|
|
|
+ scrollBar.Position = 1;
|
|
|
+ Assert.Equal (0, scrollBar.Position);
|
|
|
Assert.Equal (1, changingCount);
|
|
|
Assert.Equal (0, changedCount);
|
|
|
|
|
|
- scrollBar.ContentPosition = 1;
|
|
|
- Assert.Equal (1, scrollBar.ContentPosition);
|
|
|
+ scrollBar.Position = 1;
|
|
|
+ Assert.Equal (1, scrollBar.Position);
|
|
|
Assert.Equal (2, changingCount);
|
|
|
Assert.Equal (1, changedCount);
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- [Fact (Skip = "Disabled - Will put this feature in View")]
|
|
|
- [AutoInitShutdown]
|
|
|
- public void KeepContentInAllViewport_True_False ()
|
|
|
- {
|
|
|
- var view = new View { Width = Dim.Fill (), Height = Dim.Fill () };
|
|
|
- view.Padding.Thickness = new (0, 0, 2, 0);
|
|
|
- view.SetContentSize (new (view.Viewport.Width, 30));
|
|
|
- var scrollBar = new ScrollBar { Width = 2, Height = Dim.Fill (), Size = view.GetContentSize ().Height };
|
|
|
- scrollBar.SliderPositionChanged += (_, e) => view.Viewport = view.Viewport with { Y = e.CurrentValue };
|
|
|
- view.Padding.Add (scrollBar);
|
|
|
- var top = new Toplevel ();
|
|
|
- top.Add (view);
|
|
|
- Application.Begin (top);
|
|
|
-
|
|
|
- Assert.False (scrollBar.KeepContentInAllViewport);
|
|
|
- scrollBar.KeepContentInAllViewport = true;
|
|
|
- Assert.Equal (80, view.Padding.Viewport.Width);
|
|
|
- Assert.Equal (25, view.Padding.Viewport.Height);
|
|
|
- Assert.Equal (2, scrollBar.Viewport.Width);
|
|
|
- Assert.Equal (25, scrollBar.Viewport.Height);
|
|
|
- Assert.Equal (30, scrollBar.Size);
|
|
|
-
|
|
|
- scrollBar.KeepContentInAllViewport = false;
|
|
|
- scrollBar.ContentPosition = 50;
|
|
|
- Assert.Equal (scrollBar.GetSliderPosition (), scrollBar.Size - 1);
|
|
|
- Assert.Equal (scrollBar.GetSliderPosition (), view.Viewport.Y);
|
|
|
- Assert.Equal (29, scrollBar.GetSliderPosition ());
|
|
|
- Assert.Equal (29, view.Viewport.Y);
|
|
|
-
|
|
|
- top.Dispose ();
|
|
|
- }
|
|
|
+ #endregion Position
|
|
|
|
|
|
|
|
|
[Fact]
|
|
|
- public void Size_Cannot_Be_Negative ()
|
|
|
+ public void ScrollableContentSize_Cannot_Be_Negative ()
|
|
|
{
|
|
|
- var scrollBar = new ScrollBar { Height = 10, Size = -1 };
|
|
|
- Assert.Equal (0, scrollBar.Size);
|
|
|
- scrollBar.Size = -10;
|
|
|
- Assert.Equal (0, scrollBar.Size);
|
|
|
+ var scrollBar = new ScrollBar { Height = 10, ScrollableContentSize = -1 };
|
|
|
+ Assert.Equal (0, scrollBar.ScrollableContentSize);
|
|
|
+ scrollBar.ScrollableContentSize = -10;
|
|
|
+ Assert.Equal (0, scrollBar.ScrollableContentSize);
|
|
|
}
|
|
|
|
|
|
[Fact]
|
|
|
- public void SizeChanged_Event ()
|
|
|
+ public void ScrollableContentSizeChanged_Event ()
|
|
|
{
|
|
|
var count = 0;
|
|
|
var scrollBar = new ScrollBar ();
|
|
|
- scrollBar.SizeChanged += (s, e) => count++;
|
|
|
+ scrollBar.ScrollableContentSizeChanged += (s, e) => count++;
|
|
|
|
|
|
- scrollBar.Size = 10;
|
|
|
- Assert.Equal (10, scrollBar.Size);
|
|
|
+ scrollBar.ScrollableContentSize = 10;
|
|
|
+ Assert.Equal (10, scrollBar.ScrollableContentSize);
|
|
|
Assert.Equal (1, count);
|
|
|
}
|
|
|
|
|
|
[Theory]
|
|
|
[SetupFakeDriver]
|
|
|
|
|
|
- #region Vertical
|
|
|
+ #region Draw
|
|
|
+
|
|
|
+
|
|
|
+ #region Horizontal
|
|
|
|
|
|
#region Super 10 - ScrollBar 8
|
|
|
[InlineData (
|
|
@@ -235,7 +694,7 @@ public class ScrollBarTests
|
|
|
Orientation.Horizontal,
|
|
|
@"
|
|
|
┌──────────┐
|
|
|
-│◄░████░░░►│
|
|
|
+│◄████░░░░►│
|
|
|
└──────────┘
|
|
|
")]
|
|
|
|
|
@@ -553,9 +1012,9 @@ public class ScrollBarTests
|
|
|
│ ░████░░░ │
|
|
|
└──────────┘
|
|
|
")]
|
|
|
- #endregion Vertical
|
|
|
+ #endregion Horizontal
|
|
|
|
|
|
- #region Horizontal
|
|
|
+ #region Vertical
|
|
|
|
|
|
[InlineData (
|
|
|
1,
|
|
@@ -659,16 +1118,16 @@ public class ScrollBarTests
|
|
|
│ ▼ │
|
|
|
└───┘
|
|
|
")]
|
|
|
- #endregion
|
|
|
+ #endregion Vertical
|
|
|
|
|
|
|
|
|
- public void Draws_Correctly (int superWidth, int superHeight, int contentSize, int contentPosition, Orientation orientation, string expected)
|
|
|
+ public void Draws_Correctly (int width, int height, int contentSize, int contentPosition, Orientation orientation, string expected)
|
|
|
{
|
|
|
var super = new Window
|
|
|
{
|
|
|
Id = "super",
|
|
|
- Width = superWidth + 2,
|
|
|
- Height = superHeight + 2
|
|
|
+ Width = width + 2,
|
|
|
+ Height = height + 2
|
|
|
};
|
|
|
|
|
|
var scrollBar = new ScrollBar
|
|
@@ -678,38 +1137,32 @@ public class ScrollBarTests
|
|
|
|
|
|
if (orientation == Orientation.Vertical)
|
|
|
{
|
|
|
- scrollBar.Width = Dim.Fill ();
|
|
|
+ scrollBar.Width = 1;
|
|
|
+ scrollBar.Height = height;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- scrollBar.Height = Dim.Fill ();
|
|
|
+ scrollBar.Width = width;
|
|
|
+ scrollBar.Height = 1;
|
|
|
}
|
|
|
super.Add (scrollBar);
|
|
|
|
|
|
- scrollBar.Size = contentSize;
|
|
|
- scrollBar.ContentPosition = contentPosition;
|
|
|
+ scrollBar.ScrollableContentSize = contentSize;
|
|
|
+ scrollBar.Position = contentPosition;
|
|
|
+
|
|
|
+ int sliderPos = scrollBar.CalculateSliderPosition (contentPosition, NavigationDirection.Forward);
|
|
|
|
|
|
super.BeginInit ();
|
|
|
super.EndInit ();
|
|
|
super.Layout ();
|
|
|
super.Draw ();
|
|
|
|
|
|
- _ = TestHelpers.AssertDriverContentsWithFrameAre (expected, _output);
|
|
|
+ _ = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
|
|
|
}
|
|
|
+ #endregion Draw
|
|
|
|
|
|
- private View ScrollBarSuperView ()
|
|
|
- {
|
|
|
- var view = new View
|
|
|
- {
|
|
|
- Width = Dim.Fill (),
|
|
|
- Height = Dim.Fill ()
|
|
|
- };
|
|
|
-
|
|
|
- var top = new Toplevel ();
|
|
|
- top.Add (view);
|
|
|
+ #region Mouse
|
|
|
|
|
|
- return view;
|
|
|
- }
|
|
|
|
|
|
|
|
|
[Theory]
|
|
@@ -727,7 +1180,7 @@ public class ScrollBarTests
|
|
|
{
|
|
|
Id = "scrollBar",
|
|
|
Orientation = orientation,
|
|
|
- Size = 20,
|
|
|
+ ScrollableContentSize = 20,
|
|
|
Increment = increment
|
|
|
};
|
|
|
|
|
@@ -735,13 +1188,13 @@ public class ScrollBarTests
|
|
|
RunState rs = Application.Begin (top);
|
|
|
|
|
|
// Scroll to end
|
|
|
- scrollBar.ContentPosition = 20;
|
|
|
- Assert.Equal (10, scrollBar.ContentPosition);
|
|
|
+ scrollBar.Position = 20;
|
|
|
+ Assert.Equal (10, scrollBar.Position);
|
|
|
Application.RunIteration (ref rs);
|
|
|
|
|
|
Assert.Equal (4, scrollBar.GetSliderPosition ());
|
|
|
- Assert.Equal (10, scrollBar.ContentPosition);
|
|
|
- int initialPos = scrollBar.ContentPosition;
|
|
|
+ Assert.Equal (10, scrollBar.Position);
|
|
|
+ int initialPos = scrollBar.Position;
|
|
|
|
|
|
Application.RaiseMouseEvent (new ()
|
|
|
{
|
|
@@ -750,7 +1203,7 @@ public class ScrollBarTests
|
|
|
});
|
|
|
Application.RunIteration (ref rs);
|
|
|
|
|
|
- Assert.Equal (initialPos - increment, scrollBar.ContentPosition);
|
|
|
+ Assert.Equal (initialPos - increment, scrollBar.Position);
|
|
|
|
|
|
Application.ResetState (true);
|
|
|
}
|
|
@@ -771,7 +1224,7 @@ public class ScrollBarTests
|
|
|
{
|
|
|
Id = "scrollBar",
|
|
|
Orientation = orientation,
|
|
|
- Size = 20,
|
|
|
+ ScrollableContentSize = 20,
|
|
|
Increment = increment
|
|
|
};
|
|
|
|
|
@@ -779,12 +1232,12 @@ public class ScrollBarTests
|
|
|
RunState rs = Application.Begin (top);
|
|
|
|
|
|
// Scroll to top
|
|
|
- scrollBar.ContentPosition = 0;
|
|
|
+ scrollBar.Position = 0;
|
|
|
Application.RunIteration (ref rs);
|
|
|
|
|
|
Assert.Equal (0, scrollBar.GetSliderPosition ());
|
|
|
- Assert.Equal (0, scrollBar.ContentPosition);
|
|
|
- int initialPos = scrollBar.ContentPosition;
|
|
|
+ Assert.Equal (0, scrollBar.Position);
|
|
|
+ int initialPos = scrollBar.Position;
|
|
|
|
|
|
Application.RaiseMouseEvent (new ()
|
|
|
{
|
|
@@ -793,136 +1246,44 @@ public class ScrollBarTests
|
|
|
});
|
|
|
Application.RunIteration (ref rs);
|
|
|
|
|
|
- Assert.Equal (initialPos + increment, scrollBar.ContentPosition);
|
|
|
+ Assert.Equal (initialPos + increment, scrollBar.Position);
|
|
|
|
|
|
Application.ResetState (true);
|
|
|
}
|
|
|
+ #endregion Mouse
|
|
|
|
|
|
- [Theory]
|
|
|
- [InlineData (-1, 10, 1)]
|
|
|
- [InlineData (0, 10, 1)]
|
|
|
- [InlineData (10, 15, 5)]
|
|
|
- [InlineData (10, 5, 10)]
|
|
|
- [InlineData (10, 3, 10)]
|
|
|
- [InlineData (10, 2, 10)]
|
|
|
- [InlineData (10, 1, 10)]
|
|
|
- [InlineData (10, 0, 1)]
|
|
|
- [InlineData (10, 10, 8)]
|
|
|
- [InlineData (10, 20, 4)]
|
|
|
- [InlineData (10, 100, 1)]
|
|
|
- [InlineData (15, 10, 15)]
|
|
|
- [InlineData (15, 0, 1)]
|
|
|
- [InlineData (15, 1, 15)]
|
|
|
- [InlineData (15, 2, 15)]
|
|
|
- [InlineData (15, 3, 15)]
|
|
|
- [InlineData (15, 5, 15)]
|
|
|
- [InlineData (15, 14, 13)]
|
|
|
- [InlineData (15, 15, 13)]
|
|
|
- [InlineData (15, 16, 12)]
|
|
|
- [InlineData (20, 10, 20)]
|
|
|
- [InlineData (100, 10, 100)]
|
|
|
- public void CalculateSliderSize_Width_Matches_ViewportDimension (int viewportDimension, int size, int expectedSliderSize)
|
|
|
- {
|
|
|
- // Arrange
|
|
|
- var scrollBar = new ScrollBar
|
|
|
- {
|
|
|
- ViewportDimension = viewportDimension,
|
|
|
- Size = size,
|
|
|
- Orientation = Orientation.Horizontal // Assuming horizontal for simplicity
|
|
|
- };
|
|
|
- scrollBar.Width = viewportDimension; // Changing orientation changes Width
|
|
|
- scrollBar.BeginInit ();
|
|
|
- scrollBar.EndInit ();
|
|
|
- scrollBar.Layout ();
|
|
|
-
|
|
|
- // Act
|
|
|
- var sliderSize = scrollBar.CalculateSliderSize ();
|
|
|
-
|
|
|
-
|
|
|
- // Assert
|
|
|
- Assert.Equal (expectedSliderSize, sliderSize);
|
|
|
- }
|
|
|
-
|
|
|
- // 012345678901
|
|
|
- // ◄█░░░░░░░░░►
|
|
|
- [Theory]
|
|
|
- // ◄█►
|
|
|
- [InlineData (3, 3, -1, 0)]
|
|
|
- [InlineData (3, 3, 0, 0)]
|
|
|
- [InlineData (3, 3, 1, 0)]
|
|
|
- [InlineData (3, 3, 2, 0)]
|
|
|
-
|
|
|
- // ◄██►
|
|
|
- [InlineData (4, 2, 1, 0)]
|
|
|
- [InlineData (4, 2, 2, 0)]
|
|
|
-
|
|
|
- // 0123
|
|
|
- // ---
|
|
|
- // ◄█░►
|
|
|
- [InlineData (4, 3, 0, 0)]
|
|
|
- // ◄░█►
|
|
|
- [InlineData (4, 3, 1, 1)]
|
|
|
- // ◄░█►
|
|
|
- [InlineData (4, 3, 2, 1)]
|
|
|
-
|
|
|
-
|
|
|
- // 01234
|
|
|
- // ----
|
|
|
- // ◄█░►
|
|
|
- [InlineData (4, 4, 0, 0)]
|
|
|
- // ◄░█►
|
|
|
- [InlineData (4, 4, 1, 1)]
|
|
|
- // ◄░█►
|
|
|
- [InlineData (4, 4, 2, 1)]
|
|
|
-
|
|
|
- // 012345
|
|
|
- // ◄███►
|
|
|
- // -----
|
|
|
- [InlineData (5, 5, 3, 0)]
|
|
|
- [InlineData (5, 5, 4, 0)]
|
|
|
-
|
|
|
- // 0123456
|
|
|
- // ◄██░►
|
|
|
- // ------
|
|
|
- [InlineData (5, 6, 0, 0)]
|
|
|
- [InlineData (5, 6, 1, 1)]
|
|
|
- [InlineData (5, 6, 2, 1)]
|
|
|
|
|
|
- // 01234567890
|
|
|
- // ◄█░░░►
|
|
|
- // ----------
|
|
|
- [InlineData (5, 10, -1, 0)]
|
|
|
- [InlineData (5, 10, 0, 0)]
|
|
|
|
|
|
- // 01234567890
|
|
|
- // ◄░█░░►
|
|
|
- // --^-------
|
|
|
- [InlineData (5, 10, 1, 2)]
|
|
|
- [InlineData (5, 10, 2, 3)]
|
|
|
- [InlineData (5, 10, 3, 3)]
|
|
|
- [InlineData (5, 10, 4, 3)]
|
|
|
- [InlineData (5, 10, 5, 3)]
|
|
|
- [InlineData (5, 10, 6, 3)]
|
|
|
- [InlineData (5, 10, 7, 3)]
|
|
|
- [InlineData (5, 10, 8, 3)]
|
|
|
- [InlineData (5, 10, 9, 3)]
|
|
|
- [InlineData (5, 10, 10, 3)]
|
|
|
- public void CalculateContentPosition_ComprehensiveTests (int viewportDimension, int size, int sliderPosition, int expectedContentPosition)
|
|
|
+ [Fact (Skip = "Disabled - Will put this feature in View")]
|
|
|
+ [AutoInitShutdown]
|
|
|
+ public void KeepContentInAllViewport_True_False ()
|
|
|
{
|
|
|
- // Arrange
|
|
|
- var scrollBar = new ScrollBar
|
|
|
- {
|
|
|
- ViewportDimension = viewportDimension,
|
|
|
- Size = size,
|
|
|
- Orientation = Orientation.Horizontal // Assuming horizontal for simplicity
|
|
|
- };
|
|
|
- scrollBar.Width = viewportDimension; // Changing orientation changes Width
|
|
|
- scrollBar.Layout ();
|
|
|
+ var view = new View { Width = Dim.Fill (), Height = Dim.Fill () };
|
|
|
+ view.Padding.Thickness = new (0, 0, 2, 0);
|
|
|
+ view.SetContentSize (new (view.Viewport.Width, 30));
|
|
|
+ var scrollBar = new ScrollBar { Width = 2, Height = Dim.Fill (), ScrollableContentSize = view.GetContentSize ().Height };
|
|
|
+ scrollBar.SliderPositionChanged += (_, e) => view.Viewport = view.Viewport with { Y = e.CurrentValue };
|
|
|
+ view.Padding.Add (scrollBar);
|
|
|
+ var top = new Toplevel ();
|
|
|
+ top.Add (view);
|
|
|
+ Application.Begin (top);
|
|
|
|
|
|
- // Act
|
|
|
- var contentPosition = scrollBar.CalculateContentPosition (sliderPosition);
|
|
|
+ Assert.False (scrollBar.KeepContentInAllViewport);
|
|
|
+ scrollBar.KeepContentInAllViewport = true;
|
|
|
+ Assert.Equal (80, view.Padding.Viewport.Width);
|
|
|
+ Assert.Equal (25, view.Padding.Viewport.Height);
|
|
|
+ Assert.Equal (2, scrollBar.Viewport.Width);
|
|
|
+ Assert.Equal (25, scrollBar.Viewport.Height);
|
|
|
+ Assert.Equal (30, scrollBar.ScrollableContentSize);
|
|
|
|
|
|
- // Assert
|
|
|
- Assert.Equal (expectedContentPosition, contentPosition);
|
|
|
+ scrollBar.KeepContentInAllViewport = false;
|
|
|
+ scrollBar.Position = 50;
|
|
|
+ Assert.Equal (scrollBar.GetSliderPosition (), scrollBar.ScrollableContentSize - 1);
|
|
|
+ Assert.Equal (scrollBar.GetSliderPosition (), view.Viewport.Y);
|
|
|
+ Assert.Equal (29, scrollBar.GetSliderPosition ());
|
|
|
+ Assert.Equal (29, view.Viewport.Y);
|
|
|
+
|
|
|
+ top.Dispose ();
|
|
|
}
|
|
|
+
|
|
|
}
|