namespace RpgRoller.Tests; public sealed class ServiceHelperExtractionTests { [Fact] public void RoleSerializer_NormalizesParsesAndSerializesRoles() { var normalized = RoleSerializer.Normalize([" Admin ", "gm", "admin", "", "GM"]); var serialized = RoleSerializer.Serialize(normalized); var parsed = RoleSerializer.Parse(" admin,GM,admin "); Assert.Equal(["admin", "gm"], normalized); Assert.Equal("admin,gm", serialized); Assert.Equal(["admin", "gm"], parsed); Assert.True(RoleSerializer.HasRole(serialized, "ADMIN")); Assert.False(RoleSerializer.HasRole(serialized, "owner")); } [Theory] [InlineData("public", RollVisibility.Public)] [InlineData("PRIVATE", RollVisibility.Private)] public void RollVisibilityParser_ParsesKnownValues(string input, RollVisibility expected) { var result = RollVisibilityParser.Parse(input); Assert.True(result.Succeeded); Assert.Equal(expected, result.Value); } [Fact] public void RollVisibilityParser_RejectsUnknownValue() { var result = RollVisibilityParser.Parse("hidden"); Assert.False(result.Succeeded); Assert.Equal("invalid_visibility", result.Error!.Code); } [Fact] public void CustomRollOptionsResolver_ReturnsD6DefaultsOnlyForD6() { Assert.Equal((1, true, (int?)null), CustomRollOptionsResolver.Resolve(RulesetKind.D6)); Assert.Equal((0, false, (int?)null), CustomRollOptionsResolver.Resolve(RulesetKind.Dnd5e)); Assert.Equal((0, false, (int?)null), CustomRollOptionsResolver.Resolve(RulesetKind.Rolemaster)); } [Fact] public void SkillDefinitionValidator_ValidatesRulesetSpecificOptions() { var d6 = SkillDefinitionValidator.Validate(RulesetKind.D6, "2D+1", 1, true, null); var rolemaster = SkillDefinitionValidator.Validate(RulesetKind.Rolemaster, "d100!+15", 0, false, 5); var invalidD6 = SkillDefinitionValidator.Validate(RulesetKind.D6, "2D+1", 0, true, null); var invalidRolemaster = SkillDefinitionValidator.Validate(RulesetKind.Rolemaster, "d100!+15", 0, false, null); Assert.True(d6.Succeeded); Assert.Equal(("2D+1", 1, true, (int?)null), d6.Value); Assert.True(rolemaster.Succeeded); Assert.Equal(("d100!+15", 0, false, (int?)5), rolemaster.Value); Assert.False(invalidD6.Succeeded); Assert.Equal("invalid_wild_dice", invalidD6.Error!.Code); Assert.False(invalidRolemaster.Succeeded); Assert.Equal("invalid_fumble_range", invalidRolemaster.Error!.Code); } }