public static void EzraDoubleActionsCampaignMission1()
        {
            var players = new List <Player>
            {
                CreateBluePlayerDoubleActionsCampaignMission1(),
                CreateGreenPlayerDoubleActionsCampaignMission1(),
                CreateYellowPlayerDoubleActionsCampaignMission1(),
                CreateRedPlayerDoubleActionsCampaignMission1()
            };

            var externalTracksByZone = new Dictionary <ZoneLocation, TrackConfiguration>
            {
                { ZoneLocation.Blue, TrackConfiguration.Track6 },
                { ZoneLocation.White, TrackConfiguration.Track2 },
                { ZoneLocation.Red, TrackConfiguration.Track5 },
            };
            const TrackConfiguration internalTrack = TrackConfiguration.Track7;

            var armoredGrappler = new ArmoredGrappler();

            armoredGrappler.SetInitialPlacement(1, ZoneLocation.Blue);
            var meteoroid = new Meteoroid();

            meteoroid.SetInitialPlacement(4, ZoneLocation.Blue);
            var dimensionSpider = new DimensionSpider();

            dimensionSpider.SetInitialPlacement(2, ZoneLocation.White);
            var gunship = new Gunship();

            gunship.SetInitialPlacement(6, ZoneLocation.White);
            var asteroid = new Asteroid();

            asteroid.SetInitialPlacement(5, ZoneLocation.Red);
            var destroyer = new Destroyer();

            destroyer.SetInitialPlacement(8, ZoneLocation.Red);
            var externalThreats = new ExternalThreat[] { armoredGrappler, meteoroid, dimensionSpider, gunship, asteroid, destroyer };

            var shambler = new Shambler();

            shambler.SetInitialPlacement(4);
            var internalThreats = new InternalThreat[] { shambler };

            var bonusThreats = new Threat[0];

            var game = new Game(players, internalThreats, externalThreats, bonusThreats, externalTracksByZone, internalTrack, null);

            game.StartGame();
            try
            {
                for (var currentTurn = 0; currentTurn < game.NumberOfTurns + 1; currentTurn++)
                {
                    game.PerformTurn();
                }
            }
            catch (LoseException loseException)
            {
                Assert.AreEqual(destroyer, loseException.Threat);
                Assert.AreEqual(GameStatus.Lost, game.GameStatus);
                Assert.AreEqual(0, game.SittingDuck.BlueZone.TotalDamage);
                Assert.AreEqual(9, game.SittingDuck.RedZone.TotalDamage);
                Assert.AreEqual(0, game.SittingDuck.WhiteZone.TotalDamage);
                Assert.AreEqual(6, game.ThreatController.DefeatedThreats.Count());
                Assert.AreEqual(0, game.ThreatController.SurvivedThreats.Count());
                Assert.AreEqual(0, players.Count(player => player.IsKnockedOut));
                Assert.AreEqual(0, game.SittingDuck.BlueZone.CurrentDamageTokens.Count);
                Assert.AreEqual(6, game.SittingDuck.RedZone.CurrentDamageTokens.Count);
                Assert.AreEqual(0, game.SittingDuck.WhiteZone.CurrentDamageTokens.Count);
            }
        }
        public static void EzraCampaign1Mission1()
        {
            var players = new List <Player>
            {
                new Player(PlayerActionFactory.CreateSingleActionList(new PlayerActionType?[]
                {
                    PlayerActionType.MoveRed, null, PlayerActionType.BasicSpecialization,
                    PlayerActionType.Alpha, PlayerActionType.Alpha, PlayerActionType.Alpha, PlayerActionType.MoveBlue,
                    PlayerActionType.MoveBlue, PlayerActionType.Alpha, PlayerActionType.Alpha, PlayerActionType.Alpha, null
                }), 0, PlayerColor.Blue, PlayerSpecialization.EnergyTechnician),
                new Player(PlayerActionFactory.CreateSingleActionList(new PlayerActionType?[]
                {
                    PlayerActionType.MoveRed, PlayerActionType.ChangeDeck, PlayerActionType.Alpha,
                    PlayerActionType.Alpha, PlayerActionType.Bravo, PlayerActionType.MoveBlue, PlayerActionType.MoveBlue,
                    null, PlayerActionType.Alpha, PlayerActionType.Bravo, PlayerActionType.Alpha, null
                }), 1, PlayerColor.Green),
                new Player(PlayerActionFactory.CreateSingleActionList(new PlayerActionType?[]
                {
                    null, null, null,
                    PlayerActionType.MoveBlue, PlayerActionType.Charlie, PlayerActionType.ChangeDeck, PlayerActionType.BattleBots,
                    PlayerActionType.BattleBots,
                    null, PlayerActionType.MoveRed, null, PlayerActionType.Charlie
                }), 2, PlayerColor.Purple),
                new Player(PlayerActionFactory.CreateSingleActionList(new PlayerActionType?[]
                {
                    PlayerActionType.Charlie, null, null,
                    PlayerActionType.BasicSpecialization, null, PlayerActionType.ChangeDeck, null,
                    PlayerActionType.BasicSpecialization, null, null, null, PlayerActionType.Charlie
                }), 3, PlayerColor.Red, PlayerSpecialization.DataAnalyst),
            };

            var externalTracksByZone = new Dictionary <ZoneLocation, TrackConfiguration>
            {
                { ZoneLocation.Blue, TrackConfiguration.Track3 },
                { ZoneLocation.Red, TrackConfiguration.Track2 },
                { ZoneLocation.White, TrackConfiguration.Track7 },
            };
            const TrackConfiguration internalTrack = TrackConfiguration.Track4;

            var dimensionSpider = new DimensionSpider();

            dimensionSpider.SetInitialPlacement(6, ZoneLocation.Blue);
            var asteroid = new Asteroid();

            asteroid.SetInitialPlacement(4, ZoneLocation.Red);
            var cryoshieldFighter = new CryoshieldFighter();

            cryoshieldFighter.SetInitialPlacement(1, ZoneLocation.Red);
            var externalThreats = new ExternalThreat[] { dimensionSpider, asteroid, cryoshieldFighter };

            var shambler = new Shambler();

            shambler.SetInitialPlacement(5);
            var internalThreats = new InternalThreat[] { shambler };

            var bonusThreats = new Threat[0];

            var game = new Game(players, internalThreats, externalThreats, bonusThreats, externalTracksByZone, internalTrack, null);

            game.StartGame();
            for (var currentTurn = 0; currentTurn < game.NumberOfTurns + 1; currentTurn++)
            {
                game.PerformTurn();
            }
            Assert.AreEqual(GameStatus.Won, game.GameStatus);
            Assert.AreEqual(0, game.SittingDuck.BlueZone.TotalDamage);
            Assert.AreEqual(1, game.SittingDuck.RedZone.TotalDamage);
            Assert.AreEqual(0, game.SittingDuck.WhiteZone.TotalDamage);
            Assert.AreEqual(3, game.ThreatController.DefeatedThreats.Count());
            Assert.AreEqual(1, game.ThreatController.SurvivedThreats.Count());
            Assert.AreEqual(20 + 4 + 2 + 2, game.TotalPoints);
            Assert.AreEqual(1, game.SittingDuck.Zones.ElementAt(0).CurrentDamageTokens.Count);
            Assert.AreEqual(0, game.SittingDuck.Zones.ElementAt(1).CurrentDamageTokens.Count);
            Assert.AreEqual(0, game.SittingDuck.Zones.ElementAt(2).CurrentDamageTokens.Count);
        }