// 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.ComponentModel; using Core.Common.Base; using Core.Common.Gui.PropertyBag; using Core.Common.TestUtil; using NUnit.Framework; using Rhino.Mocks; using Ringtoets.ClosingStructures.Data; using Ringtoets.ClosingStructures.Forms.PropertyClasses; using Ringtoets.Common.Data.TestUtil; namespace Ringtoets.ClosingStructures.Forms.Test.PropertyClasses { [TestFixture] public class ClosingStructuresFailureMechanismPropertiesTest { [Test] public void Constructor_DataNull_ThrowArgumentNullException() { // Call TestDelegate test = () => new ClosingStructuresFailureMechanismProperties(null); // Assert string paramName = Assert.Throws(test).ParamName; Assert.AreEqual("data", paramName); } [Test] [TestCase(true)] [TestCase(false)] public void Constructor_ValidValues_ExpectedValues(bool isRelevant) { // Setup var failureMechanism = new ClosingStructuresFailureMechanism { IsRelevant = isRelevant }; // Call var properties = new ClosingStructuresFailureMechanismProperties(failureMechanism); // Assert Assert.IsInstanceOf>(properties); Assert.AreSame(failureMechanism, properties.Data); Assert.AreEqual(failureMechanism.Name, properties.Name); Assert.AreEqual(failureMechanism.Code, properties.Code); Assert.AreEqual(failureMechanism.Contribution, properties.Contribution); Assert.AreEqual(isRelevant, properties.IsRelevant); GeneralClosingStructuresInput generalInput = failureMechanism.GeneralInput; Assert.AreEqual(generalInput.GravitationalAcceleration, properties.GravitationalAcceleration); Assert.AreEqual(generalInput.C, properties.C); Assert.AreEqual(generalInput.N2A, properties.N2A); Assert.AreEqual(2, properties.N.NumberOfDecimalPlaces); Assert.AreEqual(generalInput.N, properties.N, properties.N.GetAccuracy()); Assert.AreEqual(generalInput.ModelFactorOvertoppingFlow.Mean, properties.ModelFactorOvertoppingFlow.Mean); Assert.AreEqual(generalInput.ModelFactorOvertoppingFlow.StandardDeviation, properties.ModelFactorOvertoppingFlow.StandardDeviation); Assert.AreEqual(generalInput.ModelFactorStorageVolume.Mean, properties.ModelFactorStorageVolume.Mean); Assert.AreEqual(generalInput.ModelFactorStorageVolume.StandardDeviation, properties.ModelFactorStorageVolume.StandardDeviation); Assert.AreEqual(generalInput.ModelFactorSubCriticalFlow.Mean, properties.ModelFactorSubCriticalFlow.Mean); Assert.AreEqual(generalInput.ModelFactorSubCriticalFlow.CoefficientOfVariation, properties.ModelFactorSubCriticalFlow.CoefficientOfVariation); Assert.AreEqual(generalInput.ModelFactorInflowVolume, properties.ModelFactorInflowVolume); } [Test] public void Constructor_IsRelevantTrue_PropertiesHaveExpectedAttributesValues() { // Call var properties = new ClosingStructuresFailureMechanismProperties( new ClosingStructuresFailureMechanism { IsRelevant = true }); // Assert const string generalCategory = "Algemeen"; const string lengthEffectCategory = "Lengte-effect parameters"; const string modelSettingsCategory = "Modelinstellingen"; PropertyDescriptorCollection dynamicProperties = PropertiesTestHelper.GetAllVisiblePropertyDescriptors(properties); Assert.AreEqual(12, dynamicProperties.Count); PropertyDescriptor nameProperty = dynamicProperties[0]; PropertiesTestHelper.AssertRequiredPropertyDescriptorProperties(nameProperty, generalCategory, "Naam", "De naam van het toetsspoor.", true); PropertyDescriptor codeProperty = dynamicProperties[1]; PropertiesTestHelper.AssertRequiredPropertyDescriptorProperties(codeProperty, generalCategory, "Label", "Het label van het toetsspoor.", true); PropertyDescriptor contributionProperty = dynamicProperties[2]; PropertiesTestHelper.AssertRequiredPropertyDescriptorProperties(contributionProperty, generalCategory, "Faalkansbijdrage [%]", "Procentuele bijdrage van dit toetsspoor aan de totale overstromingskans van het traject.", true); PropertyDescriptor isRelevantProperty = dynamicProperties[3]; PropertiesTestHelper.AssertRequiredPropertyDescriptorProperties(isRelevantProperty, generalCategory, "Is relevant", "Geeft aan of dit toetsspoor relevant is of niet.", true); PropertyDescriptor gravitationalAccelerationProperty = dynamicProperties[4]; PropertiesTestHelper.AssertRequiredPropertyDescriptorProperties(gravitationalAccelerationProperty, generalCategory, "Valversnelling [m/s²]", "Valversnelling.", true); PropertyDescriptor cProperty = dynamicProperties[5]; PropertiesTestHelper.AssertRequiredPropertyDescriptorProperties(cProperty, lengthEffectCategory, "C [-]", "De parameter 'C' die gebruikt wordt om het lengte-effect te berekenen.", true); PropertyDescriptor n2AProperty = dynamicProperties[6]; PropertiesTestHelper.AssertRequiredPropertyDescriptorProperties(n2AProperty, lengthEffectCategory, "2NA [-]", "De parameter '2NA' die gebruikt wordt om het lengte-effect te berekenen."); PropertyDescriptor nProperty = dynamicProperties[7]; PropertiesTestHelper.AssertRequiredPropertyDescriptorProperties(nProperty, lengthEffectCategory, "N* [-]", "De parameter 'N' die gebruikt wordt om het lengte-effect mee te nemen in de beoordeling (afgerond).", true); PropertyDescriptor modelFactorOvertoppingFlowProperty = dynamicProperties[8]; Assert.IsInstanceOf(modelFactorOvertoppingFlowProperty.Converter); PropertiesTestHelper.AssertRequiredPropertyDescriptorProperties(modelFactorOvertoppingFlowProperty, modelSettingsCategory, "Modelfactor overslagdebiet [-]", "Modelfactor voor het overslagdebiet.", true); PropertyDescriptor modelFactorStorageVolumeProperty = dynamicProperties[9]; Assert.IsInstanceOf(modelFactorStorageVolumeProperty.Converter); PropertiesTestHelper.AssertRequiredPropertyDescriptorProperties(modelFactorStorageVolumeProperty, modelSettingsCategory, "Modelfactor kombergend vermogen [-]", "Modelfactor kombergend vermogen.", true); PropertyDescriptor modelFactorSubCriticalFlowProperty = dynamicProperties[10]; Assert.IsInstanceOf(modelFactorSubCriticalFlowProperty.Converter); PropertiesTestHelper.AssertRequiredPropertyDescriptorProperties(modelFactorSubCriticalFlowProperty, modelSettingsCategory, "Modelfactor voor onvolkomen stroming [-]", "Modelfactor voor onvolkomen stroming.", true); PropertyDescriptor modelFactorInflowVolumeProperty = dynamicProperties[11]; PropertiesTestHelper.AssertRequiredPropertyDescriptorProperties(modelFactorInflowVolumeProperty, modelSettingsCategory, "Modelfactor instromend volume [-]", "Modelfactor instromend volume.", true); } [Test] public void Constructor_IsRelevantFalse_PropertiesHaveExpectedAttributesValues() { // Call var properties = new ClosingStructuresFailureMechanismProperties( new ClosingStructuresFailureMechanism { IsRelevant = false }); // Assert const string generalCategory = "Algemeen"; PropertyDescriptorCollection dynamicProperties = PropertiesTestHelper.GetAllVisiblePropertyDescriptors(properties); Assert.AreEqual(3, dynamicProperties.Count); PropertyDescriptor nameProperty = dynamicProperties[0]; PropertiesTestHelper.AssertRequiredPropertyDescriptorProperties(nameProperty, generalCategory, "Naam", "De naam van het toetsspoor.", true); PropertyDescriptor codeProperty = dynamicProperties[1]; PropertiesTestHelper.AssertRequiredPropertyDescriptorProperties(codeProperty, generalCategory, "Label", "Het label van het toetsspoor.", true); PropertyDescriptor isRelevantProperty = dynamicProperties[2]; PropertiesTestHelper.AssertRequiredPropertyDescriptorProperties(isRelevantProperty, generalCategory, "Is relevant", "Geeft aan of dit toetsspoor relevant is of niet.", true); } [Test] [TestCase(-10)] [TestCase(-1)] [TestCase(41)] [TestCase(141)] public void N2A_InvalidValue_ThrowsArgumentOutOfRangeExceptionNoNotifications(int value) { // Setup var mockRepository = new MockRepository(); var observer = mockRepository.StrictMock(); mockRepository.ReplayAll(); var failureMechanism = new ClosingStructuresFailureMechanism(); failureMechanism.Attach(observer); var properties = new ClosingStructuresFailureMechanismProperties(failureMechanism); // Call TestDelegate test = () => properties.N2A = value; // Assert const string expectedMessage = "De waarde voor 'N2A' moet in het bereik [0, 40] liggen."; TestHelper.AssertThrowsArgumentExceptionAndTestMessage(test, expectedMessage); mockRepository.VerifyAll(); } [Test] [TestCase(0)] [TestCase(5)] [TestCase(21)] [TestCase(40)] public void N2A_SetValidValue_UpdateDataAndNotifyObservers(int value) { // Setup var mockRepository = new MockRepository(); var observer = mockRepository.StrictMock(); observer.Expect(o => o.UpdateObserver()); mockRepository.ReplayAll(); var failureMechanism = new ClosingStructuresFailureMechanism(); failureMechanism.Attach(observer); var properties = new ClosingStructuresFailureMechanismProperties(failureMechanism); // Call properties.N2A = value; // Assert Assert.AreEqual(value, failureMechanism.GeneralInput.N2A); mockRepository.VerifyAll(); } [Test] [TestCase(true)] [TestCase(false)] public void DynamicVisibleValidationMethod_DependingOnRelevancy_ReturnExpectedVisibility(bool isRelevant) { // Setup var properties = new ClosingStructuresFailureMechanismProperties( new ClosingStructuresFailureMechanism { IsRelevant = isRelevant }); // Call & Assert Assert.IsTrue(properties.DynamicVisibleValidationMethod(nameof(properties.Name))); Assert.IsTrue(properties.DynamicVisibleValidationMethod(nameof(properties.Code))); Assert.IsTrue(properties.DynamicVisibleValidationMethod(nameof(properties.IsRelevant))); Assert.AreEqual(isRelevant, properties.DynamicVisibleValidationMethod(nameof(properties.Contribution))); Assert.AreEqual(isRelevant, properties.DynamicVisibleValidationMethod(nameof(properties.C))); Assert.AreEqual(isRelevant, properties.DynamicVisibleValidationMethod(nameof(properties.N2A))); Assert.AreEqual(isRelevant, properties.DynamicVisibleValidationMethod(nameof(properties.N))); Assert.AreEqual(isRelevant, properties.DynamicVisibleValidationMethod(nameof(properties.GravitationalAcceleration))); Assert.AreEqual(isRelevant, properties.DynamicVisibleValidationMethod(nameof(properties.ModelFactorOvertoppingFlow))); Assert.AreEqual(isRelevant, properties.DynamicVisibleValidationMethod(nameof(properties.ModelFactorStorageVolume))); Assert.AreEqual(isRelevant, properties.DynamicVisibleValidationMethod(nameof(properties.ModelFactorSubCriticalFlow))); Assert.AreEqual(isRelevant, properties.DynamicVisibleValidationMethod(nameof(properties.ModelFactorInflowVolume))); Assert.IsTrue(properties.DynamicVisibleValidationMethod(null)); } } }