Files
Terminal.Gui/UnitTests/Views/ScrollBarTests.cs
2024-11-15 12:45:28 -07:00

1290 lines
33 KiB
C#

using Xunit.Abstractions;
using static Unix.Terminal.Delegates;
namespace Terminal.Gui.ViewsTests;
public class ScrollBarTests (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 AutoHide_True_Is_Default_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);
// 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);
scrollBar.ScrollableContentSize = 10;
Application.RunIteration (ref rs);
//Assert.False (scrollBar.ShowScrollIndicator);
Assert.False (scrollBar.Visible);
scrollBar.ScrollableContentSize = 21;
//Assert.True (scrollBar.ShowScrollIndicator);
Assert.True (scrollBar.Visible);
scrollBar.AutoHide = false;
//Assert.True (scrollBar.ShowScrollIndicator);
Assert.True (scrollBar.Visible);
scrollBar.ScrollableContentSize = 10;
//Assert.True (scrollBar.ShowScrollIndicator);
Assert.True (scrollBar.Visible);
super.Dispose ();
}
#endregion AutoHide
#region Orientation
[Fact]
public void OnOrientationChanged_Keeps_Size ()
{
var scroll = new ScrollBar ();
scroll.Layout ();
scroll.ScrollableContentSize = 1;
scroll.Orientation = Orientation.Horizontal;
Assert.Equal (1, scroll.ScrollableContentSize);
}
[Fact]
public void OnOrientationChanged_Sets_Position_To_0 ()
{
View super = new View ()
{
Id = "super",
Width = 10,
Height = 10
};
var scrollBar = new ScrollBar ()
{
};
super.Add (scrollBar);
scrollBar.Layout ();
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.CalculateSliderPositionFromContentPosition (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.CalculatePositionFromSliderPosition (sliderPosition);
// Assert
Assert.Equal (expectedContentPosition, contentPosition);
}
[Fact]
public void Position_Event_Cancelables ()
{
var changingCount = 0;
var changedCount = 0;
var scrollBar = new ScrollBar { };
scrollBar.ScrollableContentSize = 5;
scrollBar.Frame = new Rectangle (0, 0, 1, 4); // Needs to be at least 4 for slider to move
scrollBar.PositionChanging += (s, e) =>
{
if (changingCount == 0)
{
e.Cancel = true;
}
changingCount++;
};
scrollBar.PositionChanged += (s, e) => changedCount++;
scrollBar.Position = 1;
Assert.Equal (0, scrollBar.Position);
Assert.Equal (1, changingCount);
Assert.Equal (0, changedCount);
scrollBar.Position = 1;
Assert.Equal (1, scrollBar.Position);
Assert.Equal (2, changingCount);
Assert.Equal (1, changedCount);
}
#endregion Position
[Fact]
public void ScrollableContentSize_Cannot_Be_Negative ()
{
var scrollBar = new ScrollBar { Height = 10, ScrollableContentSize = -1 };
Assert.Equal (0, scrollBar.ScrollableContentSize);
scrollBar.ScrollableContentSize = -10;
Assert.Equal (0, scrollBar.ScrollableContentSize);
}
[Fact]
public void ScrollableContentSizeChanged_Event ()
{
var count = 0;
var scrollBar = new ScrollBar ();
scrollBar.ScrollableContentSizeChanged += (s, e) => count++;
scrollBar.ScrollableContentSize = 10;
Assert.Equal (10, scrollBar.ScrollableContentSize);
Assert.Equal (1, count);
}
[Theory]
[SetupFakeDriver]
#region Draw
#region Horizontal
#region Super 10 - ScrollBar 8
[InlineData (
10,
1,
10,
-1,
Orientation.Horizontal,
@"
┌──────────┐
│◄████████►│
└──────────┘")]
[InlineData (
10,
1,
20,
-1,
Orientation.Horizontal,
@"
┌──────────┐
│◄████░░░░►│
└──────────┘")]
[InlineData (
10,
1,
20,
0,
Orientation.Horizontal,
@"
┌──────────┐
│◄████░░░░►│
└──────────┘")]
[InlineData (
10,
1,
20,
1,
Orientation.Horizontal,
@"
┌──────────┐
│◄████░░░░►│
└──────────┘")]
[InlineData (
10,
1,
20,
2,
Orientation.Horizontal,
@"
┌──────────┐
│◄████░░░░►│
└──────────┘
")]
[InlineData (
10,
1,
20,
3,
Orientation.Horizontal,
@"
┌──────────┐
│◄░████░░░►│
└──────────┘
")]
[InlineData (
10,
1,
20,
4,
Orientation.Horizontal,
@"
┌──────────┐
│◄░░████░░►│
└──────────┘
")]
[InlineData (
10,
1,
20,
5,
Orientation.Horizontal,
@"
┌──────────┐
│◄░░████░░►│
└──────────┘
")]
[InlineData (
10,
1,
20,
6,
Orientation.Horizontal,
@"
┌──────────┐
│◄░░░████░►│
└──────────┘
")]
[InlineData (
10,
1,
20,
7,
Orientation.Horizontal,
@"
┌──────────┐
│◄░░░████░►│
└──────────┘
")]
[InlineData (
10,
1,
20,
8,
Orientation.Horizontal,
@"
┌──────────┐
│◄░░░░████►│
└──────────┘
")]
[InlineData (
10,
1,
20,
9,
Orientation.Horizontal,
@"
┌──────────┐
│◄░░░░████►│
└──────────┘
")]
[InlineData (
10,
1,
20,
10,
Orientation.Horizontal,
@"
┌──────────┐
│◄░░░░████►│
└──────────┘
")]
[InlineData (
10,
1,
20,
19,
Orientation.Horizontal,
@"
┌──────────┐
│◄░░░░████►│
└──────────┘
")]
[InlineData (
10,
1,
20,
20,
Orientation.Horizontal,
@"
┌──────────┐
│◄░░░░████►│
└──────────┘
")]
#endregion Super 10 - ScrollBar 8
#region Super 12 - ScrollBar 10
[InlineData (
12,
1,
10,
-1,
Orientation.Horizontal,
@"
┌────────────┐
│◄██████████►│
└────────────┘")]
[InlineData (
12,
1,
20,
-1,
Orientation.Horizontal,
@"
┌────────────┐
│◄██████░░░░►│
└────────────┘")]
[InlineData (
12,
1,
20,
0,
Orientation.Horizontal,
@"
┌────────────┐
│◄██████░░░░►│
└────────────┘")]
[InlineData (
12,
1,
20,
1,
Orientation.Horizontal,
@"
┌────────────┐
│◄██████░░░░►│
└────────────┘")]
[InlineData (
12,
1,
20,
2,
Orientation.Horizontal,
@"
┌────────────┐
│◄░██████░░░►│
└────────────┘
")]
[InlineData (
12,
1,
20,
3,
Orientation.Horizontal,
@"
┌────────────┐
│◄░██████░░░►│
└────────────┘
")]
[InlineData (
12,
1,
20,
4,
Orientation.Horizontal,
@"
┌────────────┐
│◄░░██████░░►│
└────────────┘
")]
[InlineData (
12,
1,
20,
5,
Orientation.Horizontal,
@"
┌────────────┐
│◄░░░██████░►│
└────────────┘
")]
[InlineData (
12,
1,
20,
6,
Orientation.Horizontal,
@"
┌────────────┐
│◄░░░██████░►│
└────────────┘
")]
[InlineData (
12,
1,
20,
7,
Orientation.Horizontal,
@"
┌────────────┐
│◄░░░░██████►│
└────────────┘
")]
[InlineData (
12,
1,
20,
8,
Orientation.Horizontal,
@"
┌────────────┐
│◄░░░░██████►│
└────────────┘
")]
[InlineData (
12,
1,
20,
9,
Orientation.Horizontal,
@"
┌────────────┐
│◄░░░░██████►│
└────────────┘
")]
[InlineData (
12,
1,
20,
10,
Orientation.Horizontal,
@"
┌────────────┐
│◄░░░░██████►│
└────────────┘
")]
[InlineData (
12,
1,
20,
19,
Orientation.Horizontal,
@"
┌────────────┐
│◄░░░░██████►│
└────────────┘
")]
[InlineData (
12,
1,
20,
20,
Orientation.Horizontal,
@"
┌────────────┐
│◄░░░░██████►│
└────────────┘
")]
#endregion Super 12 - ScrollBar 10
[InlineData (
10,
3,
20,
2,
Orientation.Horizontal,
@"
┌──────────┐
│ ░████░░░ │
│◄░████░░░►│
│ ░████░░░ │
└──────────┘
")]
#endregion Horizontal
#region Vertical
[InlineData (
1,
10,
10,
-1,
Orientation.Vertical,
@"
┌─┐
│▲│
│█│
│█│
│█│
│█│
│█│
│█│
│█│
│█│
│▼│
└─┘")]
[InlineData (
1,
10,
10,
5,
Orientation.Vertical,
@"
┌─┐
│▲│
│█│
│█│
│█│
│█│
│█│
│█│
│█│
│█│
│▼│
└─┘")]
[InlineData (
1,
10,
20,
5,
Orientation.Vertical,
@"
┌─┐
│▲│
│░│
│░│
│█│
│█│
│█│
│█│
│░│
│░│
│▼│
└─┘")]
[InlineData (
1,
12,
20,
5,
Orientation.Vertical,
@"
┌─┐
│▲│
│░│
│░│
│░│
│█│
│█│
│█│
│█│
│█│
│█│
│░│
│▼│
└─┘")]
[InlineData (
3,
10,
20,
2,
Orientation.Vertical,
@"
┌───┐
│ ▲ │
│░░░│
│███│
│███│
│███│
│███│
│░░░│
│░░░│
│░░░│
│ ▼ │
└───┘
")]
#endregion Vertical
public void Draws_Correctly (int width, int height, int contentSize, int contentPosition, Orientation orientation, string expected)
{
var super = new Window
{
Id = "super",
Width = width + 2,
Height = height + 2
};
var scrollBar = new ScrollBar
{
Orientation = orientation,
};
if (orientation == Orientation.Vertical)
{
scrollBar.Width = 1;
scrollBar.Height = height;
}
else
{
scrollBar.Width = width;
scrollBar.Height = 1;
}
super.Add (scrollBar);
scrollBar.ScrollableContentSize = contentSize;
scrollBar.Position = contentPosition;
int sliderPos = scrollBar.CalculateSliderPositionFromContentPosition (contentPosition, NavigationDirection.Forward);
super.BeginInit ();
super.EndInit ();
super.Layout ();
super.Draw ();
_ = TestHelpers.AssertDriverContentsWithFrameAre (expected, output);
}
#endregion Draw
#region Mouse
[Theory]
[CombinatorialData]
[AutoInitShutdown]
public void Mouse_Click_DecrementButton_Decrements ([CombinatorialRange (1, 3, 1)] int increment, Orientation orientation)
{
var top = new Toplevel ()
{
Id = "top",
Width = 10,
Height = 10
};
var scrollBar = new ScrollBar
{
Id = "scrollBar",
Orientation = orientation,
ScrollableContentSize = 20,
Increment = increment
};
top.Add (scrollBar);
RunState rs = Application.Begin (top);
// Scroll to end
scrollBar.Position = 20;
Assert.Equal (10, scrollBar.Position);
Application.RunIteration (ref rs);
Assert.Equal (4, scrollBar.GetSliderPosition ());
Assert.Equal (10, scrollBar.Position);
int initialPos = scrollBar.Position;
Application.RaiseMouseEvent (new ()
{
ScreenPosition = new (0, 0),
Flags = MouseFlags.Button1Clicked
});
Application.RunIteration (ref rs);
Assert.Equal (initialPos - increment, scrollBar.Position);
Application.ResetState (true);
}
[Theory]
[CombinatorialData]
[AutoInitShutdown]
public void Mouse_Click_IncrementButton_Increments ([CombinatorialRange (1, 3, 1)] int increment, Orientation orientation)
{
var top = new Toplevel ()
{
Id = "top",
Width = 10,
Height = 10
};
var scrollBar = new ScrollBar
{
Id = "scrollBar",
Orientation = orientation,
ScrollableContentSize = 20,
Increment = increment
};
top.Add (scrollBar);
RunState rs = Application.Begin (top);
// Scroll to top
scrollBar.Position = 0;
Application.RunIteration (ref rs);
Assert.Equal (0, scrollBar.GetSliderPosition ());
Assert.Equal (0, scrollBar.Position);
int initialPos = scrollBar.Position;
Application.RaiseMouseEvent (new ()
{
ScreenPosition = orientation == Orientation.Vertical ? new (0, scrollBar.Frame.Height - 1) : new (scrollBar.Frame.Width - 1, 0),
Flags = MouseFlags.Button1Clicked
});
Application.RunIteration (ref rs);
Assert.Equal (initialPos + increment, scrollBar.Position);
Application.ResetState (true);
}
#endregion Mouse
[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 (), 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);
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);
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 ();
}
}