Пример #1
0
        public void ProcessActUsage_HealSelfWithHalfHp_HpRestored()
        {
            // ARRANGE
            const int HEAL_EFFICIENT = 1;

            var actUsageRandomSourceMock = new Mock <ITacticalActUsageRandomSource>();

            actUsageRandomSourceMock.Setup(x => x.RollEfficient(It.IsAny <Roll>())).Returns(HEAL_EFFICIENT);
            var actUsageRandomSource = actUsageRandomSourceMock.Object;

            var perkResolverMock = new Mock <IPerkResolver>();
            var perkResolver     = perkResolverMock.Object;

            var actUsageService = new ActorActUsageHandler(perkResolver, actUsageRandomSource);

            var survivalModuleMock = new Mock <ISurvivalModule>();
            var survivalModule     = survivalModuleMock.Object;

            var personMock = new Mock <IPerson>();

            personMock.Setup(x => x.GetModule <ISurvivalModule>(It.IsAny <string>())).Returns(survivalModule);
            personMock.Setup(x => x.HasModule(It.Is <string>(x => x == nameof(ISurvivalModule)))).Returns(true);
            var person = personMock.Object;

            var actorMock = new Mock <IActor>();

            actorMock.SetupGet(x => x.Node).Returns(new HexNode(0, 0));
            actorMock.SetupGet(x => x.Person).Returns(person);
            actorMock.Setup(x => x.UseAct(It.IsAny <IGraphNode>(), It.IsAny <ICombatAct>()))
            .Raises <IGraphNode, ICombatAct>(x => x.UsedAct += null,
                                             (target1, act1) => new UsedActEventArgs(target1, act1));
            var actor = actorMock.Object;

            var actStatScheme = new TestTacticalActStatsSubScheme
            {
                Effect    = TacticalActEffectType.Heal,
                Efficient = new Roll(6, 1),
                Targets   = TacticalActTargets.Self
            };

            var tacticalActMock = new Mock <ICombatAct>();

            tacticalActMock.SetupGet(x => x.Stats).Returns(actStatScheme);
            var tacticalAct = tacticalActMock.Object;

            var usedActs = new CombatActRoll(tacticalAct, 1);

            var map = Mock.Of <ISectorMap>();

            // ACT
            actUsageService.ProcessActUsage(actor, actor, usedActs, map);

            // ASSERT
            survivalModuleMock.Verify(x =>
                                      x.RestoreStat(It.Is <SurvivalStatType>(type => type == SurvivalStatType.Health),
                                                    It.Is <int>(v => v == HEAL_EFFICIENT)));
        }
Пример #2
0
        public void UseOn_ArmorSavePassed_ActEfficientDecrease()
        {
            // ARRANGE
            const OffenseType OFFENCETYPE              = OffenseType.Tactical;
            const int         FAKE_TOHIT_DICE_ROLL     = 2;                          // успех в ToHit 2+
            const int         FAKE_ARMORSAVE_DICE_ROLL = 6;                          // успех в ArmorSave 4+ при раных рангах
            const int         FAKE_ACTEFFICIENT_ROLL   = 3;                          // эффективность пробрасывается D3, максимальный бросок
            const int         EXPECTED_ACTEFFICIENT    = FAKE_ACTEFFICIENT_ROLL - 1; // -1 даёт текущая броня

            var actUsageRandomSourceMock = new Mock <ITacticalActUsageRandomSource>();

            actUsageRandomSourceMock.Setup(x => x.RollToHit(It.IsAny <Roll>())).Returns(FAKE_TOHIT_DICE_ROLL);
            actUsageRandomSourceMock.Setup(x => x.RollArmorSave()).Returns(FAKE_ARMORSAVE_DICE_ROLL);
            actUsageRandomSourceMock.Setup(x => x.RollEfficient(It.IsAny <Roll>())).Returns(FAKE_ACTEFFICIENT_ROLL);
            var actUsageRandomSource = actUsageRandomSourceMock.Object;

            var perkResolverMock = new Mock <IPerkResolver>();
            var perkResolver     = perkResolverMock.Object;

            var actUsageService = new ActorActUsageHandler(perkResolver, actUsageRandomSource);

            var actorMock = new Mock <IActor>();

            actorMock.SetupGet(x => x.Node).Returns(new HexNode(0, 0));
            var actor = actorMock.Object;

            var armors      = new[] { new PersonArmorItem(ImpactType.Kinetic, PersonRuleLevel.Lesser, 10) };
            var monsterMock = CreateMonsterMock(armors: armors);
            var monster     = monsterMock.Object;

            // Настройка дествия
            var actScheme = new TestTacticalActStatsSubScheme
            {
                Offence = new TestTacticalActOffenceSubScheme
                {
                    Type   = OFFENCETYPE,
                    ApRank = 10,
                    Impact = ImpactType.Kinetic
                }
            };

            var actMock = new Mock <ICombatAct>();

            actMock.SetupGet(x => x.Stats).Returns(actScheme);
            var act = actMock.Object;

            var map = Mock.Of <ISectorMap>();

            // ACT
            var usedActs = new CombatActRoll(act, FAKE_ACTEFFICIENT_ROLL);

            actUsageService.ProcessActUsage(actor, monster, usedActs, map);

            // ASSERT
            actUsageRandomSourceMock.Verify(x => x.RollArmorSave(), Times.Once);
            monsterMock.Verify(x => x.TakeDamage(It.Is <int>(damage => damage == EXPECTED_ACTEFFICIENT)), Times.Once);
        }
Пример #3
0
        public void ProcessActUsage_ActApGreaterRankThatArmorRank_IgnoreArmor()
        {
            // ARRANGE
            var offenceType       = OffenseType.Tactical;
            var fakeToHitDiceRoll = 2; // успех в ToHit 2+

            var actUsageRandomSourceMock = new Mock <ITacticalActUsageRandomSource>();

            actUsageRandomSourceMock.Setup(x => x.RollToHit(It.IsAny <Roll>())).Returns(fakeToHitDiceRoll);
            actUsageRandomSourceMock.Setup(x => x.RollEfficient(It.IsAny <Roll>())).Returns(1);
            var actUsageRandomSource = actUsageRandomSourceMock.Object;

            var perkResolverMock = new Mock <IPerkResolver>();
            var perkResolver     = perkResolverMock.Object;

            var actUsageService = new ActorActUsageHandler(perkResolver, actUsageRandomSource);

            var actorMock = new Mock <IActor>();

            actorMock.SetupGet(x => x.Node).Returns(new HexNode(0, 0));
            var actor = actorMock.Object;

            var armors      = new[] { new PersonArmorItem(ImpactType.Kinetic, PersonRuleLevel.Normal, 10) };
            var monsterMock = CreateMonsterMock(armors: armors);
            var monster     = monsterMock.Object;

            // Настройка дествия
            var actScheme = new TestTacticalActStatsSubScheme
            {
                Offence = new TestTacticalActOffenceSubScheme
                {
                    Type   = offenceType,
                    ApRank = 20,
                    Impact = ImpactType.Kinetic
                }
            };

            var actMock = new Mock <ICombatAct>();

            actMock.SetupGet(x => x.Stats).Returns(actScheme);
            var act = actMock.Object;

            var map = Mock.Of <ISectorMap>();

            // ACT
            var usedActs = new CombatActRoll(act, 1);

            actUsageService.ProcessActUsage(actor, monster, usedActs, map);

            // ASSERT
            monsterMock.Verify(x => x.TakeDamage(It.IsAny <int>()), Times.Once);
            actUsageRandomSourceMock.Verify(x => x.RollArmorSave(), Times.Never);
        }
Пример #4
0
        public void ProcessActUsage_OffenceTypeVsDefenceType_Success()
        {
            // ARRANGE
            var offenceType       = OffenseType.Tactical;
            var defenceType       = DefenceType.TacticalDefence;
            var defenceLevel      = PersonRuleLevel.Normal;
            var fakeToHitDiceRoll = 5; // 5+ - успех при нормальном уровне обороны

            var actUsageRandomSourceMock = new Mock <ITacticalActUsageRandomSource>();

            actUsageRandomSourceMock.Setup(x => x.RollToHit(It.IsAny <Roll>())).Returns(fakeToHitDiceRoll);
            actUsageRandomSourceMock.Setup(x => x.RollEfficient(It.IsAny <Roll>())).Returns(1);
            var actUsageRandomSource = actUsageRandomSourceMock.Object;

            var perkResolverMock = new Mock <IPerkResolver>();
            var perkResolver     = perkResolverMock.Object;

            var actUsageService = new ActorActUsageHandler(perkResolver, actUsageRandomSource);

            var actorMock = new Mock <IActor>();

            actorMock.SetupGet(x => x.Node).Returns(new HexNode(0, 0));
            var actor = actorMock.Object;

            var defences    = new[] { new PersonDefenceItem(defenceType, defenceLevel) };
            var monsterMock = CreateMonsterMock(defences);
            var monster     = monsterMock.Object;

            // Настройка дествия
            var actScheme = new TestTacticalActStatsSubScheme
            {
                Offence = new TestTacticalActOffenceSubScheme
                {
                    Type = offenceType
                }
            };

            var actMock = new Mock <ICombatAct>();

            actMock.SetupGet(x => x.Stats).Returns(actScheme);
            var act = actMock.Object;

            var map = Mock.Of <ISectorMap>();

            // ACT
            var usedActs = new CombatActRoll(act, 1);

            actUsageService.ProcessActUsage(actor, monster, usedActs, map);

            // ASSERT
            monsterMock.Verify(x => x.TakeDamage(It.IsAny <int>()), Times.Once);
        }
Пример #5
0
        public void ProcessActUsage_MonsterHitByActAndKill_SetPerkProgress()
        {
            // ARRANGE

            var perkResolverMock = new Mock <IPerkResolver>();
            var perkResolver     = perkResolverMock.Object;

            var actUsageRandomSourceMock = new Mock <ITacticalActUsageRandomSource>();

            actUsageRandomSourceMock.Setup(x => x.RollToHit(It.IsAny <Roll>())).Returns(6);
            actUsageRandomSourceMock.Setup(x => x.RollEfficient(It.IsAny <Roll>())).Returns(1);
            var actUsageRandomSource = actUsageRandomSourceMock.Object;

            var actUsageService = new ActorActUsageHandler(perkResolver, actUsageRandomSource);

            var personMock = new Mock <IPerson>();
            var person     = personMock.Object;

            var actorMock = new Mock <IActor>();

            actorMock.SetupGet(x => x.Node).Returns(new HexNode(0, 0));
            actorMock.SetupGet(x => x.Person).Returns(person);
            var actor = actorMock.Object;

            var monsterMock = CreateOnHitMonsterMock();
            var monster     = monsterMock.Object;
            var act         = CreateTestAct();

            var map = Mock.Of <ISectorMap>();

            // ACT
            var usedActs = new CombatActRoll(act, 1);

            actUsageService.ProcessActUsage(actor, monster, usedActs, map);

            // ASSERT
            perkResolverMock.Verify(x => x.ApplyProgress(
                                        It.Is <IJobProgress>(progress => CheckDefeateProgress(progress, monster)),
                                        It.IsAny <IEvolutionModule>()
                                        ), Times.Once);
        }