using Avalonia; using Avalonia.Controls; using Avalonia.Headless; using Avalonia.Input; using Avalonia.VisualTree; using DodoSSH.Client.App.Views; using DodoSSH.Client.Session; using DodoSSH.Client.Shell.ViewModels; using DodoSSH.Client.Ssh; using DodoSSH.Client.Storage; using DodoSSH.Client.Terminal; using NSubstitute; namespace DodoSSH.Client.App.Layout.Tests; /// /// The titlebar's own search pill still opens the quick-connect palette after v5b's redraw. /// /// /// A narrow suite on purpose: already holds the bar to its declared /// height and proves nothing inside it is unreachable, and the search pill's own accent-on-hover border is /// a style rule with nothing to assert headlessly. What is worth a gesture is the one thing a fidelity pass /// could quietly break without any layout test noticing — the pill no longer opening what Ctrl+K opens. /// public sealed class TitleBarTests : IAsyncLifetime { private ClientCacheFactory caches = null!; private TerminalWorkspace workspace = null!; private MainWindowViewModel shell = null!; private static CancellationToken Token => TestContext.Current.CancellationToken; /// public ValueTask InitializeAsync() { caches = ClientCacheFactory.ForMemory($"titlebar-{Guid.CreateVersion7():N}"); workspace = new TerminalWorkspace( new InMemoryTerminalAssetProvider(new Dictionary(StringComparer.Ordinal)), Substitute.For(), TimeProvider.System); shell = new MainWindowViewModel( ClientPaths.Default, caches, workspace, new VaultKnownHostStore(), Substitute.For(), (_, _) => throw new NotSupportedException("nothing here signs in"), TimeProvider.System, Substitute.For()) { // The search pill is disabled while locked — see TitleBar.axaml's IsEnabled binding — and this // is the only state that gesture is reachable in. State = ShellState.Unlocked, }; return ValueTask.CompletedTask; } /// public async ValueTask DisposeAsync() { await shell.DisposeAsync(); await workspace.DisposeAsync(); caches.Dispose(); } [Fact] public async Task ClickingTheSearchPill_OpensTheQuickConnectPalette() { await LayoutHarness.OnTheUiThreadAsync( () => { var bar = new TitleBar { DataContext = shell }; var window = LayoutHarness.HostAtMinimumSize( bar, LayoutHarness.MinimumWidth, LayoutHarness.TitleBarHeight); try { shell.IsSearching.ShouldBeFalse("nothing has been pressed yet"); var pill = bar.GetVisualDescendants() .OfType