From f1a6534dca5f6a577d576abd56d67733e9cd562f Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Sat, 15 Nov 2025 21:28:13 +0000
Subject: [PATCH] Rewrite integration tests to actually run scenarios
- Tests now use UICatalogTop and call scenario.Main()
- First test simulates full UICatalog flow: run UICatalogTop, select scenario, run scenario
- Second test runs multiple scenarios in sequence to verify driver persistence
- Both tests properly clean up event handlers to avoid assertions
- Tests verify the fix works correctly by actually running scenarios
Co-authored-by: tig <585482+tig@users.noreply.github.com>
---
.../UICatalog/ForceDriverTests.cs | 253 +++++++++++++++---
1 file changed, 211 insertions(+), 42 deletions(-)
diff --git a/Tests/IntegrationTests/UICatalog/ForceDriverTests.cs b/Tests/IntegrationTests/UICatalog/ForceDriverTests.cs
index 81d4127b9..944c871b7 100644
--- a/Tests/IntegrationTests/UICatalog/ForceDriverTests.cs
+++ b/Tests/IntegrationTests/UICatalog/ForceDriverTests.cs
@@ -16,11 +16,11 @@ public class ForceDriverTests
}
///
- /// Tests that ForceDriver persists when opening a scenario after Init/Shutdown cycles.
- /// This verifies the fix for issue #4391.
+ /// Tests that ForceDriver persists when running UICatalogTop and then opening a scenario.
+ /// This simulates the actual UICatalog flow and verifies the fix for issue #4391.
///
[Fact]
- public void ForceDriver_Persists_Across_Init_Shutdown_Cycles ()
+ public void ForceDriver_Persists_From_UICatalogTop_To_Scenario ()
{
// Arrange
const string expectedDriver = "fake";
@@ -28,6 +28,21 @@ public class ForceDriverTests
ConfigurationManager.Disable (true);
Application.ResetState (true);
+ // Initialize UICatalog.Options (required by UICatalogTop)
+ global::UICatalog.UICatalog.Options = new UICatalogCommandLineOptions
+ {
+ Driver = expectedDriver,
+ DontEnableConfigurationManagement = false,
+ Scenario = "none",
+ BenchmarkTimeout = 2500,
+ Benchmark = false,
+ ResultsFile = string.Empty,
+ DebugLogLevel = "Warning"
+ };
+
+ // Initialize cached scenarios (required by UICatalogTop)
+ UICatalogTop.CachedScenarios = Scenario.GetScenarios ();
+
// Set ForceDriver in RuntimeConfig (simulating what UICatalog does with --driver option)
ConfigurationManager.RuntimeConfig = $$"""
{
@@ -38,54 +53,136 @@ public class ForceDriverTests
// Enable ConfigurationManager with all locations (as UICatalog does)
ConfigurationManager.Enable (ConfigLocations.All);
- var firstDriverName = string.Empty;
- var secondDriverName = string.Empty;
+ var topLevelDriverName = string.Empty;
+ var scenarioDriverName = string.Empty;
+ var iterationCount = 0;
+ EventHandler? iterationHandler = null;
try
{
- // Act - Cycle 1: Init and check driver
- _output.WriteLine ("Cycle 1: First Init");
+ // Phase 1: Run UICatalogTop (simulating main UI)
+ _output.WriteLine ("=== Phase 1: Running UICatalogTop ===");
Application.Init ();
- firstDriverName = Application.Driver?.GetName () ?? string.Empty;
- _output.WriteLine ($"Cycle 1 driver: {firstDriverName}");
- Application.Shutdown ();
+ topLevelDriverName = Application.Driver?.GetName () ?? string.Empty;
+ _output.WriteLine ($"UICatalogTop driver: {topLevelDriverName}");
- // Act - Cycle 2: Reload RuntimeConfig and Init again (simulating scenario opening)
- _output.WriteLine ("Cycle 2: Reload RuntimeConfig and Init again");
+ var top = new UICatalogTop ();
- // This simulates what the fix does before each scenario
- ConfigurationManager.Load (ConfigLocations.Runtime);
- ConfigurationManager.Apply ();
+ // Set up to automatically select a scenario and stop
+ iterationHandler = (sender, e) =>
+ {
+ iterationCount++;
+
+ // On first iteration, select a scenario and request stop
+ if (iterationCount == 1)
+ {
+ // Select the first scenario
+ if (UICatalogTop.CachedScenarios is { Count: > 0 })
+ {
+ UICatalogTop.CachedSelectedScenario =
+ (Scenario)Activator.CreateInstance (UICatalogTop.CachedScenarios[0].GetType ())!;
+ Application.RequestStop ();
+ }
+ }
+ };
+
+ Application.Iteration += iterationHandler;
+ Application.Run (top);
+ Application.Iteration -= iterationHandler;
- // Scenario calls Application.Init() without parameters
- Application.Init ();
- secondDriverName = Application.Driver?.GetName () ?? string.Empty;
- _output.WriteLine ($"Cycle 2 driver: {secondDriverName}");
+ top.Dispose ();
Application.Shutdown ();
+
+ _output.WriteLine ($"Selected scenario: {UICatalogTop.CachedSelectedScenario?.GetName ()}");
+ _output.WriteLine ($"UICatalogTop completed after {iterationCount} iterations");
+
+ // Phase 2: Run the selected scenario (simulating what UICatalog.cs does)
+ if (UICatalogTop.CachedSelectedScenario is { } scenario)
+ {
+ _output.WriteLine ($"\n=== Phase 2: Running scenario '{scenario.GetName ()}' ===");
+
+ // Reload RuntimeConfig before scenario (as the fix does)
+ if (!global::UICatalog.UICatalog.Options.DontEnableConfigurationManagement)
+ {
+ ConfigurationManager.Load (ConfigLocations.Runtime);
+ ConfigurationManager.Apply ();
+ _output.WriteLine ("Reloaded RuntimeConfig");
+ }
+
+ // Track the driver used inside the scenario
+ string? driverInsideScenario = null;
+ EventHandler>? initHandler = null;
+ EventHandler? scenarioIterationHandler = null;
+
+ initHandler = (s, e) =>
+ {
+ if (e.Value)
+ {
+ driverInsideScenario = Application.Driver?.GetName ();
+
+ // Request stop immediately so the scenario doesn't actually run
+ scenarioIterationHandler = (_, _) =>
+ {
+ Application.RequestStop ();
+ // Remove immediately to avoid assertions in Shutdown
+ if (scenarioIterationHandler != null)
+ {
+ Application.Iteration -= scenarioIterationHandler;
+ scenarioIterationHandler = null;
+ }
+ };
+ Application.Iteration += scenarioIterationHandler;
+ }
+ };
+
+ Application.InitializedChanged += initHandler;
+
+ // Run the scenario's Main() method (this is what UICatalog does)
+ scenario.Main ();
+ scenarioDriverName = driverInsideScenario ?? string.Empty;
+
+ Application.InitializedChanged -= initHandler;
+ scenario.Dispose ();
+
+ _output.WriteLine ($"Scenario driver: {scenarioDriverName}");
+ _output.WriteLine ("Scenario completed and disposed");
+ }
+ else
+ {
+ _output.WriteLine ("ERROR: No scenario was selected");
+ Assert.Fail ("No scenario was selected");
+ }
// Assert
- Assert.Equal (expectedDriver, firstDriverName);
- Assert.Equal (expectedDriver, secondDriverName);
- _output.WriteLine ($"SUCCESS: Driver '{expectedDriver}' persisted across Init/Shutdown cycles");
+ _output.WriteLine ($"\n=== Results ===");
+ _output.WriteLine ($"UICatalogTop driver: {topLevelDriverName}");
+ _output.WriteLine ($"Scenario driver: {scenarioDriverName}");
+
+ Assert.Equal (expectedDriver, topLevelDriverName);
+ Assert.Equal (expectedDriver, scenarioDriverName);
+ _output.WriteLine ($"SUCCESS: Driver '{expectedDriver}' persisted from UICatalogTop to scenario");
}
finally
{
+ if (iterationHandler != null)
+ {
+ Application.Iteration -= iterationHandler;
+ }
ConfigurationManager.Disable (true);
Application.ResetState (true);
}
}
///
- /// Tests that ForceDriver is used when a scenario calls Application.Init() without parameters.
- /// This simulates the actual UICatalog scenario execution flow.
+ /// Tests that ForceDriver persists when running multiple scenarios in sequence.
+ /// This verifies the scenario loop in UICatalog works correctly.
///
[Fact]
- public void ForceDriver_Used_By_Scenario_Init ()
+ public void ForceDriver_Persists_Across_Multiple_Scenarios ()
{
// Arrange
const string expectedDriver = "fake";
- Scenario? scenario = null;
-
+
ConfigurationManager.Disable (true);
Application.ResetState (true);
@@ -99,34 +196,106 @@ public class ForceDriverTests
// Enable ConfigurationManager
ConfigurationManager.Enable (ConfigLocations.All);
+ string? driver1 = null;
+ string? driver2 = null;
+ EventHandler>? initHandler1 = null;
+ EventHandler>? initHandler2 = null;
+ EventHandler? iterHandler1 = null;
+ EventHandler? iterHandler2 = null;
+
try
{
- // Get the first available scenario
+ // Get two different scenarios to test
var scenarios = Scenario.GetScenarios ();
- Assert.NotEmpty (scenarios);
+ Assert.True (scenarios.Count >= 2, "Need at least 2 scenarios for this test");
- scenario = scenarios[0];
- var scenarioName = scenario.GetName ();
- _output.WriteLine ($"Testing with scenario: {scenarioName}");
+ var scenario1 = scenarios[0];
+ var scenario2 = scenarios[1];
+
+ _output.WriteLine ($"Testing with scenarios: {scenario1.GetName ()} and {scenario2.GetName ()}");
- // Reload RuntimeConfig before scenario (as the fix does)
+ // Run scenario 1
+ initHandler1 = (s, e) =>
+ {
+ if (e.Value)
+ {
+ driver1 = Application.Driver?.GetName ();
+ iterHandler1 = (_, _) =>
+ {
+ Application.RequestStop ();
+ // Remove immediately to avoid assertions in Shutdown
+ if (iterHandler1 != null)
+ {
+ Application.Iteration -= iterHandler1;
+ iterHandler1 = null;
+ }
+ };
+ Application.Iteration += iterHandler1;
+ }
+ };
+
+ Application.InitializedChanged += initHandler1;
+ scenario1.Main ();
+ Application.InitializedChanged -= initHandler1;
+ scenario1.Dispose ();
+ _output.WriteLine ($"Scenario 1 completed with driver: {driver1}");
+
+ // Reload RuntimeConfig before scenario 2 (as the fix does)
ConfigurationManager.Load (ConfigLocations.Runtime);
ConfigurationManager.Apply ();
+ _output.WriteLine ("Reloaded RuntimeConfig");
- // Scenario calls Application.Init() - it should use ForceDriver
- Application.Init ();
- var driverName = Application.Driver?.GetName () ?? string.Empty;
- _output.WriteLine ($"Scenario driver: {driverName}");
+ // Run scenario 2
+ initHandler2 = (s, e) =>
+ {
+ if (e.Value)
+ {
+ driver2 = Application.Driver?.GetName ();
+ iterHandler2 = (_, _) =>
+ {
+ Application.RequestStop ();
+ // Remove immediately to avoid assertions in Shutdown
+ if (iterHandler2 != null)
+ {
+ Application.Iteration -= iterHandler2;
+ iterHandler2 = null;
+ }
+ };
+ Application.Iteration += iterHandler2;
+ }
+ };
+
+ Application.InitializedChanged += initHandler2;
+ scenario2.Main ();
+ Application.InitializedChanged -= initHandler2;
+ scenario2.Dispose ();
+ _output.WriteLine ($"Scenario 2 completed with driver: {driver2}");
// Assert
- Assert.Equal (expectedDriver, driverName);
- _output.WriteLine ($"SUCCESS: Scenario uses ForceDriver '{expectedDriver}'");
-
- Application.Shutdown ();
+ Assert.Equal (expectedDriver, driver1);
+ Assert.Equal (expectedDriver, driver2);
+ _output.WriteLine ($"SUCCESS: Driver '{expectedDriver}' persisted across both scenarios");
}
finally
{
- scenario?.Dispose ();
+ // Cleanup any remaining handlers
+ if (initHandler1 != null)
+ {
+ Application.InitializedChanged -= initHandler1;
+ }
+ if (iterHandler2 != null)
+ {
+ Application.InitializedChanged -= initHandler2;
+ }
+ if (iterHandler1 != null)
+ {
+ Application.Iteration -= iterHandler1;
+ }
+ if (iterHandler2 != null)
+ {
+ Application.Iteration -= iterHandler2;
+ }
+
ConfigurationManager.Disable (true);
Application.ResetState (true);
}