// Copyright (C) Stichting Deltares 2016. 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 System.Linq;
using Core.Common.Base;
using Core.Common.Base.Data;
using Core.Common.Base.Geometry;
using Core.Common.Gui.Converters;
using Core.Common.Gui.PropertyBag;
using Core.Common.Utils;
using NUnit.Framework;
using Rhino.Mocks;
using Ringtoets.Common.Data.AssessmentSection;
using Ringtoets.Common.Data.DikeProfiles;
using Ringtoets.Common.Data.TestUtil;
using Ringtoets.Common.Forms.PropertyClasses;
using Ringtoets.HydraRing.Data;
using Ringtoets.Revetment.Data;
using Ringtoets.Revetment.Forms.PropertyClasses;
using Ringtoets.StabilityStoneCover.Data;
using Ringtoets.StabilityStoneCover.Forms.PresentationObjects;
using Ringtoets.StabilityStoneCover.Forms.PropertyClasses;
namespace Ringtoets.StabilityStoneCover.Forms.Test.PropertyClasses
{
[TestFixture]
public class StabilityStoneCoverWaveConditionsInputContextPropertiesTest
{
private const int hydraulicBoundaryLocationPropertyIndex = 0;
private const int assessmentLevelPropertyIndex = 1;
private const int upperBoundaryDesignWaterLevelPropertyIndex = 2;
private const int upperBoundaryRevetmentPropertyIndex = 3;
private const int lowerBoundaryRevetmentPropertyIndex = 4;
private const int upperBoundaryWaterLevelsPropertyIndex = 5;
private const int lowerBoundaryWaterLevelsPropertyIndex = 6;
private const int stepSizePropertyIndex = 7;
private const int waterLevelsPropertyIndex = 8;
private const int foreshoreProfilePropertyIndex = 9;
private const int worldReferencePointPropertyIndex = 10;
private const int orientationPropertyIndex = 11;
private const int breakWaterPropertyIndex = 12;
private const int foreshoreGeometryPropertyIndex = 13;
private const int revetmentTypePropertyIndex = 14;
[Test]
public void Constructor_ExpectedValues()
{
// Call
var properties = new StabilityStoneCoverWaveConditionsInputContextProperties();
// Assert
Assert.IsInstanceOf>(properties);
Assert.IsNull(properties.Data);
}
[Test]
public void Data_SetDefaultInputContextInstance_ReturnCorrectPropertyValues()
{
// Setup
var mocks = new MockRepository();
var assessmentSection = mocks.Stub();
mocks.ReplayAll();
var input = new WaveConditionsInput();
var failureMechanism = new StabilityStoneCoverFailureMechanism();
var inputContext = new StabilityStoneCoverWaveConditionsInputContext(input,
failureMechanism.ForeshoreProfiles,
assessmentSection);
// Call
var properties = new StabilityStoneCoverWaveConditionsInputContextProperties
{
Data = inputContext
};
// Assert
Assert.IsNaN(properties.AssessmentLevel.Value);
Assert.IsNaN(properties.UpperBoundaryDesignWaterLevel.Value);
Assert.AreEqual(2, properties.UpperBoundaryDesignWaterLevel.NumberOfDecimalPlaces);
Assert.IsNaN(properties.UpperBoundaryRevetment.Value);
Assert.AreEqual(2, properties.UpperBoundaryRevetment.NumberOfDecimalPlaces);
Assert.IsNaN(properties.LowerBoundaryRevetment.Value);
Assert.AreEqual(2, properties.LowerBoundaryRevetment.NumberOfDecimalPlaces);
Assert.IsNaN(properties.UpperBoundaryWaterLevels.Value);
Assert.AreEqual(2, properties.UpperBoundaryWaterLevels.NumberOfDecimalPlaces);
Assert.IsNaN(properties.LowerBoundaryWaterLevels.Value);
Assert.AreEqual(2, properties.LowerBoundaryWaterLevels.NumberOfDecimalPlaces);
Assert.AreEqual(0.5, properties.StepSize.AsValue());
CollectionAssert.AreEqual(input.WaterLevels, properties.WaterLevels);
Assert.IsNull(properties.ForeshoreProfile);
Assert.IsNull(properties.WorldReferencePoint);
Assert.AreEqual(2, properties.Orientation.NumberOfDecimalPlaces);
Assert.IsNaN(properties.Orientation);
Assert.IsInstanceOf(properties.BreakWater);
Assert.IsInstanceOf(properties.ForeshoreGeometry);
Assert.AreEqual("Steen (blokken en zuilen)", properties.RevetmentType);
mocks.VerifyAll();
}
[Test]
public void Data_SetNewInputContextInstanceWithForeshoreProfile_ReturnCorrectPropertyValues()
{
// Setup
var mocks = new MockRepository();
var assessmentSection = mocks.Stub();
mocks.ReplayAll();
var random = new Random(21);
var assessmentLevel = (RoundedDouble) random.NextDouble();
var lowerBoundaryRevetment = (RoundedDouble) random.NextDouble();
var lowerBoundaryWaterLevels = (RoundedDouble) random.NextDouble();
var upperBoundaryRevetment = lowerBoundaryRevetment + (RoundedDouble) random.NextDouble();
var upperBoundaryWaterLevels = lowerBoundaryWaterLevels + (RoundedDouble) random.NextDouble();
var stepSize = WaveConditionsInputStepSize.Half;
var worldX = (RoundedDouble) random.NextDouble();
var worldY = (RoundedDouble) random.NextDouble();
var damHeight = (RoundedDouble) random.NextDouble();
var foreshoreProfileOrientation = (RoundedDouble) random.NextDouble();
var foreshoreProfile = new ForeshoreProfile(
new Point2D(worldX, worldY),
Enumerable.Empty(),
new BreakWater(BreakWaterType.Dam, damHeight),
new ForeshoreProfile.ConstructionProperties
{
Name = string.Empty,
Orientation = foreshoreProfileOrientation,
X0 = -3
});
var hydraulicBoundaryLocation = new HydraulicBoundaryLocation(1, string.Empty, 0, 0)
{
DesignWaterLevel = assessmentLevel
};
assessmentSection.HydraulicBoundaryDatabase = new HydraulicBoundaryDatabase
{
Locations =
{
hydraulicBoundaryLocation
}
};
var input = new WaveConditionsInput()
{
ForeshoreProfile = foreshoreProfile,
HydraulicBoundaryLocation = hydraulicBoundaryLocation,
UpperBoundaryRevetment = upperBoundaryRevetment,
LowerBoundaryRevetment = lowerBoundaryRevetment,
UpperBoundaryWaterLevels = upperBoundaryWaterLevels,
LowerBoundaryWaterLevels = lowerBoundaryWaterLevels,
StepSize = stepSize
};
var failureMechanism = new StabilityStoneCoverFailureMechanism();
failureMechanism.ForeshoreProfiles.Add(foreshoreProfile);
var inputContext = new StabilityStoneCoverWaveConditionsInputContext(input,
failureMechanism.ForeshoreProfiles,
assessmentSection);
// Call
var properties = new StabilityStoneCoverWaveConditionsInputContextProperties
{
Data = inputContext
};
// Assert
Assert.AreSame(hydraulicBoundaryLocation, properties.HydraulicBoundaryLocation);
Assert.AreEqual(assessmentLevel.Value, properties.AssessmentLevel.Value, properties.AssessmentLevel.GetAccuracy());
Assert.AreSame(foreshoreProfile, properties.ForeshoreProfile);
Assert.AreEqual(worldX, properties.WorldReferencePoint.X, 0.5);
Assert.AreEqual(worldY, properties.WorldReferencePoint.Y, 0.5);
Assert.AreEqual(2, properties.Orientation.NumberOfDecimalPlaces);
Assert.AreEqual(foreshoreProfileOrientation, properties.Orientation.Value, properties.Orientation.GetAccuracy());
Assert.AreEqual(BreakWaterType.Dam, properties.BreakWater.BreakWaterType);
Assert.AreEqual(damHeight, properties.BreakWater.BreakWaterHeight.Value, properties.BreakWater.BreakWaterHeight.GetAccuracy());
Assert.IsEmpty(properties.ForeshoreGeometry.Coordinates);
mocks.VerifyAll();
}
[Test]
public void SetProperties_IndividualProperties_UpdateDataAndNotifyObservers()
{
// Setup
var mocks = new MockRepository();
var observerMock = mocks.StrictMock();
const int numberProperties = 8;
observerMock.Expect(o => o.UpdateObserver()).Repeat.Times(numberProperties);
var assessmentSection = mocks.Stub();
mocks.ReplayAll();
var random = new Random(21);
var orientation = (RoundedDouble) random.NextDouble();
var assessmentLevel = (RoundedDouble) random.NextDouble();
var newLowerBoundaryRevetment = (RoundedDouble) random.NextDouble();
var newLowerBoundaryWaterLevels = (RoundedDouble) random.NextDouble();
var newUpperBoundaryRevetment = newLowerBoundaryRevetment + (RoundedDouble) random.NextDouble();
var newUpperBoundaryWaterLevels = newLowerBoundaryWaterLevels + (RoundedDouble) random.NextDouble();
var newStepSize = WaveConditionsInputStepSize.Half;
var newHydraulicBoundaryLocation = new HydraulicBoundaryLocation(0, "name", 0.0, 1.1)
{
DesignWaterLevel = assessmentLevel
};
assessmentSection.HydraulicBoundaryDatabase = new HydraulicBoundaryDatabase
{
Locations =
{
newHydraulicBoundaryLocation
}
};
var input = new WaveConditionsInput();
input.Attach(observerMock);
var failureMechanism = new StabilityStoneCoverFailureMechanism();
var inputContext = new StabilityStoneCoverWaveConditionsInputContext(input,
failureMechanism.ForeshoreProfiles,
assessmentSection);
var newForeshoreProfile = new ForeshoreProfile(
new Point2D(
(RoundedDouble) random.NextDouble(),
(RoundedDouble) random.NextDouble()),
Enumerable.Empty(),
new BreakWater(BreakWaterType.Dam, (RoundedDouble) random.NextDouble()),
new ForeshoreProfile.ConstructionProperties());
var properties = new StabilityStoneCoverWaveConditionsInputContextProperties
{
Data = inputContext
};
// Call
properties.ForeshoreProfile = newForeshoreProfile;
properties.UpperBoundaryRevetment = newUpperBoundaryRevetment;
properties.LowerBoundaryRevetment = newLowerBoundaryRevetment;
properties.UpperBoundaryWaterLevels = newUpperBoundaryWaterLevels;
properties.LowerBoundaryWaterLevels = newLowerBoundaryWaterLevels;
properties.StepSize = newStepSize;
properties.HydraulicBoundaryLocation = newHydraulicBoundaryLocation;
properties.Orientation = orientation;
// Assert
Assert.AreSame(input.HydraulicBoundaryLocation, properties.HydraulicBoundaryLocation);
Assert.AreEqual(input.HydraulicBoundaryLocation.DesignWaterLevel.Value, properties.AssessmentLevel.Value);
Assert.AreEqual(assessmentLevel - 0.01, properties.UpperBoundaryDesignWaterLevel.Value, properties.UpperBoundaryDesignWaterLevel.GetAccuracy());
Assert.AreEqual(2, properties.UpperBoundaryDesignWaterLevel.NumberOfDecimalPlaces);
Assert.AreEqual(newUpperBoundaryRevetment.Value, properties.UpperBoundaryRevetment.Value, properties.UpperBoundaryRevetment.GetAccuracy());
Assert.AreEqual(2, properties.UpperBoundaryRevetment.NumberOfDecimalPlaces);
Assert.AreEqual(newLowerBoundaryRevetment.Value, properties.LowerBoundaryRevetment.Value, properties.LowerBoundaryRevetment.GetAccuracy());
Assert.AreEqual(2, properties.LowerBoundaryRevetment.NumberOfDecimalPlaces);
Assert.AreEqual(newUpperBoundaryWaterLevels.Value, properties.UpperBoundaryWaterLevels.Value, properties.UpperBoundaryWaterLevels.GetAccuracy());
Assert.AreEqual(2, properties.UpperBoundaryWaterLevels.NumberOfDecimalPlaces);
Assert.AreEqual(newLowerBoundaryWaterLevels.Value, properties.LowerBoundaryWaterLevels.Value, properties.LowerBoundaryWaterLevels.GetAccuracy());
Assert.AreEqual(2, properties.LowerBoundaryWaterLevels.NumberOfDecimalPlaces);
Assert.AreEqual(orientation, properties.Orientation.Value, properties.Orientation.GetAccuracy());
Assert.AreEqual(2, properties.Orientation.NumberOfDecimalPlaces);
Assert.AreEqual(newStepSize, properties.StepSize);
mocks.VerifyAll();
}
[Test]
public void PropertyAttributes_ReturnExpectedValues(
[Values(true, false)] bool withForeshoreProfile)
{
// Setup
var mocks = new MockRepository();
var assessmentSection = mocks.Stub();
mocks.ReplayAll();
var input = new WaveConditionsInput();
var foreshoreProfile = new ForeshoreProfile(
new Point2D(0, 0),
Enumerable.Empty(),
null,
new ForeshoreProfile.ConstructionProperties());
if (withForeshoreProfile)
{
input.ForeshoreProfile = foreshoreProfile;
}
var failureMechanism = new StabilityStoneCoverFailureMechanism();
var inputContext = new StabilityStoneCoverWaveConditionsInputContext(input, failureMechanism.ForeshoreProfiles, assessmentSection);
// Call
var properties = new StabilityStoneCoverWaveConditionsInputContextProperties
{
Data = inputContext
};
// Assert
var dynamicPropertyBag = new DynamicPropertyBag(properties);
PropertyDescriptorCollection dynamicProperties = dynamicPropertyBag.GetProperties(new Attribute[]
{
BrowsableAttribute.Yes
});
Assert.AreEqual(15, dynamicProperties.Count);
var hydraulicParametersCategory = "Hydraulische gegevens";
var schematizationCategory = "Schematisatie";
PropertyDescriptor hydraulicBoundaryLocationProperty = dynamicProperties[hydraulicBoundaryLocationPropertyIndex];
Assert.IsNotNull(hydraulicBoundaryLocationProperty);
Assert.IsFalse(hydraulicBoundaryLocationProperty.IsReadOnly);
Assert.AreEqual(hydraulicParametersCategory, hydraulicBoundaryLocationProperty.Category);
Assert.AreEqual("Locatie met hydraulische randvoorwaarden", hydraulicBoundaryLocationProperty.DisplayName);
Assert.AreEqual("De locatie met hydraulische randvoorwaarden.", hydraulicBoundaryLocationProperty.Description);
PropertyDescriptor assessmentLevelProperty = dynamicProperties[assessmentLevelPropertyIndex];
Assert.IsNotNull(assessmentLevelProperty);
Assert.IsTrue(assessmentLevelProperty.IsReadOnly);
Assert.AreEqual(hydraulicParametersCategory, assessmentLevelProperty.Category);
Assert.AreEqual("Toetspeil [m+NAP]", assessmentLevelProperty.DisplayName);
Assert.AreEqual("Waterstand met een overschrijdingsfrequentie gelijk aan de trajectnorm.", assessmentLevelProperty.Description);
PropertyDescriptor upperBoundaryDesignWaterLevelProperty = dynamicProperties[upperBoundaryDesignWaterLevelPropertyIndex];
Assert.IsNotNull(upperBoundaryDesignWaterLevelProperty);
Assert.IsTrue(upperBoundaryDesignWaterLevelProperty.IsReadOnly);
Assert.AreEqual(hydraulicParametersCategory, upperBoundaryDesignWaterLevelProperty.Category);
Assert.AreEqual("Bovengrens op basis van toetspeil [m+NAP]", upperBoundaryDesignWaterLevelProperty.DisplayName);
Assert.AreEqual("Bovengrens bepaald aan de hand van de waarde van het toetspeil op de geselecteerde hydraulische locatie.", upperBoundaryDesignWaterLevelProperty.Description);
PropertyDescriptor upperBoundaryRevetmentProperty = dynamicProperties[upperBoundaryRevetmentPropertyIndex];
Assert.IsNotNull(upperBoundaryRevetmentProperty);
Assert.IsTrue(upperBoundaryDesignWaterLevelProperty.IsReadOnly);
Assert.AreEqual(hydraulicParametersCategory, upperBoundaryRevetmentProperty.Category);
Assert.AreEqual("Bovengrens bekleding [m+NAP]", upperBoundaryRevetmentProperty.DisplayName);
Assert.AreEqual("Bovengrens van de bekleding.", upperBoundaryRevetmentProperty.Description);
PropertyDescriptor lowerBoundaryRevetmentProperty = dynamicProperties[lowerBoundaryRevetmentPropertyIndex];
Assert.IsNotNull(lowerBoundaryRevetmentProperty);
Assert.IsFalse(lowerBoundaryRevetmentProperty.IsReadOnly);
Assert.AreEqual(hydraulicParametersCategory, lowerBoundaryRevetmentProperty.Category);
Assert.AreEqual("Ondergrens bekleding [m+NAP]", lowerBoundaryRevetmentProperty.DisplayName);
Assert.AreEqual("Ondergrens van de bekleding.", lowerBoundaryRevetmentProperty.Description);
PropertyDescriptor upperBoundaryWaterLevelsProperty = dynamicProperties[upperBoundaryWaterLevelsPropertyIndex];
Assert.IsNotNull(upperBoundaryWaterLevelsProperty);
Assert.IsFalse(upperBoundaryWaterLevelsProperty.IsReadOnly);
Assert.AreEqual(hydraulicParametersCategory, upperBoundaryWaterLevelsProperty.Category);
Assert.AreEqual("Bovengrens waterstanden [m+NAP]", upperBoundaryWaterLevelsProperty.DisplayName);
Assert.AreEqual("Een aangepaste bovengrens voor de waterstanden.", upperBoundaryWaterLevelsProperty.Description);
PropertyDescriptor lowerBoundaryWaterLevelsProperty = dynamicProperties[lowerBoundaryWaterLevelsPropertyIndex];
Assert.IsNotNull(lowerBoundaryWaterLevelsProperty);
Assert.IsFalse(lowerBoundaryWaterLevelsProperty.IsReadOnly);
Assert.AreEqual(hydraulicParametersCategory, lowerBoundaryWaterLevelsProperty.Category);
Assert.AreEqual("Ondergrens waterstanden [m+NAP]", lowerBoundaryWaterLevelsProperty.DisplayName);
Assert.AreEqual("Een aangepaste ondergrens voor de waterstanden.", lowerBoundaryWaterLevelsProperty.Description);
PropertyDescriptor stepSizeProperty = dynamicProperties[stepSizePropertyIndex];
Assert.IsNotNull(stepSizeProperty);
Assert.IsInstanceOf(stepSizeProperty.Converter);
Assert.IsFalse(stepSizeProperty.IsReadOnly);
Assert.AreEqual(hydraulicParametersCategory, stepSizeProperty.Category);
Assert.AreEqual("Stapgrootte [m]", stepSizeProperty.DisplayName);
Assert.AreEqual("Grootte van de stappen waarmee de waterstanden in de berekening worden bepaald.", stepSizeProperty.Description);
PropertyDescriptor waterLevelsProperty = dynamicProperties[waterLevelsPropertyIndex];
Assert.IsNotNull(waterLevelsProperty);
Assert.IsInstanceOf(waterLevelsProperty.Converter);
Assert.IsTrue(waterLevelsProperty.IsReadOnly);
Assert.AreEqual(hydraulicParametersCategory, waterLevelsProperty.Category);
Assert.AreEqual("Waterstanden in berekening [m+NAP]", waterLevelsProperty.DisplayName);
Assert.AreEqual("De waterstanden waarvoor gerekend moet worden. Deze zijn afgeleid van de opgegeven boven- en ondergrenzen, en van de stapgrootte.", waterLevelsProperty.Description);
PropertyDescriptor foreshoreProfileProperty = dynamicProperties[foreshoreProfilePropertyIndex];
Assert.IsNotNull(foreshoreProfileProperty);
Assert.IsFalse(foreshoreProfileProperty.IsReadOnly);
Assert.AreEqual(schematizationCategory, foreshoreProfileProperty.Category);
Assert.AreEqual("Voorlandprofiel", foreshoreProfileProperty.DisplayName);
Assert.AreEqual("De schematisatie van het voorlandprofiel.", foreshoreProfileProperty.Description);
PropertyDescriptor worldReferencePointProperty = dynamicProperties[worldReferencePointPropertyIndex];
Assert.IsNotNull(worldReferencePointProperty);
Assert.IsTrue(worldReferencePointProperty.IsReadOnly);
Assert.AreEqual(schematizationCategory, worldReferencePointProperty.Category);
Assert.AreEqual("Locatie (RD) [m]", worldReferencePointProperty.DisplayName);
Assert.AreEqual("De coördinaten van de locatie van het voorlandprofiel in het Rijksdriehoeksstelsel.", worldReferencePointProperty.Description);
PropertyDescriptor orientationProperty = dynamicProperties[orientationPropertyIndex];
Assert.IsNotNull(orientationProperty);
Assert.IsFalse(orientationProperty.IsReadOnly);
Assert.AreEqual(schematizationCategory, orientationProperty.Category);
Assert.AreEqual("Oriëntatie [°]", orientationProperty.DisplayName);
Assert.AreEqual("Oriëntatie van de dijknormaal ten opzichte van het noorden.", orientationProperty.Description);
PropertyDescriptor breakWaterProperty = dynamicProperties[breakWaterPropertyIndex];
Assert.IsNotNull(breakWaterProperty);
Assert.IsInstanceOf(breakWaterProperty.Converter);
Assert.IsTrue(breakWaterProperty.IsReadOnly);
Assert.AreEqual(schematizationCategory, breakWaterProperty.Category);
Assert.AreEqual("Dam", breakWaterProperty.DisplayName);
Assert.AreEqual("Eigenschappen van de dam.", breakWaterProperty.Description);
PropertyDescriptor foreshoreGeometryProperty = dynamicProperties[foreshoreGeometryPropertyIndex];
Assert.IsNotNull(foreshoreGeometryProperty);
Assert.IsInstanceOf(foreshoreGeometryProperty.Converter);
Assert.IsTrue(foreshoreGeometryProperty.IsReadOnly);
Assert.AreEqual(schematizationCategory, foreshoreGeometryProperty.Category);
Assert.AreEqual("Voorlandgeometrie", foreshoreGeometryProperty.DisplayName);
Assert.AreEqual("Eigenschappen van de voorlandgeometrie.", foreshoreGeometryProperty.Description);
PropertyDescriptor revetmentTypeProperty = dynamicProperties[revetmentTypePropertyIndex];
Assert.IsNotNull(revetmentTypeProperty);
Assert.IsTrue(revetmentTypeProperty.IsReadOnly);
Assert.AreEqual(schematizationCategory, revetmentTypeProperty.Category);
Assert.AreEqual("Type bekleding", revetmentTypeProperty.DisplayName);
Assert.AreEqual("Het type van de bekleding waarvoor berekend wordt.", revetmentTypeProperty.Description);
mocks.VerifyAll();
}
}
}