123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943 |
- 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.False (scrollBar.AutoShow);
- }
- #region AutoHide
- [Fact]
- [AutoInitShutdown]
- public void AutoHide_False_Is_Default_CorrectlyHidesAndShows ()
- {
- var super = new Toplevel ()
- {
- Id = "super",
- Width = 1,
- Height = 20
- };
- var scrollBar = new ScrollBar
- {
- };
- super.Add (scrollBar);
- Assert.False (scrollBar.AutoShow);
- Assert.True (scrollBar.Visible);
- scrollBar.AutoShow = true;
- Assert.True (scrollBar.AutoShow);
- Assert.True (scrollBar.Visible);
- 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,
- AutoShow = false
- };
- super.Add (scrollBar);
- Assert.False (scrollBar.AutoShow);
- 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_True_Changing_ScrollableContentSize_CorrectlyHidesAndShows ()
- {
- var super = new Toplevel ()
- {
- Id = "super",
- Width = 1,
- Height = 20
- };
- var scrollBar = new ScrollBar
- {
- ScrollableContentSize = 20,
- };
- super.Add (scrollBar);
- Assert.False (scrollBar.AutoShow);
- Assert.True (scrollBar.Visible);
- scrollBar.AutoShow = true;
- 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;
- Application.RunIteration (ref rs);
- Assert.True (scrollBar.Visible);
- scrollBar.AutoShow = false;
- Application.RunIteration (ref rs);
- Assert.True (scrollBar.Visible);
- scrollBar.ScrollableContentSize = 10;
- Application.RunIteration (ref rs);
- Assert.True (scrollBar.Visible);
- super.Dispose ();
- }
- [Fact]
- [AutoInitShutdown]
- public void AutoHide_Change_VisibleContentSize_CorrectlyHidesAndShows ()
- {
- var super = new Toplevel ()
- {
- Id = "super",
- Width = 1,
- Height = 20
- };
- var scrollBar = new ScrollBar
- {
- ScrollableContentSize = 20,
- VisibleContentSize = 20
- };
- super.Add (scrollBar);
- Assert.False (scrollBar.AutoShow);
- Assert.True (scrollBar.Visible);
- scrollBar.AutoShow = true;
- RunState rs = Application.Begin (super);
- Assert.Equal (Orientation.Vertical, scrollBar.Orientation);
- Assert.Equal (20, scrollBar.VisibleContentSize);
- Assert.False (scrollBar.Visible);
- scrollBar.VisibleContentSize = 10;
- Application.RunIteration (ref rs);
- Assert.True (scrollBar.Visible);
- scrollBar.VisibleContentSize = 30;
- Application.RunIteration (ref rs);
- Assert.False (scrollBar.Visible);
- scrollBar.VisibleContentSize = 10;
- Application.RunIteration (ref rs);
- Assert.True (scrollBar.Visible);
- scrollBar.VisibleContentSize = 21;
- Application.RunIteration (ref rs);
- Assert.False (scrollBar.Visible);
- scrollBar.AutoShow = false;
- Application.RunIteration (ref rs);
- Assert.True (scrollBar.Visible);
- scrollBar.VisibleContentSize = 10;
- Application.RunIteration (ref rs);
- 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 Size
- // TODO: Add tests.
- #endregion Size
- #region Position
- [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_Default_Settings (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
- {
- AutoShow = false,
- Orientation = orientation,
- };
- if (orientation == Orientation.Vertical)
- {
- super.SetContentSize (new (width, contentSize));
- scrollBar.Width = width;
- }
- else
- {
- super.SetContentSize (new (contentSize, height));
- scrollBar.Height = height;
- }
- super.Add (scrollBar);
- scrollBar.Position = contentPosition;
- 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 = 19;
- Assert.Equal (10, scrollBar.Position);
- Application.RunIteration (ref rs);
- Assert.Equal (4, scrollBar.GetSliderPosition ());
- Assert.Equal (10, scrollBar.Position);
- int initialPos = scrollBar.Position;
- Point btnPoint = orientation == Orientation.Vertical
- ? new (0, 0)
- : new (0, 0);
- Application.RaiseMouseEvent (new ()
- {
- ScreenPosition = btnPoint,
- 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;
- Point btnPoint = orientation == Orientation.Vertical
- ? new (scrollBar.Frame.X, scrollBar.Frame.Height - 1)
- : new (scrollBar.Frame.Width - 1, scrollBar.Frame.Y);
- Application.RaiseMouseEvent (new ()
- {
- ScreenPosition = btnPoint,
- 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 ();
- }
- }
|