mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2025-12-27 00:07:58 +01:00
* Tons of API doc updates * Removed stale test * Removed stale tests * Fixed Skipped Shadow test 1 * Fixed Skipped Shadow test 2 * Fixed Skipped Shadow test 3 * Removed stale test * Removed stale test2 * Explicit unregister of event handler on Application.Driver!.ClearedContents * Added Toplevels to dict * code cleanup * spelling error * Removed stale test3 * Removed stale test4 * Removed stale test5 * added script * tweaked script * tweaked script * Created StressTests project; moved some tests * Created IntegrationTests project; moved some tests * New yml * made old yml just unit tests * Tweaked Button_IsDefault_Raises_Accepted_Correctly * tweaked script * cleaned up ymls * tweakled up ymls * stress tests... * stress tests on ubuntu only * Fixed WindowsDriver in InvokeLeakTest * Fixed WindowsDriver in InvokeLeakTest2 * Added Directory.Packages.props. Added Directory.Build.props * Shortened StressTest time * Removed dupe file. * DemoFiles * Moved all tests to ./Tests dir. * Fixed release build issue * Fixed .sln file * Fixed .sl* files * Fixing ymls * Fixing interation tests * Create link to the file TestHelpers. * Created Tests/UnitTestsParallelizable. Moved all obviously parallelizable tests. Updated yml. * fixing logs * fixing logs2 * fixing logs3 * don't require stress to pass for PRs * Fix a failure? * tweaked script * Coudl this be it? * Moved tons of tests to parallelizable * Fixed some stuff * Script to find duplicate tests * Testing workflows * Updated to v4 * Fix RelativeBasePath issue * Replace powershell to pwsh * Add ignore projects. * Removed dupe unit tests * Code cleanup of tests * Cleaned up test warnings * yml tweak * Moved setter * tweak ymls * just randomly throwing spaghetti at a wall * Enable runing 5 test runners in par * Turned off DEBUG_DISPOSABLE for par tests * RunningUnitTests=true * code cleanup (forcing more Action runs) * DISABLE_DEBUG_IDISPOSABLE * Added View.DebugIDisposable. False by default. * Remobed bogus tareet * Remobed bogus tareet2 * fixed warning * added api doc * fixed warning * fixed warning * fixed warning2 * fixed warning3 * fixed warning4 --------- Co-authored-by: BDisp <bd.bdisp@gmail.com>
326 lines
12 KiB
C#
326 lines
12 KiB
C#
using System.Text;
|
|
using UnitTests;
|
|
using UnitTests;
|
|
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 = Glyphs.CheckStateChecked;
|
|
_origUnchecked = Glyphs.CheckStateUnChecked;
|
|
Glyphs.CheckStateChecked = new Rune ('☑');
|
|
Glyphs.CheckStateUnChecked = new Rune ('☐');
|
|
}
|
|
|
|
public void Dispose ()
|
|
{
|
|
Glyphs.CheckStateChecked = _origChecked;
|
|
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 │";
|
|
|
|
DriverAssert.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);
|
|
|
|
View.SetClipToScreen ();
|
|
tv.Draw ();
|
|
|
|
expected =
|
|
@"
|
|
│Name │Description │
|
|
├─────────────────┼────────────────────┤
|
|
│├-Lost Highway │Exciting night road │
|
|
││ ├─Ford Trans-Am│Talking thunderbird │
|
|
││ └─DeLorean │Time travelling car │
|
|
│└+Route 66 │Great race course │
|
|
";
|
|
|
|
DriverAssert.AssertDriverContentsAre (expected, _output);
|
|
|
|
// when pressing left we should collapse the top route again
|
|
tv.NewKeyDownEvent (Key.CursorLeft);
|
|
|
|
View.SetClipToScreen ();
|
|
tv.Draw ();
|
|
|
|
expected =
|
|
@"
|
|
│Name │Description │
|
|
├──────────────┼───────────────────────┤
|
|
│├+Lost Highway│Exciting night road │
|
|
│└+Route 66 │Great race course │
|
|
";
|
|
|
|
DriverAssert.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;
|
|
|
|
View.SetClipToScreen ();
|
|
tv.Draw ();
|
|
|
|
var expected =
|
|
@"
|
|
│Name │Description │
|
|
├──────────────┼───────────────────────┤
|
|
│├+Lost Highway│Exciting night road │
|
|
│└+Route 66 │Great race course │";
|
|
|
|
DriverAssert.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 MouseEventArgs { Position = new (2, 2), Flags = MouseFlags.Button1Clicked }));
|
|
|
|
View.SetClipToScreen ();
|
|
tv.Draw ();
|
|
|
|
expected =
|
|
@"
|
|
│Name │Description │
|
|
├─────────────────┼────────────────────┤
|
|
│├-Lost Highway │Exciting night road │
|
|
││ ├─Ford Trans-Am│Talking thunderbird │
|
|
││ └─DeLorean │Time travelling car │
|
|
│└+Route 66 │Great race course │
|
|
";
|
|
|
|
DriverAssert.AssertDriverContentsAre (expected, _output);
|
|
|
|
// Clicking to the right/left of the expand/collapse does nothing
|
|
tv.NewMouseEvent (new MouseEventArgs { Position = new (3, 2), Flags = MouseFlags.Button1Clicked });
|
|
tv.Draw ();
|
|
DriverAssert.AssertDriverContentsAre (expected, _output);
|
|
tv.NewMouseEvent (new MouseEventArgs { Position = new (1, 2), Flags = MouseFlags.Button1Clicked });
|
|
tv.Draw ();
|
|
DriverAssert.AssertDriverContentsAre (expected, _output);
|
|
|
|
// Clicking on the + again should collapse
|
|
tv.NewMouseEvent (new MouseEventArgs { Position = new (2, 2), Flags = MouseFlags.Button1Clicked });
|
|
View.SetClipToScreen ();
|
|
tv.Draw ();
|
|
|
|
expected =
|
|
@"
|
|
│Name │Description │
|
|
├──────────────┼───────────────────────┤
|
|
│├+Lost Highway│Exciting night road │
|
|
│└+Route 66 │Great race course │";
|
|
|
|
DriverAssert.AssertDriverContentsAre (expected, _output);
|
|
}
|
|
|
|
[Fact]
|
|
[AutoInitShutdown (configLocation:ConfigLocations.Default)]
|
|
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 │
|
|
";
|
|
|
|
DriverAssert.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);
|
|
|
|
View.SetClipToScreen ();
|
|
tv.Draw ();
|
|
|
|
expected =
|
|
@"
|
|
|
|
│ │Name │Description │
|
|
├─┼─────────────────┼──────────────────┤
|
|
│☐│├-Lost Highway │Exciting night roa│
|
|
│☐││ ├─Ford Trans-Am│Talking thunderbir│
|
|
│☐││ └─DeLorean │Time travelling ca│
|
|
│☐│└+Route 66 │Great race course │
|
|
";
|
|
|
|
DriverAssert.AssertDriverContentsAre (expected, _output);
|
|
|
|
tv.NewKeyDownEvent (Key.CursorDown);
|
|
tv.NewKeyDownEvent (Key.Space);
|
|
View.SetClipToScreen ();
|
|
tv.Draw ();
|
|
|
|
expected =
|
|
@"
|
|
|
|
│ │Name │Description │
|
|
├─┼─────────────────┼──────────────────┤
|
|
│☐│├-Lost Highway │Exciting night roa│
|
|
│☑││ ├─Ford Trans-Am│Talking thunderbir│
|
|
│☐││ └─DeLorean │Time travelling ca│
|
|
│☐│└+Route 66 │Great race course │
|
|
";
|
|
|
|
DriverAssert.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; }
|
|
}
|
|
}
|