public void AdministrationRule_Is_Not_Satisfied_When_Distance_To_SettlementCenter_Is_Greater_Than_40_Pixels()
        {
            IRoad road           = _settlement.Roads.First();
            var   administration = new Administration()
            {
                Position = new Point(99, 51)
            };

            var buildingPositions = road.GetPossibleBuildingPositions(new PossibleBuildingPositions(_settlement.Roads, _settlement.Fields));

            buildingPositions.Remove(administration.Position);

            while (_settlement.Roads.SelectMany(g => g.Buildings).Count() < 120)
            {
                var position = buildingPositions[RandomProvider.Next(buildingPositions.Count)];
                var building = new Residence {
                    Position = position
                };
                building.Road = road;
                _settlement.AddBuildingToRoad(road, building);
            }

            Assert.AreEqual(0, administration.CalculateFitness(new BuildingRule()
            {
                BuildingRoad     = road,
                Fields           = _settlement.Fields,
                Roads            = _settlement.Roads,
                SettlementCenter = _settlement.SettlementCenter
            }));
        }
        public void ChurchRule_Is_Not_Satisfied_When_There_Are_More_Less_100_ResidencesAnd_In_Neighborhood()
        {
            IRoad road   = _settlement.Roads.First();
            var   church = new Church()
            {
                Position = new Point(50, 51)
            };

            var buildingPositions = road.GetPossibleBuildingPositions(new PossibleBuildingPositions(_settlement.Roads, _settlement.Fields));

            buildingPositions.Remove(church.Position);

            while (_settlement.Roads.SelectMany(g => g.Buildings).Count() < 10)
            {
                var position = buildingPositions[RandomProvider.Next(buildingPositions.Count)];
                var building = new Residence {
                    Position = position
                };
                building.Road = road;
                _settlement.AddBuildingToRoad(road, building);
            }

            Assert.AreEqual(0, church.CalculateFitness(new BuildingRule()
            {
                BuildingRoad     = road,
                Fields           = _settlement.Fields,
                Roads            = _settlement.Roads,
                SettlementCenter = _settlement.SettlementCenter
            }));
        }
        public void SchoolRule_IsSatisfied__When_Ratio_Schools_Per_Residences_Is_Less_Than_1_To_100()
        {
            IRoad road   = _settlement.Roads.First();
            var   school = new School()
            {
                Position = new Point(50, 51)
            };

            var buildingPositions = road.GetPossibleBuildingPositions(new PossibleBuildingPositions(_settlement.Roads, _settlement.Fields));

            buildingPositions.Remove(school.Position);

            while (_settlement.Roads.SelectMany(g => g.Buildings).Count() < 120)
            {
                var position = buildingPositions[RandomProvider.Next(buildingPositions.Count)];
                var building = new Residence {
                    Position = position
                };
                building.Road = road;
                _settlement.AddBuildingToRoad(road, building);
            }

            Assert.AreEqual(5, school.CalculateFitness(new BuildingRule()
            {
                BuildingRoad     = road,
                Fields           = _settlement.Fields,
                Roads            = _settlement.Roads,
                SettlementCenter = _settlement.SettlementCenter
            }));
        }
        public void MarketRule_IsSatisfied_When_Exists_Other_Market_But_It_Further_Than_50_Pixels_Away()
        {
            IRoad road1   = _settlement.Roads.First();
            var   market1 = new Market()
            {
                Position = new Point(50, 51)
            };

            market1.Road = road1;
            _settlement.AddBuildingToRoad(road1, market1);

            //add vertical road to the end of the road to increase distance between markets
            var roadGenerator = new RoadPointsGenerator();
            var road2         = new Road(roadGenerator.GenerateStraight(new RoadGenerationTwoPoints()
            {
                Start  = new Point(98, 51),
                End    = new Point(98, 21),
                Fields = _settlement.Fields
            }));

            _settlement.AddRoad(road2);
            var market2 = new Market()
            {
                Position = new Point(99, 21)
            };

            market2.Road = road1;
            _settlement.AddBuildingToRoad(road1, market2);


            while (_settlement.Roads.SelectMany(g => g.Buildings).Count() < 120)
            {
                var buildingPositions = road1.GetPossibleBuildingPositions(new PossibleBuildingPositions(_settlement.Roads, _settlement.Fields));
                if (!buildingPositions.Any())
                {
                    continue;
                }

                var building = new Residence {
                    Position = buildingPositions[RandomProvider.Next(buildingPositions.Count)]
                };
                building.Road = road1;
                _settlement.AddBuildingToRoad(road1, building);
            }

            Assert.AreEqual(5, market1.CalculateFitness(new BuildingRule()
            {
                BuildingRoad     = road1,
                Fields           = _settlement.Fields,
                Roads            = _settlement.Roads,
                SettlementCenter = _settlement.SettlementCenter
            }));
        }
        public void MarketRule_Is_Not_Satisfied_When_Exists_Other_Market_Which_Is_Less_Than_50_Pixels_Away()
        {
            //add randomly 100 residences
            IRoad road    = _settlement.Roads.First();
            var   market1 = new Market()
            {
                Position = new Point(50, 51)
            };

            market1.Road = road;
            _settlement.AddBuildingToRoad(road, market1);
            var market2 = new Market()
            {
                Position = new Point(90, 51)
            };

            market2.Road = road;
            _settlement.AddBuildingToRoad(road, market2);

            while (_settlement.Roads.SelectMany(g => g.Buildings).Count() < 120)
            {
                var buildingPositions = road.GetPossibleBuildingPositions(new PossibleBuildingPositions(_settlement.Roads, _settlement.Fields));
                if (!buildingPositions.Any())
                {
                    continue;
                }

                var building = new Residence {
                    Position = buildingPositions[RandomProvider.Next(buildingPositions.Count)]
                };
                building.Road = road;
                _settlement.AddBuildingToRoad(road, building);
            }

            Assert.AreEqual(0, market1.CalculateFitness(new BuildingRule()
            {
                BuildingRoad     = road,
                Fields           = _settlement.Fields,
                Roads            = _settlement.Roads,
                SettlementCenter = _settlement.SettlementCenter
            }));
        }
        public void SchoolRule_Is_Not_Satisfied__When_Ratio_Schools_Per_Residences_Is_Greater_Than_1_To_100()
        {
            IRoad road    = _settlement.Roads.First();
            var   school1 = new School()
            {
                Position = new Point(50, 51)
            };

            school1.Road = road;
            _settlement.AddBuildingToRoad(road, school1);

            while (_settlement.Roads.SelectMany(g => g.Buildings).Count() < 120)
            {
                var buildingPositions = road.GetPossibleBuildingPositions(new PossibleBuildingPositions(_settlement.Roads, _settlement.Fields));
                if (!buildingPositions.Any())
                {
                    continue;
                }

                var building = new Residence {
                    Position = buildingPositions[RandomProvider.Next(buildingPositions.Count)]
                };
                building.Road = road;
                _settlement.AddBuildingToRoad(road, building);
            }

            var school2 = new School()
            {
                Position = new Point(80, 51)
            };

            Assert.AreEqual(0, school2.CalculateFitness(new BuildingRule()
            {
                BuildingRoad     = road,
                Fields           = _settlement.Fields,
                Roads            = _settlement.Roads,
                SettlementCenter = _settlement.SettlementCenter
            }));
        }