123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301 |
- using System;
- using System.Collections.Generic;
- using System.Data;
- using System.Linq;
- using System.Text;
- using Xunit;
- using Xunit.Abstractions;
- namespace Terminal.Gui.ViewsTests;
- public class TreeTableSourceTests: IDisposable {
- readonly ITestOutputHelper _output;
- private readonly Rune _origChecked;
- private readonly Rune _origUnchecked;
- public TreeTableSourceTests (ITestOutputHelper output)
- {
- _output = output;
- _origChecked = ConfigurationManager.Glyphs.Checked;
- _origUnchecked = ConfigurationManager.Glyphs.UnChecked;
- ConfigurationManager.Glyphs.Checked = new Rune ('☑');
- ConfigurationManager.Glyphs.UnChecked = new Rune ('☐');
- }
- [Fact, AutoInitShutdown]
- public void TestTreeTableSource_BasicExpanding_WithKeyboard ()
- {
- var tv = GetTreeTable (out _);
- tv.Style.GetOrCreateColumnStyle (1).MinAcceptableWidth = 1;
- tv.Draw ();
- string 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
- Application.Top.ProcessHotKey (new KeyEvent (Key.CursorRight, new KeyModifiers ()));
- 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
- Application.Top.ProcessHotKey (new KeyEvent (Key.CursorLeft, new KeyModifiers ()));
- tv.Draw ();
- expected =
- @"
- │Name │Description │
- ├──────────────┼───────────────────────┤
- │├+Lost Highway│Exciting night road │
- │└+Route 66 │Great race course │
- ";
- TestHelpers.AssertDriverContentsAre (expected, _output);
- }
- [Fact, AutoInitShutdown]
- public void TestTreeTableSource_BasicExpanding_WithMouse ()
- {
- var tv = GetTreeTable (out _);
- tv.Style.GetOrCreateColumnStyle (1).MinAcceptableWidth = 1;
- tv.Draw ();
- string 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.OnMouseEvent (new MouseEvent () { X = 2,Y=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.OnMouseEvent (new MouseEvent () { X = 3, Y = 2, Flags = MouseFlags.Button1Clicked });
- tv.Draw ();
- TestHelpers.AssertDriverContentsAre (expected, _output);
- tv.OnMouseEvent (new MouseEvent () { X = 1, Y = 2, Flags = MouseFlags.Button1Clicked });
- tv.Draw ();
- TestHelpers.AssertDriverContentsAre (expected, _output);
- // Clicking on the + again should collapse
- tv.OnMouseEvent (new MouseEvent () { X = 2, Y = 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]
- public void TestTreeTableSource_CombinedWithCheckboxes ()
- {
- var tv = GetTreeTable (out var treeSource);
- CheckBoxTableSourceWrapperByIndex checkSource;
- tv.Table = checkSource = new CheckBoxTableSourceWrapperByIndex (tv, tv.Table);
- tv.Style.GetOrCreateColumnStyle (2).MinAcceptableWidth = 1;
- tv.Draw ();
- string 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.ProcessKey(new KeyEvent (Key.CursorRight, new KeyModifiers ()));
- // now we are in tree column
- Assert.Equal (0, tv.SelectedRow);
- Assert.Equal (1, tv.SelectedColumn);
- Application.Top.ProcessHotKey (new KeyEvent (Key.CursorRight, new KeyModifiers ()));
- 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.ProcessKey(new KeyEvent(Key.CursorDown,new KeyModifiers ()));
- tv.ProcessKey (new KeyEvent (Key.Space, new KeyModifiers ()));
- 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);
- var selectedObjects = checkSource.CheckedRows.Select (treeSource.GetObjectOnRow).ToArray();
- var selected = Assert.Single(selectedObjects);
- Assert.Equal ("Ford Trans-Am",selected.Name);
- Assert.Equal ("Talking thunderbird car", selected.Description);
- }
- interface IDescribedThing {
- string Name { get; }
- string Description { get; }
- }
- class Road : IDescribedThing {
- public string Name { get; set; }
- public string Description { get; set; }
- public List<Car> Traffic { get; set; }
- }
- class Car : IDescribedThing {
- public string Name { get; set; }
- public string Description { get; set; }
- }
- private TableView GetTreeTable (out TreeView<IDescribedThing> tree)
- {
- var tableView = new TableView ();
- tableView.ColorScheme = Colors.TopLevel;
- tableView.ColorScheme = Colors.TopLevel;
- tableView.Bounds = new Rect (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 Car { Name = "Ford Trans-Am", Description = "Talking thunderbird car"},
- new Car { Name = "DeLorean", Description = "Time travelling car"}
- }
- });
- tree.AddObject (new Road {
- Name = "Route 66",
- Description = "Great race course",
- Traffic = new List<Car> {
- new Car { Name = "Pink Compact", Description = "Penelope Pitstop's car"},
- new Car { Name = "Mean Machine", Description = "Dick Dastardly's car"}
- }
- });
- tableView.Table = new TreeTableSource<IDescribedThing> (tableView,"Name",tree,
- new () {
- {"Description",(d)=>d.Description }
- });
- tableView.BeginInit ();
- tableView.EndInit ();
- tableView.LayoutSubviews ();
- Application.Top.Add (tableView);
- Application.Top.EnsureFocus ();
- Assert.Equal (tableView, Application.Top.MostFocused);
- return tableView;
- }
- public void Dispose ()
- {
- ConfigurationManager.Glyphs.Checked = _origChecked;
- ConfigurationManager.Glyphs.UnChecked = _origUnchecked;
- }
- }
|