mirror of
https://github.com/gui-cs/Terminal.Gui.git
synced 2025-12-26 15:57:56 +01:00
Phase 6: Add tests for IRunnable implementation
Co-authored-by: tig <585482+tig@users.noreply.github.com>
This commit is contained in:
164
Tests/UnitTests/Views/IRunnableTests.cs
Normal file
164
Tests/UnitTests/Views/IRunnableTests.cs
Normal file
@@ -0,0 +1,164 @@
|
||||
using Xunit;
|
||||
using Xunit.Abstractions;
|
||||
|
||||
namespace UnitTests.ViewsTests;
|
||||
|
||||
public class IRunnableTests (ITestOutputHelper output)
|
||||
{
|
||||
private readonly ITestOutputHelper _output = output;
|
||||
|
||||
[Fact]
|
||||
public void Toplevel_Implements_IRunnable ()
|
||||
{
|
||||
var top = new Toplevel ();
|
||||
Assert.IsAssignableFrom<IRunnable> (top);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Dialog_Implements_IModalRunnable ()
|
||||
{
|
||||
var dialog = new Dialog ();
|
||||
Assert.IsAssignableFrom<IRunnable> (dialog);
|
||||
Assert.IsAssignableFrom<IModalRunnable<int?>> (dialog);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Runnable_Base_Class_Works ()
|
||||
{
|
||||
var runnable = new Runnable ();
|
||||
Assert.IsAssignableFrom<IRunnable> (runnable);
|
||||
Assert.False (runnable.Running);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
[AutoInitShutdown]
|
||||
public void Dialog_Result_Property_Works ()
|
||||
{
|
||||
var dialog = new Dialog ();
|
||||
var btn1 = new Button { Text = "OK" };
|
||||
var btn2 = new Button { Text = "Cancel" };
|
||||
|
||||
dialog.AddButton (btn1);
|
||||
dialog.AddButton (btn2);
|
||||
|
||||
// Result should be null by default
|
||||
Assert.Null (dialog.Result);
|
||||
|
||||
// Simulate clicking the first button by invoking Accept
|
||||
btn1.InvokeCommand (Command.Accept);
|
||||
|
||||
// Result should now be 0 (first button)
|
||||
Assert.Equal (0, dialog.Result);
|
||||
|
||||
// Reset
|
||||
dialog.Result = null;
|
||||
|
||||
// Simulate clicking the second button
|
||||
btn2.InvokeCommand (Command.Accept);
|
||||
|
||||
// Result should now be 1 (second button)
|
||||
Assert.Equal (1, dialog.Result);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
[AutoInitShutdown]
|
||||
public void Toplevel_Legacy_Events_Still_Work ()
|
||||
{
|
||||
// Verify that legacy Toplevel events still fire for backward compatibility
|
||||
var eventsRaised = new List<string> ();
|
||||
var top = new Toplevel ();
|
||||
|
||||
#pragma warning disable CS0618 // Type or member is obsolete
|
||||
top.Activate += (s, e) => eventsRaised.Add ("Activate");
|
||||
#pragma warning restore CS0618
|
||||
|
||||
var token = Application.Begin (top);
|
||||
|
||||
// Legacy event should still fire
|
||||
Assert.Contains ("Activate", eventsRaised);
|
||||
|
||||
Application.End (token);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void IRunnable_Stopping_Event_Works ()
|
||||
{
|
||||
// Test that the Stopping event can be subscribed to and fires
|
||||
var top = new Toplevel ();
|
||||
var stoppingFired = false;
|
||||
var stoppedFired = false;
|
||||
|
||||
top.Stopping += (s, e) => { stoppingFired = true; };
|
||||
top.Stopped += (s, e) => { stoppedFired = true; };
|
||||
|
||||
top.Running = true;
|
||||
top.RaiseStoppingEvent ();
|
||||
|
||||
Assert.True (stoppingFired);
|
||||
Assert.True (stoppedFired);
|
||||
Assert.False (top.Running);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void IRunnable_Stopping_Can_Be_Canceled ()
|
||||
{
|
||||
// Test that the Stopping event can cancel the stop operation
|
||||
var top = new Toplevel ();
|
||||
var stoppingFired = false;
|
||||
var stoppedFired = false;
|
||||
|
||||
top.Stopping += (s, e) =>
|
||||
{
|
||||
stoppingFired = true;
|
||||
e.Cancel = true; // Cancel the stop
|
||||
};
|
||||
|
||||
top.Stopped += (s, e) => { stoppedFired = true; };
|
||||
|
||||
top.Running = true;
|
||||
top.RaiseStoppingEvent ();
|
||||
|
||||
Assert.True (stoppingFired);
|
||||
Assert.False (stoppedFired); // Should not fire because it was canceled
|
||||
Assert.True (top.Running); // Should still be running
|
||||
}
|
||||
|
||||
[Fact]
|
||||
[AutoInitShutdown]
|
||||
public void IRunnable_Initialization_Events_Fire ()
|
||||
{
|
||||
// Test that Initializing and Initialized events fire
|
||||
var initializingFired = false;
|
||||
var initializedFired = false;
|
||||
var top = new Toplevel ();
|
||||
|
||||
top.Initializing += (s, e) => { initializingFired = true; };
|
||||
top.Initialized += (s, e) => { initializedFired = true; };
|
||||
|
||||
var token = Application.Begin (top);
|
||||
|
||||
Assert.True (initializingFired);
|
||||
Assert.True (initializedFired);
|
||||
|
||||
Application.End (token);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void IRunnable_Activating_And_Activated_Events_Can_Fire ()
|
||||
{
|
||||
// Test that manually calling the activation methods works
|
||||
var activatingFired = false;
|
||||
var activatedFired = false;
|
||||
var top = new Toplevel ();
|
||||
|
||||
top.Activating += (s, e) => { activatingFired = true; };
|
||||
top.Activated += (s, e) => { activatedFired = true; };
|
||||
|
||||
// Manually trigger activation
|
||||
bool canceled = top.RaiseActivatingEvent (null);
|
||||
|
||||
Assert.False (canceled);
|
||||
Assert.True (activatingFired);
|
||||
Assert.True (activatedFired);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user