using System.ComponentModel; using System.Linq; using System.Reflection; using PolyTraderSharp.Models; using Xunit; namespace PolyTrader.Tests { /// /// Fixiert die entscheidungsrelevanten Default-Werte und stellt sicher, dass alle /// einstellbaren Settings eine [Description] als Erklärung tragen (Richards Vorgabe). /// public class SettingsDefaultsTests { [Fact] public void ProfitTarget_defaults_to_9999_inactive() { Assert.Equal(9999m, new CopyTradingAccountSettings().ProfitTarget); } [Fact] public void New_account_settings_have_expected_defaults() { var s = new CopyTradingAccountSettings(); Assert.Equal(15.0m, s.SellFloorPct); Assert.Equal(5.0m, s.MaxSpreadPct); Assert.Equal(10.0m, s.MinSellRatioPct); } [Fact] public void Master_auto_pause_is_on_by_default_maker_off() { var t = new TrackedTrader(); Assert.True(t.AutoPauseEnabled); Assert.False(t.MakerEntry); } [Theory] [InlineData(typeof(CopyTradingAccountSettings))] [InlineData(typeof(TrackedTrader))] public void All_browsable_writable_settings_have_a_description(System.Type type) { var missing = type.GetProperties(BindingFlags.Public | BindingFlags.Instance) .Where(p => p.CanWrite) .Where(p => p.GetCustomAttribute()?.Browsable != false) .Where(p => string.IsNullOrWhiteSpace(p.GetCustomAttribute()?.Description)) .Select(p => p.Name) .ToList(); Assert.True(missing.Count == 0, $"Ohne [Description]: {string.Join(", ", missing)}"); } } }