public static void EzraDoubleActionsCampaignMission2()
        {
            var players = new List <Player>
            {
                CreateBluePlayerDoubleActionsCampaignMission2(),
                CreateGreenPlayerDoubleActionsCampaignMission2(),
                CreateYellowPlayerDoubleActionsCampaignMission2(),
                CreateRedPlayerDoubleActionsCampaignMission2()
            };

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

            var interstellarOctopus = new InterstellarOctopus();

            interstellarOctopus.SetInitialPlacement(3, ZoneLocation.Blue);
            var meteoroid = new Meteoroid();

            meteoroid.SetInitialPlacement(8, ZoneLocation.Blue);
            var amoeba = new Amoeba();

            amoeba.SetInitialPlacement(2, ZoneLocation.White);
            var stealthFighter = new StealthFighter();

            stealthFighter.SetInitialPlacement(4, ZoneLocation.White);
            var spinningSaucer = new SpinningSaucer();

            spinningSaucer.SetInitialPlacement(7, ZoneLocation.White);
            var armoredGrappler = new ArmoredGrappler();

            armoredGrappler.SetInitialPlacement(1, ZoneLocation.Red);
            var externalThreats = new ExternalThreat[] { interstellarOctopus, meteoroid, amoeba, stealthFighter, spinningSaucer, armoredGrappler };

            var commandosB = new CommandosB();

            commandosB.SetInitialPlacement(5);
            var hackedShieldsB = new HackedShieldsB();

            hackedShieldsB.SetInitialPlacement(8);
            var internalThreats = new InternalThreat[] { commandosB, hackedShieldsB };

            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(2, game.SittingDuck.BlueZone.TotalDamage);
            Assert.AreEqual(0, game.SittingDuck.RedZone.TotalDamage);
            Assert.AreEqual(5, game.SittingDuck.WhiteZone.TotalDamage);
            Assert.AreEqual(6, game.ThreatController.DefeatedThreats.Count());
            Assert.AreEqual(2, game.ThreatController.SurvivedThreats.Count());
            Assert.AreEqual(0, players.Count(player => player.IsKnockedOut));
            Assert.AreEqual(2, game.SittingDuck.BlueZone.CurrentDamageTokens.Count);
            Assert.AreEqual(0, game.SittingDuck.RedZone.CurrentDamageTokens.Count);
            Assert.AreEqual(5, game.SittingDuck.WhiteZone.CurrentDamageTokens.Count);
        }
        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);
            }
        }