From ed2eb36d07be9f817fa4a0f9c50679b654824bac Mon Sep 17 00:00:00 2001 From: Codex Automation Date: Fri, 5 Jun 2026 11:15:46 +0200 Subject: [PATCH] Harden CI-sensitive recording and taskbar tests --- .../RecordingCoordinatorTests.cs | 6 +- .../Taskbar/TaskbarIconRenderer.cs | 64 ++++++++++++++++++- 2 files changed, 65 insertions(+), 5 deletions(-) diff --git a/MeetingAssistant.Tests/RecordingCoordinatorTests.cs b/MeetingAssistant.Tests/RecordingCoordinatorTests.cs index dfeaa8c..3dc9fe1 100644 --- a/MeetingAssistant.Tests/RecordingCoordinatorTests.cs +++ b/MeetingAssistant.Tests/RecordingCoordinatorTests.cs @@ -17,7 +17,7 @@ public sealed class RecordingCoordinatorTests { private static async Task WaitUntilAsync(Func condition) { - var deadline = DateTimeOffset.UtcNow.AddSeconds(5); + var deadline = DateTimeOffset.UtcNow.AddSeconds(15); while (DateTimeOffset.UtcNow < deadline) { if (condition()) @@ -367,7 +367,7 @@ public sealed class RecordingCoordinatorTests clock.Advance(TimeSpan.FromSeconds(2)); await promptService.WaitForPromptAsync(); - await WaitUntilAsync(() => !coordinator.CurrentStatus.IsRecording); + await WaitUntilAsync(() => summaryPipeline.WasRun); Assert.Single(promptService.Requests); Assert.False(coordinator.CurrentStatus.IsRecording); @@ -464,7 +464,7 @@ public sealed class RecordingCoordinatorTests await WaitUntilAsync(() => clock.PendingDelayCount > 0); clock.Advance(TimeSpan.FromSeconds(3)); - await WaitUntilAsync(() => !coordinator.CurrentStatus.IsRecording); + await WaitUntilAsync(() => summaryPipeline.WasRun); Assert.Single(promptService.Requests); Assert.True(summaryPipeline.WasRun); diff --git a/MeetingAssistant/Taskbar/TaskbarIconRenderer.cs b/MeetingAssistant/Taskbar/TaskbarIconRenderer.cs index 22e71bd..8eb2a32 100644 --- a/MeetingAssistant/Taskbar/TaskbarIconRenderer.cs +++ b/MeetingAssistant/Taskbar/TaskbarIconRenderer.cs @@ -52,10 +52,11 @@ internal static class TaskbarIconRenderer { using var path = new GraphicsPath(); using var format = StringFormat.GenericTypographic; + using var fontFamily = CreateGlyphFontFamily(out var fontStyle); path.AddString( text, - FontFamily.GenericSansSerif, - (int)FontStyle.Bold, + fontFamily, + (int)fontStyle, 9, Point.Empty, format); @@ -69,6 +70,65 @@ internal static class TaskbarIconRenderer graphics.FillPath(textBrush, path); } + private static FontFamily CreateGlyphFontFamily(out FontStyle fontStyle) + { + foreach (var name in new[] { "Segoe UI", "Arial", "DejaVu Sans", "Liberation Sans", "Noto Sans" }) + { + try + { + var family = new FontFamily(name); + if (TryGetUsableStyle(family, out fontStyle)) + { + return family; + } + + family.Dispose(); + } + catch (ArgumentException) + { + } + } + + using var installedFonts = new InstalledFontCollection(); + foreach (var installedFamily in installedFonts.Families) + { + try + { + var family = new FontFamily(installedFamily.Name); + if (TryGetUsableStyle(family, out fontStyle)) + { + return family; + } + + family.Dispose(); + } + catch (ArgumentException) + { + } + } + + fontStyle = FontStyle.Bold; + return FontFamily.GenericSansSerif; + } + + private static bool TryGetUsableStyle(FontFamily family, out FontStyle fontStyle) + { + if (family.IsStyleAvailable(FontStyle.Bold)) + { + fontStyle = FontStyle.Bold; + return true; + } + + if (family.IsStyleAvailable(FontStyle.Regular)) + { + fontStyle = FontStyle.Regular; + return true; + } + + fontStyle = FontStyle.Regular; + return false; + } + [DllImport("user32.dll", SetLastError = true)] private static extern bool DestroyIcon(IntPtr hIcon); }