public void StartAFight_ThenAnotherPlayerJoins_ResultsInRaisedHeroStrength_Test()
        {
            var quest = QuestFactory.CreateStartedWithMaleHero(
                out var gameStore,
                out var gameId,
                out var playerId,
                out var sequence);

            var xena = new Hero(PlayerFactory.CreateFemale("Xena"));
            var game = quest.GetState(gameId);
            var hero = game.GetHero(playerId);

            var heroLevelRaise = LevelMessage.Create(sequence.Next, playerId, 1);
            var heroBonusRaise = BonusMessage.Create(sequence.Next, playerId, 1);
            var addXena        = PlayerMessage.CreateAdd(sequence.Next, new[] { xena.Player });
            var xenaLevelRaise = LevelMessage.Create(sequence.Next, xena.Player.Id, 1);
            var xenaBonusRaise = BonusMessage.Create(sequence.Next, xena.Player.Id, 1);
            var startFight     = FightStartMessage.Create(sequence.Next, hero.Player.Id, zerschmetterling);
            var preparation    = new GameMessage[] { heroLevelRaise, heroBonusRaise, addXena, xenaLevelRaise, xenaBonusRaise, startFight };

            var xenaJoinsFight = FightJoinMessage.Create(sequence.Next, xena.Player.Id);

            quest.AddMessages(gameId, preparation);
            game = quest.AddMessage(gameId, xenaJoinsFight);

            Assert.NotNull(game.Score.Fight);
            Assert.Equal(2, game.Score.Fight.Heroes.Count);
            Assert.Equal(6, game.Score.Fight.TotalHeroesScore);
        }
        public void StartingAFightWhenGameIsNotStarted_ThrowsInvalidActionException_Test()
        {
            // Arrange
            var quest      = QuestFactory.CreateStored(out var gameStore, out var gameId);
            var hero       = new Hero(PlayerFactory.CreateMale("GI Joe"));
            var monster    = new Monster("Plastiksoldaten", 2);
            var startFight = FightStartMessage.Create(1, hero.Player.Id, monster);

            // Act & Assert
            Assert.Throws <InvalidActionException>(() => quest.AddMessage(gameId, startFight));
        }
        public void StartingAFightWhileAnotherFightIsNotEnded_ThrowsInvalidActionException_Test()
        {
            // Arrange
            var quest             = QuestFactory.CreateStartedWithMaleHero(out var gameStore, out var gameId, out var playerId, out var sequence);
            var monster           = new Monster("Plastiksoldaten", 2);
            var startFight        = FightStartMessage.Create(sequence.Next, playerId, monster);
            var startAnotherFight = FightStartMessage.Create(sequence.Next, playerId, monster);

            // Act & Assert
            quest.AddMessage(gameId, startFight);
            Assert.Throws <InvalidActionException>(() => quest.AddMessage(gameId, startAnotherFight));
        }
        public void StartAndEndAFight_ResultingInAnEmptyFightState_Test()
        {
            var quest = QuestFactory.CreateStartedWithMaleHero(
                out var gameStore,
                out var gameId,
                out var playerId,
                out var sequence);

            var game = quest.GetState(gameId);
            var hero = game.GetHero(playerId);

            var startFight = FightStartMessage.Create(sequence.Next, hero.Player.Id, zerschmetterling);
            var endFight   = FightEndMessage.Create(sequence.Next, badThings);

            quest.AddMessage(gameId, startFight);
            game = quest.AddMessage(gameId, endFight);

            Assert.Null(game.Score.Fight);
        }
        public void StartFight_ResultingInASetFightState_Test()
        {
            var quest = QuestFactory.CreateStartedWithMaleHero(
                out var gameStore,
                out var gameId,
                out var playerId,
                out var sequence);

            var game = quest.GetState(gameId);
            var hero = game.GetHero(playerId);

            var startFight = FightStartMessage.Create(sequence.Next, hero.Player.Id, zerschmetterling);

            game = quest.AddMessage(gameId, startFight);

            Assert.NotNull(game.Score.Fight);
            Assert.Equal(zerschmetterling.Name, game.Score.Fight.Monsters.First().Name);
            Assert.Equal(hero.Player.Id, game.Score.Fight.Heroes.First().Player.Id);
        }