Phase 1: Modul-System formalisiert (IModule + ModuleRegistry) - Core/Modules/IModule.cs: Vertrag (Key, DisplayName, Description, Version, RegisterServices, InitializeAsync, GetWorkers, CreateWindow) - Core/Modules/ModuleRegistry.cs - CongressTradingModule auf IModule umgestellt (instanzbasiert, Platzhalter-Fenster) - Program.cs iteriert ueber IModule[] + Registry; Form1 initialisiert Module ueber Registry - Testbarkeit: WorkerBase DB-Log-Seam (virtuell); CapitolTradesScraper.ParseTradesFromHtml extrahiert (offline gegen ct_raw.html testbar) - Tests: ModuleRegistry, CongressTradingModule, WorkerBase, CapitolTradesScraper -> 15/15 gruen Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> @
50 lines
1.5 KiB
C#
50 lines
1.5 KiB
C#
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<IWorker> 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<ArgumentNullException>();
|
|
}
|
|
}
|