namespace RpgRoller.Tests; public sealed class DiceRulesTests { [Fact] public void DiceRules_CoversParsingAndMappingBranches() { Assert.Equal(RulesetKind.D6, DiceRules.TryParseRulesetId("d6")); Assert.Equal(RulesetKind.Dnd5e, DiceRules.TryParseRulesetId("dnd5e")); Assert.Equal(RulesetKind.Rolemaster, DiceRules.TryParseRulesetId("rolemaster")); Assert.Null(DiceRules.TryParseRulesetId("unknown")); var d6 = DiceRules.ParseExpression(RulesetKind.D6, "5D+4"); var dnd = DiceRules.ParseExpression(RulesetKind.Dnd5e, "2d12+2"); var rolemasterInitiative = DiceRules.ParseExpression(RulesetKind.Rolemaster, "2d10-15"); var rolemasterPercentile = DiceRules.ParseExpression(RulesetKind.Rolemaster, "d100+4"); var rolemasterOpenEnded = DiceRules.ParseExpression(RulesetKind.Rolemaster, "1d100!+85"); var emptyExpression = DiceRules.ParseExpression(RulesetKind.Dnd5e, ""); var badFormat = DiceRules.ParseExpression(RulesetKind.Dnd5e, "abc"); var tooManyDice = DiceRules.ParseExpression(RulesetKind.D6, "51D+1"); var tooManySides = DiceRules.ParseExpression(RulesetKind.Dnd5e, "1d1001"); var tooLargeModifier = DiceRules.ParseExpression(RulesetKind.Dnd5e, "1d20+1001"); var negativeDndModifier = DiceRules.ParseExpression(RulesetKind.Dnd5e, "1d20-1"); var invalidRolemasterFormat = DiceRules.ParseExpression(RulesetKind.Rolemaster, "2d12+1"); var tooNegativeRolemasterModifier = DiceRules.ParseExpression(RulesetKind.Rolemaster, "d100-1001"); var unknownRulesetExpression = DiceRules.ParseExpression((RulesetKind)99, "1d20+1"); Assert.True(d6.Succeeded); Assert.True(dnd.Succeeded); Assert.True(rolemasterInitiative.Succeeded); Assert.True(rolemasterPercentile.Succeeded); Assert.True(rolemasterOpenEnded.Succeeded); Assert.False(emptyExpression.Succeeded); Assert.False(badFormat.Succeeded); Assert.False(tooManyDice.Succeeded); Assert.False(tooManySides.Succeeded); Assert.False(tooLargeModifier.Succeeded); Assert.False(negativeDndModifier.Succeeded); Assert.False(invalidRolemasterFormat.Succeeded); Assert.False(tooNegativeRolemasterModifier.Succeeded); Assert.False(unknownRulesetExpression.Succeeded); Assert.Equal("2d10-15", rolemasterInitiative.Value!.Canonical); Assert.Equal(DiceExpressionKind.RolemasterInitiative, rolemasterInitiative.Value.Kind); Assert.Equal("d100+4", rolemasterPercentile.Value!.Canonical); Assert.Equal(DiceExpressionKind.RolemasterPercentile, rolemasterPercentile.Value.Kind); Assert.Equal("d100!+85", rolemasterOpenEnded.Value!.Canonical); Assert.Equal(DiceExpressionKind.RolemasterOpenEndedPercentile, rolemasterOpenEnded.Value.Kind); Assert.Equal("d6", DiceRules.ToRulesetId(RulesetKind.D6)); Assert.Equal("dnd5e", DiceRules.ToRulesetId(RulesetKind.Dnd5e)); Assert.Equal("rolemaster", DiceRules.ToRulesetId(RulesetKind.Rolemaster)); Assert.Throws(() => DiceRules.ToRulesetId((RulesetKind)99)); } }