Index: Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.Designer.cs =================================================================== diff -u -rb034322e34cde361a1cb86dffc55e9e0f83a1a9f -r4d7632a55f75ca47d7cee49166570d91a75d3d8f --- Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision b034322e34cde361a1cb86dffc55e9e0f83a1a9f) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 4d7632a55f75ca47d7cee49166570d91a75d3d8f) @@ -680,6 +680,60 @@ } /// + /// Looks up a localized string similar to Naam van de categorie.. + /// + public static string CategoryProperties_Group_Description { + get { + return ResourceManager.GetString("CategoryProperties_Group_Description", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Naam. + /// + public static string CategoryProperties_Group_DisplayName { + get { + return ResourceManager.GetString("CategoryProperties_Group_DisplayName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ondergrens van de categorie.. + /// + public static string CategoryProperties_LowerBoundary_Description { + get { + return ResourceManager.GetString("CategoryProperties_LowerBoundary_Description", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Ondergrens [1/jaar]. + /// + public static string CategoryProperties_LowerBoundary_DisplayName { + get { + return ResourceManager.GetString("CategoryProperties_LowerBoundary_DisplayName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bovengrens van de categorie.. + /// + public static string CategoryProperties_UpperBoundary_Description { + get { + return ResourceManager.GetString("CategoryProperties_UpperBoundary_Description", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bovengrens [1/jaar]. + /// + public static string CategoryProperties_UpperBoundary_DisplayName { + get { + return ResourceManager.GetString("CategoryProperties_UpperBoundary_DisplayName", resourceCulture); + } + } + + /// /// Looks up a localized string similar to De locatie van het begin van de slootbodem wanneer deze van de kant van de dijk wordt benaderd.. /// public static string CharacteristicPoint_BottomDitchDikeSide_Description { @@ -1392,6 +1446,46 @@ } /// + /// Looks up a localized string similar to De categoriegrenzen per traject voor dit toetsspoor.. + /// + public static string FailureMechanismCategoryBoundariesProperties_FailureMechanismBoundaries_Description { + get { + return ResourceManager.GetString("FailureMechanismCategoryBoundariesProperties_FailureMechanismBoundaries_Descripti" + + "on", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Categoriegrenzen per traject. + /// + public static string FailureMechanismCategoryBoundariesProperties_FailureMechanismBoundaries_DisplayName { + get { + return ResourceManager.GetString("FailureMechanismCategoryBoundariesProperties_FailureMechanismBoundaries_DisplayNa" + + "me", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to De categoriegrenzen per vak voor dit toetsspoor.. + /// + public static string FailureMechanismCategoryBoundariesProperties_FailureMechanismSectionBoundaries_Description { + get { + return ResourceManager.GetString("FailureMechanismCategoryBoundariesProperties_FailureMechanismSectionBoundaries_De" + + "scription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Categoriegrenzen per vak. + /// + public static string FailureMechanismCategoryBoundariesProperties_FailureMechanismSectionBoundaries_DisplayName { + get { + return ResourceManager.GetString("FailureMechanismCategoryBoundariesProperties_FailureMechanismSectionBoundaries_Di" + + "splayName", resourceCulture); + } + } + + /// /// Looks up a localized string similar to I&s relevant. /// public static string FailureMechanismContextMenuStrip_Is_relevant { Index: Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.resx =================================================================== diff -u -rb034322e34cde361a1cb86dffc55e9e0f83a1a9f -r4d7632a55f75ca47d7cee49166570d91a75d3d8f --- Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.resx (.../Resources.resx) (revision b034322e34cde361a1cb86dffc55e9e0f83a1a9f) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/Properties/Resources.resx (.../Resources.resx) (revision 4d7632a55f75ca47d7cee49166570d91a75d3d8f) @@ -1401,4 +1401,34 @@ Categoriegrenzen + + Naam van de categorie. + + + Naam + + + Ondergrens van de categorie. + + + Ondergrens [1/jaar] + + + Bovengrens van de categorie. + + + Bovengrens [1/jaar] + + + De categoriegrenzen per traject voor dit toetsspoor. + + + Categoriegrenzen per traject + + + De categoriegrenzen per vak voor dit toetsspoor. + + + Categoriegrenzen per vak + \ No newline at end of file Index: Ringtoets/Common/src/Ringtoets.Common.Forms/PropertyClasses/FailureMechanismCategoryBoundariesBaseProperties.cs =================================================================== diff -u --- Ringtoets/Common/src/Ringtoets.Common.Forms/PropertyClasses/FailureMechanismCategoryBoundariesBaseProperties.cs (revision 0) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/PropertyClasses/FailureMechanismCategoryBoundariesBaseProperties.cs (revision 4d7632a55f75ca47d7cee49166570d91a75d3d8f) @@ -0,0 +1,130 @@ +// 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 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 General Public License for more details. +// +// You should have received a copy of the GNU 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.ComponentModel; +using System.Linq; +using Core.Common.Gui.Attributes; +using Core.Common.Gui.Converters; +using Core.Common.Gui.PropertyBag; +using Core.Common.Util.Attributes; +using Ringtoets.AssemblyTool.Data; +using Ringtoets.Common.Data.AssemblyTool; +using Ringtoets.Common.Data.AssessmentSection; +using Ringtoets.Common.Data.Contribution; +using Ringtoets.Common.Data.Exceptions; +using Ringtoets.Common.Data.FailureMechanism; +using Ringtoets.Common.Forms.Properties; + +namespace Ringtoets.Common.Forms.PropertyClasses +{ + /// + /// Base ViewModel of the category boundaries in a for properties panel. + /// + public abstract class FailureMechanismCategoryBoundariesBaseProperties : ObjectProperties + { + private const int failureMechanismAssemblyCategoryPropertyIndex = 1; + private const int failureMechanismSectionAssemblyCategoryPropertyIndex = 2; + + protected readonly IAssessmentSection AssessmentSection; + protected readonly Func GetNFunc; + + /// + /// Creates a new instance of . + /// + /// The failure mechanism to show the properties for. + /// The assessment section to show the properties for. + /// The function to get the 'N' parameter used to factor in the 'length effect'. + /// Thrown when any parameter is null. + protected FailureMechanismCategoryBoundariesBaseProperties(IFailureMechanism failureMechanism, + IAssessmentSection assessmentSection, + Func getNFunc) + { + if (failureMechanism == null) + { + throw new ArgumentNullException(nameof(failureMechanism)); + } + + if (assessmentSection == null) + { + throw new ArgumentNullException(nameof(assessmentSection)); + } + + if (getNFunc == null) + { + throw new ArgumentNullException(nameof(getNFunc)); + } + + AssessmentSection = assessmentSection; + GetNFunc = getNFunc; + Data = failureMechanism; + } + + [PropertyOrder(failureMechanismAssemblyCategoryPropertyIndex)] + [ResourcesCategory(typeof(Resources), nameof(Resources.Categories_General))] + [ResourcesDisplayName(typeof(Resources), nameof(Resources.FailureMechanismCategoryBoundariesProperties_FailureMechanismBoundaries_DisplayName))] + [ResourcesDescription(typeof(Resources), nameof(Resources.FailureMechanismCategoryBoundariesProperties_FailureMechanismBoundaries_Description))] + [TypeConverter(typeof(ExpandableArrayConverter))] + public FailureMechanismAssemblyCategoryProperties[] FailureMechanismAssemblyCategoryProperties + { + get + { + return CreateFailureMechanismCategoryBoundaries().Select(boundary => new FailureMechanismAssemblyCategoryProperties(boundary)).ToArray(); + } + } + + [PropertyOrder(failureMechanismSectionAssemblyCategoryPropertyIndex)] + [ResourcesCategory(typeof(Resources), nameof(Resources.Categories_General))] + [ResourcesDisplayName(typeof(Resources), nameof(Resources.FailureMechanismCategoryBoundariesProperties_FailureMechanismSectionBoundaries_DisplayName))] + [ResourcesDescription(typeof(Resources), nameof(Resources.FailureMechanismCategoryBoundariesProperties_FailureMechanismSectionBoundaries_Description))] + [TypeConverter(typeof(ExpandableArrayConverter))] + public FailureMechanismSectionAssemblyCategoryProperties[] FailureMechanismSectionAssemblyCategoryProperties + { + get + { + return CreateFailureMechanismSectionCategoryBoundaries().Select(boundary => new FailureMechanismSectionAssemblyCategoryProperties(boundary)).ToArray(); + } + } + + /// + /// Creates the collection of for the + /// in . + /// + /// A collection of . + protected abstract IEnumerable CreateFailureMechanismSectionCategoryBoundaries(); + + /// + /// Creates the collection of for the + /// in . + /// + /// A collection of . + /// Thrown when an error occurred while creating the categories. + private IEnumerable CreateFailureMechanismCategoryBoundaries() + { + FailureMechanismContribution failureMechanismContribution = AssessmentSection.FailureMechanismContribution; + return AssemblyToolCategoriesFactory.CreateFailureMechanismAssemblyCategories(failureMechanismContribution.SignalingNorm, + failureMechanismContribution.LowerLimitNorm, + data.Contribution, + GetNFunc()); + } + } +} \ No newline at end of file Index: Ringtoets/Common/src/Ringtoets.Common.Forms/Ringtoets.Common.Forms.csproj =================================================================== diff -u -rb034322e34cde361a1cb86dffc55e9e0f83a1a9f -r4d7632a55f75ca47d7cee49166570d91a75d3d8f --- Ringtoets/Common/src/Ringtoets.Common.Forms/Ringtoets.Common.Forms.csproj (.../Ringtoets.Common.Forms.csproj) (revision b034322e34cde361a1cb86dffc55e9e0f83a1a9f) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/Ringtoets.Common.Forms.csproj (.../Ringtoets.Common.Forms.csproj) (revision 4d7632a55f75ca47d7cee49166570d91a75d3d8f) @@ -93,6 +93,7 @@ Resources.resx + Index: Ringtoets/Common/test/Ringtoets.Common.Forms.Test/PropertyClasses/FailureMechanismCategoryBoundariesBasePropertiesTest.cs =================================================================== diff -u --- Ringtoets/Common/test/Ringtoets.Common.Forms.Test/PropertyClasses/FailureMechanismCategoryBoundariesBasePropertiesTest.cs (revision 0) +++ Ringtoets/Common/test/Ringtoets.Common.Forms.Test/PropertyClasses/FailureMechanismCategoryBoundariesBasePropertiesTest.cs (revision 4d7632a55f75ca47d7cee49166570d91a75d3d8f) @@ -0,0 +1,203 @@ +// 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 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 General Public License for more details. +// +// You should have received a copy of the GNU 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.ComponentModel; +using System.Linq; +using Core.Common.Gui.Converters; +using Core.Common.Gui.PropertyBag; +using Core.Common.TestUtil; +using NUnit.Framework; +using Rhino.Mocks; +using Ringtoets.AssemblyTool.Data; +using Ringtoets.Common.Data.AssemblyTool; +using Ringtoets.Common.Data.AssessmentSection; +using Ringtoets.Common.Data.Contribution; +using Ringtoets.Common.Data.FailureMechanism; +using Ringtoets.Common.Data.TestUtil; +using Ringtoets.Common.Forms.PropertyClasses; + +namespace Ringtoets.Common.Forms.Test.PropertyClasses +{ + [TestFixture] + public class FailureMechanismCategoryBoundariesBasePropertiesTest + { + [Test] + public void Constructor_FailureMechanismNull_ThrowsArgumentNullException() + { + // Setup + var mocks = new MockRepository(); + var assessmentSection = mocks.Stub(); + mocks.ReplayAll(); + + // Call + TestDelegate call = () => new TestFailureMechanismCategoryBoundariesProperties(null, + assessmentSection, + () => 0.01); + + // Assert + var exception = Assert.Throws(call); + Assert.AreEqual("failureMechanism", exception.ParamName); + mocks.VerifyAll(); + } + + [Test] + public void Constructor_AssessmentSectionNull_ThrowsArgumentNullException() + { + // Setup + var mocks = new MockRepository(); + var failureMechanism = mocks.Stub(); + mocks.ReplayAll(); + + // Call + TestDelegate call = () => new TestFailureMechanismCategoryBoundariesProperties(failureMechanism, + null, + () => 0.01); + + // Assert + var exception = Assert.Throws(call); + Assert.AreEqual("assessmentSection", exception.ParamName); + mocks.VerifyAll(); + } + + [Test] + public void Constructor_GetNFuncNull_ThrowsArgumentNullException() + { + // Setup + var mocks = new MockRepository(); + var failureMechanism = mocks.Stub(); + var assessmentSection = mocks.Stub(); + mocks.ReplayAll(); + + // Call + TestDelegate call = () => new TestFailureMechanismCategoryBoundariesProperties(failureMechanism, + assessmentSection, + null); + + // Assert + var exception = Assert.Throws(call); + Assert.AreEqual("getNFunc", exception.ParamName); + mocks.VerifyAll(); + } + + [Test] + public void Constructor_ValidParameters_ExpectedValues() + { + // Setup + const double n = 1.0; + + var mocks = new MockRepository(); + var failureMechanism = mocks.Stub(); + failureMechanism.Contribution = 5; + var assessmentSection = new AssessmentSectionStub(); + mocks.ReplayAll(); + + // Call + var properties = new TestFailureMechanismCategoryBoundariesProperties(failureMechanism, + assessmentSection, + () => n); + + // Assert + Assert.IsInstanceOf>(properties); + Assert.AreSame(failureMechanism, properties.Data); + + TestHelper.AssertTypeConverter( + nameof(TestFailureMechanismCategoryBoundariesProperties.FailureMechanismAssemblyCategoryProperties)); + TestHelper.AssertTypeConverter( + nameof(TestFailureMechanismCategoryBoundariesProperties.FailureMechanismSectionAssemblyCategoryProperties)); + + FailureMechanismContribution failureMechanismContribution = assessmentSection.FailureMechanismContribution; + IEnumerable expectedFailureMechanismCategories = AssemblyToolCategoriesFactory.CreateFailureMechanismAssemblyCategories( + failureMechanismContribution.SignalingNorm, + failureMechanismContribution.LowerLimitNorm, + failureMechanism.Contribution, + n); + + Assert.AreEqual(expectedFailureMechanismCategories.Count(), properties.FailureMechanismAssemblyCategoryProperties.Length); + for (var i = 0; i < expectedFailureMechanismCategories.Count(); i++) + { + FailureMechanismAssemblyCategory category = expectedFailureMechanismCategories.ElementAt(i); + FailureMechanismAssemblyCategoryProperties property = properties.FailureMechanismAssemblyCategoryProperties[i]; + Assert.AreEqual(category.Group, property.Group); + Assert.AreEqual(category.UpperBoundary, property.UpperBoundary); + Assert.AreEqual(category.LowerBoundary, property.LowerBoundary); + } + + FailureMechanismSectionAssemblyCategoryProperties actualSectionCategoryProperties = properties.FailureMechanismSectionAssemblyCategoryProperties.Single(); + Assert.AreEqual(FailureMechanismSectionAssemblyCategoryGroup.IIIv, actualSectionCategoryProperties.Group); + Assert.AreEqual(0.0, actualSectionCategoryProperties.LowerBoundary); + Assert.AreEqual(1.0, actualSectionCategoryProperties.UpperBoundary); + + mocks.VerifyAll(); + } + + [Test] + public void Constructor_Always_PropertiesHaveExpectedAttributesValues() + { + // Setup + var mocks = new MockRepository(); + var failureMechanism = mocks.Stub(); + var assessmentSection = new AssessmentSectionStub(); + mocks.ReplayAll(); + + // Call + var properties = new TestFailureMechanismCategoryBoundariesProperties(failureMechanism, + assessmentSection, + () => 0.01); + // Assert + PropertyDescriptorCollection dynamicProperties = PropertiesTestHelper.GetAllVisiblePropertyDescriptors(properties); + Assert.AreEqual(2, dynamicProperties.Count); + + const string generalCategoryName = "Algemeen"; + + PropertyDescriptor failureMechanismCategoriesProperty = dynamicProperties[0]; + PropertiesTestHelper.AssertRequiredPropertyDescriptorProperties(failureMechanismCategoriesProperty, + generalCategoryName, + "Categoriegrenzen per traject", + "De categoriegrenzen per traject voor dit toetsspoor.", + true); + + PropertyDescriptor failureMechanismSectionCategoriesProperty = dynamicProperties[1]; + PropertiesTestHelper.AssertRequiredPropertyDescriptorProperties(failureMechanismSectionCategoriesProperty, + generalCategoryName, + "Categoriegrenzen per vak", + "De categoriegrenzen per vak voor dit toetsspoor.", + true); + + mocks.VerifyAll(); + } + + private class TestFailureMechanismCategoryBoundariesProperties : FailureMechanismCategoryBoundariesBaseProperties + { + public TestFailureMechanismCategoryBoundariesProperties(IFailureMechanism failureMechanism, IAssessmentSection assessmentSection, Func getNFunc) + : base(failureMechanism, assessmentSection, getNFunc) {} + + protected override IEnumerable CreateFailureMechanismSectionCategoryBoundaries() + { + return new[] + { + new FailureMechanismSectionAssemblyCategory(0.0, 1.0, FailureMechanismSectionAssemblyCategoryGroup.IIIv) + }; + } + } + } +} \ No newline at end of file Index: Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Ringtoets.Common.Forms.Test.csproj =================================================================== diff -u -rb034322e34cde361a1cb86dffc55e9e0f83a1a9f -r4d7632a55f75ca47d7cee49166570d91a75d3d8f --- Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Ringtoets.Common.Forms.Test.csproj (.../Ringtoets.Common.Forms.Test.csproj) (revision b034322e34cde361a1cb86dffc55e9e0f83a1a9f) +++ Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Ringtoets.Common.Forms.Test.csproj (.../Ringtoets.Common.Forms.Test.csproj) (revision 4d7632a55f75ca47d7cee49166570d91a75d3d8f) @@ -98,6 +98,7 @@ +