From 6cb8536241e1ca4a4a42e197650adc60aea79215 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 1 Dec 2025 22:55:46 +0000 Subject: [PATCH] Add minimal ExampleRunner example - Created new ExampleRunner example that discovers and runs all examples sequentially - Minimal implementation with no UI - just console output - Discovers examples from Examples directory and runs them with FakeDriver - Shows success/failure status for each example - Returns exit code 0 if all pass, 1 if any fail Note: Key injection via ExampleContextInjector needs debugging for out-of-process mode Co-authored-by: tig <585482+tig@users.noreply.github.com> --- Examples/ExampleRunner/ExampleRunner.csproj | 15 +++ Examples/ExampleRunner/Program.cs | 103 ++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 Examples/ExampleRunner/ExampleRunner.csproj create mode 100644 Examples/ExampleRunner/Program.cs diff --git a/Examples/ExampleRunner/ExampleRunner.csproj b/Examples/ExampleRunner/ExampleRunner.csproj new file mode 100644 index 000000000..75ae4d41e --- /dev/null +++ b/Examples/ExampleRunner/ExampleRunner.csproj @@ -0,0 +1,15 @@ + + + Exe + + + + 2.0 + 2.0 + 2.0 + 2.0 + + + + + diff --git a/Examples/ExampleRunner/Program.cs b/Examples/ExampleRunner/Program.cs new file mode 100644 index 000000000..522e18867 --- /dev/null +++ b/Examples/ExampleRunner/Program.cs @@ -0,0 +1,103 @@ +#nullable enable +// Example Runner - Demonstrates discovering and running all examples using the example infrastructure + +using System.Diagnostics.CodeAnalysis; +using Terminal.Gui.Examples; + +[assembly: ExampleMetadata ("Example Runner", "Discovers and runs all examples sequentially")] +[assembly: ExampleCategory ("Infrastructure")] + +// Discover examples from the Examples directory +string? assemblyDir = Path.GetDirectoryName (System.Reflection.Assembly.GetExecutingAssembly ().Location); + +if (assemblyDir is null) +{ + Console.WriteLine ("Error: Could not determine assembly directory"); + + return 1; +} + +// Go up to find the Examples directory - from bin/Debug/net8.0 to Examples +string examplesDir = Path.GetFullPath (Path.Combine (assemblyDir, "..", "..", "..", "..")); + +if (!Directory.Exists (examplesDir)) +{ + Console.WriteLine ($"Error: Examples directory not found: {examplesDir}"); + + return 1; +} + +Console.WriteLine ($"Searching for examples in: {examplesDir}\n"); + +// Discover all examples - look specifically in each example's bin directory +List examples = []; +HashSet seen = []; + +foreach (string dir in Directory.GetDirectories (examplesDir)) +{ + string binDir = Path.Combine (dir, "bin", "Debug", "net8.0"); + + if (!Directory.Exists (binDir)) + { + continue; + } + + foreach (ExampleInfo example in ExampleDiscovery.DiscoverFromDirectory (binDir, "*.dll", SearchOption.TopDirectoryOnly)) + { + // Don't include this runner in the list and avoid duplicates + if (example.Name != "Example Runner" && seen.Add (example.Name)) + { + examples.Add (example); + } + } +} + +Console.WriteLine ($"Discovered {examples.Count} examples\n"); + +// Run all examples sequentially +var successCount = 0; +var failCount = 0; + +foreach (ExampleInfo example in examples) +{ + Console.Write ($"Running: {example.Name,-40} "); + + // Create context for running the example + ExampleContext context = new () + { + DriverName = "FakeDriver", + KeysToInject = ["Esc"], // Just press Esc to quit each example + TimeoutMs = 5000, + Mode = ExecutionMode.OutOfProcess + }; + + try + { + ExampleResult result = ExampleRunner.Run (example, context); + + if (result.Success) + { + Console.WriteLine ($"✓ Success"); + successCount++; + } + else if (result.TimedOut) + { + Console.WriteLine ($"✗ Timeout"); + failCount++; + } + else + { + Console.WriteLine ($"✗ Failed: {result.ErrorMessage ?? "Unknown"}"); + failCount++; + } + } + catch (Exception ex) + { + Console.WriteLine ($"✗ Exception: {ex.Message}"); + failCount++; + } +} + +Console.WriteLine ($"\n=== Summary: {successCount} passed, {failCount} failed ==="); + +return failCount == 0 ? 0 : 1;