Browse Source

Phase 6: Add tests for IRunnable implementation

Co-authored-by: tig <[email protected]>
copilot-swe-agent[bot] 3 tuần trước cách đây
mục cha
commit
54d0a4ba4a
1 tập tin đã thay đổi với 164 bổ sung0 xóa
  1. 164 0
      Tests/UnitTests/Views/IRunnableTests.cs

+ 164 - 0
Tests/UnitTests/Views/IRunnableTests.cs

@@ -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);
+    }
+}