public void UseOn_Attack_RaiseUsedAct() { // ARRANGE var handlerSelector = CreateEmptyHandlerSelector(); var actUsageService = new TacticalActUsageService( _actUsageRandomSource, handlerSelector); 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 <ITacticalAct>())) .Raises <IGraphNode, ITacticalAct>(x => x.UsedAct += null, (target1, act1) => new UsedActEventArgs(target1, act1)); var actor = actorMock.Object; var monsterMock = CreateMonsterMock(); var monster = monsterMock.Object; var usedActs = new UsedTacticalActs(new[] { _act }); var actTargetInfo = new ActTargetInfo(monster, monster.Node); using var monitor = actor.Monitor(); // ACT actUsageService.UseOn(actor, actTargetInfo, usedActs, _sector); // ASSERT monitor.Should().Raise(nameof(IActor.UsedAct)); }
public void UseOn_MonsterHitByAct_MonsterTakesDamage() { // ARRANGE var actUsageService = new TacticalActUsageService(_actUsageRandomSource, _perkResolver); var actorMock = new Mock <IActor>(); actorMock.SetupGet(x => x.Node).Returns(new HexNode(0, 0)); var actor = actorMock.Object; var monsterMock = new Mock <IActor>(); monsterMock.SetupGet(x => x.Node).Returns(new HexNode(1, 0)); var monster = monsterMock.Object; var monsterStateMock = new Mock <IActorState>(); monsterStateMock.SetupGet(x => x.IsDead).Returns(false); var monsterState = monsterStateMock.Object; monsterMock.SetupGet(x => x.State).Returns(monsterState); // ACT actUsageService.UseOn(actor, monster, _act); // ASSERT monsterMock.Verify(x => x.TakeDamage(It.IsAny <float>()), Times.Once); }
private static void RegisterActUsageServices(IServiceCollection container) { container.AddScoped <IActUsageHandlerSelector>(serviceProvider => { var handlers = serviceProvider.GetServices <IActUsageHandler>(); var handlersArray = handlers.ToArray(); var handlerSelector = new ActUsageHandlerSelector(handlersArray); return(handlerSelector); }); container.AddScoped <IActUsageHandler>(serviceProvider => { var perkResolver = serviceProvider.GetRequiredService <IPerkResolver>(); var randomSource = serviceProvider.GetRequiredService <ITacticalActUsageRandomSource>(); var handler = new ActorActUsageHandler(perkResolver, randomSource); ConfigurateActorActUsageHandler(serviceProvider, handler); return(handler); }); container.AddScoped <IActUsageHandler, StaticObjectActUsageHandler>(); container.AddScoped <ITacticalActUsageService>(serviceProvider => { var randomSource = serviceProvider.GetRequiredService <ITacticalActUsageRandomSource>(); var actHandlerSelector = serviceProvider.GetRequiredService <IActUsageHandlerSelector>(); var sectorManager = serviceProvider.GetRequiredService <ISectorManager>(); var tacticalActUsageService = new TacticalActUsageService(randomSource, sectorManager, actHandlerSelector); ConfigurateTacticalActUsageService(serviceProvider, tacticalActUsageService); return(tacticalActUsageService); }); }
public void UseOn_Wall_ThrowsInvalidOperationException() { // ARRANGE var sectorManager = CreateSectorManagerWithWall(); var actUsageService = new TacticalActUsageService( _actUsageRandomSource, _perkResolver, sectorManager); 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 = CreateMonsterMock(); var monster = monsterMock.Object; // ACT var usedActs = new UsedTacticalActs(new[] { _act }); Action act = () => { actUsageService.UseOn(actor, monster, usedActs); }; // ASSERT act.Should().Throw <InvalidOperationException>(); }
public void UseOn_Wall_ThrowsUsageThroughtWallException() { // ARRANGE var sector = CreateSectorManagerWithWall(); var handlerSelector = CreateEmptyHandlerSelector(); var actUsageService = new TacticalActUsageService( _actUsageRandomSource, handlerSelector); 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 = CreateMonsterMock(); var monster = monsterMock.Object; var actTargetInfo = new ActTargetInfo(monster, monster.Node); var usedActs = new UsedTacticalActs(new[] { _act }); // ACT Action act = () => { actUsageService.UseOn(actor, actTargetInfo, usedActs, sector); }; // ASSERT act.Should().Throw <UsageThroughtWallException>(); }
public void UseOn_MonsterHitByActAndKill_SetPerkProgress() { // ARRANGE var actUsageService = new TacticalActUsageService(_actUsageRandomSource, _perkResolver, _sectorManager); 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; // ACT var usedActs = new UsedTacticalActs(new[] { _act }); actUsageService.UseOn(actor, monster, usedActs); // ASSERT _perkResolverMock.Verify(x => x.ApplyProgress( It.Is <IJobProgress>(progress => CheckDefeateProgress(progress, monster)), It.IsAny <IEvolutionData>() ), Times.Once); }
public void UseOn_Attack_RaiseUsedAct() { // ARRANGE var actUsageService = new TacticalActUsageService( _actUsageRandomSource, _perkResolver, _sectorManager); 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 <IAttackTarget>(), It.IsAny <ITacticalAct>())) .Raises <IAttackTarget, ITacticalAct>(x => x.UsedAct += null, (target1, act1) => new UsedActEventArgs(target1, act1)); var actor = actorMock.Object; var monsterMock = CreateMonsterMock(); var monster = monsterMock.Object; // ACT var usedActs = new UsedTacticalActs(new[] { _act }); using (var monitor = actor.Monitor()) { actUsageService.UseOn(actor, monster, usedActs); // ASSERT monitor.Should().Raise(nameof(IActor.UsedAct)); } }
public void UseOn_ArmorSavePassed_ActEfficientDecrease() { // ARRANGE const OffenseType offenceType = OffenseType.Tactical; const int fakeToHitDiceRoll = 2; // успех в ToHit 2+ const int fakeArmorSaveDiceRoll = 6; // успех в ArmorSave 4+ при раных рангах const int fakeActEfficientRoll = 3; // эффективность пробрасывается D3, максимальный бросок const int expectedActEfficient = fakeActEfficientRoll - 1; // -1 даёт текущая броня var actUsageRandomSourceMock = new Mock <ITacticalActUsageRandomSource>(); actUsageRandomSourceMock.Setup(x => x.RollToHit()).Returns(fakeToHitDiceRoll); actUsageRandomSourceMock.Setup(x => x.RollArmorSave()).Returns(fakeArmorSaveDiceRoll); actUsageRandomSourceMock.Setup(x => x.RollEfficient(It.IsAny <Roll>())).Returns(fakeActEfficientRoll); var actUsageRandomSource = actUsageRandomSourceMock.Object; var actUsageService = new TacticalActUsageService( actUsageRandomSource, _perkResolver, _sectorManager); 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 <ITacticalAct>(); actMock.SetupGet(x => x.Stats).Returns(actScheme); var act = actMock.Object; // ACT var usedActs = new UsedTacticalActs(new[] { act }); actUsageService.UseOn(actor, monster, usedActs); // ASSERT actUsageRandomSourceMock.Verify(x => x.RollArmorSave(), Times.Once); monsterMock.Verify(x => x.TakeDamage(It.Is <int>(damage => damage == expectedActEfficient)), Times.Once); }
public void UseOn_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 actUsageService = new TacticalActUsageService( actUsageRandomSource, _perkResolver, _sectorManager); var survivalDataMock = new Mock <ISurvivalData>(); var survivalData = survivalDataMock.Object; var personMock = new Mock <IPerson>(); personMock.Setup(x => x.Survival).Returns(survivalData); 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 <IAttackTarget>(), It.IsAny <ITacticalAct>())) .Raises <IAttackTarget, ITacticalAct>(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 <ITacticalAct>(); tacticalActMock.SetupGet(x => x.Stats).Returns(actStatScheme); var tacticalAct = tacticalActMock.Object; var usedActs = new UsedTacticalActs(new[] { tacticalAct }); // ACT actUsageService.UseOn(actor, actor, usedActs); // ASSERT survivalDataMock.Verify(x => x.RestoreStat(It.Is <SurvivalStatType>(type => type == SurvivalStatType.Health), It.Is <int>(v => v == HEAL_EFFICIENT))); }
public void UseOn_ActApGreaterRankThatArmorRank_IgnoreArmor() { // ARRANGE var offenceType = OffenseType.Tactical; var fakeToHitDiceRoll = 2; // успех в ToHit 2+ var actUsageRandomSourceMock = new Mock <ITacticalActUsageRandomSource>(); actUsageRandomSourceMock.Setup(x => x.RollToHit()).Returns(fakeToHitDiceRoll); actUsageRandomSourceMock.Setup(x => x.RollEfficient(It.IsAny <Roll>())).Returns(1); var actUsageRandomSource = actUsageRandomSourceMock.Object; var actUsageService = new TacticalActUsageService(actUsageRandomSource, _perkResolver, _sectorManager); 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 <ITacticalAct>(); actMock.SetupGet(x => x.Stats).Returns(actScheme); var act = actMock.Object; // ACT var usedActs = new UsedTacticalActs(new[] { act }); actUsageService.UseOn(actor, monster, usedActs); // ASSERT monsterMock.Verify(x => x.TakeDamage(It.IsAny <int>()), Times.Once); actUsageRandomSourceMock.Verify(x => x.RollArmorSave(), Times.Never); }
public void UseOn_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()).Returns(fakeToHitDiceRoll); actUsageRandomSourceMock.Setup(x => x.RollEfficient(It.IsAny <Roll>())).Returns(1); var actUsageRandomSource = actUsageRandomSourceMock.Object; var actUsageService = new TacticalActUsageService(actUsageRandomSource, _perkResolver, _sectorManager); 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 <ITacticalAct>(); actMock.SetupGet(x => x.Stats).Returns(actScheme); var act = actMock.Object; // ACT var usedActs = new UsedTacticalActs(new[] { act }); actUsageService.UseOn(actor, monster, usedActs); // ASSERT monsterMock.Verify(x => x.TakeDamage(It.IsAny <int>()), Times.Once); }
public void UseOn_MonsterHitByActAndKill_SetPerkProgress() { // ARRANGE var actUsageService = new TacticalActUsageService(_actUsageRandomSource, _perkResolver); 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 = new Mock <IActor>(); monsterMock.SetupGet(x => x.Node).Returns(new HexNode(1, 0)); var monster = monsterMock.Object; var monsterStateMock = new Mock <IActorState>(); var monsterState = monsterStateMock.Object; monsterMock.SetupGet(x => x.State).Returns(monsterState); var monsterIsDead = false; monsterStateMock.SetupGet(x => x.IsDead).Returns(() => monsterIsDead); monsterStateMock.Setup(x => x.TakeDamage(It.IsAny <float>())).Callback(() => monsterIsDead = true); monsterMock.Setup(x => x.TakeDamage(It.IsAny <float>())).Callback <float>(damage => monsterState.TakeDamage(damage)); // ACT actUsageService.UseOn(actor, monster, _act); // ASSERT _perkResolverMock.Verify(x => x.ApplyProgress( It.Is <IJobProgress>(progress => CheckDefeateProgress(progress, monster)), It.IsAny <IEvolutionData>() ), Times.Once); }
private static void ConfigurateTacticalActUsageService(IServiceProvider serviceProvider, TacticalActUsageService tacticalActUsageService) { // Указание необязательных зависимостей tacticalActUsageService.EquipmentDurableService = serviceProvider.GetService <IEquipmentDurableService>(); }
public void UseOn_DecreaseBullets_BulletRemovedFromInventory() { // ARRANGE var handlerSelector = CreateEmptyHandlerSelector(); var actUsageService = new TacticalActUsageService( _actUsageRandomSource, handlerSelector); 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 actStatsSubScheme = new TestTacticalActStatsSubScheme { Offence = new TestTacticalActOffenceSubScheme { Type = OffenseType.Tactical, Impact = ImpactType.Kinetic, ApRank = 10 } }; var actConstrainsSubScheme = new TestTacticalActConstrainsSubScheme { PropResourceType = "7-62", PropResourceCount = 1 }; var inventory = new InventoryModule(); var bulletScheme = new TestPropScheme { Sid = "bullet-7-62", Bullet = new TestPropBulletSubScheme { Caliber = "7-62" } }; inventory.Add(new Resource(bulletScheme, 10)); personMock.Setup(x => x.GetModule <IInventoryModule>(It.IsAny <string>())).Returns(inventory); var actMock = new Mock <ITacticalAct>(); actMock.SetupGet(x => x.Stats).Returns(actStatsSubScheme); actMock.SetupGet(x => x.Constrains).Returns(actConstrainsSubScheme); var shootAct = actMock.Object; var actTargetInfo = new ActTargetInfo(monster, monster.Node); var usedActs = new UsedTacticalActs(new[] { shootAct }); // ACT actUsageService.UseOn(actor, actTargetInfo, usedActs, _sector); // ASSERT var bullets = inventory.CalcActualItems().Single(x => x.Scheme.Sid == "bullet-7-62") as Resource; bullets.Count.Should().Be(9); }