// Copyright (C) Stichting Deltares 2017. All rights reserved. // // This file is part of Ringtoets. // // Ringtoets is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with this program. If not, see . // // All names, logos, and references to "Deltares" are registered trademarks of // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using Core.Common.Base.Geometry; using Core.Components.DotSpatial.Converter; using Core.Components.Gis.Data; using Core.Components.Gis.Features; using Core.Components.Gis.Geometries; using Core.Components.Gis.Style; using Core.Components.Gis.Theme; using Core.Components.Gis.Theme.Criteria; using DotSpatial.Controls; using DotSpatial.Data; using DotSpatial.Symbology; using DotSpatial.Topology; using NUnit.Framework; using Point = DotSpatial.Topology.Point; using PointShape = DotSpatial.Symbology.PointShape; namespace Core.Components.DotSpatial.Test.Converter { [TestFixture] public class MapPointDataConverterTest { [Test] public void DefaultConstructor_IsMapPointDataConverter() { // Call var converter = new MapPointDataConverter(); // Assert Assert.IsInstanceOf>(converter); } [Test] public void ConvertLayerFeatures_MapPointDataWithMultipleFeatures_ConvertsEachGeometryToMapPointLayerAsSingleFeature() { // Setup var converter = new MapPointDataConverter(); var mapPointLayer = new MapPointLayer(); var mapPointData = new MapPointData("test") { Features = new[] { new MapFeature(new[] { new MapGeometry(new[] { new[] { new Point2D(1, 2) } }) }), new MapFeature(Enumerable.Empty()), new MapFeature(new[] { new MapGeometry(new[] { new[] { new Point2D(2, 3) } }) }), new MapFeature(Enumerable.Empty()), new MapFeature(new[] { new MapGeometry(new[] { new[] { new Point2D(3, 4) } }), new MapGeometry(new[] { new[] { new Point2D(5, 6) } }) }) } }; // Call converter.ConvertLayerFeatures(mapPointData, mapPointLayer); // Assert Assert.AreEqual(4, mapPointLayer.DataSet.Features.Count); } [Test] public void ConvertLayerFeatures_MapPointDataWithFeature_ConvertsFeatureToMapPointLayerAsPointData() { // Setup var converter = new MapPointDataConverter(); var mapPointLayer = new MapPointLayer(); var mapFeature = new MapFeature(new[] { new MapGeometry(new[] { new[] { new Point2D(1, 2) } }) }); var mapPointData = new MapPointData("test") { Features = new[] { mapFeature } }; // Call converter.ConvertLayerFeatures(mapPointData, mapPointLayer); // Assert IFeature feature = mapPointLayer.DataSet.Features[0]; Assert.AreEqual(mapPointData.Features.Count(), mapPointLayer.DataSet.Features.Count); Assert.IsInstanceOf(feature.BasicGeometry); IEnumerable expectedCoordinates = mapFeature.MapGeometries.ElementAt(0).PointCollections.ElementAt(0).Select(p => new Coordinate(p.X, p.Y)); CollectionAssert.AreEqual(expectedCoordinates, feature.Coordinates); } [Test] [Combinatorial] public void ConvertLayerProperties_MapPointDataWithStyle_ConvertsStyleToMapPointLayer( [Values(KnownColor.AliceBlue, KnownColor.Azure)] KnownColor color, [Values(1, 5)] int width, [Values(PointSymbol.Circle, PointSymbol.Square)] PointSymbol pointStyle) { // Setup var converter = new MapPointDataConverter(); var mapPointLayer = new MapPointLayer(); Color expectedColor = Color.FromKnownColor(color); var mapPointData = new MapPointData("test", new PointStyle { Color = expectedColor, Size = width, Symbol = pointStyle, StrokeColor = expectedColor, StrokeThickness = 1 }); // Call converter.ConvertLayerProperties(mapPointData, mapPointLayer); // Assert PointShape expectedPointShape = pointStyle == PointSymbol.Circle ? PointShape.Ellipse : PointShape.Rectangle; var expectedSymbolizer = new PointSymbolizer(expectedColor, expectedPointShape, width); expectedSymbolizer.SetOutline(expectedColor, 1); AssertAreEqual(expectedSymbolizer, mapPointLayer.Symbolizer); } [Test] public void ConvertLayerProperties_MapPointDataWithStyleAndValueCriteria_ConvertDataToMapPointLayer() { // Setup const string metadataAttribute = "Meta"; var random = new Random(21); var unequalCriteria = new ValueCriteria(ValueCriteriaOperator.UnequalValue, random.NextDouble()); var equalCriteria = new ValueCriteria(ValueCriteriaOperator.EqualValue, random.NextDouble()); var theme = new MapTheme(metadataAttribute, new[] { new CategoryTheme(Color.FromKnownColor(random.NextEnum()), equalCriteria), new CategoryTheme(Color.FromKnownColor(random.NextEnum()), unequalCriteria) }); var pointStyle = new PointStyle { Color = Color.FromKnownColor(random.NextEnum()), Size = random.Next(1, 48), Symbol = PointSymbol.Circle, StrokeColor = Color.FromKnownColor(random.NextEnum()), StrokeThickness = random.Next(1, 48) }; var mapPointData = new MapPointData("test", pointStyle) { Features = new[] { CreateMapFeatureWithMetaData(metadataAttribute) }, MapTheme = theme }; var mapPointLayer = new MapPointLayer(); var converter = new MapPointDataConverter(); // Call converter.ConvertLayerProperties(mapPointData, mapPointLayer); // Assert const PointShape expectedPointShape = PointShape.Ellipse; PointSymbolizer expectedSymbolizer = CreateExpectedSymbolizer(pointStyle, expectedPointShape, pointStyle.Color); IPointScheme appliedScheme = mapPointLayer.Symbology; Assert.AreEqual(3, appliedScheme.Categories.Count); IPointCategory baseCategory = appliedScheme.Categories[0]; AssertAreEqual(expectedSymbolizer, baseCategory.Symbolizer); Assert.IsNull(baseCategory.FilterExpression); IPointCategory equalSchemeCategory = appliedScheme.Categories[1]; string expectedFilter = $"[1] = {equalCriteria.Value}"; Assert.AreEqual(expectedFilter, equalSchemeCategory.FilterExpression); expectedSymbolizer = CreateExpectedSymbolizer(pointStyle, expectedPointShape, theme.CategoryThemes.ElementAt(0).Color); AssertAreEqual(expectedSymbolizer, equalSchemeCategory.Symbolizer); IPointCategory unEqualSchemeCategory = appliedScheme.Categories[2]; expectedFilter = $"[1] != {unequalCriteria.Value}"; Assert.AreEqual(expectedFilter, unEqualSchemeCategory.FilterExpression); expectedSymbolizer = CreateExpectedSymbolizer(pointStyle, expectedPointShape, theme.CategoryThemes.ElementAt(1).Color); AssertAreEqual(expectedSymbolizer, unEqualSchemeCategory.Symbolizer); } [Test] public void ConvertLayerProperties_MapPointDataWithStyleAndRangeCriteria_ConvertDataToMapPointLayer() { // Setup const string metadataAttribute = "Meta"; var random = new Random(21); var allBoundsInclusiveCriteria = new RangeCriteria(RangeCriteriaOperator.AllBoundsInclusive, random.NextDouble(), 1 + random.NextDouble()); var lowerBoundInclusiveCriteria = new RangeCriteria(RangeCriteriaOperator.LowerBoundInclusive, random.NextDouble(), 1 + random.NextDouble()); var upperBoundInclusiveCriteria = new RangeCriteria(RangeCriteriaOperator.UpperBoundInclusive, random.NextDouble(), 1 + random.NextDouble()); var allBoundsExclusiveCriteria = new RangeCriteria(RangeCriteriaOperator.AllBoundsExclusive, random.NextDouble(), 1 + random.NextDouble()); var theme = new MapTheme(metadataAttribute, new[] { new CategoryTheme(Color.FromKnownColor(random.NextEnum()), allBoundsInclusiveCriteria), new CategoryTheme(Color.FromKnownColor(random.NextEnum()), lowerBoundInclusiveCriteria), new CategoryTheme(Color.FromKnownColor(random.NextEnum()), upperBoundInclusiveCriteria), new CategoryTheme(Color.FromKnownColor(random.NextEnum()), allBoundsExclusiveCriteria) }); var pointStyle = new PointStyle { Color = Color.FromKnownColor(random.NextEnum()), Size = random.Next(1, 48), Symbol = PointSymbol.Circle, StrokeColor = Color.FromKnownColor(random.NextEnum()), StrokeThickness = random.Next(1, 48) }; var mapPointData = new MapPointData("test", pointStyle) { Features = new[] { CreateMapFeatureWithMetaData(metadataAttribute) }, MapTheme = theme }; var mapPointLayer = new MapPointLayer(); var converter = new MapPointDataConverter(); // Call converter.ConvertLayerProperties(mapPointData, mapPointLayer); // Assert const PointShape expectedPointShape = PointShape.Ellipse; PointSymbolizer expectedSymbolizer = CreateExpectedSymbolizer(pointStyle, expectedPointShape, pointStyle.Color); IPointScheme appliedScheme = mapPointLayer.Symbology; Assert.AreEqual(5, appliedScheme.Categories.Count); IPointCategory baseCategory = appliedScheme.Categories[0]; AssertAreEqual(expectedSymbolizer, baseCategory.Symbolizer); Assert.IsNull(baseCategory.FilterExpression); IPointCategory allBoundsInclusiveCategory = appliedScheme.Categories[1]; string expectedFilter = $"[1] >= {allBoundsInclusiveCriteria.LowerBound} AND [1] <= {allBoundsInclusiveCriteria.UpperBound}"; Assert.AreEqual(expectedFilter, allBoundsInclusiveCategory.FilterExpression); expectedSymbolizer = CreateExpectedSymbolizer(pointStyle, expectedPointShape, theme.CategoryThemes.ElementAt(0).Color); AssertAreEqual(expectedSymbolizer, allBoundsInclusiveCategory.Symbolizer); IPointCategory lowerBoundInclusiveCategory = appliedScheme.Categories[2]; expectedFilter = $"[1] >= {lowerBoundInclusiveCriteria.LowerBound} AND [1] < {lowerBoundInclusiveCriteria.UpperBound}"; Assert.AreEqual(expectedFilter, lowerBoundInclusiveCategory.FilterExpression); expectedSymbolizer = CreateExpectedSymbolizer(pointStyle, expectedPointShape, theme.CategoryThemes.ElementAt(1).Color); AssertAreEqual(expectedSymbolizer, lowerBoundInclusiveCategory.Symbolizer); IPointCategory upperBoundInclusiveCategory = appliedScheme.Categories[3]; expectedFilter = $"[1] > {upperBoundInclusiveCriteria.LowerBound} AND [1] <= {upperBoundInclusiveCriteria.UpperBound}"; Assert.AreEqual(expectedFilter, upperBoundInclusiveCategory.FilterExpression); expectedSymbolizer = CreateExpectedSymbolizer(pointStyle, expectedPointShape, theme.CategoryThemes.ElementAt(2).Color); AssertAreEqual(expectedSymbolizer, upperBoundInclusiveCategory.Symbolizer); IPointCategory allBoundsExclusiveCategory = appliedScheme.Categories[4]; expectedFilter = $"[1] > {allBoundsExclusiveCriteria.LowerBound} AND [1] < {allBoundsExclusiveCriteria.UpperBound}"; Assert.AreEqual(expectedFilter, allBoundsExclusiveCategory.FilterExpression); expectedSymbolizer = CreateExpectedSymbolizer(pointStyle, expectedPointShape, theme.CategoryThemes.ElementAt(3).Color); AssertAreEqual(expectedSymbolizer, allBoundsExclusiveCategory.Symbolizer); } private static PointSymbolizer CreateExpectedSymbolizer(PointStyle expectedPointStyle, PointShape expectedPointShape, Color expectedColor) { var expectedSymbolizer = new PointSymbolizer(expectedColor, expectedPointShape, expectedPointStyle.Size); expectedSymbolizer.SetOutline(expectedPointStyle.StrokeColor, expectedPointStyle.StrokeThickness); return expectedSymbolizer; } private static MapFeature CreateMapFeatureWithMetaData(string metadataAttributeName) { var random = new Random(21); var mapFeature = new MapFeature(new[] { new MapGeometry(new[] { new[] { new Point2D(random.NextDouble(), random.NextDouble()) } }) }); mapFeature.MetaData[metadataAttributeName] = new object(); return mapFeature; } private static void AssertAreEqual(IPointSymbolizer expectedSymbolizer, IPointSymbolizer actualSymbolizer) { IList firstSymbols = expectedSymbolizer.Symbols; IList secondSymbols = actualSymbolizer.Symbols; Assert.AreEqual(firstSymbols.Count, secondSymbols.Count, "Unequal amount of symbols defined."); for (var i = 0; i < firstSymbols.Count; i++) { var firstSymbol = (SimpleSymbol) firstSymbols[i]; var secondSymbol = (SimpleSymbol) secondSymbols[i]; Assert.AreEqual(firstSymbol.Color, secondSymbol.Color); Assert.AreEqual(firstSymbol.PointShape, secondSymbol.PointShape); Assert.AreEqual(firstSymbol.Size, secondSymbol.Size); Assert.AreEqual(firstSymbol.OutlineColor, secondSymbol.OutlineColor); Assert.AreEqual(firstSymbol.OutlineWidth, secondSymbol.OutlineWidth); } } } }