From 6fdfd17a1d7401ce2ecf172f97443b1ec103daa2 Mon Sep 17 00:00:00 2001 From: HarryCordewener Date: Mon, 6 Jul 2026 14:07:49 -0500 Subject: [PATCH] chore: strip decorative comment banners and restatements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Codebase-wide comment sweep: remove decorative `// ── Section ──` banner separators and a couple of pure restatement comments ("// main entry point"). No code changed — comment/blank lines only; all "why" notes (protocol/RFC rationale, keepalive/half-open tuning, foreground-service and EF/FTS5 constraints, DI ordering) are kept. 105 lines removed across 18 files. Core Connection/Sessions and Domain/Persistence/Platform/Diagnostics were already lean (no changes). 263 unit tests pass unchanged. Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01HHCRc5CJ6595iMzEgYYdQp --- src/SharpClient.App/MauiProgram.cs | 8 -------- .../Android/ConnectionKeepAliveService.cs | 15 --------------- .../Platforms/MacCatalyst/Program.cs | 1 - src/SharpClient.App/Platforms/iOS/Program.cs | 1 - .../Presentation/SettingsViewModel.cs | 5 ----- .../Presentation/TriggerAliasEditorViewModel.cs | 10 ---------- src/SharpClient.Data/SessionHistory.cs | 4 ---- src/SharpClient.Data/WorldStore.cs | 4 ---- src/SharpClient.UI/ServiceCollectionExtensions.cs | 2 -- src/SharpClient.Web/Program.cs | 9 --------- .../SharpClient.Data.Tests/SessionHistoryTests.cs | 14 -------------- tests/SharpClient.Data.Tests/WorldStoreTests.cs | 8 -------- .../TriggerAliasEditorViewModelTests.cs | 2 -- .../Rendering/AnsiPaletteTests.cs | 2 -- .../Sessions/RuntimeWiringTests.cs | 14 -------------- .../Sessions/SessionManagerTests.cs | 2 -- .../Triggers/TriggerEngineTests.cs | 2 -- tests/SharpClient.UI.Tests/TriggerEditorTests.cs | 2 -- 18 files changed, 105 deletions(-) diff --git a/src/SharpClient.App/MauiProgram.cs b/src/SharpClient.App/MauiProgram.cs index 02a5ca2..2626939 100644 --- a/src/SharpClient.App/MauiProgram.cs +++ b/src/SharpClient.App/MauiProgram.cs @@ -39,7 +39,6 @@ public static MauiApp CreateMauiApp() builder.Services.AddMauiBlazorWebView(); - // ── Crash / diagnostics file logging ────────────────────────────── // A single FileLogStore is the sink for both ILogger output (via FileLoggerProvider — this // captures Blazor's own Error-level log for an unhandled component exception, the "An // unhandled error has occurred" case) and the global unhandled-exception hooks below. The @@ -69,7 +68,6 @@ public static MauiApp CreateMauiApp() builder.Logging.AddDebug(); #endif - // ── TNC telnet runtime ───────────────────────────────────────────── // AddTelnetClient() is an extension method from TelnetNegotiationCore and // registers ITelnetInterpreterFactory. The TNC package IS referenced in // App.csproj so AddTelnetClient() resolves, but direct use of @@ -79,7 +77,6 @@ public static MauiApp CreateMauiApp() builder.Services.AddTelnetClient(); builder.Services.AddSingleton(); - // ── Platform services ───────────────────────────────────────────── #if ANDROID builder.Services.AddSingleton(); #else @@ -92,7 +89,6 @@ public static MauiApp CreateMauiApp() builder.Services.AddSingleton(); builder.Services.AddSingleton(); - // ── Data / persistence ──────────────────────────────────────────── // AppDbContext is transient so each call gets a fresh context; this // avoids cross-thread SQLite issues and mirrors the Web's per-request // scoped pattern without requiring HTTP request scopes in MAUI. @@ -100,20 +96,16 @@ public static MauiApp CreateMauiApp() builder.Services.AddTransient(); builder.Services.AddTransient(); - // ── Session management ──────────────────────────────────────────── builder.Services.AddSingleton(); builder.Services.AddSingleton(sp => sp.GetRequiredService()); - // ── Session launcher (real telnet) ──────────────────────────────── builder.Services.AddTransient(); - // ── View models ─────────────────────────────────────────────────── // Registered via the shared extension so MAUI and Web stay in lockstep (no host drift). // Per-view view models are Transient here to match MAUI's per-request-less lifetime model. builder.Services.AddSharpClientViewModels(ServiceLifetime.Transient); - // ── Trigger / alias engines (stateless) ────────────────────────── builder.Services.AddSingleton(); builder.Services.AddSingleton(); diff --git a/src/SharpClient.App/Platforms/Android/ConnectionKeepAliveService.cs b/src/SharpClient.App/Platforms/Android/ConnectionKeepAliveService.cs index 1d0f533..bf8ca1e 100644 --- a/src/SharpClient.App/Platforms/Android/ConnectionKeepAliveService.cs +++ b/src/SharpClient.App/Platforms/Android/ConnectionKeepAliveService.cs @@ -7,8 +7,6 @@ namespace SharpClient.App; -// ── Foreground-service declaration ──────────────────────────────────────────── -// // foregroundServiceType = "connectedDevice" // Android docs: "remote device connected through Bluetooth, NFC, IR, USB, or network." // A MUSH telnet server is a remote device connected over the network — connectedDevice is the @@ -20,28 +18,21 @@ namespace SharpClient.App; // foregroundServiceType attribute (which cannot be set via the C# ServiceAttribute). It MUST stay // in lock-step with in SharpClient.App.csproj and the entry in the // manifest, otherwise the merger emits two distinct services and startForeground throws. -// [Service(Exported = false, Name = "com.sharpmush.sharpclient.app.ConnectionKeepAliveService")] [SupportedOSPlatform("android26.0")] // Foreground services + NotificationChannel require API 26 internal sealed class ConnectionKeepAliveService : Service { - // ── Notification constants ──────────────────────────────────────────────── - private const string ChannelId = "sharpclient_keepalive"; private const string ChannelName = "Connection Keep-Alive"; private const int NotificationId = 1_001; private const string WakeLockTag = "SharpClient::KeepAlive"; - // ── Runtime state ───────────────────────────────────────────────────────── - private PowerManager.WakeLock? _wakeLock; private ConnectivityManager? _connectivity; private ConnectivityManager.NetworkCallback? _networkCallback; private Network? _boundNetwork; private bool _haveSeenNetwork; - // ── Service lifecycle ───────────────────────────────────────────────────── - public override IBinder? OnBind(Intent? intent) => null; [return: GeneratedEnum] @@ -72,8 +63,6 @@ public override void OnDestroy() base.OnDestroy(); } - // ── Wake lock ───────────────────────────────────────────────────────────── - // // A PARTIAL_WAKE_LOCK keeps the CPU running so the TCP socket and telnet-NOP keepalive keep // ticking while the screen is off / the device dozes. Released on OnDestroy (i.e. when the // coordinator Halts the service because no sessions remain connected). @@ -101,8 +90,6 @@ private void ReleaseWakeLock() _wakeLock = null; } - // ── Connectivity monitoring ─────────────────────────────────────────────── - // // Watches the device's DEFAULT network. When it changes on the move (WiFi↔cellular, tower // handoff, coming out of a dead zone) the old sockets are silently dead. We (a) pin the process // to the new network so reconnects use the live interface at once, and (b) raise a signal that @@ -183,8 +170,6 @@ private void OnNetworkLost(Network network) } } - // ── Helpers ─────────────────────────────────────────────────────────────── - private void EnsureNotificationChannel() { var channel = new NotificationChannel(ChannelId, ChannelName, NotificationImportance.Low) diff --git a/src/SharpClient.App/Platforms/MacCatalyst/Program.cs b/src/SharpClient.App/Platforms/MacCatalyst/Program.cs index e4d818c..3cf837b 100644 --- a/src/SharpClient.App/Platforms/MacCatalyst/Program.cs +++ b/src/SharpClient.App/Platforms/MacCatalyst/Program.cs @@ -5,7 +5,6 @@ namespace SharpClient.App; public class Program { - // This is the main entry point of the application. static void Main(string[] args) { // if you want to use a different Application Delegate class from "AppDelegate" diff --git a/src/SharpClient.App/Platforms/iOS/Program.cs b/src/SharpClient.App/Platforms/iOS/Program.cs index 6c984b4..8d39920 100644 --- a/src/SharpClient.App/Platforms/iOS/Program.cs +++ b/src/SharpClient.App/Platforms/iOS/Program.cs @@ -5,7 +5,6 @@ namespace SharpClient.App; public class Program { - // This is the main entry point of the application. static void Main(string[] args) { // if you want to use a different Application Delegate class from "AppDelegate" diff --git a/src/SharpClient.Core/Presentation/SettingsViewModel.cs b/src/SharpClient.Core/Presentation/SettingsViewModel.cs index b19b513..1d0c4d7 100644 --- a/src/SharpClient.Core/Presentation/SettingsViewModel.cs +++ b/src/SharpClient.Core/Presentation/SettingsViewModel.cs @@ -4,7 +4,6 @@ namespace SharpClient.Core.Presentation; public sealed class SettingsViewModel { - // ── Lookup tables ──────────────────────────────────────────────────────── public static readonly string[] FontOptions = [ "JetBrains Mono", @@ -42,7 +41,6 @@ public sealed class SettingsViewModel ["Courier"] = "Courier,'Courier New',monospace", }; - // ── State ──────────────────────────────────────────────────────────────── private readonly IPreferences _prefs; private string _outputFont; private int _minColumns; @@ -53,7 +51,6 @@ public sealed class SettingsViewModel public event Action? Changed; - // ── Constructor ────────────────────────────────────────────────────────── public SettingsViewModel(IPreferences prefs) { _prefs = prefs; @@ -72,7 +69,6 @@ public SettingsViewModel(IPreferences prefs) } } - // ── Properties ─────────────────────────────────────────────────────────── public string OutputFont { get => _outputFont; @@ -109,7 +105,6 @@ public bool Scanlines set { _scanlines = value; _prefs.SetBool("Scanlines", value); Changed?.Invoke(); } } - // ── Computed ───────────────────────────────────────────────────────────── public string FontFamily => s_fontFamilies.TryGetValue(_outputFont, out var f) ? f : "'JetBrains Mono',ui-monospace,monospace"; diff --git a/src/SharpClient.Core/Presentation/TriggerAliasEditorViewModel.cs b/src/SharpClient.Core/Presentation/TriggerAliasEditorViewModel.cs index e6b9b88..df26b9d 100644 --- a/src/SharpClient.Core/Presentation/TriggerAliasEditorViewModel.cs +++ b/src/SharpClient.Core/Presentation/TriggerAliasEditorViewModel.cs @@ -12,8 +12,6 @@ public sealed class TriggerAliasEditorViewModel public TriggerAliasEditorViewModel(IWorldStore store) => _store = store; - // ── Scope ───────────────────────────────────────────────────────────── - /// null means world scope; non-null is the character's Id. public Guid? CharacterScopeId => _characterScopeId; @@ -42,15 +40,11 @@ public void SetScope(Guid? characterId) RaiseChanged(); } - // ── Exposed lists ───────────────────────────────────────────────────── - public IReadOnlyList Triggers => ScopedTriggers; public IReadOnlyList Aliases => ScopedAliases; public event Action? Changed; - // ── Load / Set ──────────────────────────────────────────────────────── - public async Task LoadAsync(Guid worldId, CancellationToken ct = default) { _worldId = worldId; @@ -72,8 +66,6 @@ public void SetWorld(World world) RaiseChanged(); } - // ── Triggers ────────────────────────────────────────────────────────── - public async Task AddTriggerAsync(TriggerRule rule, CancellationToken ct = default) { if (_world is null) return; @@ -110,8 +102,6 @@ public async Task ToggleTriggerAsync(Guid id, CancellationToken ct = default) await LoadAsync(_worldId, ct); } - // ── Aliases ─────────────────────────────────────────────────────────── - public async Task AddAliasAsync(AliasRule rule, CancellationToken ct = default) { if (_world is null) return; diff --git a/src/SharpClient.Data/SessionHistory.cs b/src/SharpClient.Data/SessionHistory.cs index 9c4505c..a8e8169 100644 --- a/src/SharpClient.Data/SessionHistory.cs +++ b/src/SharpClient.Data/SessionHistory.cs @@ -19,8 +19,6 @@ public SessionHistory(IAppStorage storage) _dbPath = storage.GetDatabasePath(); } - // ── ISessionHistory ────────────────────────────────────────────────────── - public async Task AppendAsync(Guid characterId, string line, CancellationToken cancellationToken = default) { await using var connection = new SqliteConnection($"Data Source={_dbPath}"); @@ -64,8 +62,6 @@ public async Task> SearchAsync( return results; } - // ── Helpers ────────────────────────────────────────────────────────────── - /// /// Creates the FTS5 table if it does not yet exist. /// CREATE VIRTUAL TABLE IF NOT EXISTS is idempotent so this is safe to diff --git a/src/SharpClient.Data/WorldStore.cs b/src/SharpClient.Data/WorldStore.cs index 5075654..8697dc3 100644 --- a/src/SharpClient.Data/WorldStore.cs +++ b/src/SharpClient.Data/WorldStore.cs @@ -14,8 +14,6 @@ public sealed class WorldStore : IWorldStore public WorldStore(AppDbContext db) => _db = db; - // ── IWorldStore ────────────────────────────────────────────────────────── - public async Task> GetWorldsAsync(CancellationToken cancellationToken = default) { await EnsureSchemaAsync(cancellationToken); @@ -103,8 +101,6 @@ public async Task DeleteWorldAsync(Guid worldId, CancellationToken cancellationT } } - // ── Helpers ────────────────────────────────────────────────────────────── - private async Task EnsureSchemaAsync(CancellationToken cancellationToken) { if (_schemaEnsured) return; diff --git a/src/SharpClient.UI/ServiceCollectionExtensions.cs b/src/SharpClient.UI/ServiceCollectionExtensions.cs index 5fc37e6..a30b318 100644 --- a/src/SharpClient.UI/ServiceCollectionExtensions.cs +++ b/src/SharpClient.UI/ServiceCollectionExtensions.cs @@ -24,7 +24,6 @@ public static IServiceCollection AddSharpClientViewModels( this IServiceCollection services, ServiceLifetime perViewLifetime) { - // ── Shared-lifetime view models (Singleton in both hosts) ──────────── services.AddSingleton(sp => new SessionsViewModel(sp.GetRequiredService())); services.AddSingleton(sp => @@ -32,7 +31,6 @@ public static IServiceCollection AddSharpClientViewModels( services.AddSingleton(sp => new SettingsViewModel(sp.GetRequiredService())); - // ── Per-view view models (Transient in MAUI, Scoped in Web) ────────── services.Add(new ServiceDescriptor( typeof(WorldManagerViewModel), sp => new WorldManagerViewModel( diff --git a/src/SharpClient.Web/Program.cs b/src/SharpClient.Web/Program.cs index eb4d49f..28df9d6 100644 --- a/src/SharpClient.Web/Program.cs +++ b/src/SharpClient.Web/Program.cs @@ -15,41 +15,32 @@ builder.Services.AddRazorComponents() .AddInteractiveServerComponents(); -// ── TNC telnet runtime ───────────────────────────────────────────────────── builder.Services.AddTelnetClient(); builder.Services.AddSingleton(); -// ── Platform services ────────────────────────────────────────────────────── builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); -// ── Trigger / alias engines (stateless singletons) ───────────────────────── builder.Services.AddSingleton(); builder.Services.AddSingleton(); -// ── Platform notifier ────────────────────────────────────────────────────── builder.Services.AddSingleton(); -// ── Diagnostics ───────────────────────────────────────────────────────────── // The Web preview has no persistent file log; the no-op exporter keeps SettingsView's // ILogExporter injection satisfiable and hides the export affordance (IsAvailable == false). builder.Services.AddSingleton(); -// ── Session management ───────────────────────────────────────────────────── builder.Services.AddSingleton(); builder.Services.AddSingleton(sp => sp.GetRequiredService()); -// ── Data / persistence ───────────────────────────────────────────────────── builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); -// ── Session launcher (real telnet) ───────────────────────────────────────── builder.Services.AddScoped(); -// ── View models ──────────────────────────────────────────────────────────── // Registered via the shared extension so MAUI and Web stay in lockstep (no host drift). // Per-view view models are Scoped here to match the Web's per-request scope. builder.Services.AddSharpClientViewModels(ServiceLifetime.Scoped); diff --git a/tests/SharpClient.Data.Tests/SessionHistoryTests.cs b/tests/SharpClient.Data.Tests/SessionHistoryTests.cs index 2a805db..e30ac0a 100644 --- a/tests/SharpClient.Data.Tests/SessionHistoryTests.cs +++ b/tests/SharpClient.Data.Tests/SessionHistoryTests.cs @@ -12,8 +12,6 @@ public sealed class SessionHistoryTests [After(Test)] public void Teardown() => _storage.Delete(); - // ── Append + Search ────────────────────────────────────────────────────── - [Test] public async Task AppendThenSearchReturnsMatchingLinesWithCorrectCharacterId() { @@ -31,8 +29,6 @@ public async Task AppendThenSearchReturnsMatchingLinesWithCorrectCharacterId() await Assert.That(hits[0].Line).IsEqualTo("the quick brown fox"); } - // ── Multi-word search ──────────────────────────────────────────────────── - [Test] public async Task MultiWordSearchMatchesLinesContainingAllTerms() { @@ -51,8 +47,6 @@ public async Task MultiWordSearchMatchesLinesContainingAllTerms() await Assert.That(hits.Any(h => h.Line == "the fox is quick")).IsTrue(); } - // ── Multi-character search ──────────────────────────────────────────────── - [Test] public async Task SearchAcrossTwoCharactersReturnsCorrectCharacterIds() { @@ -73,8 +67,6 @@ public async Task SearchAcrossTwoCharactersReturnsCorrectCharacterIds() await Assert.That(hitForB.CharacterId).IsEqualTo(charB); } - // ── Limit ──────────────────────────────────────────────────────────────── - [Test] public async Task LimitIsRespectedWhenMoreMatchesExist() { @@ -89,8 +81,6 @@ public async Task LimitIsRespectedWhenMoreMatchesExist() await Assert.That(hits).Count().IsEqualTo(3); } - // ── No-match / empty ───────────────────────────────────────────────────── - [Test] public async Task SearchWithNoMatchReturnsEmptyList() { @@ -118,8 +108,6 @@ public async Task EmptyOrWhitespaceQueryReturnsEmptyListWithoutException() await Assert.That(hitsWhitespace).Count().IsEqualTo(0); } - // ── FTS-special characters ─────────────────────────────────────────────── - [Test] public async Task QueryWithFtsSpecialCharactersDoesNotThrow() { @@ -142,8 +130,6 @@ public async Task QueryWithFtsSpecialCharactersDoesNotThrow() await Assert.That(result3).Count().IsEqualTo(0); } - // ── Sequence is monotonically from rowid ───────────────────────────────── - [Test] public async Task SequenceValuesArePositiveAndDistinctPerAppend() { diff --git a/tests/SharpClient.Data.Tests/WorldStoreTests.cs b/tests/SharpClient.Data.Tests/WorldStoreTests.cs index b4dc0f7..b1ef00f 100644 --- a/tests/SharpClient.Data.Tests/WorldStoreTests.cs +++ b/tests/SharpClient.Data.Tests/WorldStoreTests.cs @@ -32,8 +32,6 @@ public sealed class WorldStoreTests [After(Test)] public void Teardown() => _storage.Delete(); - // ── Add + Get ──────────────────────────────────────────────────────────── - [Test] public async Task AddWorldThenGetWorldsReturnsFullyPopulatedGraph() { @@ -129,8 +127,6 @@ public async Task AddWorldRoundTripsConnectSecretKey() await Assert.That(loaded.ConnectSecretKey).IsEqualTo("vault:hero-key"); } - // ── Update ─────────────────────────────────────────────────────────────── - [Test] public async Task UpdateWorldRenameAndAddCharacterReflectedInGetWorlds() { @@ -172,8 +168,6 @@ public async Task UpdateWorldRemoveCharacterNotReturnedByGetWorlds() await Assert.That(worlds[0].Characters[0].Name).IsEqualTo("CharA"); } - // ── Delete ─────────────────────────────────────────────────────────────── - [Test] public async Task DeleteWorldGetWorldsReturnsEmpty() { @@ -250,8 +244,6 @@ public async Task UpdateWorldRemoveCharacterCascadesItsRulesNoOrphans() await Assert.That(await db2.AliasRules.CountAsync()).IsEqualTo(1); // world-scoped only } - // ── Helpers ────────────────────────────────────────────────────────────── - private static World BuildSampleWorld() { var world = new World diff --git a/tests/SharpClient.Tests/Presentation/TriggerAliasEditorViewModelTests.cs b/tests/SharpClient.Tests/Presentation/TriggerAliasEditorViewModelTests.cs index b65bc9b..aaca8b7 100644 --- a/tests/SharpClient.Tests/Presentation/TriggerAliasEditorViewModelTests.cs +++ b/tests/SharpClient.Tests/Presentation/TriggerAliasEditorViewModelTests.cs @@ -210,8 +210,6 @@ public async Task TriggersEmptyWhenWorldNotLoaded() await Assert.That(vm.Aliases).IsEmpty(); } - // ── Character-scope tests ───────────────────────────────────────────── - private static async Task<(TriggerAliasEditorViewModel vm, FakeWorldStore store, World world, Character character)> BuildWithCharacterAsync() { diff --git a/tests/SharpClient.Tests/Rendering/AnsiPaletteTests.cs b/tests/SharpClient.Tests/Rendering/AnsiPaletteTests.cs index 3ba27a0..88497f4 100644 --- a/tests/SharpClient.Tests/Rendering/AnsiPaletteTests.cs +++ b/tests/SharpClient.Tests/Rendering/AnsiPaletteTests.cs @@ -39,8 +39,6 @@ public async Task OutOfRangeFallsBackToPhosphor() await Assert.That(AnsiPalette.ToHex(999)).IsEqualTo("#c4d1c8"); } - // ── New tests ──────────────────────────────────────────────────────────── - [Test] public async Task GrayscaleRampEndsAtIndex255() { diff --git a/tests/SharpClient.Tests/Sessions/RuntimeWiringTests.cs b/tests/SharpClient.Tests/Sessions/RuntimeWiringTests.cs index 1529877..699338c 100644 --- a/tests/SharpClient.Tests/Sessions/RuntimeWiringTests.cs +++ b/tests/SharpClient.Tests/Sessions/RuntimeWiringTests.cs @@ -37,8 +37,6 @@ public async Task TearDown() } } - // ── Task 1: ISession identity ───────────────────────────────────────────── - [Test] public async Task SessionExposesWorldIdAndCharacterId() { @@ -72,8 +70,6 @@ public async Task ISessionDefaultIdentityDimIsEmpty() await Assert.That(session.CharacterId).IsEqualTo(Guid.Empty); } - // ── Task 2: World↔session correlation ──────────────────────────────────── - [Test] public async Task ActiveSessionForMatchesByCharacterId() { @@ -182,8 +178,6 @@ public async Task IsWorldLiveFalseWhenNoCharacterHasSession() await Assert.That(vm.IsWorldLive(vm.Worlds[0])).IsFalse(); } - // ── Task 3: NAWS forwarding ─────────────────────────────────────────────── - [Test] public async Task SendWindowSizeAsyncForwardsNawsToConnection() { @@ -197,8 +191,6 @@ public async Task SendWindowSizeAsyncForwardsNawsToConnection() await Assert.That(conn.NawsSent[0].Height).IsEqualTo(24); } - // ── Task 4: Alias expansion ─────────────────────────────────────────────── - [Test] public async Task SendAsyncExpandsAliasBeforeSending() { @@ -233,8 +225,6 @@ public async Task SendAsyncPassesThroughWhenNoMatchingAlias() await Assert.That(conn.Sent).Contains("look"); } - // ── Task 5: Trigger application ─────────────────────────────────────────── - [Test] public async Task IncomingLineAppliesTriggerSendCommand() { @@ -310,8 +300,6 @@ public async Task IncomingLineUsesAnsiParserWhenNoTriggerEngine() await Assert.That(session.Scrollback[0].Segments[0].Text).IsEqualTo("plain text"); } - // ── Task 6: Session history ─────────────────────────────────────────────── - [Test] public async Task IncomingLineCallsHistoryAppendAsync() { @@ -332,8 +320,6 @@ public async Task IncomingLineCallsHistoryAppendAsync() await Assert.That(history.Appended[0].Line).IsEqualTo("The goblin attacks!"); } - // ── Task 7: Error state on failed connect ───────────────────────────────── - [Test] public async Task ConnectToUnreachableHostSetsErrorState() { diff --git a/tests/SharpClient.Tests/Sessions/SessionManagerTests.cs b/tests/SharpClient.Tests/Sessions/SessionManagerTests.cs index b8cec85..f650d74 100644 --- a/tests/SharpClient.Tests/Sessions/SessionManagerTests.cs +++ b/tests/SharpClient.Tests/Sessions/SessionManagerTests.cs @@ -63,8 +63,6 @@ public async Task CloseLastSessionLeavesNoActive() await Assert.That(mgr.Active).IsNull(); } - // ── New tests ──────────────────────────────────────────────────────────── - [Test] public async Task CloseNonActiveSessionKeepsCurrentActive() { diff --git a/tests/SharpClient.Tests/Triggers/TriggerEngineTests.cs b/tests/SharpClient.Tests/Triggers/TriggerEngineTests.cs index 0e2d5c8..721f239 100644 --- a/tests/SharpClient.Tests/Triggers/TriggerEngineTests.cs +++ b/tests/SharpClient.Tests/Triggers/TriggerEngineTests.cs @@ -275,8 +275,6 @@ public async Task MultipleSendCommandsAllCollected() await Assert.That(outcome.SendCommands).Contains("loot"); } - // ── New tests ──────────────────────────────────────────────────────────── - [Test] public async Task HighlightOutOfRangeActionValueSkippedFirstColourKept() { diff --git a/tests/SharpClient.UI.Tests/TriggerEditorTests.cs b/tests/SharpClient.UI.Tests/TriggerEditorTests.cs index 91379b4..fa62344 100644 --- a/tests/SharpClient.UI.Tests/TriggerEditorTests.cs +++ b/tests/SharpClient.UI.Tests/TriggerEditorTests.cs @@ -154,8 +154,6 @@ public async Task TwoSectionsRenderTriggersAndAliases() await Assert.That(cut.Markup).Contains("Aliases"); } - // ── Inline edit tests ────────────────────────────────────────────────── - [Test] public async Task EditButtonIsRenderedPerTriggerRow() {