More refactoring. Still WIP

This commit is contained in:
Tig
2024-10-05 17:41:48 -06:00
parent af110d92d0
commit 6adeec6548
11 changed files with 415 additions and 282 deletions

View File

@@ -24,6 +24,11 @@ public class AllViewsTests (ITestOutputHelper output) : TestsAllViews
return;
}
if (view is IDesignable designable)
{
designable.EnableForDesign ();
}
view.X = Pos.Center ();
view.Y = Pos.Center ();
@@ -61,17 +66,6 @@ public class AllViewsTests (ITestOutputHelper output) : TestsAllViews
Assert.True (Test_All_Constructors_Of_Type (viewType));
}
//[Fact]
//public void AllViews_HotKey_Works ()
//{
// foreach (var type in GetAllViewClasses ()) {
// _output.WriteLine ($"Testing {type.Name}");
// var view = GetTypeInitializer (type, type.GetConstructor (Array.Empty<Type> ()));
// view.HotKeySpecifier = (Rune)'^';
// view.Text = "^text";
// Assert.Equal(Key.T, view.HotKey);
// }
//}
public bool Test_All_Constructors_Of_Type (Type type)
{
@@ -87,4 +81,86 @@ public class AllViewsTests (ITestOutputHelper output) : TestsAllViews
return true;
}
//[Fact]
//public void AllViews_HotKey_Works ()
//{
// foreach (var type in GetAllViewClasses ()) {
// _output.WriteLine ($"Testing {type.Name}");
// var view = GetTypeInitializer (type, type.GetConstructor (Array.Empty<Type> ()));
// view.HotKeySpecifier = (Rune)'^';
// view.Text = "^text";
// Assert.Equal(Key.T, view.HotKey);
// }
//}
[Theory]
[MemberData (nameof (AllViewTypes))]
public void AllViews_Command_Select_Raises_Selected (Type viewType)
{
var view = (View)CreateInstanceIfNotGeneric (viewType);
if (view == null)
{
output.WriteLine ($"Ignoring {viewType} - It's a Generic");
return;
}
if (view is IDesignable designable)
{
designable.EnableForDesign ();
}
var selectedCount = 0;
view.Selected += (s, e) => selectedCount++;
var acceptedCount = 0;
view.Accepted += (s, e) =>
{
acceptedCount++;
};
if (view.InvokeCommand(Command.Select) == true)
{
Assert.Equal(1, selectedCount);
Assert.Equal (0, acceptedCount);
}
}
[Theory]
[MemberData (nameof (AllViewTypes))]
public void AllViews_Command_Accept_Raises_Accepted (Type viewType)
{
var view = (View)CreateInstanceIfNotGeneric (viewType);
if (view == null)
{
output.WriteLine ($"Ignoring {viewType} - It's a Generic");
return;
}
if (view is IDesignable designable)
{
designable.EnableForDesign ();
}
var selectedCount = 0;
view.Selected += (s, e) => selectedCount++;
var acceptedCount = 0;
view.Accepted += (s, e) =>
{
acceptedCount++;
};
if (view.InvokeCommand (Command.Accept) == true)
{
Assert.Equal (0, selectedCount);
Assert.Equal (1, acceptedCount);
}
}
}

View File

@@ -1316,10 +1316,56 @@ e
super.Dispose ();
}
[Fact]
public void Label_CanFocus_True_Get_Focus_By_Keyboard ()
public void CanFocus_False_HotKey_SetsFocus_Next ()
{
Label label = new () { Text = "label" };
View otherView = new () { Text = "otherView", CanFocus = true };
Label label = new () { Text = "_label" };
View nextView = new () { Text = "nextView", CanFocus = true };
Application.Navigation = new ();
Application.Top = new ();
Application.Top.Add (otherView, label, nextView);
Application.Top.SetFocus ();
Assert.True (otherView.HasFocus);
// No focused view accepts Tab, and there's no other view to focus, so OnKeyDown returns false
Assert.True (Application.OnKeyDown (label.HotKey));
Assert.False (otherView.HasFocus);
Assert.False (label.HasFocus);
Assert.True (nextView.HasFocus);
Application.Top.Dispose ();
Application.ResetState ();
}
[Fact]
public void CanFocus_False_MouseClick_SetsFocus_Next ()
{
View otherView = new () { X = 0, Y = 0, Width = 1, Height = 1, Id = "otherView", CanFocus = true };
Label label = new () { X = 0, Y = 1, Text = "_label" };
View nextView = new () { X = Pos.Right (label), Y = Pos.Top (label), Width = 1, Height = 1, Id = "nextView", CanFocus = true };
Application.Navigation = new ();
Application.Top = new ();
Application.Top.Add (otherView, label, nextView);
Application.Top.SetFocus ();
// click on label
Application.OnMouseEvent (new () { ScreenPosition = label.Frame.Location, Flags = MouseFlags.Button1Clicked });
Assert.False (label.HasFocus);
Assert.True (nextView.HasFocus);
Application.Top.Dispose ();
Application.ResetState ();
}
[Fact]
public void CanFocus_True_HotKey_SetsFocus ()
{
Label label = new () { Text = "_label" };
View view = new () { Text = "view", CanFocus = true };
Application.Navigation = new ();
Application.Top = new ();
@@ -1333,21 +1379,7 @@ e
Assert.True (view.HasFocus);
// No focused view accepts Tab, and there's no other view to focus, so OnKeyDown returns false
Assert.False (Application.OnKeyDown (Key.Tab));
Assert.False (label.HasFocus);
Assert.True (view.HasFocus);
// Set label CanFocus to true
label.CanFocus = true;
Assert.False (label.HasFocus);
Assert.True (view.HasFocus);
// No focused view accepts Tab, but label can now be focused, so focus should move to it.
Assert.True (Application.OnKeyDown (Key.Tab));
Assert.True (label.HasFocus);
Assert.False (view.HasFocus);
Assert.True (Application.OnKeyDown (Key.Tab));
Assert.True (Application.OnKeyDown (label.HotKey));
Assert.False (label.HasFocus);
Assert.True (view.HasFocus);
@@ -1357,15 +1389,17 @@ e
[Fact]
public void Label_CanFocus_True_Get_Focus_By_Mouse ()
public void CanFocus_True_MouseClick_Focuses ()
{
Application.Navigation = new ();
Label label = new ()
{
Text = "label",
X = 0,
Y = 0
Y = 0,
CanFocus = true
};
View view = new ()
View otherView = new ()
{
Text = "view",
X = 0,
@@ -1379,34 +1413,26 @@ e
Width = 10,
Height = 10
};
Application.Top.Add (label, view);
Application.Top.Add (label, otherView);
Application.Top.SetFocus ();
Assert.Equal (view, Application.Top.MostFocused);
Assert.False (label.CanFocus);
Assert.False (label.HasFocus);
Assert.True (view.CanFocus);
Assert.True (view.HasFocus);
// label can't focus so clicking on it has no effect
Application.OnMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1Clicked });
Assert.False (label.HasFocus);
Assert.True (view.HasFocus);
Assert.True (label.CanFocus);
Assert.True (label.HasFocus);
Assert.True (otherView.CanFocus);
Assert.False (otherView.HasFocus);
// Set label CanFocus to true
label.CanFocus = true;
Assert.False (label.HasFocus);
Assert.True (view.HasFocus);
otherView.SetFocus ();
Assert.True (otherView.HasFocus);
// label can focus, so clicking on it set focus
Application.OnMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1Clicked });
Application.OnMouseEvent (new () { ScreenPosition = new (0, 0), Flags = MouseFlags.Button1Clicked });
Assert.True (label.HasFocus);
Assert.False (view.HasFocus);
Assert.False (otherView.HasFocus);
// click on view
Application.OnMouseEvent (new () { Position = new (0, 1), Flags = MouseFlags.Button1Clicked });
Application.OnMouseEvent (new () { ScreenPosition = new (0, 1), Flags = MouseFlags.Button1Clicked });
Assert.False (label.HasFocus);
Assert.True (view.HasFocus);
Assert.True (otherView.HasFocus);
Application.Top.Dispose ();
Application.ResetState ();

View File

@@ -90,17 +90,17 @@ public class RadioGroupTests (ITestOutputHelper output)
var selectedItemChangedCount = 0;
rg.SelectedItemChanged += (s, e) => selectedItemChangedCount++;
var selectCount = 0;
rg.Selected += (s, e) => selectCount++;
var selectedCount = 0;
rg.Selected += (s, e) => selectedCount++;
var acceptCount = 0;
rg.Accepted += (s, e) => acceptCount++;
var acceptedCount = 0;
rg.Accepted += (s, e) => acceptedCount++;
// By default the first item is selected
Assert.Equal (0, rg.SelectedItem);
Assert.Equal (0, selectedItemChangedCount);
Assert.Equal (0, selectCount);
Assert.Equal (0, acceptCount);
Assert.Equal (0, selectedCount);
Assert.Equal (0, acceptedCount);
Assert.Equal (Key.Empty, rg.HotKey);
// With HasFocus
@@ -109,38 +109,38 @@ public class RadioGroupTests (ITestOutputHelper output)
Assert.Equal (0, rg.SelectedItem);
Assert.Equal (0, rg.Cursor);
Assert.Equal (0, selectedItemChangedCount);
Assert.Equal (0, selectCount);
Assert.Equal (0, acceptCount);
Assert.Equal (0, selectedCount);
Assert.Equal (0, acceptedCount);
Assert.True (Application.OnKeyDown (Key.CursorDown));
Assert.Equal (0, rg.SelectedItem); // Cursor changed, but selection didnt
Assert.Equal (1, rg.Cursor);
Assert.Equal (0, selectedItemChangedCount);
Assert.Equal (0, selectCount);
Assert.Equal (0, acceptCount);
Assert.Equal (0, selectedCount);
Assert.Equal (0, acceptedCount);
Assert.False (Application.OnKeyDown (Key.CursorDown)); // Should not change selection (should focus next view if there was one, which there isn't)
Assert.Equal (0, rg.SelectedItem);
Assert.Equal (1, rg.Cursor);
Assert.Equal (0, selectedItemChangedCount);
Assert.Equal (0, selectCount);
Assert.Equal (0, acceptCount);
Assert.Equal (0, selectedCount);
Assert.Equal (0, acceptedCount);
// Test Select (Space) when Cursor != SelectedItem
// Test Select (Space) when Cursor != SelectedItem - Should select cursor
Assert.True (Application.OnKeyDown (Key.Space));
Assert.Equal (1, rg.SelectedItem);
Assert.Equal (1, rg.Cursor);
Assert.Equal (1, selectedItemChangedCount);
Assert.Equal (1, selectCount);
Assert.Equal (0, acceptCount);
Assert.Equal (1, selectedCount);
Assert.Equal (0, acceptedCount);
// Now test Select (Space) when Cursor == SelectedItem - Should cycle
// Test Select (Space) when Cursor == SelectedItem - Should cycle
Assert.True (Application.OnKeyDown (Key.Space));
Assert.Equal (0, rg.SelectedItem);
Assert.Equal (0, rg.Cursor);
Assert.Equal (2, selectedItemChangedCount);
Assert.Equal (2, selectCount);
Assert.Equal (0, acceptCount);
Assert.Equal (2, selectedCount);
Assert.Equal (0, acceptedCount);
Assert.True (Application.OnKeyDown (Key.Space));
Assert.Equal (1, rg.SelectedItem);
@@ -166,8 +166,8 @@ public class RadioGroupTests (ITestOutputHelper output)
Assert.Equal (1, rg.SelectedItem);
Assert.Equal (1, rg.Cursor);
Assert.Equal (7, selectedItemChangedCount);
Assert.Equal (7, selectCount);
Assert.Equal (0, acceptCount);
Assert.Equal (7, selectedCount);
Assert.Equal (0, acceptedCount);
// Test HotKey
// Selected == Cursor (1) - Advance state and raise Select event - DO NOT raise Accept
@@ -178,8 +178,8 @@ public class RadioGroupTests (ITestOutputHelper output)
Assert.Equal (0, rg.SelectedItem);
Assert.Equal (0, rg.Cursor);
Assert.Equal (8, selectedItemChangedCount);
Assert.Equal (8, selectCount);
Assert.Equal (0, acceptCount);
Assert.Equal (8, selectedCount);
Assert.Equal (0, acceptedCount);
// Make Selected != Cursor
Assert.True (Application.OnKeyDown (Key.CursorDown));
@@ -191,8 +191,8 @@ public class RadioGroupTests (ITestOutputHelper output)
Assert.Equal (1, rg.SelectedItem);
Assert.Equal (1, rg.Cursor);
Assert.Equal (9, selectedItemChangedCount);
Assert.Equal (9, selectCount);
Assert.Equal (0, acceptCount);
Assert.Equal (9, selectedCount);
Assert.Equal (0, acceptedCount);
Application.ResetState (true);
}
@@ -372,7 +372,6 @@ public class RadioGroupTests (ITestOutputHelper output)
Assert.NotEmpty (rg.KeyBindings.GetCommands (KeyCode.L | KeyCode.ShiftMask));
Assert.NotEmpty (rg.KeyBindings.GetCommands (KeyCode.L | KeyCode.AltMask));
// BUGBUG: These tests only test that RG works on it's own, not if it's a subview
Assert.True (Application.OnKeyDown (Key.T));
Assert.Equal (2, rg.SelectedItem);
Assert.True (Application.OnKeyDown (Key.L));
@@ -463,7 +462,7 @@ public class RadioGroupTests (ITestOutputHelper output)
group.NewKeyDownEvent (Key.G.WithAlt);
Assert.Equal (0, group.SelectedItem);
Assert.True (group.HasFocus);
Assert.False (group.HasFocus);
}
[Fact]
@@ -619,18 +618,18 @@ public class RadioGroupTests (ITestOutputHelper output)
{
var radioGroup = new RadioGroup
{
RadioLabels = ["_1", "__2"]
RadioLabels = ["_1", "_2"]
};
Assert.True (radioGroup.CanFocus);
var selectedItemChanged = 0;
radioGroup.SelectedItemChanged += (s, e) => selectedItemChanged++;
var selectCount = 0;
radioGroup.Selected += (s, e) => selectCount++;
var selectedCount = 0;
radioGroup.Selected += (s, e) => selectedCount++;
var acceptCount = 0;
radioGroup.Accepted += (s, e) => acceptCount++;
var acceptedCount = 0;
radioGroup.Accepted += (s, e) => acceptedCount++;
Assert.Equal (Orientation.Vertical, radioGroup.Orientation);
@@ -638,26 +637,29 @@ public class RadioGroupTests (ITestOutputHelper output)
Assert.True (radioGroup.HasFocus);
Assert.Equal (0, radioGroup.SelectedItem);
Assert.Equal (0, selectedItemChanged);
Assert.Equal (0, selectCount);
Assert.Equal (0, acceptCount);
Assert.Equal (0, selectedCount);
Assert.Equal (0, acceptedCount);
Assert.False (radioGroup.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1Clicked }));
// Click on the first item, which is already selected
Assert.True (radioGroup.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1Clicked }));
Assert.Equal (0, radioGroup.SelectedItem);
Assert.Equal (0, selectedItemChanged);
Assert.Equal (0, selectCount);
Assert.Equal (0, acceptCount);
Assert.Equal (0, selectedCount);
Assert.Equal (0, acceptedCount);
// Click on the second item
Assert.True (radioGroup.NewMouseEvent (new () { Position = new (0, 1), Flags = MouseFlags.Button1Clicked }));
Assert.Equal (1, radioGroup.SelectedItem);
Assert.Equal (1, selectedItemChanged);
Assert.Equal (1, selectCount);
Assert.Equal (0, acceptCount);
Assert.Equal (1, selectedCount);
Assert.Equal (0, acceptedCount);
// Click on the first item
Assert.True (radioGroup.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1Clicked }));
Assert.Equal (0, radioGroup.SelectedItem);
Assert.Equal (2, selectedItemChanged);
Assert.Equal (2, selectCount);
Assert.Equal (0, acceptCount);
Assert.Equal (2, selectedCount);
Assert.Equal (0, acceptedCount);
}
[Fact]
@@ -673,16 +675,16 @@ public class RadioGroupTests (ITestOutputHelper output)
var selectedItemChanged = 0;
radioGroup.SelectedItemChanged += (s, e) => selectedItemChanged++;
var selectCount = 0;
radioGroup.Selected += (s, e) => selectCount++;
var selectedCount = 0;
radioGroup.Selected += (s, e) => selectedCount++;
var acceptCount = 0;
var handleAccept = false;
var acceptedCount = 0;
var handleAccepted = false;
radioGroup.Accepted += (s, e) =>
{
acceptCount++;
e.Handled = handleAccept;
acceptedCount++;
e.Handled = handleAccepted;
};
Assert.True (radioGroup.DoubleClickAccepts);
@@ -692,25 +694,32 @@ public class RadioGroupTests (ITestOutputHelper output)
Assert.True (radioGroup.HasFocus);
Assert.Equal (0, radioGroup.SelectedItem);
Assert.Equal (0, selectedItemChanged);
Assert.Equal (0, selectCount);
Assert.Equal (0, acceptCount);
Assert.Equal (0, selectedCount);
Assert.Equal (0, acceptedCount);
// NOTE: Drivers ALWAYS generate a Button1Clicked event before Button1DoubleClicked
// NOTE: We need to do the same
Assert.True (radioGroup.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1Clicked }));
Assert.True (radioGroup.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1DoubleClicked }));
Assert.Equal (0, radioGroup.SelectedItem);
Assert.Equal (0, selectedItemChanged);
Assert.Equal (0, selectCount);
Assert.Equal (1, acceptCount);
Assert.Equal (0, selectedCount);
Assert.Equal (1, acceptedCount);
Assert.True (radioGroup.NewMouseEvent (new () { Position = new (0, 1), Flags = MouseFlags.Button1Clicked }));
Assert.True (radioGroup.NewMouseEvent (new () { Position = new (0, 1), Flags = MouseFlags.Button1Clicked }));
Assert.Equal (1, radioGroup.SelectedItem);
Assert.Equal (1, selectedItemChanged);
Assert.Equal (1, selectCount);
Assert.Equal (1, acceptCount);
Assert.Equal (1, selectedCount);
Assert.Equal (1, acceptedCount);
Assert.True (radioGroup.NewMouseEvent (new () { Position = new (0, 1), Flags = MouseFlags.Button1Clicked }));
Assert.True (radioGroup.NewMouseEvent (new () { Position = new (0, 1), Flags = MouseFlags.Button1DoubleClicked }));
Assert.Equal (1, radioGroup.SelectedItem);
Assert.Equal (1, selectedItemChanged);
Assert.Equal (1, selectCount);
Assert.Equal (2, acceptCount);
Assert.Equal (1, selectedCount);
Assert.Equal (2, acceptedCount);
View superView = new () { Id = "superView", CanFocus = true };
superView.Add (radioGroup);
@@ -719,8 +728,8 @@ public class RadioGroupTests (ITestOutputHelper output)
Assert.True (radioGroup.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1Clicked }));
Assert.Equal (0, radioGroup.SelectedItem);
Assert.Equal (2, selectedItemChanged);
Assert.Equal (2, selectCount);
Assert.Equal (2, acceptCount);
Assert.Equal (2, selectedCount);
Assert.Equal (2, acceptedCount);
var superViewAcceptCount = 0;
@@ -732,24 +741,28 @@ public class RadioGroupTests (ITestOutputHelper output)
Assert.Equal (0, superViewAcceptCount);
handleAccept = true;
Assert.False (radioGroup.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1DoubleClicked }));
// By handling the event, we're cancelling it. So the radio group should not change.
handleAccepted = true;
Assert.True (radioGroup.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1Clicked }));
Assert.True (radioGroup.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1DoubleClicked }));
Assert.Equal (0, radioGroup.SelectedItem);
Assert.Equal (2, selectedItemChanged);
Assert.Equal (2, selectCount);
Assert.Equal (3, acceptCount);
Assert.Equal (1, superViewAcceptCount);
Assert.Equal (2, selectedCount);
Assert.Equal (3, acceptedCount);
Assert.Equal (0, superViewAcceptCount);
handleAccept = false;
Assert.False (radioGroup.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1DoubleClicked }));
handleAccepted = false;
Assert.True (radioGroup.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1Clicked }));
Assert.True (radioGroup.NewMouseEvent (new () { Position = new (0, 0), Flags = MouseFlags.Button1DoubleClicked }));
Assert.Equal (0, radioGroup.SelectedItem);
Assert.Equal (2, selectedItemChanged);
Assert.Equal (2, selectCount);
Assert.Equal (4, acceptCount);
Assert.Equal (3, superViewAcceptCount); // Accept bubbles up to superview
Assert.Equal (2, selectedCount);
Assert.Equal (4, acceptedCount);
Assert.Equal (1, superViewAcceptCount); // Accept bubbles up to superview
radioGroup.DoubleClickAccepts = false;
Assert.False (radioGroup.NewMouseEvent (new () { Position = new (0, 1), Flags = MouseFlags.Button1DoubleClicked }));
Assert.True (radioGroup.NewMouseEvent (new () { Position = new (0, 1), Flags = MouseFlags.Button1Clicked }));
Assert.True (radioGroup.NewMouseEvent (new () { Position = new (0, 1), Flags = MouseFlags.Button1DoubleClicked }));
}
#endregion Mouse Tests