示例#1
0
        public void GetHashCode_IsNotEqual()
        {
            var result1 = new StatisticsCalculationResult(42, 42, 45, 45, 3, 3, 9, 9, 100);
            var result2 = new StatisticsCalculationResult(21, 21, 45, 45, 3, 3, 9, 9, 100);

            Assert.NotEqual(result1.GetHashCode(), result2.GetHashCode());
        }
        public void CalculateStatistics_IsCalledWithAlsoBlockTiles_ShouldIgnoreBlockTilesInCalculation()
        {
            // Arrange
            var helper = GetHelper();

            var expected = new StatisticsCalculationResult(minX: 42, minY: 42, maxX: 45, maxY: 45, usedAreaWidth: 3, usedAreaHeight: 3, usedTiles: 9, minTiles: 9, efficiency: 100);

            var objects = new List <AnnoObject>
            {
                new AnnoObject
                {
                    Template = "Blocker"
                },
                new AnnoObject
                {
                    Template = "Dummy",
                    Position = new System.Windows.Point(42, 42),
                    Size     = new System.Windows.Size(3, 3),
                    Road     = false
                }
            };

            // Act
            var result = helper.CalculateStatistics(objects);

            // Assert
            Assert.Equal(expected, result);
        }
示例#3
0
        public void Equals_IsNotEqual()
        {
            var result1 = new StatisticsCalculationResult(42, 42, 45, 45, 3, 3, 9, 9, 100);
            var result2 = new StatisticsCalculationResult(21, 21, 45, 45, 3, 3, 9, 9, 100);

            Assert.False(result1.Equals(result2));
            Assert.False(result1.Equals((object)result2));
            Assert.False(result1.Equals(null));
        }
示例#4
0
        public void Equals_IsEqual()
        {
            var result1 = new StatisticsCalculationResult(42, 42, 45, 45, 3, 3, 9, 9, 100);
            var result2 = new StatisticsCalculationResult(42, 42, 45, 45, 3, 3, 9, 9, 100);

            Assert.True(result1.Equals(result2));
            Assert.True(result1.Equals((object)result2));
            Assert.True(result1.Equals(result1));
        }
示例#5
0
        public void CalculateStatistics_IsCalledWithEmptyList_ShouldNotThrowAndNotReturnNull()
        {
            // Arrange
            var helper = GetHelper();

            var result = new StatisticsCalculationResult();

            // Act
            var ex = Record.Exception(() => result = helper.CalculateStatistics(new List <AnnoObject>()));

            // Assert
            Assert.Null(ex);
            Assert.NotNull(result);
        }
示例#6
0
        public void CalculateStatistics_IsCalledWithNull_ShouldNotThrowAndReturnNull()
        {
            // Arrange
            var helper = GetHelper();

            var result = new StatisticsCalculationResult();

            // Act
            var ex = Record.Exception(() => result = helper.CalculateStatistics(null));

            // Assert
            Assert.Null(ex);
            Assert.Null(result);
        }
        public void CalculateStatistics_IsCalledWithKnownLayout_IgnoreNothing_ShouldReturnCorrectResult()
        {
            // Arrange
            ILayoutLoader loader = new LayoutLoader();

            using var streamWithLayout = new MemoryStream(Encoding.UTF8.GetBytes(testData_layout_with_blocking_tiles));
            var loadedLayout = loader.LoadLayout(streamWithLayout, true);

            var helper = GetHelper();

            var expected = new StatisticsCalculationResult(minX: 1, minY: 1, maxX: 38, maxY: 33, usedAreaWidth: 37, usedAreaHeight: 32, usedTiles: 1184, minTiles: 1057, efficiency: 89);

            // Act
            var result = helper.CalculateStatistics(loadedLayout.Objects, includeRoads: true, includeIgnoredObjects: true);

            // Assert
            Assert.Equal(expected, result);
        }
        public void CalculateStatistics_IsCalledWithKnownLayout_IgnoreRoadsAndBlockTiles_ShouldReturnCorrectResult()
        {
            // Arrange
            ILayoutLoader loader = new LayoutLoader();

            using var streamWithLayout = new MemoryStream(Encoding.UTF8.GetBytes(testData_layout_with_blocking_tiles));
            var loadedLayout = loader.LoadLayout(streamWithLayout, true);

            var helper = GetHelper();

            var expected = new StatisticsCalculationResult(minX: 3, minY: 3, maxX: 36, maxY: 31, usedAreaWidth: 33, usedAreaHeight: 28, usedTiles: 924, minTiles: 736, efficiency: 80);

            // Act
            var result = helper.CalculateStatistics(loadedLayout.Objects);

            // Assert
            Assert.Equal(expected, result);
        }
示例#9
0
        public StatisticsCalculationResult CalculateStatistics(List <AnnoObject> placedObjects)
        {
            var result = new StatisticsCalculationResult();

            // calculate bouding box
            var boxX = placedObjects.Max(_ => _.Position.X + _.Size.Width) - placedObjects.Min(_ => _.Position.X);
            var boxY = placedObjects.Max(_ => _.Position.Y + _.Size.Height) - placedObjects.Min(_ => _.Position.Y);
            // calculate area of all buildings
            var minTiles = placedObjects.Where(_ => !_.Road).Sum(_ => _.Size.Width * _.Size.Height);

            result.UsedAreaX = boxX;
            result.UsedAreaY = boxY;
            result.UsedTiles = boxX * boxY;

            result.MinTiles   = minTiles;
            result.Efficiency = Math.Round(minTiles / boxX / boxY * 100);

            return(result);
        }
示例#10
0
        public StatisticsCalculationResult CalculateStatistics(IEnumerable <AnnoObject> placedObjects)
        {
            if (placedObjects == null)
            {
                return(null);
            }

            var result = new StatisticsCalculationResult();

            if (!placedObjects.Any())
            {
                return(result);
            }

            /* old logic is easier to understand, but slower
             * // calculate bouding box
             * var boxX = placedObjects.Max(_ => _.Position.X + _.Size.Width) - placedObjects.Min(_ => _.Position.X);
             * var boxY = placedObjects.Max(_ => _.Position.Y + _.Size.Height) - placedObjects.Min(_ => _.Position.Y);
             * // calculate area of all buildings
             * var minTiles = placedObjects.Where(_ => !_.Road).Sum(_ => _.Size.Width * _.Size.Height);
             */

            var maxX = double.MinValue;
            var maxY = double.MinValue;
            var minX = double.MaxValue;
            var minY = double.MaxValue;
            var sum  = 0d;

            foreach (var curObject in placedObjects)
            {
                var curPosX = curObject.Position.X;
                var curPosY = curObject.Position.Y;
                var curSize = curObject.Size;

                var curMaxX = curPosX + curSize.Width;
                var curMaxY = curPosY + curSize.Height;

                if (curMaxX > maxX)
                {
                    maxX = curMaxX;
                }
                if (curPosX < minX)
                {
                    minX = curPosX;
                }

                if (curMaxY > maxY)
                {
                    maxY = curMaxY;
                }
                if (curPosY < minY)
                {
                    minY = curPosY;
                }

                if (!curObject.Road)
                {
                    sum += (curSize.Width * curSize.Height);
                }
            }

            // calculate bouding box
            var boxX = maxX - minX;
            var boxY = maxY - minY;
            // calculate area of all buildings
            var minTiles = sum;

            result.UsedAreaX = boxX;
            result.UsedAreaY = boxY;
            result.UsedTiles = boxX * boxY;

            result.MinTiles   = minTiles;
            result.Efficiency = Math.Round(minTiles / boxX / boxY * 100);

            return(result);
        }