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;