123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316 |
- using System.Text;
- using Xunit.Abstractions;
- namespace Terminal.Gui.ViewsTests;
- public class TreeTableSourceTests : IDisposable
- {
- private readonly Rune _origChecked;
- private readonly Rune _origUnchecked;
- private readonly ITestOutputHelper _output;
- public TreeTableSourceTests (ITestOutputHelper output)
- {
- _output = output;
- _origChecked = ConfigurationManager.Glyphs.CheckStateChecked;
- _origUnchecked = ConfigurationManager.Glyphs.CheckStateUnChecked;
- ConfigurationManager.Glyphs.CheckStateChecked = new Rune ('☑');
- ConfigurationManager.Glyphs.CheckStateUnChecked = new Rune ('☐');
- }
- public void Dispose ()
- {
- ConfigurationManager.Glyphs.CheckStateChecked = _origChecked;
- ConfigurationManager.Glyphs.CheckStateUnChecked = _origUnchecked;
- }
- [Fact]
- [SetupFakeDriver]
- public void TestTreeTableSource_BasicExpanding_WithKeyboard ()
- {
- ((FakeDriver)Application.Driver!).SetBufferSize (100, 100);
- TableView tv = GetTreeTable (out _);
- tv.Style.GetOrCreateColumnStyle (1).MinAcceptableWidth = 1;
- tv.Draw ();
- var expected =
- @"
- │Name │Description │
- ├──────────────┼───────────────────────┤
- │├+Lost Highway│Exciting night road │
- │└+Route 66 │Great race course │";
- TestHelpers.AssertDriverContentsAre (expected, _output);
- Assert.Equal (2, tv.Table.Rows);
- // top left is selected cell
- Assert.Equal (0, tv.SelectedRow);
- Assert.Equal (0, tv.SelectedColumn);
- // when pressing right we should expand the top route
- tv.NewKeyDownEvent (Key.CursorRight);
- tv.Draw ();
- expected =
- @"
- │Name │Description │
- ├─────────────────┼────────────────────┤
- │├-Lost Highway │Exciting night road │
- ││ ├─Ford Trans-Am│Talking thunderbird │
- ││ └─DeLorean │Time travelling car │
- │└+Route 66 │Great race course │
- ";
- TestHelpers.AssertDriverContentsAre (expected, _output);
- // when pressing left we should collapse the top route again
- tv.NewKeyDownEvent (Key.CursorLeft);
- tv.Draw ();
- expected =
- @"
- │Name │Description │
- ├──────────────┼───────────────────────┤
- │├+Lost Highway│Exciting night road │
- │└+Route 66 │Great race course │
- ";
- TestHelpers.AssertDriverContentsAre (expected, _output);
- }
- [Fact]
- [SetupFakeDriver]
- public void TestTreeTableSource_BasicExpanding_WithMouse ()
- {
- ((FakeDriver)Application.Driver!).SetBufferSize (100, 100);
- TableView tv = GetTreeTable (out _);
- tv.Style.GetOrCreateColumnStyle (1).MinAcceptableWidth = 1;
- tv.Draw ();
- var expected =
- @"
- │Name │Description │
- ├──────────────┼───────────────────────┤
- │├+Lost Highway│Exciting night road │
- │└+Route 66 │Great race course │";
- TestHelpers.AssertDriverContentsAre (expected, _output);
- Assert.Equal (2, tv.Table.Rows);
- // top left is selected cell
- Assert.Equal (0, tv.SelectedRow);
- Assert.Equal (0, tv.SelectedColumn);
- Assert.True (tv.NewMouseEvent (new MouseEvent { Position = new (2, 2), Flags = MouseFlags.Button1Clicked }));
- tv.Draw ();
- expected =
- @"
- │Name │Description │
- ├─────────────────┼────────────────────┤
- │├-Lost Highway │Exciting night road │
- ││ ├─Ford Trans-Am│Talking thunderbird │
- ││ └─DeLorean │Time travelling car │
- │└+Route 66 │Great race course │
- ";
- TestHelpers.AssertDriverContentsAre (expected, _output);
- // Clicking to the right/left of the expand/collapse does nothing
- tv.NewMouseEvent (new MouseEvent { Position = new (3, 2), Flags = MouseFlags.Button1Clicked });
- tv.Draw ();
- TestHelpers.AssertDriverContentsAre (expected, _output);
- tv.NewMouseEvent (new MouseEvent { Position = new (1, 2), Flags = MouseFlags.Button1Clicked });
- tv.Draw ();
- TestHelpers.AssertDriverContentsAre (expected, _output);
- // Clicking on the + again should collapse
- tv.NewMouseEvent (new MouseEvent { Position = new (2, 2), Flags = MouseFlags.Button1Clicked });
- tv.Draw ();
- expected =
- @"
- │Name │Description │
- ├──────────────┼───────────────────────┤
- │├+Lost Highway│Exciting night road │
- │└+Route 66 │Great race course │";
- TestHelpers.AssertDriverContentsAre (expected, _output);
- }
- [Fact]
- [AutoInitShutdown (configLocation:ConfigurationManager.ConfigLocations.DefaultOnly)]
- public void TestTreeTableSource_CombinedWithCheckboxes ()
- {
- Toplevel top = new ();
- TableView tv = GetTreeTable (out TreeView<IDescribedThing> treeSource);
- CheckBoxTableSourceWrapperByIndex checkSource;
- tv.Table = checkSource = new CheckBoxTableSourceWrapperByIndex (tv, tv.Table);
- tv.Style.GetOrCreateColumnStyle (2).MinAcceptableWidth = 1;
- top.Add (tv);
- Application.Begin (top);
- tv.Draw ();
- var expected =
- @"
- │ │Name │Description │
- ├─┼──────────────┼─────────────────────┤
- │☐│├+Lost Highway│Exciting night road │
- │☐│└+Route 66 │Great race course │
- ";
- TestHelpers.AssertDriverContentsAre (expected, _output);
- Assert.Equal (2, tv.Table.Rows);
- // top left is selected cell
- Assert.Equal (0, tv.SelectedRow);
- Assert.Equal (0, tv.SelectedColumn);
- // when pressing right we move to tree column
- tv.NewKeyDownEvent (Key.CursorRight);
- // now we are in tree column
- Assert.Equal (0, tv.SelectedRow);
- Assert.Equal (1, tv.SelectedColumn);
- Application.RaiseKeyDownEvent (Key.CursorRight);
- tv.Draw ();
- expected =
- @"
- │ │Name │Description │
- ├─┼─────────────────┼──────────────────┤
- │☐│├-Lost Highway │Exciting night roa│
- │☐││ ├─Ford Trans-Am│Talking thunderbir│
- │☐││ └─DeLorean │Time travelling ca│
- │☐│└+Route 66 │Great race course │
- ";
- TestHelpers.AssertDriverContentsAre (expected, _output);
- tv.NewKeyDownEvent (Key.CursorDown);
- tv.NewKeyDownEvent (Key.Space);
- tv.Draw ();
- expected =
- @"
- │ │Name │Description │
- ├─┼─────────────────┼──────────────────┤
- │☐│├-Lost Highway │Exciting night roa│
- │☑││ ├─Ford Trans-Am│Talking thunderbir│
- │☐││ └─DeLorean │Time travelling ca│
- │☐│└+Route 66 │Great race course │
- ";
- TestHelpers.AssertDriverContentsAre (expected, _output);
- IDescribedThing [] selectedObjects = checkSource.CheckedRows.Select (treeSource.GetObjectOnRow).ToArray ();
- IDescribedThing selected = Assert.Single (selectedObjects);
- Assert.Equal ("Ford Trans-Am", selected.Name);
- Assert.Equal ("Talking thunderbird car", selected.Description);
- top.Dispose ();
- }
- private TableView GetTreeTable (out TreeView<IDescribedThing> tree)
- {
- var tableView = new TableView ();
- tableView.ColorScheme = Colors.ColorSchemes ["TopLevel"];
- tableView.ColorScheme = Colors.ColorSchemes ["TopLevel"];
- tableView.Viewport = new Rectangle (0, 0, 40, 6);
- tableView.Style.ShowHorizontalHeaderUnderline = true;
- tableView.Style.ShowHorizontalHeaderOverline = false;
- tableView.Style.AlwaysShowHeaders = true;
- tableView.Style.SmoothHorizontalScrolling = true;
- tree = new TreeView<IDescribedThing> ();
- tree.AspectGetter = d => d.Name;
- tree.TreeBuilder = new DelegateTreeBuilder<IDescribedThing> (
- d => d is Road r
- ? r.Traffic
- : Enumerable.Empty<IDescribedThing> ()
- );
- tree.AddObject (
- new Road
- {
- Name = "Lost Highway",
- Description = "Exciting night road",
- Traffic = new List<Car>
- {
- new () { Name = "Ford Trans-Am", Description = "Talking thunderbird car" },
- new () { Name = "DeLorean", Description = "Time travelling car" }
- }
- }
- );
- tree.AddObject (
- new Road
- {
- Name = "Route 66",
- Description = "Great race course",
- Traffic = new List<Car>
- {
- new () { Name = "Pink Compact", Description = "Penelope Pitstop's car" },
- new () { Name = "Mean Machine", Description = "Dick Dastardly's car" }
- }
- }
- );
- tableView.Table = new TreeTableSource<IDescribedThing> (
- tableView,
- "Name",
- tree,
- new Dictionary<string, Func<IDescribedThing, object>> { { "Description", d => d.Description } }
- );
- tableView.BeginInit ();
- tableView.EndInit ();
- tableView.LayoutSubviews ();
- var top = new Toplevel ();
- top.Add (tableView);
- top.SetFocus ();
- Assert.Equal (tableView, top.MostFocused);
- return tableView;
- }
- private class Car : IDescribedThing
- {
- public string Name { get; set; }
- public string Description { get; set; }
- }
- private interface IDescribedThing
- {
- string Description { get; }
- string Name { get; }
- }
- private class Road : IDescribedThing
- {
- public List<Car> Traffic { get; set; }
- public string Name { get; set; }
- public string Description { get; set; }
- }
- }
|