public void ACBonus_Deflection()
        {
            // Arrange
            byte acBonus = 10;

            var mockBonusTracker = new Mock <IModifierTracker>();

            mockBonusTracker.Setup(bt => bt.GetTotal())
            .Returns(acBonus);

            var mockArmorClass = new Mock <IArmorClass>();

            mockArmorClass.Setup(ac => ac.DeflectionBonuses)
            .Returns(mockBonusTracker.Object);

            var mockCharacter = new Mock <ICharacter>();

            mockCharacter.Setup(c => c.ArmorClass)
            .Returns(mockArmorClass.Object);

            CombatManeuverDefense cmd = new CombatManeuverDefense(mockCharacter.Object);

            // Act
            var result = cmd.DeflectionBonuses.GetTotal();

            // Assert
            Assert.AreEqual(acBonus, result,
                            "Deflection bonuses to AC should also affect CMD.");
        }
        public void GetTotal_Aggregates()
        {
            // Arrange
            var mockBaseAttackBonus = new Mock <IBaseAttackBonus>();

            mockBaseAttackBonus.Setup(bab => bab.GetTotal())
            .Returns(20);

            var mockAttackBonusesSection = new Mock <IAttackBonusSection>();

            mockAttackBonusesSection.Setup(abs => abs.BaseAttackBonus)
            .Returns(mockBaseAttackBonus.Object);

            var mockStrength = new Mock <IAbilityScore>();

            mockStrength.Setup(str => str.GetModifier())
            .Returns(3);

            var mockDexterity = new Mock <IAbilityScore>();

            mockDexterity.Setup(dex => dex.GetModifier())
            .Returns(2);

            var mockAbilityScores = new Mock <IAbilityScoreSection>();

            mockAbilityScores.Setup(abs => abs.Strength)
            .Returns(mockStrength.Object);
            mockAbilityScores.Setup(abs => abs.Dexterity)
            .Returns(mockDexterity.Object);

            var mockCharacter = new Mock <ICharacter>();

            mockCharacter.Setup(c => c.AttackBonuses)
            .Returns(mockAttackBonusesSection.Object);
            mockCharacter.Setup(c => c.AbilityScores)
            .Returns(mockAbilityScores.Object);
            mockCharacter.Setup(c => c.Size)
            .Returns(SizeCategory.Large);

            CombatManeuverDefense cmd = new CombatManeuverDefense(mockCharacter.Object);

            cmd.CircumstanceBonuses.Add(() => 2);
            cmd.DeflectionBonuses.Add(() => 2);
            cmd.DodgeBonuses.Add(() => 2);
            cmd.InsightBonuses.Add(() => 2);
            cmd.LuckBonuses.Add(() => 2);
            cmd.MoraleBonuses.Add(() => 2);
            cmd.ProfaneBonuses.Add(() => 2);
            cmd.SacredBonuses.Add(() => 2);
            cmd.UntypedBonuses.Add(() => 2);
            cmd.Penalties.Add(() => 10);

            // Act
            var result = cmd.GetTotal();

            // Assert
            Assert.AreEqual(44, result,
                            "44 = 10 + (20 BAB) + (1 large) + (2 dex) + (3 str) + (2 circumstance) + (2 deflection) + (2 dodge) + (2 insight) + (2 luck) + (2 morale) + (2 profane) + (2 sacred) + (2 untyped) - (10 penalties)");
        }
        public void GetTotal_Default()
        {
            // Arrange
            var mockBaseAttackBonus = new Mock <IBaseAttackBonus>();

            mockBaseAttackBonus.Setup(bab => bab.GetTotal())
            .Returns(0);

            var mockAttackBonusesSection = new Mock <IAttackBonusSection>();

            mockAttackBonusesSection.Setup(abs => abs.BaseAttackBonus)
            .Returns(mockBaseAttackBonus.Object);

            var mockStrength = new Mock <IAbilityScore>();

            mockStrength.Setup(str => str.GetModifier())
            .Returns(0);

            var mockDexterity = new Mock <IAbilityScore>();

            mockDexterity.Setup(dex => dex.GetModifier())
            .Returns(0);

            var mockAbilityScores = new Mock <IAbilityScoreSection>();

            mockAbilityScores.Setup(abs => abs.Strength)
            .Returns(mockStrength.Object);
            mockAbilityScores.Setup(abs => abs.Dexterity)
            .Returns(mockDexterity.Object);

            var mockCharacter = new Mock <ICharacter>();

            mockCharacter.Setup(c => c.AttackBonuses)
            .Returns(mockAttackBonusesSection.Object);
            mockCharacter.Setup(c => c.AbilityScores)
            .Returns(mockAbilityScores.Object);
            mockCharacter.Setup(c => c.Size)
            .Returns(SizeCategory.Medium);

            CombatManeuverDefense cmd = new CombatManeuverDefense(mockCharacter.Object);

            // Act
            var result = cmd.GetTotal();

            // Assert
            Assert.AreEqual(10, result,
                            "A medium-sized character with +0 BAB, 10 strength, and 10 dexterity should have a CMD of 10.");
        }
        public void GetSizeModifier_Large()
        {
            // Arrange
            var mockCharacter = new Mock <ICharacter>();

            mockCharacter.Setup(c => c.Size)
            .Returns(SizeCategory.Large);
            CombatManeuverDefense cmd = new CombatManeuverDefense(mockCharacter.Object);

            // Act
            var sizeMod = cmd.GetSizeModifier();

            // Assert
            Assert.AreEqual(1, sizeMod,
                            "Large characters should have a +1 size modifier to their CMD.");
        }
        public void Default()
        {
            // Arrange
            var character             = Mock.Of <ICharacter>();
            CombatManeuverDefense cmd = new CombatManeuverDefense(character);

            // Arrange
            Assert.IsInstanceOf <CircumstanceBonusTracker>(cmd.CircumstanceBonuses);
            Assert.IsInstanceOf <DeflectionBonusTracker>(cmd.DeflectionBonuses);
            Assert.IsInstanceOf <DodgeBonusTracker>(cmd.DodgeBonuses);
            Assert.IsInstanceOf <InsightBonusTracker>(cmd.InsightBonuses);
            Assert.IsInstanceOf <LuckBonusTracker>(cmd.LuckBonuses);
            Assert.IsInstanceOf <MoraleBonusTracker>(cmd.MoraleBonuses);
            Assert.IsInstanceOf <ProfaneBonusTracker>(cmd.ProfaneBonuses);
            Assert.IsInstanceOf <SacredBonusTracker>(cmd.SacredBonuses);
            Assert.IsInstanceOf <UntypedBonusTracker>(cmd.UntypedBonuses);
            Assert.IsInstanceOf <PenaltyTracker>(cmd.Penalties);
        }