Files
PolyTraderSharp/tests/PolyTrader.Tests/FeeModelTests.cs
T
RichardandClaude Opus 4.8 2f5270a2f3 RF-Slice 0: FeeModel nach Core (geteilte Markt-Infrastruktur)
Vorbereitung fuer das ResolutionFarming-Modul: FeeModel von
PolyTrader.Modules.CopyTrading.Logic nach PolyTrader.Core.Trading verschoben, damit
mehrere Strategiemodule dieselbe Fee-Logik nutzen koennen (Module duerfen nicht
voneinander abhaengen -> geteiltes gehoert in den Core). CopyTrading-Referenzen +
FeeModelTests auf den Core-Namespace umgestellt. Rein mechanisch, verhaltensneutral.

Build 0 Fehler, 244 Tests gruen, --smoke-ui ok.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-09 21:35:11 +02:00

57 lines
1.9 KiB
C#

using PolyTrader.Core.Trading;
using Xunit;
using static PolyTrader.Core.Trading.FeeModel;
namespace PolyTrader.Tests
{
/// <summary>
/// Sicherheitsnetz für die Fee-Logik (Phase 0.2): Kategorie-Fallback + Fee-Berechnung.
/// </summary>
public class FeeModelTests
{
[Theory]
[InlineData("Sports", 75)]
[InlineData("SPORTS", 75)] // case-insensitive
[InlineData("Crypto", 180)]
[InlineData("Geopolitics", 0)]
[InlineData("Politics", 100)]
[InlineData("Finance", 100)]
[InlineData("Economics", 100)]
[InlineData("Weird-Unknown", 100)] // konservativer Default
[InlineData("", 100)]
[InlineData(null, 100)]
public void FallbackBps_maps_category(string? category, int expected)
{
Assert.Equal(expected, FallbackBps(category));
}
[Fact]
public void FeeUsd_is_notional_times_bps()
{
Assert.Equal(1.0m, FeeUsd(100m, 100)); // 1,0 % von 100
Assert.Equal(0.9m, FeeUsd(50m, 180)); // 1,8 % von 50
}
[Theory]
[InlineData(100, 0)] // kein Satz
[InlineData(0, 100)] // kein Notional
[InlineData(-5, 100)] // negatives Notional
public void FeeUsd_zero_cases(double notional, int bps)
{
Assert.Equal(0m, FeeUsd((decimal)notional, bps));
}
// ----- ResolveBps (M6) -----
[Theory]
[InlineData(120, "Sports", 120)] // realer Satz gewinnt
[InlineData(0, "Sports", 75)] // kein realer Satz -> Kategorie-Fallback
[InlineData(0, "Crypto", 180)]
[InlineData(0, null, 100)] // unbekannt -> Default
public void ResolveBps_prefers_actual_then_fallback(int takerFeeBps, string? category, int expected)
{
Assert.Equal(expected, ResolveBps(takerFeeBps, category));
}
}
}