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 SetUp()
        {
            var fields     = new Field[100, 100];
            int waterLevel = 10;

            for (int i = 0; i < fields.GetLength(0); i++)
            {
                for (int j = 0; j < fields.GetLength(1); j++)
                {
                    var position = new Point(i, j);
                    if (j < waterLevel)
                    {
                        fields[i, j] = new Field()
                        {
                            InSettlement = false,
                            Position     = position,
                            Terrain      = new Water()
                        };
                    }
                    else
                    {
                        fields[i, j] = new Field()
                        {
                            InSettlement       = true,
                            Position           = position,
                            Terrain            = new Lowland(),
                            DistanceToWater    = position.Y - waterLevel,
                            DistanceToMainRoad = position.Y - waterLevel - 1
                        };
                    }
                }
            }

            var roadGenerator = new RoadPointsGenerator();
            var mainRoad      = roadGenerator.GenerateStraight(new RoadGenerationTwoPoints()
            {
                Start  = new Point(0, waterLevel),
                End    = new Point(fields.GetLength(0) - 1, waterLevel),
                Fields = fields
            });//in this case main road should be straight horizontal line

            _settlement = new Settlement(fields, mainRoad, false);

            var road1 = new Road(roadGenerator.GenerateStraight(new RoadGenerationTwoPoints()
            {
                Start  = new Point(0, 50),
                End    = new Point(99, 50),
                Fields = _settlement.Fields
            }));

            _settlement.AddRoad(road1);
        }