using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Windows.Forms; using Core.Common.Base; using Core.Common.Base.Geometry; using Core.Common.Controls.Views; using Core.Components.DotSpatial.Forms; using Core.Components.Gis.Data; using NUnit.Framework; using Rhino.Mocks; using Ringtoets.Common.Data; using Ringtoets.HydraRing.Data; using Ringtoets.Piping.Data; using Ringtoets.Piping.Forms.PresentationObjects; using Ringtoets.Piping.Forms.Views; namespace Ringtoets.Piping.Forms.Test.Views { [TestFixture] public class PipingFailureMechanismViewTest { [Test] public void DefaultConstructor_DefaultValues() { // Call var view = new PipingFailureMechanismView(); // Assert Assert.IsInstanceOf(view); Assert.IsInstanceOf(view); Assert.IsInstanceOf(view); Assert.IsNotNull(view.Map); Assert.IsNull(view.Data); } [Test] public void DefaultConstructor_Always_AddsBaseMapWithoutData() { // Call var view = new PipingFailureMechanismView(); // Assert Assert.AreEqual(1, view.Controls.Count); var mapObject = view.Controls[0] as BaseMap; Assert.NotNull(mapObject); Assert.AreEqual(DockStyle.Fill, mapObject.Dock); Assert.IsNull(mapObject.Data); } [Test] public void Data_EmptyAssessmentSection_NoMapDataSet() { // Setup var view = new PipingFailureMechanismView(); var map = (BaseMap)view.Controls[0]; var assessmentSectionBase = new TestAssessmentSectionBase(); var pipingFailureMechanism = new PipingFailureMechanism(); var pipingContext = new PipingFailureMechanismContext(pipingFailureMechanism, assessmentSectionBase); // Call view.Data = pipingContext; // Assert var mapData = (MapDataCollection)map.Data; Assert.AreEqual(0, mapData.List.Count); } [Test] public void Data_SetMapData_MapDataSet() { // Setup var view = new PipingFailureMechanismView(); var map = (BaseMap)view.Controls[0]; var refereceGeometryPoints = new[] { new Point2D(0.0, 0.0), new Point2D(2.0, 0.0), new Point2D(4.0, 4.0), new Point2D(6.0, 4.0) }; var referenceLine = new ReferenceLine(); referenceLine.SetGeometry(refereceGeometryPoints); var assessmentSectionBase = new TestAssessmentSectionBase { HydraulicBoundaryDatabase = new HydraulicBoundaryDatabase(), ReferenceLine = referenceLine }; assessmentSectionBase.HydraulicBoundaryDatabase.Locations.Add(new HydraulicBoundaryLocation(1, "test", 1.0, 2.0)); assessmentSectionBase.ReferenceLine.SetGeometry(new List { new Point2D(1.0, 2.0), new Point2D(2.0, 1.0) }); var pipingFailureMechanism = new PipingFailureMechanism(); pipingFailureMechanism.SurfaceLines.Add(new RingtoetsPipingSurfaceLine()); pipingFailureMechanism.AddSection(new FailureMechanismSection("A", refereceGeometryPoints.Take(2))); pipingFailureMechanism.AddSection(new FailureMechanismSection("B", refereceGeometryPoints.Skip(1).Take(2))); pipingFailureMechanism.AddSection(new FailureMechanismSection("C", refereceGeometryPoints.Skip(2).Take(2))); var pipingContext = new PipingFailureMechanismContext(pipingFailureMechanism, assessmentSectionBase); // Call view.Data = pipingContext; // Assert Assert.AreSame(pipingContext, view.Data); Assert.IsInstanceOf(map.Data); var mapData = map.Data as MapDataCollection; Assert.IsNotNull(mapData); AssertReferenceMapData(referenceLine, mapData.List[0]); AssertHydraulicBoundaryLocationsMapData(assessmentSectionBase.HydraulicBoundaryDatabase, mapData.List[1]); AssertFailureMechanismSectionsMapData(pipingFailureMechanism.Sections, mapData.List[2]); AssertSurfacelinesMapData(pipingFailureMechanism.SurfaceLines, mapData.List[3]); } private void AssertReferenceMapData(ReferenceLine referenceLine, MapData mapData) { Assert.IsInstanceOf(mapData); var referenceLineData = (MapLineData)mapData; CollectionAssert.AreEqual(referenceLine.Points, referenceLineData.Points); } private void AssertHydraulicBoundaryLocationsMapData(HydraulicBoundaryDatabase database, MapData mapData) { Assert.IsInstanceOf(mapData); var hydraulicLocationsMapData = (MapPointData)mapData; CollectionAssert.AreEqual(database.Locations.Select(hrp => hrp.Location), hydraulicLocationsMapData.Points); } private void AssertFailureMechanismSectionsMapData(IEnumerable sections, MapData mapData) { Assert.IsInstanceOf(mapData); var sectionsMapLinesData = (MapMultiLineData)mapData; foreach (var failureMechanismSection in sections) { CollectionAssert.Contains(sectionsMapLinesData.Lines, failureMechanismSection.Points); } } private void AssertSurfacelinesMapData(IEnumerable surfaceLines, MapData mapData) { Assert.IsInstanceOf(mapData); var surfacelinesMapData = (MapMultiLineData)mapData; foreach (var surfaceLine in surfaceLines) { CollectionAssert.Contains(surfacelinesMapData.Lines, surfaceLine.Points.Select(p => new Point2D(p.X, p.Y))); } } [Test] public void UpdateObserver_HydraulicBoundaryDatabaseUpdated_SetNewMapDataData() { // Setup var view = new PipingFailureMechanismView(); var map = (BaseMap)view.Controls[0]; var assessmentSectionBase = new TestAssessmentSectionBase { HydraulicBoundaryDatabase = new HydraulicBoundaryDatabase() }; assessmentSectionBase.HydraulicBoundaryDatabase.Locations.Add(new HydraulicBoundaryLocation(1, "test", 1.0, 2.0)); var pipingFailureMechanism = new PipingFailureMechanism(); var pipingContext = new PipingFailureMechanismContext(pipingFailureMechanism, assessmentSectionBase); view.Data = pipingContext; var mapData = map.Data; assessmentSectionBase.HydraulicBoundaryDatabase = new HydraulicBoundaryDatabase(); assessmentSectionBase.HydraulicBoundaryDatabase.Locations.Add(new HydraulicBoundaryLocation(2, "test2", 2.0, 3.0)); // Call assessmentSectionBase.NotifyObservers(); // Assert Assert.AreNotEqual(mapData, map.Data); Assert.IsInstanceOf(map.Data); } [Test] public void UpdateObserver_ReferenceLineUpdated_SetNewMapDataData() { // Setup var view = new PipingFailureMechanismView(); var map = (BaseMap)view.Controls[0]; var assessmentSectionBase = new TestAssessmentSectionBase { ReferenceLine = new ReferenceLine() }; assessmentSectionBase.ReferenceLine.SetGeometry(new List { new Point2D(1.0, 2.0), new Point2D(2.0, 1.0) }); var pipingFailureMechanism = new PipingFailureMechanism(); var pipingContext = new PipingFailureMechanismContext(pipingFailureMechanism, assessmentSectionBase); view.Data = pipingContext; var mapData = map.Data; assessmentSectionBase.ReferenceLine.SetGeometry(new List { new Point2D(2.0, 5.0), new Point2D(4.0, 3.0) }); // Call assessmentSectionBase.NotifyObservers(); // Assert Assert.AreNotEqual(mapData, map.Data); Assert.IsInstanceOf(map.Data); } [Test] public void UpdateObserver_SurfaceLinesUpdated_SetNewMapDataData() { // Setup var view = new PipingFailureMechanismView(); var map = (BaseMap)view.Controls[0]; var assessmentSectionBase = new TestAssessmentSectionBase(); var pipingFailureMechanism = new PipingFailureMechanism(); var pipingContext = new PipingFailureMechanismContext(pipingFailureMechanism, assessmentSectionBase); view.Data = pipingContext; var mapData = map.Data; var surfaceLine = new RingtoetsPipingSurfaceLine(); surfaceLine.SetGeometry(new Collection { new Point3D(1,2,3), new Point3D(1,2,3) }); pipingFailureMechanism.SurfaceLines.Add(surfaceLine); // Call ((IObservable)pipingFailureMechanism.SurfaceLines).NotifyObservers(); // Assert Assert.AreNotEqual(mapData, map.Data); Assert.IsInstanceOf(map.Data); } [Test] public void UpdateObserver_OtherAssessmentSectionUpdated_MapDataNotUpdated() { // Setup var view = new PipingFailureMechanismView(); var map = (BaseMap)view.Controls[0]; var assessmentSectionBase = new TestAssessmentSectionBase { HydraulicBoundaryDatabase = new HydraulicBoundaryDatabase(), ReferenceLine = new ReferenceLine() }; assessmentSectionBase.HydraulicBoundaryDatabase.Locations.Add(new HydraulicBoundaryLocation(1, "test", 1.0, 2.0)); assessmentSectionBase.ReferenceLine.SetGeometry(new List { new Point2D(1.0, 2.0), new Point2D(2.0, 1.0) }); var pipingFailureMechanism = new PipingFailureMechanism(); var pipingContext = new PipingFailureMechanismContext(pipingFailureMechanism, assessmentSectionBase); view.Data = pipingContext; var assessmentSectionBase2 = new TestAssessmentSectionBase { HydraulicBoundaryDatabase = new HydraulicBoundaryDatabase(), ReferenceLine = new ReferenceLine() }; assessmentSectionBase2.HydraulicBoundaryDatabase.Locations.Add(new HydraulicBoundaryLocation(2, "test2", 2.0, 3.0)); assessmentSectionBase.ReferenceLine.SetGeometry(new List { new Point2D(2.0, 1.0), new Point2D(4.0, 3.0) }); // Call assessmentSectionBase2.NotifyObservers(); // Assert Assert.AreEqual(pipingContext, view.Data); Assert.IsInstanceOf(map.Data); } [Test] public void UpdateObserver_DataNull_MapDataNotUpdated() { // Setup var view = new PipingFailureMechanismView(); var map = (BaseMap)view.Controls[0]; var assessmentSectionBase = new TestAssessmentSectionBase { HydraulicBoundaryDatabase = new HydraulicBoundaryDatabase(), ReferenceLine = new ReferenceLine() }; assessmentSectionBase.HydraulicBoundaryDatabase.Locations.Add(new HydraulicBoundaryLocation(1, "test", 1.0, 2.0)); assessmentSectionBase.ReferenceLine.SetGeometry(new List { new Point2D(1.0, 2.0), new Point2D(2.0, 1.0) }); var pipingFailureMechanism = new PipingFailureMechanism(); var pipingContext = new PipingFailureMechanismContext(pipingFailureMechanism, assessmentSectionBase); view.Data = pipingContext; view.Data = null; MapData dataBeforeUpdate = map.Data; assessmentSectionBase.ReferenceLine = new ReferenceLine(); assessmentSectionBase.ReferenceLine.SetGeometry(new List { new Point2D(2.0, 5.0), new Point2D(34.0, 2.0) }); // Call assessmentSectionBase.NotifyObservers(); // Assert Assert.AreEqual(dataBeforeUpdate, map.Data); } [Test] public void NotifyObservers_DataUpdatedNotifyObserversOnOldData_NoUpdateInViewData() { // Setup var mocks = new MockRepository(); AssessmentSectionBase oldAssessmentSectionMock = mocks.Stub(); AssessmentSectionBase newAssessmentSectionMock = mocks.Stub(); mocks.ReplayAll(); newAssessmentSectionMock.ReferenceLine = new ReferenceLine(); newAssessmentSectionMock.ReferenceLine.SetGeometry(new[] { new Point2D(2,4), new Point2D(3,4) }); var oldPipingFailureMechanismContext = new PipingFailureMechanismContext(new PipingFailureMechanism(), oldAssessmentSectionMock); var newPipingFailureMechanismContext = new PipingFailureMechanismContext(new PipingFailureMechanism(), newAssessmentSectionMock); var view = new PipingFailureMechanismView(); var map = (BaseMap)view.Controls[0]; view.Data = oldPipingFailureMechanismContext; view.Data = newPipingFailureMechanismContext; MapData dataBeforeUpdate = map.Data; newAssessmentSectionMock.ReferenceLine.SetGeometry(Enumerable.Empty()); // Call oldAssessmentSectionMock.NotifyObservers(); // Assert Assert.AreEqual(dataBeforeUpdate, map.Data); mocks.VerifyAll(); } private class TestAssessmentSectionBase : AssessmentSectionBase { public override IEnumerable GetFailureMechanisms() { yield break; } } } }