feat(guild): add GuildConfig with ShippedDefaults

This commit is contained in:
gamer147
2026-06-27 11:07:54 -04:00
parent f4533aabd3
commit 7f245b50d6
2 changed files with 57 additions and 0 deletions

View File

@@ -0,0 +1,26 @@
using System.Collections.Generic;
using System.Linq;
namespace SVSim.Database.Models.Config;
/// <summary>
/// Guild-feature configuration: membership caps, search caps, stamp palette,
/// and chat-polling intervals. All collection defaults live in
/// <see cref="ShippedDefaults"/> (not property initializers) to survive the
/// GameConfigService tier-merge correctly.
/// </summary>
[ConfigSection("Guild")]
public sealed class GuildConfig
{
public int MaxMemberNum { get; init; } = 30;
public int MaxSubLeaderNum { get; init; } = 2;
public int SearchResultCap { get; init; } = 50;
public int ChatPollIdleSeconds { get; init; } = 10;
public int ChatPollActiveSeconds { get; init; } = 3;
public List<int> UsableStampList { get; init; } = new();
public static GuildConfig ShippedDefaults() => new()
{
UsableStampList = Enumerable.Range(100001, 20).ToList(),
};
}

View File

@@ -0,0 +1,31 @@
using NUnit.Framework;
using SVSim.Database.Models.Config;
using System.Linq;
namespace SVSim.UnitTests.Config;
[TestFixture]
public class GuildConfigDefaultsTests
{
[Test]
public void ShippedDefaults_carry_capture_matching_stamps_and_caps()
{
var c = GuildConfig.ShippedDefaults();
Assert.That(c.MaxMemberNum, Is.EqualTo(30));
Assert.That(c.MaxSubLeaderNum, Is.EqualTo(2));
Assert.That(c.SearchResultCap, Is.EqualTo(50));
Assert.That(c.UsableStampList, Is.EqualTo(Enumerable.Range(100001, 20).ToList()));
}
[Test]
public void Property_initializers_alone_leave_stamp_list_empty()
{
// Defensive check: if someone moves UsableStampList default off ShippedDefaults
// and into a property initializer, the config-section tier merge will silently
// empty it. See feedback_config_defaults.md.
var c = new GuildConfig();
Assert.That(c.UsableStampList, Is.Empty,
"UsableStampList must default empty on property init; populated only by ShippedDefaults().");
}
}