public void GivenInjuredBlademasterInHand_WhenSummoned_ThenBlademasterDealsFourDamageToHimself()
        {
            var gameState = GameState.Empty.With(PlayerGameState.Empty.With(_player,
                                                                            hand: x => x.AddCard(Minions.InjuredBlademaster), remainingMana: x => 10));
            var summonAction = new SummonBattlecryTargetless(_player, Minions.InjuredBlademaster);

            var newState = _testee.ApplyAction(gameState, summonAction);

            Assert.IsTrue(newState.Of(_player).Minions.Single().Health == Minions.InjuredBlademaster.Health - 4);
        }
        public void GivenEmptyBoard_WhenSummonsMurlocTidehunter_ThenPlayerWillHaveBothTidehunterAndScoutOnboard()
        {
            var gameState = GameState.Empty.With(
                PlayerGameState.Empty.With(_player, hand: x => x.AddCard(Minions.MurlocTidehunter), remainingMana: x => 10));
            var summonAction = new SummonBattlecryTargetless(_player, Minions.MurlocTidehunter);

            var newState = _testee.ApplyAction(gameState, summonAction);

            var supposedTidehunter = newState.Of(_player).Minions.First();
            var supposedScout      = newState.Of(_player).Minions.Last();

            Assert.IsTrue(supposedTidehunter.Attack == 2 && supposedTidehunter.Health == 1);
            Assert.IsTrue(supposedScout.Attack == 1 && supposedTidehunter.Health == 1);
        }
        public void GivenNoviceEngineerInHand_WhenSummoned_ThenPlayerDrawsOneCard()
        {
            var novice    = Minions.NoviceEngineer;
            var gameState = GameState.Empty.With(
                PlayerGameState.Empty.With(_player, hand: x => x.AddCard(novice), remainingMana: x => novice.ManaCost,
                                           deck: x => x.With(Minions.BoulderfistOgre.Yield())));

            var action = new SummonBattlecryTargetless(_player, novice);

            var newState = _testee.ApplyAction(gameState, action);

            Assert.IsTrue(newState.Of(_player).Hand.Single() == Minions.BoulderfistOgre);
            Assert.IsTrue(newState.Of(_player).Deck.IsEmpty);
        }
        public void GivenNightBladeInHand_WhenSummoned_ThenEnemyFaceRecievesThreeDamage()
        {
            var nightBlade = Minions.NightBlade;
            var bFace      = Face.Empty;
            var gameState  = GameState.Empty.With(
                PlayerGameState.Empty.With(_player, hand: x => x.AddCard(nightBlade), remainingMana: x => nightBlade.ManaCost),
                PlayerGameState.Empty.With(face: x => bFace));

            var action = new SummonBattlecryTargetless(_player, nightBlade);

            var newState = _testee.ApplyAction(gameState, action);

            Assert.IsTrue(newState.OfOpponent(_player).Face.Health == bFace.Health - 3);
        }
        public void GivenDarkscaleHealerInHand_WhenSummoned_ThenAllFriendlyCharsHealedByTwo()
        {
            var healer    = Minions.DarkscaleHealer;
            var face      = Face.Empty.With(health: 15);
            var minion    = Minion.Empty.With(health: 5, healthBuffCurrent: 3);
            var gameState = GameState.Empty.With(
                PlayerGameState.Empty.With(_player, x => face, x => x.Add(minion), hand: x => x.AddCard(healer), remainingMana: x => healer.ManaCost));

            var action = new SummonBattlecryTargetless(_player, healer, 1);

            var newState = _testee.ApplyAction(gameState, action);

            Assert.IsTrue(newState.Of(_player).Face.Health == face.Health + 2);
            Assert.IsTrue(newState.Of(_player).Minions.First().Health == minion.Health + 2);
        }
        public void GivenArgusAndTwoMinionsOnboard_WhenPlaysArgusIntoMiddle_ThenAdjacentMinionsGotOneOneBuffAndTaunt()
        {
            var yeti      = new Minion(Minions.ChillwindYeti);
            var raptor    = new Minion(Minions.BloodfenRaptor);
            var gameState = GameState.Empty.With(PlayerGameState.Empty.With(_player, minions: x => x.AddRange(new[] { yeti, raptor }),
                                                                            hand: x => x.AddCard(Minions.DefenderOfArgus), remainingMana: x => 10));
            var summonAction = new SummonBattlecryTargetless(_player, Minions.DefenderOfArgus, 1);

            var newState = _testee.ApplyAction(gameState, summonAction);

            var minions       = newState.Of(_player).Minions;
            var newYeti       = minions[0];
            var supposedArgus = minions[1];
            var newRaptor     = minions[2];

            Assert.IsTrue(minions.Count == 3);
            Assert.IsTrue(newYeti.HasStatus(Status.Taunt) && newYeti.Health == yeti.Health + 1 && newYeti.Attack == yeti.Attack + 1);
            Assert.IsTrue(IsSimilar(supposedArgus, Minions.DefenderOfArgus));
            Assert.IsTrue(newRaptor.HasStatus(Status.Taunt) && newRaptor.Health == raptor.Health + 1 && newRaptor.Attack == raptor.Attack + 1);
        }
        public void GivenDreadInfernalnHand_WhenSummoned_ThenAllCharactersInPlayRecieveOneDamage()
        {
            var infernal  = Minions.DreadInfernal;
            var aFace     = Face.Empty;
            var bFace     = Face.Empty;
            var aMinion   = Minion.Empty.With(health: 2, healthCurrent: 2);
            var bMinion   = Minion.Empty.With(health: 3, healthCurrent: 3);
            var gameState = GameState.Empty.With(
                PlayerGameState.Empty.With(_player, x => aFace, x => x.Add(aMinion), hand: x => x.AddCard(infernal), remainingMana: x => infernal.ManaCost),
                PlayerGameState.Empty.With(Player.Empty, x => bFace, x => x.Add(bMinion)));

            var action = new SummonBattlecryTargetless(_player, infernal, desiredBoardPosition: 1);

            var newState = _testee.ApplyAction(gameState, action);

            Assert.IsTrue(newState.Of(_player).Face.Health == aFace.Health - 1);
            Assert.IsTrue(newState.Of(_player).Minions.First().Health == aMinion.Health - 1);
            Assert.IsTrue(newState.OfOpponent(_player).Face.Health == bFace.Health - 1);
            Assert.IsTrue(newState.OfOpponent(_player).Minions.First().Health == bMinion.Health - 1);

            Assert.IsTrue(newState.Of(_player).Minions.Last().Health == infernal.Health);
        }