Index: Core/Common/src/Core.Common.Utils/EnumTypeConverter.cs =================================================================== diff -u -r66c3a121906a47ea4164e2a657e0b43d86e2f269 -rccf22c570f610fc47e18f8e92afc6aab2ee6c896 --- Core/Common/src/Core.Common.Utils/EnumTypeConverter.cs (.../EnumTypeConverter.cs) (revision 66c3a121906a47ea4164e2a657e0b43d86e2f269) +++ Core/Common/src/Core.Common.Utils/EnumTypeConverter.cs (.../EnumTypeConverter.cs) (revision ccf22c570f610fc47e18f8e92afc6aab2ee6c896) @@ -59,7 +59,10 @@ { return base.ConvertTo(context, culture, value, destinationType); } - var fieldInfo = EnumType.GetField(value.ToString()); + + var fieldInfo = EnumType.IsGenericType && EnumType.GetGenericTypeDefinition() == typeof(Nullable<>) ? + EnumType.GetGenericArguments()[0].GetField(value.ToString()) : + EnumType.GetField(value.ToString()); return GetDisplayName(fieldInfo); } Index: Core/Common/test/Core.Common.Utils.Test/EnumTypeConverterTest.cs =================================================================== diff -u -r96c96a5f55735cb1d019a5fd8677200e2079284d -rccf22c570f610fc47e18f8e92afc6aab2ee6c896 --- Core/Common/test/Core.Common.Utils.Test/EnumTypeConverterTest.cs (.../EnumTypeConverterTest.cs) (revision 96c96a5f55735cb1d019a5fd8677200e2079284d) +++ Core/Common/test/Core.Common.Utils.Test/EnumTypeConverterTest.cs (.../EnumTypeConverterTest.cs) (revision ccf22c570f610fc47e18f8e92afc6aab2ee6c896) @@ -134,11 +134,41 @@ var result = converter.ConvertTo(enumValue, typeof(string)); // Assert - var expectedText = ""; + const string expectedText = ""; Assert.AreEqual(expectedText, result); } [Test] + public void ConvertTo_FromNullableToString_ReturnsExpectedEnumDisplayName() + { + // Setup + SimpleEnum? enumValue = SimpleEnum.FirstValue; + var converter = new EnumTypeConverter(typeof(SimpleEnum?)); + + // Call + var result = converter.ConvertTo(enumValue, typeof(string)); + + // Assert + const string expectedText = ""; + Assert.AreEqual(expectedText, result); + } + + [Test] + public void ConvertTo_FromNullableWithNullValue_ReturnsEmptyDisplayName() + { + // Setup + SimpleEnum? enumValue = null; + var converter = new EnumTypeConverter(typeof(SimpleEnum?)); + + // Call + var result = converter.ConvertTo(enumValue, typeof(string)); + + // Assert + string expectedText = string.Empty; + Assert.AreEqual(expectedText, result); + } + + [Test] public void CanConvertFrom_SourceTypeIsInvalid_ReturnsFalse() { // Setup Index: Ringtoets/Common/src/Ringtoets.Common.Forms/PropertyClasses/UseBreakWaterProperties.cs =================================================================== diff -u -r443fcdbfa5d49c306f76bb12f054c6e6bf859e18 -rccf22c570f610fc47e18f8e92afc6aab2ee6c896 --- Ringtoets/Common/src/Ringtoets.Common.Forms/PropertyClasses/UseBreakWaterProperties.cs (.../UseBreakWaterProperties.cs) (revision 443fcdbfa5d49c306f76bb12f054c6e6bf859e18) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/PropertyClasses/UseBreakWaterProperties.cs (.../UseBreakWaterProperties.cs) (revision ccf22c570f610fc47e18f8e92afc6aab2ee6c896) @@ -19,7 +19,6 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. -using System; using System.ComponentModel; using Core.Common.Base.Data; using Core.Common.Gui.Attributes; @@ -28,6 +27,7 @@ using Core.Common.Utils.Reflection; using Ringtoets.Common.Data.DikeProfiles; using Ringtoets.Common.Forms.Properties; +using Ringtoets.Common.Forms.TypeConverters; namespace Ringtoets.Common.Forms.PropertyClasses { @@ -40,26 +40,15 @@ private const int breakWaterTypePropertyIndex = 2; private const int breakWaterHeightPropertyIndex = 3; private readonly IUseBreakWater data; - private readonly Func useBreakWaterEnabled; /// /// Creates a new instance of . /// - /// The data to use for the properties. - /// Function to check if should be read-only or not. - /// Thrown if any of the input parameters is null. - public UseBreakWaterProperties(IUseBreakWater useBreakWaterData, Func useBreakWaterEnabled) + /// The data to use for the properties. If + /// is null, all properties will be set to . + public UseBreakWaterProperties(IUseBreakWater useBreakWaterData) { - if (useBreakWaterData == null) - { - throw new ArgumentNullException("useBreakWaterData"); - } - if (useBreakWaterEnabled == null) - { - throw new ArgumentNullException("useBreakWaterEnabled"); - } data = useBreakWaterData; - this.useBreakWaterEnabled = useBreakWaterEnabled; } [DynamicReadOnly] @@ -70,7 +59,7 @@ { get { - return data.UseBreakWater; + return data != null && data.UseBreakWater; } set { @@ -84,29 +73,40 @@ [ResourcesDisplayName(typeof(Resources), "BreakWaterType_DisplayName")] [ResourcesDescription(typeof(Resources), "BreakWaterType_Description")] [TypeConverter(typeof(EnumTypeConverter))] - public BreakWaterType BreakWaterType + public BreakWaterType? BreakWaterType { get { - return data.BreakWater == null ? BreakWaterType.Dam : data.BreakWater.Type; + if (data != null && data.BreakWater != null) + { + return data.BreakWater.Type; + } + return null; } set { - data.BreakWater.Type = value; - data.NotifyObservers(); + if (value.HasValue) + { + data.BreakWater.Type = value.Value; + data.NotifyObservers(); + } } } [DynamicReadOnly] [PropertyOrder(breakWaterHeightPropertyIndex)] [ResourcesDisplayName(typeof(Resources), "BreakWaterHeight_DisplayName")] [ResourcesDescription(typeof(Resources), "BreakWaterHeight_Description")] + [TypeConverter(typeof(NoValueRoundedDoubleConverter))] public RoundedDouble BreakWaterHeight { get { - return data.BreakWater == null ? (RoundedDouble) double.NaN - : data.BreakWater.Height; + if (data != null && data.BreakWater != null) + { + return data.BreakWater.Height; + } + return (RoundedDouble) double.NaN; } set { @@ -118,7 +118,7 @@ [DynamicReadOnlyValidationMethod] public bool DynamicReadOnlyValidationMethod(string propertyName) { - return !useBreakWaterEnabled() + return data == null || !propertyName.Equals(TypeUtils.GetMemberName(i => i.UseBreakWater)) && !UseBreakWater; } Index: Ringtoets/Common/src/Ringtoets.Common.Forms/PropertyClasses/UseForeshoreProperties.cs =================================================================== diff -u -r443fcdbfa5d49c306f76bb12f054c6e6bf859e18 -rccf22c570f610fc47e18f8e92afc6aab2ee6c896 --- Ringtoets/Common/src/Ringtoets.Common.Forms/PropertyClasses/UseForeshoreProperties.cs (.../UseForeshoreProperties.cs) (revision 443fcdbfa5d49c306f76bb12f054c6e6bf859e18) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/PropertyClasses/UseForeshoreProperties.cs (.../UseForeshoreProperties.cs) (revision ccf22c570f610fc47e18f8e92afc6aab2ee6c896) @@ -19,7 +19,6 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. -using System; using System.ComponentModel; using System.Linq; using Core.Common.Base.Geometry; @@ -43,14 +42,10 @@ /// /// Creates a new instance of . /// - /// The data to use for the properties. - /// Thrown if any of is null. + /// The data to use for the properties. If + /// is null, all properties will be set to . public UseForeshoreProperties(IUseForeshore useForshoreData) { - if (useForshoreData == null) - { - throw new ArgumentNullException("useForshoreData"); - } data = useForshoreData; } @@ -62,7 +57,7 @@ { get { - return data.UseForeshore; + return data != null && data.UseForeshore; } set { @@ -79,14 +74,16 @@ { get { - return data.ForeshoreGeometry == null ? new Point2D[0] : data.ForeshoreGeometry.ToArray(); + return data != null && data.ForeshoreGeometry != null ? + data.ForeshoreGeometry.ToArray() : + null; } } [DynamicReadOnlyValidationMethod] public bool DynamicReadOnlyValidationMethod(string propertyName) { - return data.ForeshoreGeometry == null || data.ForeshoreGeometry.Count() < 2; + return data == null || data.ForeshoreGeometry == null || data.ForeshoreGeometry.Count() < 2; } public override string ToString() Index: Ringtoets/Common/test/Ringtoets.Common.Forms.Test/PropertyClasses/UseBreakWaterPropertiesTest.cs =================================================================== diff -u -r0a6fd2fa18908a63fc029833ea3735709ebd5829 -rccf22c570f610fc47e18f8e92afc6aab2ee6c896 --- Ringtoets/Common/test/Ringtoets.Common.Forms.Test/PropertyClasses/UseBreakWaterPropertiesTest.cs (.../UseBreakWaterPropertiesTest.cs) (revision 0a6fd2fa18908a63fc029833ea3735709ebd5829) +++ Ringtoets/Common/test/Ringtoets.Common.Forms.Test/PropertyClasses/UseBreakWaterPropertiesTest.cs (.../UseBreakWaterPropertiesTest.cs) (revision ccf22c570f610fc47e18f8e92afc6aab2ee6c896) @@ -35,43 +35,31 @@ public class UseBreakWaterPropertiesTest { [Test] - public void Constructor_IBreakWaterNullThrowsArgumentNullException() + public void Constructor_IBreakWaterNull_ExpectedValues() { // Setup & Call - TestDelegate test = () => new UseBreakWaterProperties(null, () => true); + var properties = new UseBreakWaterProperties(null); // Assert - var paramName = Assert.Throws(test).ParamName; - Assert.AreEqual("useBreakWaterData", paramName); + Assert.IsFalse(properties.UseBreakWater); + Assert.IsNull(properties.BreakWaterType); + Assert.AreEqual((RoundedDouble) double.NaN, properties.BreakWaterHeight); + Assert.AreEqual(string.Empty, properties.ToString()); } - - [Test] - public void Constructor_UseBreakWaterEnabledNullThrowsArgumentNullException() - { - // Setup - var useBreakWaterData = new TestUseBreakWater(); - - // Call - TestDelegate test = () => new UseBreakWaterProperties(useBreakWaterData, null); - // Assert - var paramName = Assert.Throws(test).ParamName; - Assert.AreEqual("useBreakWaterEnabled", paramName); - } - [Test] - public void Constructor_ExpectedValues() + public void Constructor_ValidData_ExpectedValues() { // Setup var useBreakWaterData = new TestUseBreakWater(); // Call - var properties = new UseBreakWaterProperties(useBreakWaterData, () => true); + var properties = new UseBreakWaterProperties(useBreakWaterData); // Assert Assert.IsFalse(properties.UseBreakWater); - Assert.AreEqual(BreakWaterType.Dam, properties.BreakWaterType); - Assert.AreEqual((RoundedDouble)double.NaN,properties.BreakWaterHeight); + Assert.IsNull(properties.BreakWaterType); + Assert.AreEqual((RoundedDouble) double.NaN, properties.BreakWaterHeight); Assert.AreEqual(string.Empty, properties.ToString()); } @@ -89,14 +77,14 @@ { BreakWater = breakWater }; - var properties = new UseBreakWaterProperties(testUseBreakWater, ()=>true); + var properties = new UseBreakWaterProperties(testUseBreakWater); testUseBreakWater.Attach(observerMock); // Call properties.UseBreakWater = true; properties.BreakWaterType = BreakWaterType.Dam; - properties.BreakWaterHeight=(RoundedDouble)1.1; + properties.BreakWaterHeight = (RoundedDouble) 1.1; // Assert Assert.IsTrue(properties.UseBreakWater); @@ -111,10 +99,13 @@ public void PropertyAttributes_UseBreakWater_ReturnExpectedValues(bool useBreakWater, bool useBreakWaterEnabled) { // Setup - var testUseBreakWater = new TestUseBreakWater { UseBreakWater = useBreakWater }; + TestUseBreakWater testUseBreakWater = useBreakWaterEnabled ? new TestUseBreakWater + { + UseBreakWater = useBreakWater + } : null; // Call - var properties = new UseBreakWaterProperties(testUseBreakWater, () => useBreakWaterEnabled); + var properties = new UseBreakWaterProperties(testUseBreakWater); // Assert var dynamicPropertyBag = new DynamicPropertyBag(properties); Index: Ringtoets/Common/test/Ringtoets.Common.Forms.Test/PropertyClasses/UseForeshorePropertiesTest.cs =================================================================== diff -u -r0a6fd2fa18908a63fc029833ea3735709ebd5829 -rccf22c570f610fc47e18f8e92afc6aab2ee6c896 --- Ringtoets/Common/test/Ringtoets.Common.Forms.Test/PropertyClasses/UseForeshorePropertiesTest.cs (.../UseForeshorePropertiesTest.cs) (revision 0a6fd2fa18908a63fc029833ea3735709ebd5829) +++ Ringtoets/Common/test/Ringtoets.Common.Forms.Test/PropertyClasses/UseForeshorePropertiesTest.cs (.../UseForeshorePropertiesTest.cs) (revision ccf22c570f610fc47e18f8e92afc6aab2ee6c896) @@ -37,18 +37,19 @@ public class UseForeshorePropertiesTest { [Test] - public void Constructor_IUseForeshoreNullThrowsArgumentNullException() + public void Constructor_IUseForeshoreNull_ExpectedValues() { // Setup & Call - TestDelegate test = () => new UseForeshoreProperties(null); + var properties = new UseForeshoreProperties(null); // Assert - var paramName = Assert.Throws(test).ParamName; - Assert.AreEqual("useForshoreData", paramName); + Assert.IsFalse(properties.UseForeshore); + Assert.IsNull(properties.Coordinates); + Assert.AreEqual(string.Empty, properties.ToString()); } [Test] - public void Constructor_ExpectedValues() + public void Constructor_ValidData_ExpectedValues() { // Setup var useForshoreData = new TestUseForeshore(); @@ -58,7 +59,7 @@ // Assert Assert.IsFalse(properties.UseForeshore); - Assert.IsEmpty(properties.Coordinates); + Assert.IsNull(properties.Coordinates); Assert.AreEqual(string.Empty, properties.ToString()); } @@ -81,7 +82,7 @@ // Assert Assert.IsTrue(properties.UseForeshore); - Assert.AreEqual(geometry,properties.Coordinates); + Assert.AreEqual(geometry, properties.Coordinates); } [Test] @@ -120,7 +121,7 @@ // Call var properties = new UseForeshoreProperties(useForshoreData); - + // Assert var dynamicPropertyBag = new DynamicPropertyBag(properties); PropertyDescriptorCollection dynamicProperties = dynamicPropertyBag.GetProperties(new Attribute[] Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Forms/PropertyClasses/GrassCoverErosionInwardsInputContextProperties.cs =================================================================== diff -u -r9050ad5f3a80e630b2fcc092942a40d6343286a0 -rccf22c570f610fc47e18f8e92afc6aab2ee6c896 --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Forms/PropertyClasses/GrassCoverErosionInwardsInputContextProperties.cs (.../GrassCoverErosionInwardsInputContextProperties.cs) (revision 9050ad5f3a80e630b2fcc092942a40d6343286a0) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Forms/PropertyClasses/GrassCoverErosionInwardsInputContextProperties.cs (.../GrassCoverErosionInwardsInputContextProperties.cs) (revision ccf22c570f610fc47e18f8e92afc6aab2ee6c896) @@ -115,7 +115,9 @@ { get { - return new UseBreakWaterProperties(data.WrappedData, UseBreakWaterEnabled); + return data.WrappedData.DikeProfile == null ? + new UseBreakWaterProperties(null) : + new UseBreakWaterProperties(data.WrappedData); } } @@ -232,10 +234,5 @@ { return data.AvailableHydraulicBoundaryLocations; } - - private bool UseBreakWaterEnabled() - { - return data.WrappedData.DikeProfile != null; - } } } \ No newline at end of file Index: Ringtoets/HeightStructures/src/Ringtoets.HeightStructures.Forms/PropertyClasses/HeightStructuresInputContextProperties.cs =================================================================== diff -u -r9050ad5f3a80e630b2fcc092942a40d6343286a0 -rccf22c570f610fc47e18f8e92afc6aab2ee6c896 --- Ringtoets/HeightStructures/src/Ringtoets.HeightStructures.Forms/PropertyClasses/HeightStructuresInputContextProperties.cs (.../HeightStructuresInputContextProperties.cs) (revision 9050ad5f3a80e630b2fcc092942a40d6343286a0) +++ Ringtoets/HeightStructures/src/Ringtoets.HeightStructures.Forms/PropertyClasses/HeightStructuresInputContextProperties.cs (.../HeightStructuresInputContextProperties.cs) (revision ccf22c570f610fc47e18f8e92afc6aab2ee6c896) @@ -320,15 +320,12 @@ { get { - return new UseBreakWaterProperties(data.WrappedData, UseBreakWaterEnabled); + return data.WrappedData.ForeshoreProfile == null ? + new UseBreakWaterProperties(null) : + new UseBreakWaterProperties(data.WrappedData); } } - private bool UseBreakWaterEnabled() - { - return data.WrappedData.ForeshoreProfile != null; - } - [PropertyOrder(foreshoreGeometryPropertyIndex)] [TypeConverter(typeof(ExpandableObjectConverter))] [ResourcesCategory(typeof(RingtoetsCommonFormsResources), "Categories_Schematization")] Index: Ringtoets/Revetment/src/Ringtoets.Revetment.Forms/PropertyClasses/WaveConditionsInputContextProperties.cs =================================================================== diff -u -raa56a5d7a6ec9f083ce3bd7a65d0c5b06470fd3b -rccf22c570f610fc47e18f8e92afc6aab2ee6c896 --- Ringtoets/Revetment/src/Ringtoets.Revetment.Forms/PropertyClasses/WaveConditionsInputContextProperties.cs (.../WaveConditionsInputContextProperties.cs) (revision aa56a5d7a6ec9f083ce3bd7a65d0c5b06470fd3b) +++ Ringtoets/Revetment/src/Ringtoets.Revetment.Forms/PropertyClasses/WaveConditionsInputContextProperties.cs (.../WaveConditionsInputContextProperties.cs) (revision ccf22c570f610fc47e18f8e92afc6aab2ee6c896) @@ -228,7 +228,9 @@ { get { - return new UseBreakWaterProperties(data.WrappedData, UseBreakWaterEnabled); + return data.WrappedData.ForeshoreProfile == null ? + new UseBreakWaterProperties(null) : + new UseBreakWaterProperties(data.WrappedData); } } @@ -296,10 +298,5 @@ { return data.ForeshoreProfiles; } - - private bool UseBreakWaterEnabled() - { - return data.WrappedData.ForeshoreProfile != null; - } } } \ No newline at end of file