using System.ComponentModel;
using System.Text;
using Xunit.Abstractions;
namespace Terminal.Gui.ViewTests;
public class ViewCommandTests (ITestOutputHelper output)
{
#region OnAccept/Accept tests
[Fact]
public void Accept_Command_Raises_NoFocus ()
{
var view = new ViewEventTester ();
Assert.False (view.HasFocus);
Assert.False (view.InvokeCommand (Command.Accept)); // false means it was not handled
Assert.Equal (1, view.OnAcceptCount);
Assert.Equal (1, view.AcceptCount);
Assert.False (view.HasFocus);
}
[Fact]
public void Accept_Command_Handle_OnAccept_NoEvent ()
{
var view = new ViewEventTester ();
Assert.False (view.HasFocus);
view.HandleOnAccept = true;
Assert.True (view.InvokeCommand (Command.Accept));
Assert.Equal (1, view.OnAcceptCount);
Assert.Equal (0, view.AcceptCount);
}
[Fact]
public void Accept_Handle_Event_OnAccept_Returns_True ()
{
var view = new View ();
var acceptInvoked = false;
view.Accept += ViewOnAccept;
bool? ret = view.InvokeCommand (Command.Accept);
Assert.True (ret);
Assert.True (acceptInvoked);
return;
void ViewOnAccept (object sender, HandledEventArgs e)
{
acceptInvoked = true;
e.Handled = true;
}
}
[Fact]
public void Accept_Command_Invokes_Accept_Event ()
{
var view = new View ();
var accepted = false;
view.Accept += ViewOnAccept;
view.InvokeCommand (Command.Accept);
Assert.True (accepted);
return;
void ViewOnAccept (object sender, HandledEventArgs e) { accepted = true; }
}
// Accept on subview should bubble up to parent
[Fact]
public void Accept_Command_Bubbles_Up_To_SuperView ()
{
var view = new ViewEventTester () { Id = "view" };
var subview = new ViewEventTester () { Id = "subview" };
view.Add (subview);
subview.InvokeCommand (Command.Accept);
Assert.Equal (1, subview.OnAcceptCount);
Assert.Equal (1, view.OnAcceptCount);
subview.HandleOnAccept = true;
subview.InvokeCommand (Command.Accept);
Assert.Equal (2, subview.OnAcceptCount);
Assert.Equal (1, view.OnAcceptCount);
subview.HandleOnAccept = false;
subview.HandleAccept = true;
subview.InvokeCommand (Command.Accept);
Assert.Equal (3, subview.OnAcceptCount);
Assert.Equal (1, view.OnAcceptCount);
// Add a super view to test deeper hierarchy
var superView = new ViewEventTester () { Id = "superView" };
superView.Add (view);
subview.InvokeCommand (Command.Accept);
Assert.Equal (4, subview.OnAcceptCount);
Assert.Equal (1, view.OnAcceptCount);
Assert.Equal (0, superView.OnAcceptCount);
subview.HandleAccept = false;
subview.InvokeCommand (Command.Accept);
Assert.Equal (5, subview.OnAcceptCount);
Assert.Equal (2, view.OnAcceptCount);
Assert.Equal (1, superView.OnAcceptCount);
view.HandleAccept = true;
subview.InvokeCommand (Command.Accept);
Assert.Equal (6, subview.OnAcceptCount);
Assert.Equal (3, view.OnAcceptCount);
Assert.Equal (1, superView.OnAcceptCount);
}
#endregion OnAccept/Accept tests
#region OnSelect/Select tests
[Fact]
public void Select_Command_Raises_NoFocus ()
{
var view = new ViewEventTester ();
Assert.False (view.HasFocus);
Assert.False (view.InvokeCommand (Command.Select)); // false means it was not handled
Assert.Equal (1, view.OnSelectCount);
Assert.Equal (1, view.SelectCount);
Assert.False (view.HasFocus);
}
[Fact]
public void Select_Command_Handle_OnSelect_NoEvent ()
{
var view = new ViewEventTester ();
Assert.False (view.HasFocus);
view.HandleOnSelect = true;
Assert.True (view.InvokeCommand (Command.Select));
Assert.Equal (1, view.OnSelectCount);
Assert.Equal (0, view.SelectCount);
}
[Fact]
public void Select_Handle_Event_OnSelect_Returns_True ()
{
var view = new View ();
var SelectInvoked = false;
view.Select += ViewOnSelect;
bool? ret = view.InvokeCommand (Command.Select);
Assert.True (ret);
Assert.True (SelectInvoked);
return;
void ViewOnSelect (object sender, HandledEventArgs e)
{
SelectInvoked = true;
e.Handled = true;
}
}
[Fact]
public void Select_Command_Invokes_Select_Event ()
{
var view = new View ();
var Selected = false;
view.Select += ViewOnSelect;
view.InvokeCommand (Command.Select);
Assert.True (Selected);
return;
void ViewOnSelect (object sender, HandledEventArgs e) { Selected = true; }
}
#endregion OnSelect/Select tests
#region OnHotKey/HotKey tests
[Fact]
public void HotKey_Command_SetsFocus ()
{
var view = new View ();
view.CanFocus = true;
Assert.False (view.HasFocus);
view.InvokeCommand (Command.HotKey);
Assert.True (view.HasFocus);
}
#endregion OnHotKey/HotKey tests
public class ViewEventTester : View
{
public ViewEventTester ()
{
CanFocus = true;
Accept += (s, a) =>
{
a.Handled = HandleAccept;
AcceptCount++;
};
HotKeyCommand += (s, a) =>
{
a.Handled = HandleHotKeyCommand;
HotKeyCommandCount++;
};
Select += (s, a) =>
{
a.Handled = HandleSelect;
SelectCount++;
};
}
public int OnAcceptCount { get; set; }
public int AcceptCount { get; set; }
public bool HandleOnAccept { get; set; }
///
protected override bool OnAccept (HandledEventArgs args)
{
OnAcceptCount++;
return HandleOnAccept;
}
public bool HandleAccept { get; set; }
public int OnHotKeyCommandCount { get; set; }
public int HotKeyCommandCount { get; set; }
public bool HandleOnHotKeyCommand { get; set; }
///
protected override bool OnHotKeyCommand (HandledEventArgs args)
{
OnHotKeyCommandCount++;
return HandleOnHotKeyCommand;
}
public bool HandleHotKeyCommand { get; set; }
public int OnSelectCount { get; set; }
public int SelectCount { get; set; }
public bool HandleOnSelect { get; set; }
///
protected override bool OnSelect (HandledEventArgs args)
{
OnSelectCount++;
return HandleOnSelect;
}
public bool HandleSelect { get; set; }
}
}