public void CorrectlyGeneratesBattlefield_ShadeGroupingAndBellTerrainConfiguration()
        {
            const int fighterLevel = 1;
            FighterGroupingConfiguration groupingConfig = new ShadeGroupingConfiguration(3, fighterLevel);

            BellType[] bellTypes = { BellType.Copper, BellType.Silver };
            TerrainInteractablesConfiguration terrainConfiguration = new BellTerrainConfiguration(bellTypes);

            BattlefieldConfiguration config = new BattlefieldConfiguration(groupingConfig, terrainConfiguration);

            BattleFieldInfo returnedBattleFieldInfo = _factory.GetBattleFieldSetUp(config);

            List <IFighter> fighters = returnedBattleFieldInfo.EnemyTeam.Fighters;

            Assert.AreEqual(3, fighters.Count);
            Assert.True(fighters.TrueForAll(f => f is Shade), "the returned fighters should be Shades!");
            Assert.True(fighters.TrueForAll(f => f.Level == fighterLevel), $"the returned fighters should all be level {fighterLevel}!");

            List <TerrainInteractable> terrainInteractables = returnedBattleFieldInfo.TerrainInteractables.ToList();

            Assert.AreEqual(2, terrainInteractables.Count);
            Assert.True(terrainInteractables.TrueForAll(b => b is Bell));

            List <Bell> bells = terrainInteractables.OfType <Bell>().ToList();

            for (var i = 0; i < bellTypes.Length; ++i)
            {
                Assert.AreEqual(bellTypes[i], bells[i].BellType);
            }
        }
        public void CorrectlyGeneratesEnemyTeams_FromBattlefieldConfiguration([Values(new[] { FighterType.Goblin, FighterType.Fairy }, new[] { FighterType.Warrior, FighterType.ShieldGuy })] IEnumerable <FighterType> enemyTypes)
        {
            List <FighterType> enemyTypesList = enemyTypes.ToList();

            TeamConfiguration bossConfiguration = new TeamConfiguration(new EnemyConfiguration(FighterType.Barbarian, 5), new EnemyConfiguration(FighterType.ShieldGuy, 2), new EnemyConfiguration(FighterType.ShieldGuy, 3));

            ShadeGroupingConfiguration shadeGroupingConfig = new ShadeGroupingConfiguration(3, 1);

            BellType[] bellTypes = { BellType.Silver, BellType.Copper };
            BellTerrainConfiguration bellConfig   = new BellTerrainConfiguration(bellTypes);
            BattlefieldConfiguration battleConfig = new BattlefieldConfiguration(shadeGroupingConfig, bellConfig);

            List <ScriptedBattlefieldConfiguration> scriptedBattlefieldConfigurations = new List
                                                                                        <ScriptedBattlefieldConfiguration>
            {
                new ScriptedBattlefieldConfiguration(battleConfig, 0)
            };

            SubRegion subRegion = new SubRegion(WorldSubRegion.Fields,
                                                1,
                                                new[] { new ChanceEvent <int>(2, 1) },
                                                enemyTypesList,
                                                new BattlefieldConfiguration(bossConfiguration),
                                                scriptedBattlefieldConfigurations);

            SubRegion[] subRegions = { subRegion };

            Region fakeFieldsRegion = new Region(WorldRegion.Fields, new BattleMove[0], subRegions);

            _regionFactory.SetRegion(WorldRegion.Fields, fakeFieldsRegion);

            _regionManager = GetRegionManager();

            _humanFighter1.SetMove(_runawayMove);
            _humanFighter1.SetMoveTarget(_humanFighter1);

            _humanFighter2.SetMove(_doNothingMove);

            _regionManager.Battle(_battleManager, _humanTeam);

            Team            enemyTeam     = _battleManager.GetAllEnemyTeams()[0];
            List <IFighter> enemyFighters = enemyTeam.Fighters;

            Assert.AreEqual(3, enemyFighters.Count);
            Assert.True(enemyFighters.TrueForAll(ef => ef is Shade));

            List <TerrainInteractable> terrainInteractables = _battleManager.GetAllTerrainInteractableLists()[0];

            Assert.NotNull(terrainInteractables);
            Assert.AreEqual(2, terrainInteractables.Count);

            List <Bell> bells = terrainInteractables.OfType <Bell>().ToList();

            Assert.AreEqual(bellTypes.Length, bells.Count);
            for (var i = 0; i < bellTypes.Length; ++i)
            {
                Assert.AreEqual(bellTypes[i], bells[i].BellType);
            }
        }