using FluentAssertions; using IBKRTrader.Core.Modules; using IBKRTrader.Core.Workers; using Microsoft.Extensions.DependencyInjection; namespace IBKRTrader.Tests.Modules; [Trait("cat", "unit")] public class ModuleRegistryTests { private sealed class FakeModule(string key) : IModule { public string Key => key; public string DisplayName => $"Fake {key}"; public string Description => "test"; public string Version => "0.0.1"; public void RegisterServices(IServiceCollection services) { } public Task InitializeAsync(IServiceProvider provider) => Task.CompletedTask; public IEnumerable GetWorkers(IServiceProvider provider) => []; public Form CreateWindow(IServiceProvider provider) => new(); } [Fact] public void Modules_PreservesRegistrationOrder() { var registry = new ModuleRegistry([new FakeModule("A"), new FakeModule("B")]); registry.Modules.Select(m => m.Key).Should().ContainInOrder("A", "B"); } [Fact] public void Find_IsCaseInsensitive() { var registry = new ModuleRegistry([new FakeModule("CT")]); registry.Find("ct").Should().NotBeNull(); registry.Find("CT").Should().NotBeNull(); registry.Find("XX").Should().BeNull(); } [Fact] public void Ctor_NullModules_Throws() { var act = () => new ModuleRegistry(null!); act.Should().Throw(); } }