using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using PolyTrader.Core.Modularity;
using Xunit;
namespace PolyTrader.Tests
{
/// Sicherheitsnetz für das gemeinsame „Fenster"-Menü (Slice 1): Inhalt + Verhalten.
public class WindowMenuTests
{
private sealed class FakeUiHost : IModuleUiHost
{
public List ViewList { get; } = new();
public HashSet OpenIds { get; } = new();
public List Opened { get; } = new();
public bool MainActivated { get; private set; }
public IReadOnlyList Views => ViewList;
public bool IsOpen(string viewId) => OpenIds.Contains(viewId);
public void OpenView(string viewId) => Opened.Add(viewId);
public void ActivateMain() => MainActivated = true;
public void RegisterView(ModuleView view) => ViewList.Add(view);
public event Action? OpenStateChanged { add { } remove { } }
}
private static FakeUiHost Host()
{
var h = new FakeUiHost();
h.RegisterView(new ModuleView { Id = "core.dashboard", Title = "Dashboard", Order = 1 });
h.RegisterView(new ModuleView { Id = "core.terminal", Title = "Terminal / Logs", Order = 2 });
h.OpenIds.Add("core.terminal"); // Terminal ist offen
return h;
}
[Fact]
public void Populate_lists_launcher_views_and_exit()
{
var host = Host();
var fenster = new ToolStripMenuItem("Fenster");
WindowMenu.Populate(fenster, host, currentViewId: "core.dashboard");
var texts = fenster.DropDownItems.OfType().Select(i => i.Text).ToList();
Assert.Equal("Launcher", texts[0]);
Assert.Contains("Dashboard", texts);
Assert.Contains("Terminal / Logs", texts);
Assert.Contains("Beenden", texts);
}
[Fact]
public void Current_view_is_bold_and_checked_open_view_is_checked()
{
var host = Host();
var fenster = new ToolStripMenuItem("Fenster");
WindowMenu.Populate(fenster, host, currentViewId: "core.dashboard");
var dashboard = fenster.DropDownItems.OfType().First(i => i.Text == "Dashboard");
var terminal = fenster.DropDownItems.OfType().First(i => i.Text == "Terminal / Logs");
Assert.True(dashboard.Checked); // aktuelles Fenster
Assert.True(dashboard.Font.Bold);
Assert.True(terminal.Checked); // offenes Fenster
Assert.False(terminal.Font.Bold);
}
[Fact]
public void Clicking_items_navigates()
{
var host = Host();
var fenster = new ToolStripMenuItem("Fenster");
WindowMenu.Populate(fenster, host, currentViewId: null);
var items = fenster.DropDownItems.OfType().ToList();
items.First(i => i.Text == "Launcher").PerformClick();
items.First(i => i.Text == "Terminal / Logs").PerformClick();
Assert.True(host.MainActivated);
Assert.Contains("core.terminal", host.Opened);
}
}
}