Index: Ringtoets/Common/src/Ringtoets.Common.Forms/Views/RingtoetsMapDataFactory.cs =================================================================== diff -u -r44e2c0b1a9a5cf648e6287c2f02038cc1d598c46 -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/Common/src/Ringtoets.Common.Forms/Views/RingtoetsMapDataFactory.cs (.../RingtoetsMapDataFactory.cs) (revision 44e2c0b1a9a5cf648e6287c2f02038cc1d598c46) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/Views/RingtoetsMapDataFactory.cs (.../RingtoetsMapDataFactory.cs) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -118,5 +118,17 @@ Style = new LineStyle(Color.DarkSeaGreen, 2, DashStyle.Solid) }; } + + /// + /// Create with default styling for collections of . + /// + /// The created . + public static MapLineData CreateForeshoreProfileMapData() + { + return new MapLineData(Resources.ForeshoreProfiles_DisplayName) + { + Style = new LineStyle(Color.LightSeaGreen, 2, DashStyle.Solid) + }; + } } } \ No newline at end of file Index: Ringtoets/Common/src/Ringtoets.Common.Forms/Views/RingtoetsMapDataFeaturesFactory.cs =================================================================== diff -u -r1e07c6eef1c8cdc531e12e6c5429838757972142 -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/Common/src/Ringtoets.Common.Forms/Views/RingtoetsMapDataFeaturesFactory.cs (.../RingtoetsMapDataFeaturesFactory.cs) (revision 1e07c6eef1c8cdc531e12e6c5429838757972142) +++ Ringtoets/Common/src/Ringtoets.Common.Forms/Views/RingtoetsMapDataFeaturesFactory.cs (.../RingtoetsMapDataFeaturesFactory.cs) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -144,14 +144,17 @@ return new MapFeature[0]; } - var features = new List(); - foreach (var dikeProfile in dikeProfiles) + return dikeProfiles.Select(dikeProfile => GetAsSingleMapFeature(GetWorldPoints(dikeProfile))).ToArray(); + } + + public static MapFeature[] CreateForeshoreProfilesFeatures(IEnumerable foreshoreProfiles) + { + if (foreshoreProfiles == null || !foreshoreProfiles.Any()) { - features.Add(GetAsSingleMapFeature(GetWorldPoints(dikeProfile))); - features.Add(GetAsSingleMapFeature(GetWorldPoints(dikeProfile.ForeshoreProfile))); + return new MapFeature[0]; } - return features.ToArray(); + return foreshoreProfiles.Select(foreshoreProfile => GetAsSingleMapFeature(GetWorldPoints(foreshoreProfile))).ToArray(); } private static Point2D[] GetWorldPoints(DikeProfile dikeProfile) Index: Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Views/RingtoetsMapDataFactoryTest.cs =================================================================== diff -u -r44e2c0b1a9a5cf648e6287c2f02038cc1d598c46 -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Views/RingtoetsMapDataFactoryTest.cs (.../RingtoetsMapDataFactoryTest.cs) (revision 44e2c0b1a9a5cf648e6287c2f02038cc1d598c46) +++ Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Views/RingtoetsMapDataFactoryTest.cs (.../RingtoetsMapDataFactoryTest.cs) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -95,7 +95,7 @@ } [Test] - public void CreateDikeProfileMapData_ReturnsEmptyMapPointDataWithDefaultStyling() + public void CreateDikeProfileMapData_ReturnsEmptyMapLineDataWithDefaultStyling() { // Call MapLineData data = RingtoetsMapDataFactory.CreateDikeProfileMapData(); @@ -106,6 +106,18 @@ AssertEqualStyle(data.Style, Color.DarkSeaGreen, 2, DashStyle.Solid); } + [Test] + public void CreateForeshoreProfileMapData_ReturnsEmptyMapLineDataWithDefaultStyling() + { + // Call + MapLineData data = RingtoetsMapDataFactory.CreateForeshoreProfileMapData(); + + // Assert + Assert.IsEmpty(data.Features); + Assert.AreEqual(RingtoetsCommonFormsResources.ForeshoreProfiles_DisplayName, data.Name); + AssertEqualStyle(data.Style, Color.LightSeaGreen, 2, DashStyle.Solid); + } + private static string GetSectionPointDisplayName(string name) { return string.Format("{0} ({1})", Index: Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Views/RingtoetsMapDataFeaturesFactoryTest.cs =================================================================== diff -u -r1e07c6eef1c8cdc531e12e6c5429838757972142 -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Views/RingtoetsMapDataFeaturesFactoryTest.cs (.../RingtoetsMapDataFeaturesFactoryTest.cs) (revision 1e07c6eef1c8cdc531e12e6c5429838757972142) +++ Ringtoets/Common/test/Ringtoets.Common.Forms.Test/Views/RingtoetsMapDataFeaturesFactoryTest.cs (.../RingtoetsMapDataFeaturesFactoryTest.cs) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -332,15 +332,11 @@ MapFeature[] features = RingtoetsMapDataFeaturesFactory.CreateDikeProfilesFeatures(dikeProfiles); // Assert - Assert.AreEqual(4, features.Length); + Assert.AreEqual(2, features.Length); Assert.AreEqual(1, features.ElementAt(0).MapGeometries.Count()); Assert.AreEqual(1, features.ElementAt(1).MapGeometries.Count()); - Assert.AreEqual(1, features.ElementAt(2).MapGeometries.Count()); - Assert.AreEqual(1, features.ElementAt(3).MapGeometries.Count()); var mapDataDikeGeometryOne = features.ElementAt(0).MapGeometries.ElementAt(0).PointCollections.First().ToArray(); - var mapDataForeshoreGeometryOne = features.ElementAt(1).MapGeometries.ElementAt(0).PointCollections.First().ToArray(); - var mapDataDikeGeometryTwo = features.ElementAt(2).MapGeometries.ElementAt(0).PointCollections.First().ToArray(); - var mapDataForeshoreGeometryTwo = features.ElementAt(3).MapGeometries.ElementAt(0).PointCollections.First().ToArray(); + var mapDataDikeGeometryTwo = features.ElementAt(1).MapGeometries.ElementAt(0).PointCollections.First().ToArray(); CollectionElementsAlmostEquals(new[] { @@ -349,19 +345,87 @@ }, mapDataDikeGeometryOne); CollectionElementsAlmostEquals(new[] { - new Point2D(5, 0.8), - new Point2D(5, -3.7) - }, mapDataForeshoreGeometryOne); - CollectionElementsAlmostEquals(new[] - { new Point2D(2, -0.3), new Point2D(2, -3.6), new Point2D(2, -5.3), new Point2D(2, -3.2) }, mapDataDikeGeometryTwo); - Assert.IsEmpty(mapDataForeshoreGeometryTwo); } + [Test] + public void CreateForeshoreProfilesFeatures_NullForeshoreProfiles_ReturnsEmptyCollection() + { + // Call + MapFeature[] features = RingtoetsMapDataFeaturesFactory.CreateForeshoreProfilesFeatures(null); + // Assert + Assert.IsEmpty(features); + } + + [Test] + public void CreateForeshoreProfilesFeatures_EmptyForeshoreProfiles_ReturnsEmptyCollection() + { + // Call + MapFeature[] features = RingtoetsMapDataFeaturesFactory.CreateForeshoreProfilesFeatures( + Enumerable.Empty()); + + // Assert + Assert.IsEmpty(features); + } + + [Test] + public void CreateForeshoreProfilesFeatures_WithForeshoreProfiles_ReturnsCollectionWithForeshoreProfileAndForeshoreProfile() + { + // Setup + var pointA = new Point2D(1.2, 2.3); + var pointB = new Point2D(2.7, 2.0); + + var pointC = new Point2D(1.3, 2.3); + var pointD = new Point2D(4.6, 2.0); + var pointE = new Point2D(3.2, 23.3); + var pointF = new Point2D(7.7, 12.6); + + var pointsOne = new[] + { + pointA, + pointB + }; + var pointsTwo = new[] + { + pointC, + pointD, + pointE, + pointF + }; + var dikeProfiles = new[] + { + new ForeshoreProfile(new Point2D(5,4), pointsOne, null, new ForeshoreProfile.ConstructionProperties()), + new ForeshoreProfile(new Point2D(2,1), pointsTwo, null, new ForeshoreProfile.ConstructionProperties()) + }; + + // Call + MapFeature[] features = RingtoetsMapDataFeaturesFactory.CreateForeshoreProfilesFeatures(dikeProfiles); + + // Assert + Assert.AreEqual(2, features.Length); + Assert.AreEqual(1, features.ElementAt(0).MapGeometries.Count()); + Assert.AreEqual(1, features.ElementAt(1).MapGeometries.Count()); + var mapDataGeometryOne = features.ElementAt(0).MapGeometries.ElementAt(0).PointCollections.First().ToArray(); + var mapDataGeometryTwo = features.ElementAt(1).MapGeometries.ElementAt(0).PointCollections.First().ToArray(); + + CollectionElementsAlmostEquals(new[] + { + new Point2D(5, 2.8), + new Point2D(5, 1.3) + }, mapDataGeometryOne); + CollectionElementsAlmostEquals(new[] + { + new Point2D(2, -0.3), + new Point2D(2, -3.6), + new Point2D(2, -2.2), + new Point2D(2, -6.7) + }, mapDataGeometryTwo); + } + private void CollectionElementsAlmostEquals(IEnumerable expected, Point2D[] actual) { Assert.AreEqual(expected.Count(), actual.Length); Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Forms/Views/GrassCoverErosionInwardsFailureMechanismView.cs =================================================================== diff -u -r0bcae8b23e2364c988df54e70695322b5a8c9829 -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Forms/Views/GrassCoverErosionInwardsFailureMechanismView.cs (.../GrassCoverErosionInwardsFailureMechanismView.cs) (revision 0bcae8b23e2364c988df54e70695322b5a8c9829) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Forms/Views/GrassCoverErosionInwardsFailureMechanismView.cs (.../GrassCoverErosionInwardsFailureMechanismView.cs) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -20,6 +20,7 @@ // All rights reserved. using System.Collections.Generic; +using System.Linq; using System.Windows.Forms; using Core.Common.Base; using Core.Components.Gis.Data; @@ -52,6 +53,7 @@ private readonly MapPointData sectionsEndPointMapData; private readonly MapPointData hydraulicBoundaryDatabaseMapData; private readonly MapLineData dikeProfilesMapData; + private readonly MapLineData foreshoreProfilesMapData; private GrassCoverErosionInwardsFailureMechanismContext data; @@ -69,6 +71,7 @@ referenceLineMapData = RingtoetsMapDataFactory.CreateReferenceLineMapData(); hydraulicBoundaryDatabaseMapData = RingtoetsMapDataFactory.CreateHydraulicBoundaryDatabaseMapData(); dikeProfilesMapData = RingtoetsMapDataFactory.CreateDikeProfileMapData(); + foreshoreProfilesMapData = RingtoetsMapDataFactory.CreateForeshoreProfileMapData(); sectionsMapData = RingtoetsMapDataFactory.CreateFailureMechanismSectionsMapData(); sectionsStartPointMapData = RingtoetsMapDataFactory.CreateFailureMechanismSectionsStartPointMapData(); @@ -80,6 +83,7 @@ mapControl.Data.Add(sectionsEndPointMapData); mapControl.Data.Add(hydraulicBoundaryDatabaseMapData); mapControl.Data.Add(dikeProfilesMapData); + mapControl.Data.Add(foreshoreProfilesMapData); mapControl.Data.Name = GrassCoverErosionInwardsDataResources.GrassCoverErosionInwardsFailureMechanism_DisplayName; } @@ -160,6 +164,8 @@ RingtoetsMapDataFeaturesFactory.CreateHydraulicBoundaryDatabaseFeatures(hydraulicBoundaryDatabase)); UpdateFeatureBasedMapData(dikeProfilesMapData, RingtoetsMapDataFeaturesFactory.CreateDikeProfilesFeatures(dikeProfiles)); + UpdateFeatureBasedMapData(foreshoreProfilesMapData, + RingtoetsMapDataFeaturesFactory.CreateForeshoreProfilesFeatures(dikeProfiles.Select(dp => dp.ForeshoreProfile))); mapControl.Data.NotifyObservers(); } Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsPlugin.cs =================================================================== diff -u -r2aeb951ddc6e2137897569a2de4c55c9fb7e2420 -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsPlugin.cs (.../GrassCoverErosionInwardsPlugin.cs) (revision 2aeb951ddc6e2137897569a2de4c55c9fb7e2420) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsPlugin.cs (.../GrassCoverErosionInwardsPlugin.cs) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -214,19 +214,19 @@ return null; } - # region PipingFailureMechanismView ViewInfo + # region GrassCoverErosionInwardsFailureMechanismView ViewInfo private bool CloseGrassCoverErosionInwardsFailureMechanismViewForData(GrassCoverErosionInwardsFailureMechanismView view, object o) { var assessmentSection = o as IAssessmentSection; - var pipingFailureMechanism = o as GrassCoverErosionInwardsFailureMechanism; + var failureMechanism = o as GrassCoverErosionInwardsFailureMechanism; var viewFailureMechanismContext = (GrassCoverErosionInwardsFailureMechanismContext)view.Data; var viewFailureMechanism = viewFailureMechanismContext.WrappedData; return assessmentSection != null ? ReferenceEquals(viewFailureMechanismContext.Parent, assessmentSection) - : ReferenceEquals(viewFailureMechanism, pipingFailureMechanism); + : ReferenceEquals(viewFailureMechanism, failureMechanism); } # endregion Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/Views/GrassCoverErosionInwardsFailureMechanismViewTest.cs =================================================================== diff -u -r1e07c6eef1c8cdc531e12e6c5429838757972142 -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/Views/GrassCoverErosionInwardsFailureMechanismViewTest.cs (.../GrassCoverErosionInwardsFailureMechanismViewTest.cs) (revision 1e07c6eef1c8cdc531e12e6c5429838757972142) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Forms.Test/Views/GrassCoverErosionInwardsFailureMechanismViewTest.cs (.../GrassCoverErosionInwardsFailureMechanismViewTest.cs) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -54,6 +54,7 @@ private const int sectionsEndPointIndex = 3; private const int hydraulicBoundaryDatabaseIndex = 4; private const int dikeProfilesIndex = 5; + private const int foreshoreProfilesIndex = 6; [Test] public void DefaultConstructor_DefaultValues() @@ -90,13 +91,13 @@ // Setup using (var view = new GrassCoverErosionInwardsFailureMechanismView()) { - var grassCoverErosionInwardsFailureMechanismContext = new GrassCoverErosionInwardsFailureMechanismContext(new GrassCoverErosionInwardsFailureMechanism(), new TestAssessmentSection()); + var failureMechanismContext = new GrassCoverErosionInwardsFailureMechanismContext(new GrassCoverErosionInwardsFailureMechanism(), new TestAssessmentSection()); // Call - view.Data = grassCoverErosionInwardsFailureMechanismContext; + view.Data = failureMechanismContext; // Assert - Assert.AreSame(grassCoverErosionInwardsFailureMechanismContext, view.Data); + Assert.AreSame(failureMechanismContext, view.Data); } } @@ -122,12 +123,12 @@ // Setup using (var view = new GrassCoverErosionInwardsFailureMechanismView()) { - var grassCoverErosionInwardsFailureMechanismContext = new GrassCoverErosionInwardsFailureMechanismContext(new GrassCoverErosionInwardsFailureMechanism(), new TestAssessmentSection()); + var failureMechanismContext = new GrassCoverErosionInwardsFailureMechanismContext(new GrassCoverErosionInwardsFailureMechanism(), new TestAssessmentSection()); - view.Data = grassCoverErosionInwardsFailureMechanismContext; + view.Data = failureMechanismContext; // Precondition - Assert.AreEqual(6, view.Map.Data.Collection.Count()); + Assert.AreEqual(7, view.Map.Data.Collection.Count()); // Call view.Data = null; @@ -144,13 +145,13 @@ // Setup using (var view = new GrassCoverErosionInwardsFailureMechanismView()) { - var grassCoverErosionInwardsFailureMechanismContext = new GrassCoverErosionInwardsFailureMechanismContext(new GrassCoverErosionInwardsFailureMechanism(), new TestAssessmentSection()); + var failureMechanismContext = new GrassCoverErosionInwardsFailureMechanismContext(new GrassCoverErosionInwardsFailureMechanism(), new TestAssessmentSection()); // Call - view.Data = grassCoverErosionInwardsFailureMechanismContext; + view.Data = failureMechanismContext; // Assert - Assert.AreSame(grassCoverErosionInwardsFailureMechanismContext, view.Data); + Assert.AreSame(failureMechanismContext, view.Data); AssertEmptyMapData(view.Map.Data); } } @@ -187,33 +188,34 @@ ReferenceLine = referenceLine }; - var grassCoverErosionInwardsFailureMechanism = new GrassCoverErosionInwardsFailureMechanism(); - grassCoverErosionInwardsFailureMechanism.AddSection(new FailureMechanismSection("A", geometryPoints.Take(2))); - grassCoverErosionInwardsFailureMechanism.AddSection(new FailureMechanismSection("B", geometryPoints.Skip(1).Take(2))); - grassCoverErosionInwardsFailureMechanism.AddSection(new FailureMechanismSection("C", geometryPoints.Skip(2).Take(2))); + var failureMechanism = new GrassCoverErosionInwardsFailureMechanism(); + failureMechanism.AddSection(new FailureMechanismSection("A", geometryPoints.Take(2))); + failureMechanism.AddSection(new FailureMechanismSection("B", geometryPoints.Skip(1).Take(2))); + failureMechanism.AddSection(new FailureMechanismSection("C", geometryPoints.Skip(2).Take(2))); - grassCoverErosionInwardsFailureMechanism.DikeProfiles.Add(new TestDikeProfile()); - grassCoverErosionInwardsFailureMechanism.DikeProfiles.Add(new TestDikeProfile()); + failureMechanism.DikeProfiles.Add(new TestDikeProfile()); + failureMechanism.DikeProfiles.Add(new TestDikeProfile()); - var grassCoverErosionInwardsContext = new GrassCoverErosionInwardsFailureMechanismContext(grassCoverErosionInwardsFailureMechanism, assessmentSection); + var failureMechanismContext = new GrassCoverErosionInwardsFailureMechanismContext(failureMechanism, assessmentSection); // Call - view.Data = grassCoverErosionInwardsContext; + view.Data = failureMechanismContext; // Assert - Assert.AreSame(grassCoverErosionInwardsContext, view.Data); + Assert.AreSame(failureMechanismContext, view.Data); var mapData = map.Data; Assert.IsInstanceOf(mapData); var mapDataList = mapData.Collection.ToList(); - Assert.AreEqual(6, mapDataList.Count); + Assert.AreEqual(7, mapDataList.Count); AssertReferenceLineMapData(assessmentSection.ReferenceLine, mapDataList[referenceLineIndex]); - AssertFailureMechanismSectionsMapData(grassCoverErosionInwardsFailureMechanism.Sections, mapDataList[sectionsIndex]); - AssertFailureMechanismSectionsStartPointMapData(grassCoverErosionInwardsFailureMechanism.Sections, mapDataList[sectionsStartPointIndex]); - AssertFailureMechanismSectionsEndPointMapData(grassCoverErosionInwardsFailureMechanism.Sections, mapDataList[sectionsEndPointIndex]); + AssertFailureMechanismSectionsMapData(failureMechanism.Sections, mapDataList[sectionsIndex]); + AssertFailureMechanismSectionsStartPointMapData(failureMechanism.Sections, mapDataList[sectionsStartPointIndex]); + AssertFailureMechanismSectionsEndPointMapData(failureMechanism.Sections, mapDataList[sectionsEndPointIndex]); AssertHydraulicBoundaryLocationsMapData(assessmentSection.HydraulicBoundaryDatabase, mapDataList[hydraulicBoundaryDatabaseIndex]); - AssertDikeProfiles(grassCoverErosionInwardsFailureMechanism.DikeProfiles, mapDataList[dikeProfilesIndex]); + AssertDikeProfiles(failureMechanism.DikeProfiles, mapDataList[dikeProfilesIndex]); + AssertForeshoreProfiles(failureMechanism.DikeProfiles.Select(dp => dp.ForeshoreProfile), mapDataList[foreshoreProfilesIndex]); } } @@ -245,9 +247,9 @@ HydraulicBoundaryDatabase = hydraulicBoundaryDatabase1 }; - var grassCoverErosionInwardsContext = new GrassCoverErosionInwardsFailureMechanismContext(new GrassCoverErosionInwardsFailureMechanism(), assessmentSection); + var failureMechanismContext = new GrassCoverErosionInwardsFailureMechanismContext(new GrassCoverErosionInwardsFailureMechanism(), assessmentSection); - view.Data = grassCoverErosionInwardsContext; + view.Data = failureMechanismContext; var hydraulicBoundaryDatabaseMapData = map.Data.Collection.ElementAt(hydraulicBoundaryDatabaseIndex); @@ -289,9 +291,9 @@ }; assessmentSection.ReferenceLine.SetGeometry(points1); - var grassCoverErosionInwardsContext = new GrassCoverErosionInwardsFailureMechanismContext(new GrassCoverErosionInwardsFailureMechanism(), assessmentSection); + var failureMechanismContext = new GrassCoverErosionInwardsFailureMechanismContext(new GrassCoverErosionInwardsFailureMechanism(), assessmentSection); - view.Data = grassCoverErosionInwardsContext; + view.Data = failureMechanismContext; var referenceLineMapData = map.Data.Collection.ElementAt(referenceLineIndex); @@ -315,27 +317,27 @@ { var map = (MapControl) view.Controls[0]; - var grassCoverErosionInwardsFailureMechanism = new GrassCoverErosionInwardsFailureMechanism(); - var grassCoverErosionInwardsContext = new GrassCoverErosionInwardsFailureMechanismContext(grassCoverErosionInwardsFailureMechanism, new TestAssessmentSection()); + var failureMechanism = new GrassCoverErosionInwardsFailureMechanism(); + var failureMechanismContext = new GrassCoverErosionInwardsFailureMechanismContext(failureMechanism, new TestAssessmentSection()); - view.Data = grassCoverErosionInwardsContext; + view.Data = failureMechanismContext; var sectionMapData = (MapLineData) map.Data.Collection.ElementAt(sectionsIndex); var sectionStartsMapData = (MapPointData) map.Data.Collection.ElementAt(sectionsStartPointIndex); var sectionsEndsMapData = (MapPointData) map.Data.Collection.ElementAt(sectionsEndPointIndex); // Call - grassCoverErosionInwardsFailureMechanism.AddSection(new FailureMechanismSection(string.Empty, new[] + failureMechanism.AddSection(new FailureMechanismSection(string.Empty, new[] { new Point2D(1, 2), new Point2D(1, 2) })); - grassCoverErosionInwardsFailureMechanism.NotifyObservers(); + failureMechanism.NotifyObservers(); // Assert - AssertFailureMechanismSectionsMapData(grassCoverErosionInwardsFailureMechanism.Sections, sectionMapData); - AssertFailureMechanismSectionsStartPointMapData(grassCoverErosionInwardsFailureMechanism.Sections, sectionStartsMapData); - AssertFailureMechanismSectionsEndPointMapData(grassCoverErosionInwardsFailureMechanism.Sections, sectionsEndsMapData); + AssertFailureMechanismSectionsMapData(failureMechanism.Sections, sectionMapData); + AssertFailureMechanismSectionsStartPointMapData(failureMechanism.Sections, sectionStartsMapData); + AssertFailureMechanismSectionsEndPointMapData(failureMechanism.Sections, sectionsEndsMapData); } } @@ -347,47 +349,77 @@ { var map = (MapControl)view.Controls[0]; - var grassCoverErosionInwardsFailureMechanism = new GrassCoverErosionInwardsFailureMechanism(); - var grassCoverErosionInwardsContext = new GrassCoverErosionInwardsFailureMechanismContext(grassCoverErosionInwardsFailureMechanism, new TestAssessmentSection()); + var failureMechanism = new GrassCoverErosionInwardsFailureMechanism(); + var failureMechanismContext = new GrassCoverErosionInwardsFailureMechanismContext(failureMechanism, new TestAssessmentSection()); - grassCoverErosionInwardsFailureMechanism.DikeProfiles.Add(new TestDikeProfile()); + failureMechanism.DikeProfiles.Add(new TestDikeProfile()); - view.Data = grassCoverErosionInwardsContext; + view.Data = failureMechanismContext; var dikeProfileData = map.Data.Collection.ElementAt(dikeProfilesIndex); // Precondition - AssertDikeProfiles(grassCoverErosionInwardsFailureMechanism.DikeProfiles, dikeProfileData); + AssertDikeProfiles(failureMechanism.DikeProfiles, dikeProfileData); // Call - grassCoverErosionInwardsFailureMechanism.DikeProfiles.Add(new TestDikeProfile()); - grassCoverErosionInwardsFailureMechanism.DikeProfiles.NotifyObservers(); + failureMechanism.DikeProfiles.Add(new TestDikeProfile()); + failureMechanism.DikeProfiles.NotifyObservers(); // Assert - AssertDikeProfiles(grassCoverErosionInwardsFailureMechanism.DikeProfiles, dikeProfileData); + AssertDikeProfiles(failureMechanism.DikeProfiles, dikeProfileData); } } [Test] + public void UpdateObserver_ForeshoreProfilesUpdated_MapDataUpdated() + { + // Setup + using (var view = new GrassCoverErosionInwardsFailureMechanismView()) + { + var map = (MapControl)view.Controls[0]; + + var failureMechanism = new GrassCoverErosionInwardsFailureMechanism(); + var failureMechanismContext = new GrassCoverErosionInwardsFailureMechanismContext(failureMechanism, new TestAssessmentSection()); + + failureMechanism.DikeProfiles.Add(new TestDikeProfile()); + + view.Data = failureMechanismContext; + + var dikeProfileData = map.Data.Collection.ElementAt(foreshoreProfilesIndex); + + // Precondition + AssertForeshoreProfiles(failureMechanism.DikeProfiles.Select(dp => dp.ForeshoreProfile), dikeProfileData); + + // Call + failureMechanism.DikeProfiles.Add(new TestDikeProfile()); + failureMechanism.DikeProfiles.NotifyObservers(); + + // Assert + AssertForeshoreProfiles(failureMechanism.DikeProfiles.Select(dp => dp.ForeshoreProfile), dikeProfileData); + } + } + + [Test] public void UpdateObserver_DataUpdated_MapLayersSameOrder() { // Setup - const int updatedRefenceLineLayerIndex = referenceLineIndex + 5; + const int updatedRefenceLineLayerIndex = referenceLineIndex + 6; const int updatedSectionsLayerIndex = sectionsIndex - 1; const int updateSectionStartLayerIndex = sectionsStartPointIndex - 1; const int updatedSectionEndLayerIndex = sectionsEndPointIndex - 1; const int updatedHydraulicLocationsLayerIndex = hydraulicBoundaryDatabaseIndex - 1; const int updatedDikeProfilesLayerIndex = dikeProfilesIndex - 1; + const int updatedForeshoreProfilesLayerIndex = foreshoreProfilesIndex - 1; using (var view = new GrassCoverErosionInwardsFailureMechanismView()) { var map = (MapControl) view.Controls[0]; var assessmentSection = new TestAssessmentSection(); - var grassCoverErosionInwardsFailureMechanism = new GrassCoverErosionInwardsFailureMechanism(); - var grassCoverErosionInwardsContext = new GrassCoverErosionInwardsFailureMechanismContext(grassCoverErosionInwardsFailureMechanism, assessmentSection); + var failureMechanism = new GrassCoverErosionInwardsFailureMechanism(); + var failureMechanismContext = new GrassCoverErosionInwardsFailureMechanismContext(failureMechanism, assessmentSection); - view.Data = grassCoverErosionInwardsContext; + view.Data = failureMechanismContext; var mapData = map.Data; @@ -416,6 +448,9 @@ var dikeProfilesData = (MapLineData) mapDataList[updatedDikeProfilesLayerIndex]; Assert.AreEqual("Dijkprofielen", dikeProfilesData.Name); + var foreshoreProfilesData = (MapLineData)mapDataList[updatedForeshoreProfilesLayerIndex]; + Assert.AreEqual("Voorlandprofielen", foreshoreProfilesData.Name); + var points = new List { new Point2D(2.0, 5.0), @@ -446,6 +481,9 @@ var actualDikeProfilesData = (MapLineData) mapDataList[updatedDikeProfilesLayerIndex]; Assert.AreEqual("Dijkprofielen", actualDikeProfilesData.Name); + + var actualForeshoreProfilesData = (MapLineData)mapDataList[updatedForeshoreProfilesLayerIndex]; + Assert.AreEqual("Voorlandprofielen", actualForeshoreProfilesData.Name); } } @@ -506,20 +544,36 @@ var dikeProfileArray = dikeProfiles.ToArray(); Assert.IsInstanceOf(mapData); - Assert.AreEqual(dikeProfileArray.Length * 2, dikeProfilesData.Features.Length); + Assert.AreEqual(dikeProfileArray.Length, dikeProfilesData.Features.Length); for (int i = 0; i < dikeProfileArray.Length; i++) { - var profileDataA = dikeProfilesData.Features.ElementAt(i * 2).MapGeometries.First(); - var foreshoreDataA = dikeProfilesData.Features.ElementAt(i * 2 + 1).MapGeometries.First(); - + var profileDataA = dikeProfilesData.Features.ElementAt(i).MapGeometries.First(); CollectionAssert.AreEquivalent(dikeProfileArray[0].DikeGeometry, profileDataA.PointCollections.First()); - CollectionAssert.AreEquivalent(dikeProfileArray[0].ForeshoreProfile.Geometry, foreshoreDataA.PointCollections.First()); } Assert.AreEqual("Dijkprofielen", mapData.Name); } + private static void AssertForeshoreProfiles(IEnumerable foreshoreProfiles, MapData mapData) + { + Assert.NotNull(foreshoreProfiles, "foreshoreProfiles should never be null."); + + var foreshoreProfilesData = (MapLineData) mapData; + var foreshoreProfileArray = foreshoreProfiles.ToArray(); + + Assert.IsInstanceOf(mapData); + Assert.AreEqual(foreshoreProfileArray.Length, foreshoreProfilesData.Features.Length); + + for (int i = 0; i < foreshoreProfileArray.Length; i++) + { + var profileDataA = foreshoreProfilesData.Features.ElementAt(i).MapGeometries.First(); + CollectionAssert.AreEquivalent(foreshoreProfileArray[0].Geometry, profileDataA.PointCollections.First()); + } + + Assert.AreEqual("Voorlandprofielen", mapData.Name); + } + private static void AssertHydraulicBoundaryLocationsMapData(HydraulicBoundaryDatabase database, MapData mapData) { Assert.IsInstanceOf(mapData); @@ -576,18 +630,20 @@ var mapDataList = mapData.Collection.ToList(); - Assert.AreEqual(6, mapDataList.Count); + Assert.AreEqual(7, mapDataList.Count); var referenceLineMapData = (MapLineData) mapDataList[referenceLineIndex]; var sectionsMapData = (MapLineData) mapDataList[sectionsIndex]; var dikeProfilesMapData = (MapLineData) mapDataList[dikeProfilesIndex]; + var foreshoreProfilesMapData = (MapLineData) mapDataList[foreshoreProfilesIndex]; var sectionsStartPointMapData = (MapPointData) mapDataList[sectionsStartPointIndex]; var sectionsEndPointMapData = (MapPointData) mapDataList[sectionsEndPointIndex]; var hydraulicBoundaryDatabaseMapData = (MapPointData) mapDataList[hydraulicBoundaryDatabaseIndex]; CollectionAssert.IsEmpty(referenceLineMapData.Features); CollectionAssert.IsEmpty(sectionsMapData.Features); CollectionAssert.IsEmpty(dikeProfilesMapData.Features); + CollectionAssert.IsEmpty(foreshoreProfilesMapData.Features); CollectionAssert.IsEmpty(sectionsStartPointMapData.Features); CollectionAssert.IsEmpty(sectionsEndPointMapData.Features); CollectionAssert.IsEmpty(hydraulicBoundaryDatabaseMapData.Features); Index: Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.Forms/Ringtoets.GrassCoverErosionOutwards.Forms.csproj =================================================================== diff -u -r01c86929c554e5092193f6c7e0c673f58b5d2bbc -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.Forms/Ringtoets.GrassCoverErosionOutwards.Forms.csproj (.../Ringtoets.GrassCoverErosionOutwards.Forms.csproj) (revision 01c86929c554e5092193f6c7e0c673f58b5d2bbc) +++ Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.Forms/Ringtoets.GrassCoverErosionOutwards.Forms.csproj (.../Ringtoets.GrassCoverErosionOutwards.Forms.csproj) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -38,6 +38,7 @@ + @@ -71,6 +72,12 @@ + + UserControl + + + GrassCoverErosionInwardsFailureMechanismView.cs + UserControl @@ -109,6 +116,21 @@ Core.Common.Utils False + + {5a91174a-fb95-4c9d-9ca5-81c0b8d4361a} + Core.Components.DotSpatial.Forms + False + + + {4A06DF0D-5D75-4BAD-A95A-A3DB9B7C4AD5} + Core.Components.Gis.Forms + False + + + {318BA582-88C9-4816-A54A-A7E431461DE3} + Core.Components.Gis + False + {D4200F43-3F72-4F42-AF0A-8CED416A38EC} Ringtoets.Common.Data @@ -156,6 +178,9 @@ Resources.Designer.cs Designer + + GrassCoverErosionInwardsFailureMechanismView.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file Index: Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.Plugin/GrassCoverErosionOutwardsPlugin.cs =================================================================== diff -u -r5a19c1544d732696d84f24877303cdfb19122bc7 -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.Plugin/GrassCoverErosionOutwardsPlugin.cs (.../GrassCoverErosionOutwardsPlugin.cs) (revision 5a19c1544d732696d84f24877303cdfb19122bc7) +++ Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.Plugin/GrassCoverErosionOutwardsPlugin.cs (.../GrassCoverErosionOutwardsPlugin.cs) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -94,6 +94,14 @@ public override IEnumerable GetViewInfos() { + yield return new ViewInfo + { + GetViewName = (view, mechanism) => mechanism.WrappedData.Name, + Image = RingtoetsCommonFormsResources.CalculationIcon, + CloseForData = CloseGrassCoverErosionOutwardsFailureMechanismViewForData, + AdditionalDataCheck = context => context.WrappedData.IsRelevant + }; + yield return new ViewInfo< FailureMechanismSectionResultContext, IEnumerable, @@ -202,18 +210,18 @@ yield return new TreeNodeInfo { - Text = emptyPipingOutput => RingtoetsCommonFormsResources.CalculationOutput_DisplayName, - Image = emptyPipingOutput => RingtoetsCommonFormsResources.GeneralOutputIcon, - ForeColor = emptyPipingOutput => Color.FromKnownColor(KnownColor.GrayText), + Text = emptyOutput => RingtoetsCommonFormsResources.CalculationOutput_DisplayName, + Image = emptyOutput => RingtoetsCommonFormsResources.GeneralOutputIcon, + ForeColor = emptyOutput => Color.FromKnownColor(KnownColor.GrayText), ContextMenuStrip = (nodeData, parentData, treeViewControl) => Gui.Get(nodeData, treeViewControl) .AddPropertiesItem() .Build() }; yield return new TreeNodeInfo { - Text = emptyPipingOutput => RingtoetsCommonFormsResources.CalculationOutput_DisplayName, - Image = emptyPipingOutput => RingtoetsCommonFormsResources.GeneralOutputIcon, + Text = emptyOutput => RingtoetsCommonFormsResources.CalculationOutput_DisplayName, + Image = emptyOutput => RingtoetsCommonFormsResources.GeneralOutputIcon, ContextMenuStrip = (nodeData, parentData, treeViewControl) => Gui.Get(nodeData, treeViewControl) .AddPropertiesItem() .Build() @@ -292,6 +300,23 @@ #region ViewInfos + # region GrassCoverErosionOutwardsFailureMechanismView ViewInfo + + private bool CloseGrassCoverErosionOutwardsFailureMechanismViewForData(GrassCoverErosionOutwardsFailureMechanismView view, object o) + { + var assessmentSection = o as IAssessmentSection; + var failureMechanism = o as GrassCoverErosionOutwardsFailureMechanism; + + var viewFailureMechanismContext = (GrassCoverErosionOutwardsFailureMechanismContext)view.Data; + var viewFailureMechanism = viewFailureMechanismContext.WrappedData; + + return assessmentSection != null + ? ReferenceEquals(viewFailureMechanismContext.Parent, assessmentSection) + : ReferenceEquals(viewFailureMechanism, failureMechanism); + } + + # endregion + #region GrassCoverErosionOutwardsFailureMechanismResultView ViewInfo private static bool CloseFailureMechanismResultViewForData(GrassCoverErosionOutwardsFailureMechanismResultView view, object o) @@ -405,8 +430,10 @@ { var builder = new RingtoetsContextMenuBuilder(Gui.Get(grassCoverErosionOutwardsFailureMechanismContext, treeViewControl)); - return builder.AddToggleRelevancyOfFailureMechanismItem(grassCoverErosionOutwardsFailureMechanismContext, RemoveAllViewsForItem) + return builder.AddOpenItem() .AddSeparator() + .AddToggleRelevancyOfFailureMechanismItem(grassCoverErosionOutwardsFailureMechanismContext, RemoveAllViewsForItem) + .AddSeparator() .AddExpandAllItem() .AddCollapseAllItem() .AddSeparator() Index: Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.Plugin/Ringtoets.GrassCoverErosionOutwards.Plugin.csproj =================================================================== diff -u -rbc4c4000ca4a850b49a88156ca2b919ea690494b -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.Plugin/Ringtoets.GrassCoverErosionOutwards.Plugin.csproj (.../Ringtoets.GrassCoverErosionOutwards.Plugin.csproj) (revision bc4c4000ca4a850b49a88156ca2b919ea690494b) +++ Ringtoets/GrassCoverErosionOutwards/src/Ringtoets.GrassCoverErosionOutwards.Plugin/Ringtoets.GrassCoverErosionOutwards.Plugin.csproj (.../Ringtoets.GrassCoverErosionOutwards.Plugin.csproj) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -80,6 +80,11 @@ Core.Common.Gui False + + {4a06df0d-5d75-4bad-a95a-a3db9b7c4ad5} + Core.Components.Gis.Forms + False + {d4200f43-3f72-4f42-af0a-8ced416a38ec} Ringtoets.Common.Data Index: Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Forms.Test/Ringtoets.GrassCoverErosionOutwards.Forms.Test.csproj =================================================================== diff -u -r98f01944e8ac182e2a1e9b1ed4deb48a07952529 -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Forms.Test/Ringtoets.GrassCoverErosionOutwards.Forms.Test.csproj (.../Ringtoets.GrassCoverErosionOutwards.Forms.Test.csproj) (revision 98f01944e8ac182e2a1e9b1ed4deb48a07952529) +++ Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Forms.Test/Ringtoets.GrassCoverErosionOutwards.Forms.Test.csproj (.../Ringtoets.GrassCoverErosionOutwards.Forms.Test.csproj) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -99,6 +99,7 @@ + @@ -139,6 +140,18 @@ {D749EE4C-CE50-4C17-BF01-9A953028C126} Core.Common.TestUtil + + {5a91174a-fb95-4c9d-9ca5-81c0b8d4361a} + Core.Components.DotSpatial.Forms + + + {4a06df0d-5d75-4bad-a95a-a3db9b7c4ad5} + Core.Components.Gis.Forms + + + {318ba582-88c9-4816-a54a-a7e431461de3} + Core.Components.Gis + {D4200F43-3F72-4F42-AF0A-8CED416A38EC} Ringtoets.Common.Data Index: Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Forms.Test/TreeNodeInfos/GrassCoverErosionOutwardsFailureMechanismContextTreeNodeInfoTest.cs =================================================================== diff -u -rb5accd775c390fa85f815ef13c3c3e54a6d10ada -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Forms.Test/TreeNodeInfos/GrassCoverErosionOutwardsFailureMechanismContextTreeNodeInfoTest.cs (.../GrassCoverErosionOutwardsFailureMechanismContextTreeNodeInfoTest.cs) (revision b5accd775c390fa85f815ef13c3c3e54a6d10ada) +++ Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Forms.Test/TreeNodeInfos/GrassCoverErosionOutwardsFailureMechanismContextTreeNodeInfoTest.cs (.../GrassCoverErosionOutwardsFailureMechanismContextTreeNodeInfoTest.cs) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -44,7 +44,7 @@ [TestFixture] public class GrassCoverErosionOutwardsFailureMechanismContextTreeNodeInfoTest { - private const int contextMenuRelevancyIndexWhenRelevant = 0; + private const int contextMenuRelevancyIndexWhenRelevant = 2; private const int contextMenuRelevancyIndexWhenNotRelevant = 0; private MockRepository mocks; private GrassCoverErosionOutwardsPlugin plugin; @@ -256,6 +256,8 @@ assessmentSection); var menuBuilder = mocks.StrictMock(); + menuBuilder.Expect(mb => mb.AddOpenItem()).Return(menuBuilder); + menuBuilder.Expect(mb => mb.AddSeparator()).Return(menuBuilder); menuBuilder.Expect(mb => mb.AddCustomItem(null)).IgnoreArguments().Return(menuBuilder); menuBuilder.Expect(mb => mb.AddSeparator()).Return(menuBuilder); menuBuilder.Expect(mb => mb.AddExpandAllItem()).Return(menuBuilder); Index: Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Forms.Test/Views/GrassCoverErosionOutwardsFailureMechanismViewTest.cs =================================================================== diff -u --- Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Forms.Test/Views/GrassCoverErosionOutwardsFailureMechanismViewTest.cs (revision 0) +++ Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Forms.Test/Views/GrassCoverErosionOutwardsFailureMechanismViewTest.cs (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -0,0 +1,628 @@ +// 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.Collections.Generic; +using System.Linq; +using System.Windows.Forms; +using Core.Common.Base; +using Core.Common.Base.Geometry; +using Core.Components.DotSpatial.Forms; +using Core.Components.Gis.Data; +using Core.Components.Gis.Forms; +using NUnit.Framework; +using Ringtoets.Common.Data.AssessmentSection; +using Ringtoets.Common.Data.Contribution; +using Ringtoets.Common.Data.DikeProfiles; +using Ringtoets.Common.Data.FailureMechanism; +using Ringtoets.Common.Data.TestUtil; +using Ringtoets.HydraRing.Data; +using Ringtoets.GrassCoverErosionOutwards.Data; +using Ringtoets.GrassCoverErosionOutwards.Forms.PresentationObjects; +using Ringtoets.GrassCoverErosionOutwards.Forms.Views; +using RingtoetsCommonFormsResources = Ringtoets.Common.Forms.Properties.Resources; +using RingtoetsCommonDataResources = Ringtoets.Common.Data.Properties.Resources; +using GrassCoverErosionOutwardsDataResources = Ringtoets.GrassCoverErosionOutwards.Data.Properties.Resources; +using GrassCoverErosionOutwardsFormsResources = Ringtoets.GrassCoverErosionOutwards.Forms.Properties.Resources; + +namespace Ringtoets.GrassCoverErosionOutwards.Forms.Test.Views +{ + [TestFixture] + public class GrassCoverErosionOutwardsFailureMechanismViewTest + { + private const int referenceLineIndex = 0; + private const int sectionsIndex = 1; + private const int sectionsStartPointIndex = 2; + private const int sectionsEndPointIndex = 3; + private const int hydraulicBoundaryDatabaseIndex = 4; + private const int foreshoreProfilesIndex = 5; + + [Test] + public void DefaultConstructor_DefaultValues() + { + // Call + using (var view = new GrassCoverErosionOutwardsFailureMechanismView()) + { + // Assert + Assert.IsInstanceOf(view); + Assert.IsInstanceOf(view); + Assert.IsNotNull(view.Map); + Assert.IsNull(view.Data); + } + } + + [Test] + public void DefaultConstructor_Always_AddMapControlWithCollectionOfEmptyMapData() + { + // Call + using (var view = new GrassCoverErosionOutwardsFailureMechanismView()) + { + // Assert + Assert.AreEqual(1, view.Controls.Count); + Assert.AreSame(view.Map, view.Controls[0]); + Assert.AreEqual(DockStyle.Fill, ((Control)view.Map).Dock); + Assert.AreEqual(GrassCoverErosionOutwardsDataResources.GrassCoverErosionOutwardsFailureMechanism_DisplayName, view.Map.Data.Name); + AssertEmptyMapData(view.Map.Data); + } + } + + [Test] + public void Data_GrassCoverErosionOutwardsFailureMechanismContext_DataSet() + { + // Setup + using (var view = new GrassCoverErosionOutwardsFailureMechanismView()) + { + var failureMechanismContext = new GrassCoverErosionOutwardsFailureMechanismContext(new GrassCoverErosionOutwardsFailureMechanism(), new TestAssessmentSection()); + + // Call + view.Data = failureMechanismContext; + + // Assert + Assert.AreSame(failureMechanismContext, view.Data); + } + } + + [Test] + public void Data_OtherThanGrassCoverErosionOutwardsFailureMechanismContext_DataNull() + { + // Setup + using (var view = new GrassCoverErosionOutwardsFailureMechanismView()) + { + var data = new object(); + + // Call + view.Data = data; + + // Assert + Assert.IsNull(view.Data); + } + } + + [Test] + public void Data_SetToNull_MapDataCleared() + { + // Setup + using (var view = new GrassCoverErosionOutwardsFailureMechanismView()) + { + var failureMechanismContext = new GrassCoverErosionOutwardsFailureMechanismContext(new GrassCoverErosionOutwardsFailureMechanism(), new TestAssessmentSection()); + + view.Data = failureMechanismContext; + + // Precondition + Assert.AreEqual(6, view.Map.Data.Collection.Count()); + + // Call + view.Data = null; + + // Assert + Assert.IsNull(view.Data); + Assert.IsNull(view.Map.Data); + } + } + + [Test] + public void Data_EmptyGrassCoverErosionOutwardsFailureMechanismContext_NoMapDataSet() + { + // Setup + using (var view = new GrassCoverErosionOutwardsFailureMechanismView()) + { + var failureMechanismContext = new GrassCoverErosionOutwardsFailureMechanismContext(new GrassCoverErosionOutwardsFailureMechanism(), new TestAssessmentSection()); + + // Call + view.Data = failureMechanismContext; + + // Assert + Assert.AreSame(failureMechanismContext, view.Data); + AssertEmptyMapData(view.Map.Data); + } + } + + [Test] + public void Data_GrassCoverErosionOutwardsFailureMechanismContext_DataUpdatedToCollectionOfFilledMapData() + { + // Setup + using (var view = new GrassCoverErosionOutwardsFailureMechanismView()) + { + var map = (MapControl)view.Controls[0]; + + var geometryPoints = 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 hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase(); + hydraulicBoundaryDatabase.Locations.Add(new HydraulicBoundaryLocation(1, "test", 1.0, 2.0)); + + var referenceLine = new ReferenceLine(); + referenceLine.SetGeometry(new[] + { + new Point2D(1.0, 2.0), + new Point2D(2.0, 1.0) + }); + + var assessmentSection = new TestAssessmentSection + { + HydraulicBoundaryDatabase = hydraulicBoundaryDatabase, + ReferenceLine = referenceLine + }; + + var failureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); + failureMechanism.AddSection(new FailureMechanismSection("A", geometryPoints.Take(2))); + failureMechanism.AddSection(new FailureMechanismSection("B", geometryPoints.Skip(1).Take(2))); + failureMechanism.AddSection(new FailureMechanismSection("C", geometryPoints.Skip(2).Take(2))); + + failureMechanism.ForeshoreProfiles.Add(new TestForeshoreProfile()); + failureMechanism.ForeshoreProfiles.Add(new TestForeshoreProfile()); + + var failureMechanismContext = new GrassCoverErosionOutwardsFailureMechanismContext(failureMechanism, assessmentSection); + + // Call + view.Data = failureMechanismContext; + + // Assert + Assert.AreSame(failureMechanismContext, view.Data); + + var mapData = map.Data; + Assert.IsInstanceOf(mapData); + + var mapDataList = mapData.Collection.ToList(); + Assert.AreEqual(6, mapDataList.Count); + AssertReferenceLineMapData(assessmentSection.ReferenceLine, mapDataList[referenceLineIndex]); + AssertFailureMechanismSectionsMapData(failureMechanism.Sections, mapDataList[sectionsIndex]); + AssertFailureMechanismSectionsStartPointMapData(failureMechanism.Sections, mapDataList[sectionsStartPointIndex]); + AssertFailureMechanismSectionsEndPointMapData(failureMechanism.Sections, mapDataList[sectionsEndPointIndex]); + AssertHydraulicBoundaryLocationsMapData(assessmentSection.HydraulicBoundaryDatabase, mapDataList[hydraulicBoundaryDatabaseIndex]); + AssertForeshoreProfiles(failureMechanism.ForeshoreProfiles, mapDataList[foreshoreProfilesIndex]); + } + } + + [Test] + public void UpdateObserver_HydraulicBoundaryDatabaseUpdated_MapDataUpdated() + { + // Setup + using (var view = new GrassCoverErosionOutwardsFailureMechanismView()) + { + var map = (MapControl)view.Controls[0]; + + var hydraulicBoundaryDatabase1 = new HydraulicBoundaryDatabase + { + Locations = + { + new HydraulicBoundaryLocation(1, "test1", 1.0, 2.0) + } + }; + var hydraulicBoundaryDatabase2 = new HydraulicBoundaryDatabase + { + Locations = + { + new HydraulicBoundaryLocation(2, "test2", 2.0, 3.0) + } + }; + + var assessmentSection = new TestAssessmentSection + { + HydraulicBoundaryDatabase = hydraulicBoundaryDatabase1 + }; + + var failureMechanismContext = new GrassCoverErosionOutwardsFailureMechanismContext(new GrassCoverErosionOutwardsFailureMechanism(), assessmentSection); + + view.Data = failureMechanismContext; + + var hydraulicBoundaryDatabaseMapData = map.Data.Collection.ElementAt(hydraulicBoundaryDatabaseIndex); + + // Precondition + AssertHydraulicBoundaryLocationsMapData(hydraulicBoundaryDatabase1, hydraulicBoundaryDatabaseMapData); + + // Call + assessmentSection.HydraulicBoundaryDatabase = hydraulicBoundaryDatabase2; + assessmentSection.NotifyObservers(); + + // Assert + AssertHydraulicBoundaryLocationsMapData(hydraulicBoundaryDatabase2, hydraulicBoundaryDatabaseMapData); + } + } + + [Test] + public void UpdateObserver_ReferenceLineUpdated_MapDataUpdated() + { + // Setup + using (var view = new GrassCoverErosionOutwardsFailureMechanismView()) + { + var map = (MapControl)view.Controls[0]; + + var points1 = new List + { + new Point2D(1.0, 2.0), + new Point2D(2.0, 1.0) + }; + + var points2 = new List + { + new Point2D(2.0, 5.0), + new Point2D(4.0, 3.0) + }; + + var assessmentSection = new TestAssessmentSection + { + ReferenceLine = new ReferenceLine() + }; + assessmentSection.ReferenceLine.SetGeometry(points1); + + var failureMechanismContext = new GrassCoverErosionOutwardsFailureMechanismContext(new GrassCoverErosionOutwardsFailureMechanism(), assessmentSection); + + view.Data = failureMechanismContext; + + var referenceLineMapData = map.Data.Collection.ElementAt(referenceLineIndex); + + // Precondition + AssertReferenceLineMapData(assessmentSection.ReferenceLine, referenceLineMapData); + + // Call + assessmentSection.ReferenceLine.SetGeometry(points2); + assessmentSection.NotifyObservers(); + + // Assert + AssertReferenceLineMapData(assessmentSection.ReferenceLine, referenceLineMapData); + } + } + + [Test] + public void UpdateObserver_FailureMechanismSectionsUpdated_MapDataUpdated() + { + // Setup + using (var view = new GrassCoverErosionOutwardsFailureMechanismView()) + { + var map = (MapControl)view.Controls[0]; + + var failureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); + var failureMechanismContext = new GrassCoverErosionOutwardsFailureMechanismContext(failureMechanism, new TestAssessmentSection()); + + view.Data = failureMechanismContext; + + var sectionMapData = (MapLineData)map.Data.Collection.ElementAt(sectionsIndex); + var sectionStartsMapData = (MapPointData)map.Data.Collection.ElementAt(sectionsStartPointIndex); + var sectionsEndsMapData = (MapPointData)map.Data.Collection.ElementAt(sectionsEndPointIndex); + + // Call + failureMechanism.AddSection(new FailureMechanismSection(string.Empty, new[] + { + new Point2D(1, 2), + new Point2D(1, 2) + })); + failureMechanism.NotifyObservers(); + + // Assert + AssertFailureMechanismSectionsMapData(failureMechanism.Sections, sectionMapData); + AssertFailureMechanismSectionsStartPointMapData(failureMechanism.Sections, sectionStartsMapData); + AssertFailureMechanismSectionsEndPointMapData(failureMechanism.Sections, sectionsEndsMapData); + } + } + + [Test] + public void UpdateObserver_ForeshoreProfilesUpdated_MapDataUpdated() + { + // Setup + using (var view = new GrassCoverErosionOutwardsFailureMechanismView()) + { + var map = (MapControl)view.Controls[0]; + + var failureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); + var failureMechanismContext = new GrassCoverErosionOutwardsFailureMechanismContext(failureMechanism, new TestAssessmentSection()); + + failureMechanism.ForeshoreProfiles.Add(new TestForeshoreProfile()); + + view.Data = failureMechanismContext; + + var foreshoreProfileData = map.Data.Collection.ElementAt(foreshoreProfilesIndex); + + // Precondition + AssertForeshoreProfiles(failureMechanism.ForeshoreProfiles, foreshoreProfileData); + + // Call + failureMechanism.ForeshoreProfiles.Add(new TestForeshoreProfile()); + failureMechanism.ForeshoreProfiles.NotifyObservers(); + + // Assert + AssertForeshoreProfiles(failureMechanism.ForeshoreProfiles, foreshoreProfileData); + } + } + + [Test] + public void UpdateObserver_DataUpdated_MapLayersSameOrder() + { + // Setup + const int updatedRefenceLineLayerIndex = referenceLineIndex + 5; + const int updatedSectionsLayerIndex = sectionsIndex - 1; + const int updateSectionStartLayerIndex = sectionsStartPointIndex - 1; + const int updatedSectionEndLayerIndex = sectionsEndPointIndex - 1; + const int updatedHydraulicLocationsLayerIndex = hydraulicBoundaryDatabaseIndex - 1; + const int updatedForeshoreProfilesLayerIndex = foreshoreProfilesIndex - 1; + + using (var view = new GrassCoverErosionOutwardsFailureMechanismView()) + { + var map = (MapControl)view.Controls[0]; + + var assessmentSection = new TestAssessmentSection(); + var failureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); + var failureMechanismContext = new GrassCoverErosionOutwardsFailureMechanismContext(failureMechanism, assessmentSection); + + view.Data = failureMechanismContext; + + var mapData = map.Data; + + var dataToMove = (MapLineData)map.Data.Collection.ElementAt(referenceLineIndex); + mapData.Remove(dataToMove); + mapData.Add(dataToMove); + + var mapDataList = mapData.Collection.ToList(); + + // Precondition + var referenceLineData = (MapLineData)mapDataList[updatedRefenceLineLayerIndex]; + Assert.AreEqual("Referentielijn", referenceLineData.Name); + + var sectionsData = (MapLineData)mapDataList[updatedSectionsLayerIndex]; + Assert.AreEqual("Vakindeling", sectionsData.Name); + + var sectionStartsData = (MapPointData)mapDataList[updateSectionStartLayerIndex]; + Assert.AreEqual("Vakindeling (startpunten)", sectionStartsData.Name); + + var sectionEndsData = (MapPointData)mapDataList[updatedSectionEndLayerIndex]; + Assert.AreEqual("Vakindeling (eindpunten)", sectionEndsData.Name); + + var hydraulicLocationsData = (MapPointData)mapDataList[updatedHydraulicLocationsLayerIndex]; + Assert.AreEqual("Hydraulische randvoorwaarden", hydraulicLocationsData.Name); + + var foreshoreProfilesData = (MapLineData)mapDataList[updatedForeshoreProfilesLayerIndex]; + Assert.AreEqual("Voorlandprofielen", foreshoreProfilesData.Name); + + var points = new List + { + new Point2D(2.0, 5.0), + new Point2D(4.0, 3.0) + }; + ReferenceLine referenceLine = new ReferenceLine(); + referenceLine.SetGeometry(points); + assessmentSection.ReferenceLine = referenceLine; + + // Call + assessmentSection.NotifyObservers(); + + // Call + var actualReferenceLineData = (MapLineData)mapDataList[updatedRefenceLineLayerIndex]; + Assert.AreEqual("Referentielijn", actualReferenceLineData.Name); + + var actualSectionsData = (MapLineData)mapDataList[updatedSectionsLayerIndex]; + Assert.AreEqual("Vakindeling", actualSectionsData.Name); + + var actualSectionStartsData = (MapPointData)mapDataList[updateSectionStartLayerIndex]; + Assert.AreEqual("Vakindeling (startpunten)", actualSectionStartsData.Name); + + var actualSectionEndsData = (MapPointData)mapDataList[updatedSectionEndLayerIndex]; + Assert.AreEqual("Vakindeling (eindpunten)", actualSectionEndsData.Name); + + var actualHydraulicLocationsData = (MapPointData)mapDataList[updatedHydraulicLocationsLayerIndex]; + Assert.AreEqual("Hydraulische randvoorwaarden", actualHydraulicLocationsData.Name); + + var actualForeshoreProfilesData = (MapLineData)mapDataList[updatedForeshoreProfilesLayerIndex]; + Assert.AreEqual("Voorlandprofielen", actualForeshoreProfilesData.Name); + } + } + + [Test] + public void NotifyObservers_DataUpdatedNotifyObserversOnOldData_NoUpdateInViewData() + { + // Setup + IAssessmentSection oldAssessmentSection = new TestAssessmentSection(); + IAssessmentSection newAssessmentSection = new TestAssessmentSection(); + + newAssessmentSection.ReferenceLine = new ReferenceLine(); + newAssessmentSection.ReferenceLine.SetGeometry(new[] + { + new Point2D(2, 4), + new Point2D(3, 4) + }); + + var oldGrassCoverErosionOutwardsFailureMechanismContext = new GrassCoverErosionOutwardsFailureMechanismContext(new GrassCoverErosionOutwardsFailureMechanism(), oldAssessmentSection); + var newGrassCoverErosionOutwardsFailureMechanismContext = new GrassCoverErosionOutwardsFailureMechanismContext(new GrassCoverErosionOutwardsFailureMechanism(), newAssessmentSection); + using (var view = new GrassCoverErosionOutwardsFailureMechanismView()) + { + var map = (MapControl)view.Controls[0]; + + view.Data = oldGrassCoverErosionOutwardsFailureMechanismContext; + view.Data = newGrassCoverErosionOutwardsFailureMechanismContext; + MapData dataBeforeUpdate = map.Data; + + newAssessmentSection.ReferenceLine.SetGeometry(Enumerable.Empty()); + + // Call + oldAssessmentSection.NotifyObservers(); + + // Assert + Assert.AreEqual(dataBeforeUpdate, map.Data); + } + } + + private static void AssertReferenceLineMapData(ReferenceLine referenceLine, MapData mapData) + { + Assert.IsInstanceOf(mapData); + var referenceLineData = (MapLineData)mapData; + if (referenceLine == null) + { + CollectionAssert.IsEmpty(referenceLineData.Features.First().MapGeometries.First().PointCollections.First()); + } + else + { + CollectionAssert.AreEqual(referenceLine.Points, referenceLineData.Features.First().MapGeometries.First().PointCollections.First()); + } + Assert.AreEqual("Referentielijn", mapData.Name); + } + + private static void AssertForeshoreProfiles(IEnumerable foreshoreProfiles, MapData mapData) + { + Assert.NotNull(foreshoreProfiles, "foreshoreProfiles should never be null."); + + var foreshoreProfilesData = (MapLineData)mapData; + var foreshoreProfileArray = foreshoreProfiles.ToArray(); + + Assert.IsInstanceOf(mapData); + Assert.AreEqual(foreshoreProfileArray.Length, foreshoreProfilesData.Features.Length); + + for (int i = 0; i < foreshoreProfileArray.Length; i++) + { + var profileDataA = foreshoreProfilesData.Features.ElementAt(i).MapGeometries.First(); + CollectionAssert.AreEquivalent(foreshoreProfileArray[0].Geometry, profileDataA.PointCollections.First()); + } + + Assert.AreEqual("Voorlandprofielen", mapData.Name); + } + + private static void AssertHydraulicBoundaryLocationsMapData(HydraulicBoundaryDatabase database, MapData mapData) + { + Assert.IsInstanceOf(mapData); + var hydraulicLocationsMapData = (MapPointData)mapData; + if (database == null) + { + CollectionAssert.IsEmpty(hydraulicLocationsMapData.Features.First().MapGeometries.First().PointCollections.First()); + } + else + { + CollectionAssert.AreEqual(database.Locations.Select(hrp => hrp.Location), hydraulicLocationsMapData.Features.First().MapGeometries.First().PointCollections.First()); + } + Assert.AreEqual("Hydraulische randvoorwaarden", mapData.Name); + } + + private static void AssertFailureMechanismSectionsMapData(IEnumerable sections, MapData mapData) + { + Assert.IsInstanceOf(mapData); + var sectionsMapLinesData = (MapLineData)mapData; + var sectionMapLinesFeatures = sectionsMapLinesData.Features.ToArray(); + Assert.AreEqual(1, sectionMapLinesFeatures.Length); + + var geometries = sectionMapLinesFeatures.First().MapGeometries.ToArray(); + var sectionsArray = sections.ToArray(); + Assert.AreEqual(sectionsArray.Length, geometries.Length); + + for (int index = 0; index < sectionsArray.Length; index++) + { + var failureMechanismSection = sectionsArray[index]; + CollectionAssert.AreEquivalent(failureMechanismSection.Points, geometries[index].PointCollections.First()); + } + Assert.AreEqual("Vakindeling", mapData.Name); + } + + private static void AssertFailureMechanismSectionsStartPointMapData(IEnumerable sections, MapData mapData) + { + Assert.IsInstanceOf(mapData); + var sectionsStartPointData = (MapPointData)mapData; + CollectionAssert.AreEqual(sections.Select(s => s.GetStart()), sectionsStartPointData.Features.First().MapGeometries.First().PointCollections.First()); + Assert.AreEqual("Vakindeling (startpunten)", mapData.Name); + } + + private static void AssertFailureMechanismSectionsEndPointMapData(IEnumerable sections, MapData mapData) + { + Assert.IsInstanceOf(mapData); + var sectionsStartPointData = (MapPointData)mapData; + CollectionAssert.AreEqual(sections.Select(s => s.GetLast()), sectionsStartPointData.Features.First().MapGeometries.First().PointCollections.First()); + Assert.AreEqual("Vakindeling (eindpunten)", mapData.Name); + } + + private static void AssertEmptyMapData(MapDataCollection mapData) + { + Assert.IsInstanceOf(mapData); + + var mapDataList = mapData.Collection.ToList(); + + Assert.AreEqual(6, mapDataList.Count); + + var referenceLineMapData = (MapLineData)mapDataList[referenceLineIndex]; + var sectionsMapData = (MapLineData)mapDataList[sectionsIndex]; + var foreshoreProfilesMapData = (MapLineData)mapDataList[foreshoreProfilesIndex]; + var sectionsStartPointMapData = (MapPointData)mapDataList[sectionsStartPointIndex]; + var sectionsEndPointMapData = (MapPointData)mapDataList[sectionsEndPointIndex]; + var hydraulicBoundaryDatabaseMapData = (MapPointData)mapDataList[hydraulicBoundaryDatabaseIndex]; + + CollectionAssert.IsEmpty(referenceLineMapData.Features); + CollectionAssert.IsEmpty(sectionsMapData.Features); + CollectionAssert.IsEmpty(foreshoreProfilesMapData.Features); + CollectionAssert.IsEmpty(foreshoreProfilesMapData.Features); + CollectionAssert.IsEmpty(sectionsStartPointMapData.Features); + CollectionAssert.IsEmpty(sectionsEndPointMapData.Features); + CollectionAssert.IsEmpty(hydraulicBoundaryDatabaseMapData.Features); + + Assert.AreEqual(RingtoetsCommonDataResources.ReferenceLine_DisplayName, referenceLineMapData.Name); + Assert.AreEqual(RingtoetsCommonFormsResources.FailureMechanism_Sections_DisplayName, sectionsMapData.Name); + Assert.AreEqual(GetSectionPointDisplayName(RingtoetsCommonFormsResources.FailureMechanismSections_StartPoints_DisplayName), sectionsStartPointMapData.Name); + Assert.AreEqual(GetSectionPointDisplayName(RingtoetsCommonFormsResources.FailureMechanismSections_EndPoints_DisplayName), sectionsEndPointMapData.Name); + Assert.AreEqual(RingtoetsCommonDataResources.HydraulicBoundaryConditions_DisplayName, hydraulicBoundaryDatabaseMapData.Name); + } + + private static string GetSectionPointDisplayName(string name) + { + return string.Format("{0} ({1})", + RingtoetsCommonFormsResources.FailureMechanism_Sections_DisplayName, + name); + } + + private class TestAssessmentSection : Observable, IAssessmentSection + { + public string Id { get; set; } + public string Name { get; set; } + public string Comments { get; set; } + public AssessmentSectionComposition Composition { get; private set; } + public ReferenceLine ReferenceLine { get; set; } + public FailureMechanismContribution FailureMechanismContribution { get; private set; } + public HydraulicBoundaryDatabase HydraulicBoundaryDatabase { get; set; } + + public IEnumerable GetFailureMechanisms() + { + yield break; + } + + public void ChangeComposition(AssessmentSectionComposition newComposition) + { + throw new NotImplementedException(); + } + } + } +} \ No newline at end of file Index: Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Plugin.Test/GrassCoverErosionOutwardsPluginTest.cs =================================================================== diff -u -r2973c5f790a5131e427bd5f73e2a620044199639 -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Plugin.Test/GrassCoverErosionOutwardsPluginTest.cs (.../GrassCoverErosionOutwardsPluginTest.cs) (revision 2973c5f790a5131e427bd5f73e2a620044199639) +++ Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Plugin.Test/GrassCoverErosionOutwardsPluginTest.cs (.../GrassCoverErosionOutwardsPluginTest.cs) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -60,10 +60,15 @@ ViewInfo[] viewInfos = plugin.GetViewInfos().ToArray(); // Assert - Assert.AreEqual(3, viewInfos.Length); + Assert.AreEqual(4, viewInfos.Length); PluginTestHelper.AssertViewInfoDefined( viewInfos, + typeof(GrassCoverErosionOutwardsFailureMechanismContext), + typeof(GrassCoverErosionOutwardsFailureMechanismView)); + + PluginTestHelper.AssertViewInfoDefined( + viewInfos, typeof(FailureMechanismSectionResultContext), typeof(IEnumerable), typeof(GrassCoverErosionOutwardsFailureMechanismResultView)); Index: Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Plugin.Test/Ringtoets.GrassCoverErosionOutwards.Plugin.Test.csproj =================================================================== diff -u -r2d5e2d09b0cb1a7f48e1b0a067d332347c89d4a8 -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Plugin.Test/Ringtoets.GrassCoverErosionOutwards.Plugin.Test.csproj (.../Ringtoets.GrassCoverErosionOutwards.Plugin.Test.csproj) (revision 2d5e2d09b0cb1a7f48e1b0a067d332347c89d4a8) +++ Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Plugin.Test/Ringtoets.GrassCoverErosionOutwards.Plugin.Test.csproj (.../Ringtoets.GrassCoverErosionOutwards.Plugin.Test.csproj) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -58,6 +58,7 @@ + @@ -92,6 +93,10 @@ {D749EE4C-CE50-4C17-BF01-9A953028C126} Core.Common.TestUtil + + {4a06df0d-5d75-4bad-a95a-a3db9b7c4ad5} + Core.Components.Gis.Forms + {D4200F43-3F72-4F42-AF0A-8CED416A38EC} Ringtoets.Common.Data Index: Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Plugin.Test/ViewInfos/GrassCoverErosionOutwardsFailureMechanismViewInfoTest.cs =================================================================== diff -u --- Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Plugin.Test/ViewInfos/GrassCoverErosionOutwardsFailureMechanismViewInfoTest.cs (revision 0) +++ Ringtoets/GrassCoverErosionOutwards/test/Ringtoets.GrassCoverErosionOutwards.Plugin.Test/ViewInfos/GrassCoverErosionOutwardsFailureMechanismViewInfoTest.cs (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -0,0 +1,210 @@ +// 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.Linq; +using Core.Common.Gui.Plugin; +using Core.Common.TestUtil; +using NUnit.Framework; +using Rhino.Mocks; +using Ringtoets.Common.Data.AssessmentSection; +using Ringtoets.GrassCoverErosionOutwards.Data; +using Ringtoets.GrassCoverErosionOutwards.Forms.PresentationObjects; +using Ringtoets.GrassCoverErosionOutwards.Forms.Views; +using GrassCoverErosionOutwardsDataResources = Ringtoets.GrassCoverErosionOutwards.Data.Properties.Resources; +using GrassCoverErosionOutwardsFormsResources = Ringtoets.GrassCoverErosionOutwards.Forms.Properties.Resources; +using RingtoetsCommonFormsResources = Ringtoets.Common.Forms.Properties.Resources; + +namespace Ringtoets.GrassCoverErosionOutwards.Plugin.Test.ViewInfos +{ + [TestFixture] + public class GrassCoverErosionOutwardsFailureMechanismViewInfoTest + { + private MockRepository mocks; + private GrassCoverErosionOutwardsPlugin plugin; + private ViewInfo info; + + [SetUp] + public void SetUp() + { + mocks = new MockRepository(); + plugin = new GrassCoverErosionOutwardsPlugin(); + info = plugin.GetViewInfos().First(tni => tni.ViewType == typeof(GrassCoverErosionOutwardsFailureMechanismView)); + } + + [TearDown] + public void TearDown() + { + plugin.Dispose(); + } + + [Test] + public void Initialized_Always_ExpectedPropertiesSet() + { + // Assert + Assert.AreEqual(typeof(GrassCoverErosionOutwardsFailureMechanismContext), info.DataType); + Assert.AreEqual(typeof(GrassCoverErosionOutwardsFailureMechanismContext), info.ViewDataType); + TestHelper.AssertImagesAreEqual(RingtoetsCommonFormsResources.CalculationIcon, info.Image); + } + + [Test] + public void GetViewName_WithGrassCoverErosionOutwardsFailureMechanism_ReturnsNameOfFailureMechanism() + { + // Setup + var assessmentSectionMock = mocks.Stub(); + mocks.ReplayAll(); + + var grassCoverErosionOutwardsFailureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); + var grassCoverErosionOutwardsFailureMechanismContext = new GrassCoverErosionOutwardsFailureMechanismContext(grassCoverErosionOutwardsFailureMechanism, assessmentSectionMock); + + using (var view = new GrassCoverErosionOutwardsFailureMechanismView()) + { + // Call + string viewName = info.GetViewName(view, grassCoverErosionOutwardsFailureMechanismContext); + + // Assert + Assert.AreEqual(grassCoverErosionOutwardsFailureMechanism.Name, viewName); + } + } + + [Test] + public void CloseForData_ViewNotCorrespondingToRemovedAssessmentSection_ReturnsFalse() + { + // Setup + var assessmentSectionMock = mocks.Stub(); + var otherAssessmentSectionMock = mocks.Stub(); + mocks.ReplayAll(); + + var grassCoverErosionOutwardsFailureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); + var grassCoverErosionOutwardsFailureMechanismContext = new GrassCoverErosionOutwardsFailureMechanismContext(grassCoverErosionOutwardsFailureMechanism, assessmentSectionMock); + + using (var view = new GrassCoverErosionOutwardsFailureMechanismView + { + Data = grassCoverErosionOutwardsFailureMechanismContext + }) + { + // Call + bool closeForData = info.CloseForData(view, otherAssessmentSectionMock); + + // Assert + Assert.IsFalse(closeForData); + } + mocks.VerifyAll(); + } + + [Test] + public void CloseForData_ViewCorrespondingToRemovedAssessmentSection_ReturnsTrue() + { + // Setup + var assessmentSectionMock = mocks.Stub(); + mocks.ReplayAll(); + + var grassCoverErosionOutwardsFailureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); + var grassCoverErosionOutwardsFailureMechanismContext = new GrassCoverErosionOutwardsFailureMechanismContext(grassCoverErosionOutwardsFailureMechanism, assessmentSectionMock); + + using (var view = new GrassCoverErosionOutwardsFailureMechanismView + { + Data = grassCoverErosionOutwardsFailureMechanismContext + }) + { + // Call + bool closeForData = info.CloseForData(view, assessmentSectionMock); + + // Assert + Assert.IsTrue(closeForData); + } + mocks.VerifyAll(); + } + + [Test] + public void CloseForData_ViewNotCorrespondingToRemovedFailureMechanism_ReturnsFalse() + { + // Setup + var assessmentSectionMock = mocks.Stub(); + mocks.ReplayAll(); + + var grassCoverErosionOutwardsFailureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); + var otherGrassCoverErosionOutwardsFailureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); + + var grassCoverErosionOutwardsFailureMechanismContext = new GrassCoverErosionOutwardsFailureMechanismContext(grassCoverErosionOutwardsFailureMechanism, assessmentSectionMock); + + using (var view = new GrassCoverErosionOutwardsFailureMechanismView + { + Data = grassCoverErosionOutwardsFailureMechanismContext + }) + { + // Call + bool closeForData = info.CloseForData(view, otherGrassCoverErosionOutwardsFailureMechanism); + + // Assert + Assert.IsFalse(closeForData); + } + mocks.VerifyAll(); + } + + [Test] + public void CloseForData_ViewCorrespondingToRemovedFailureMechanism_ReturnsTrue() + { + // Setup + var assessmentSectionMock = mocks.Stub(); + mocks.ReplayAll(); + + var grassCoverErosionOutwardsFailureMechanism = new GrassCoverErosionOutwardsFailureMechanism(); + var grassCoverErosionOutwardsFailureMechanismContext = new GrassCoverErosionOutwardsFailureMechanismContext(grassCoverErosionOutwardsFailureMechanism, assessmentSectionMock); + + using (var view = new GrassCoverErosionOutwardsFailureMechanismView + { + Data = grassCoverErosionOutwardsFailureMechanismContext + }) + { + // Call + bool closeForData = info.CloseForData(view, grassCoverErosionOutwardsFailureMechanism); + + // Assert + Assert.IsTrue(closeForData); + } + mocks.VerifyAll(); + } + + [Test] + [TestCase(true)] + [TestCase(false)] + public void AdditionalDataCheck_Always_ReturnTrueOnlyIfFailureMechanismRelevant(bool isRelevant) + { + // Setup + var assessmentSection = mocks.Stub(); + mocks.ReplayAll(); + + var failureMechanism = new GrassCoverErosionOutwardsFailureMechanism + { + IsRelevant = isRelevant + }; + + var context = new GrassCoverErosionOutwardsFailureMechanismContext(failureMechanism, assessmentSection); + + // Call + bool result = info.AdditionalDataCheck(context); + + // Assert + Assert.AreEqual(isRelevant, result); + mocks.VerifyAll(); + } + } +} \ No newline at end of file Index: Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Views/PipingFailureMechanismViewTest.cs =================================================================== diff -u -r7641c0e215cd2e90a9b1828778906cfee05ff592 -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Views/PipingFailureMechanismViewTest.cs (.../PipingFailureMechanismViewTest.cs) (revision 7641c0e215cd2e90a9b1828778906cfee05ff592) +++ Ringtoets/Piping/test/Ringtoets.Piping.Forms.Test/Views/PipingFailureMechanismViewTest.cs (.../PipingFailureMechanismViewTest.cs) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -91,13 +91,13 @@ // Setup using (var view = new PipingFailureMechanismView()) { - var pipingFailureMechanismContext = new PipingFailureMechanismContext(new PipingFailureMechanism(), new TestAssessmentSection()); + var failureMechanismContext = new PipingFailureMechanismContext(new PipingFailureMechanism(), new TestAssessmentSection()); // Call - view.Data = pipingFailureMechanismContext; + view.Data = failureMechanismContext; // Assert - Assert.AreSame(pipingFailureMechanismContext, view.Data); + Assert.AreSame(failureMechanismContext, view.Data); } } @@ -123,9 +123,9 @@ // Setup using (var view = new PipingFailureMechanismView()) { - var pipingFailureMechanismContext = new PipingFailureMechanismContext(new PipingFailureMechanism(), new TestAssessmentSection()); + var failureMechanismContext = new PipingFailureMechanismContext(new PipingFailureMechanism(), new TestAssessmentSection()); - view.Data = pipingFailureMechanismContext; + view.Data = failureMechanismContext; // Precondition Assert.AreEqual(7, view.Map.Data.Collection.Count()); @@ -145,13 +145,13 @@ // Setup using (var view = new PipingFailureMechanismView()) { - var pipingFailureMechanismContext = new PipingFailureMechanismContext(new PipingFailureMechanism(), new TestAssessmentSection()); + var failureMechanismContext = new PipingFailureMechanismContext(new PipingFailureMechanism(), new TestAssessmentSection()); // Call - view.Data = pipingFailureMechanismContext; + view.Data = failureMechanismContext; // Assert - Assert.AreSame(pipingFailureMechanismContext, view.Data); + Assert.AreSame(failureMechanismContext, view.Data); AssertEmptyMapData(view.Map.Data); } } @@ -195,33 +195,33 @@ new Point2D(1.1, 2.2) }); - var pipingFailureMechanism = new PipingFailureMechanism(); - pipingFailureMechanism.SurfaceLines.Add(new RingtoetsPipingSurfaceLine()); - pipingFailureMechanism.AddSection(new FailureMechanismSection("A", geometryPoints.Take(2))); - pipingFailureMechanism.AddSection(new FailureMechanismSection("B", geometryPoints.Skip(1).Take(2))); - pipingFailureMechanism.AddSection(new FailureMechanismSection("C", geometryPoints.Skip(2).Take(2))); - pipingFailureMechanism.StochasticSoilModels.Add(stochasticSoilModel); + var failureMechanism = new PipingFailureMechanism(); + failureMechanism.SurfaceLines.Add(new RingtoetsPipingSurfaceLine()); + failureMechanism.AddSection(new FailureMechanismSection("A", geometryPoints.Take(2))); + failureMechanism.AddSection(new FailureMechanismSection("B", geometryPoints.Skip(1).Take(2))); + failureMechanism.AddSection(new FailureMechanismSection("C", geometryPoints.Skip(2).Take(2))); + failureMechanism.StochasticSoilModels.Add(stochasticSoilModel); - var pipingContext = new PipingFailureMechanismContext(pipingFailureMechanism, assessmentSection); + var failureMechanismContext = new PipingFailureMechanismContext(failureMechanism, assessmentSection); // Call - view.Data = pipingContext; + view.Data = failureMechanismContext; // Assert - Assert.AreSame(pipingContext, view.Data); + Assert.AreSame(failureMechanismContext, view.Data); var mapData = map.Data; Assert.IsInstanceOf(mapData); var mapDataList = mapData.Collection.ToList(); Assert.AreEqual(7, mapDataList.Count); AssertReferenceLineMapData(assessmentSection.ReferenceLine, mapDataList[referenceLineIndex]); - AssertSurfacelinesMapData(pipingFailureMechanism.SurfaceLines, mapDataList[surfaceLinesIndex]); - AssertFailureMechanismSectionsMapData(pipingFailureMechanism.Sections, mapDataList[sectionsIndex]); - AssertFailureMechanismSectionsStartPointMapData(pipingFailureMechanism.Sections, mapDataList[sectionsStartPointIndex]); - AssertFailureMechanismSectionsEndPointMapData(pipingFailureMechanism.Sections, mapDataList[sectionsEndPointIndex]); + AssertSurfacelinesMapData(failureMechanism.SurfaceLines, mapDataList[surfaceLinesIndex]); + AssertFailureMechanismSectionsMapData(failureMechanism.Sections, mapDataList[sectionsIndex]); + AssertFailureMechanismSectionsStartPointMapData(failureMechanism.Sections, mapDataList[sectionsStartPointIndex]); + AssertFailureMechanismSectionsEndPointMapData(failureMechanism.Sections, mapDataList[sectionsEndPointIndex]); AssertHydraulicBoundaryLocationsMapData(assessmentSection.HydraulicBoundaryDatabase, mapDataList[hydraulicBoundaryDatabaseIndex]); - AssertStochasticSoilModelsMapData(pipingFailureMechanism.StochasticSoilModels, mapDataList[stochasticSoilModelsIndex]); + AssertStochasticSoilModelsMapData(failureMechanism.StochasticSoilModels, mapDataList[stochasticSoilModelsIndex]); } } @@ -253,9 +253,9 @@ HydraulicBoundaryDatabase = hydraulicBoundaryDatabase1 }; - var pipingContext = new PipingFailureMechanismContext(new PipingFailureMechanism(), assessmentSection); + var failureMechanismContext = new PipingFailureMechanismContext(new PipingFailureMechanism(), assessmentSection); - view.Data = pipingContext; + view.Data = failureMechanismContext; var hydraulicBoundaryDatabaseMapData = map.Data.Collection.ElementAt(hydraulicBoundaryDatabaseIndex); @@ -297,9 +297,9 @@ }; assessmentSection.ReferenceLine.SetGeometry(points1); - var pipingContext = new PipingFailureMechanismContext(new PipingFailureMechanism(), assessmentSection); + var failureMechanismContext = new PipingFailureMechanismContext(new PipingFailureMechanism(), assessmentSection); - view.Data = pipingContext; + view.Data = failureMechanismContext; var referenceLineMapData = map.Data.Collection.ElementAt(referenceLineIndex); @@ -322,8 +322,8 @@ using (var view = new PipingFailureMechanismView()) { var map = (MapControl) view.Controls[0]; - var pipingFailureMechanism = new PipingFailureMechanism(); - var pipingContext = new PipingFailureMechanismContext(pipingFailureMechanism, new TestAssessmentSection()); + var failureMechanism = new PipingFailureMechanism(); + var failureMechanismContext = new PipingFailureMechanismContext(failureMechanism, new TestAssessmentSection()); var surfaceLine = new RingtoetsPipingSurfaceLine(); var geometry1 = new Collection @@ -334,16 +334,16 @@ surfaceLine.SetGeometry(geometry1); - view.Data = pipingContext; + view.Data = failureMechanismContext; var surfaceLineMapData = (MapLineData) map.Data.Collection.ElementAt(surfaceLinesIndex); // Call - pipingFailureMechanism.SurfaceLines.Add(surfaceLine); - pipingFailureMechanism.SurfaceLines.NotifyObservers(); + failureMechanism.SurfaceLines.Add(surfaceLine); + failureMechanism.SurfaceLines.NotifyObservers(); // Assert - AssertSurfacelinesMapData(pipingFailureMechanism.SurfaceLines, surfaceLineMapData); + AssertSurfacelinesMapData(failureMechanism.SurfaceLines, surfaceLineMapData); } } @@ -355,27 +355,27 @@ { var map = (MapControl) view.Controls[0]; - var pipingFailureMechanism = new PipingFailureMechanism(); - var pipingContext = new PipingFailureMechanismContext(pipingFailureMechanism, new TestAssessmentSection()); + var failureMechanism = new PipingFailureMechanism(); + var failureMechanismContext = new PipingFailureMechanismContext(failureMechanism, new TestAssessmentSection()); - view.Data = pipingContext; + view.Data = failureMechanismContext; var sectionMapData = (MapLineData) map.Data.Collection.ElementAt(sectionsIndex); var sectionStartsMapData = (MapPointData) map.Data.Collection.ElementAt(sectionsStartPointIndex); var sectionsEndsMapData = (MapPointData) map.Data.Collection.ElementAt(sectionsEndPointIndex); // Call - pipingFailureMechanism.AddSection(new FailureMechanismSection(string.Empty, new[] + failureMechanism.AddSection(new FailureMechanismSection(string.Empty, new[] { new Point2D(1, 2), new Point2D(1, 2) })); - pipingFailureMechanism.NotifyObservers(); + failureMechanism.NotifyObservers(); // Assert - AssertFailureMechanismSectionsMapData(pipingFailureMechanism.Sections, sectionMapData); - AssertFailureMechanismSectionsStartPointMapData(pipingFailureMechanism.Sections, sectionStartsMapData); - AssertFailureMechanismSectionsEndPointMapData(pipingFailureMechanism.Sections, sectionsEndsMapData); + AssertFailureMechanismSectionsMapData(failureMechanism.Sections, sectionMapData); + AssertFailureMechanismSectionsStartPointMapData(failureMechanism.Sections, sectionStartsMapData); + AssertFailureMechanismSectionsEndPointMapData(failureMechanism.Sections, sectionsEndsMapData); } } @@ -387,8 +387,8 @@ { var map = (MapControl) view.Controls[0]; - var pipingFailureMechanism = new PipingFailureMechanism(); - var pipingContext = new PipingFailureMechanismContext(pipingFailureMechanism, new TestAssessmentSection()); + var failureMechanism = new PipingFailureMechanism(); + var failureMechanismContext = new PipingFailureMechanismContext(failureMechanism, new TestAssessmentSection()); var stochasticSoilModel = new StochasticSoilModel(0, "", ""); stochasticSoilModel.Geometry.AddRange(new[] @@ -397,16 +397,16 @@ new Point2D(1, 2) }); - view.Data = pipingContext; + view.Data = failureMechanismContext; var stochasticSoilModelMapData = (MapLineData) map.Data.Collection.ElementAt(stochasticSoilModelsIndex); // Call - pipingFailureMechanism.StochasticSoilModels.Add(stochasticSoilModel); - pipingFailureMechanism.StochasticSoilModels.NotifyObservers(); + failureMechanism.StochasticSoilModels.Add(stochasticSoilModel); + failureMechanism.StochasticSoilModels.NotifyObservers(); // Assert - AssertStochasticSoilModelsMapData(pipingFailureMechanism.StochasticSoilModels, stochasticSoilModelMapData); + AssertStochasticSoilModelsMapData(failureMechanism.StochasticSoilModels, stochasticSoilModelMapData); } } @@ -427,10 +427,10 @@ var map = (MapControl) view.Controls[0]; var assessmentSection = new TestAssessmentSection(); - var pipingFailureMechanism = new PipingFailureMechanism(); - var pipingContext = new PipingFailureMechanismContext(pipingFailureMechanism, assessmentSection); + var failureMechanism = new PipingFailureMechanism(); + var failureMechanismContext = new PipingFailureMechanismContext(failureMechanism, assessmentSection); - view.Data = pipingContext; + view.Data = failureMechanismContext; var mapData = map.Data; Index: Ringtoets/StabilityStoneCover/src/Ringtoets.StabilityStoneCover.Forms/Ringtoets.StabilityStoneCover.Forms.csproj =================================================================== diff -u -rbc4c4000ca4a850b49a88156ca2b919ea690494b -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/StabilityStoneCover/src/Ringtoets.StabilityStoneCover.Forms/Ringtoets.StabilityStoneCover.Forms.csproj (.../Ringtoets.StabilityStoneCover.Forms.csproj) (revision bc4c4000ca4a850b49a88156ca2b919ea690494b) +++ Ringtoets/StabilityStoneCover/src/Ringtoets.StabilityStoneCover.Forms/Ringtoets.StabilityStoneCover.Forms.csproj (.../Ringtoets.StabilityStoneCover.Forms.csproj) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -34,6 +34,7 @@ + @@ -56,6 +57,12 @@ + + UserControl + + + StabilityStoneCoverFailureMechanismView.cs + UserControl @@ -87,6 +94,21 @@ Core.Common.Utils False + + {5a91174a-fb95-4c9d-9ca5-81c0b8d4361a} + Core.Components.DotSpatial.Forms + False + + + {4A06DF0D-5D75-4BAD-A95A-A3DB9B7C4AD5} + Core.Components.Gis.Forms + False + + + {318BA582-88C9-4816-A54A-A7E431461DE3} + Core.Components.Gis + False + {d4200f43-3f72-4f42-af0a-8ced416a38ec} Ringtoets.Common.Data @@ -124,6 +146,9 @@ Resources.Designer.cs Designer + + StabilityStoneCoverFailureMechanismView.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file Index: Ringtoets/StabilityStoneCover/src/Ringtoets.StabilityStoneCover.Plugin/Ringtoets.StabilityStoneCover.Plugin.csproj =================================================================== diff -u -rbc4c4000ca4a850b49a88156ca2b919ea690494b -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/StabilityStoneCover/src/Ringtoets.StabilityStoneCover.Plugin/Ringtoets.StabilityStoneCover.Plugin.csproj (.../Ringtoets.StabilityStoneCover.Plugin.csproj) (revision bc4c4000ca4a850b49a88156ca2b919ea690494b) +++ Ringtoets/StabilityStoneCover/src/Ringtoets.StabilityStoneCover.Plugin/Ringtoets.StabilityStoneCover.Plugin.csproj (.../Ringtoets.StabilityStoneCover.Plugin.csproj) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -70,6 +70,11 @@ Core.Common.Gui False + + {4a06df0d-5d75-4bad-a95a-a3db9b7c4ad5} + Core.Components.Gis.Forms + False + {d4200f43-3f72-4f42-af0a-8ced416a38ec} Ringtoets.Common.Data Index: Ringtoets/StabilityStoneCover/src/Ringtoets.StabilityStoneCover.Plugin/StabilityStoneCoverPlugin.cs =================================================================== diff -u -rb5accd775c390fa85f815ef13c3c3e54a6d10ada -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/StabilityStoneCover/src/Ringtoets.StabilityStoneCover.Plugin/StabilityStoneCoverPlugin.cs (.../StabilityStoneCoverPlugin.cs) (revision b5accd775c390fa85f815ef13c3c3e54a6d10ada) +++ Ringtoets/StabilityStoneCover/src/Ringtoets.StabilityStoneCover.Plugin/StabilityStoneCoverPlugin.cs (.../StabilityStoneCoverPlugin.cs) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -69,6 +69,14 @@ public override IEnumerable GetViewInfos() { + yield return new ViewInfo + { + GetViewName = (view, mechanism) => mechanism.WrappedData.Name, + Image = RingtoetsCommonFormsResources.CalculationIcon, + CloseForData = CloseStabilityStoneCoverFailureMechanismViewForData, + AdditionalDataCheck = context => context.WrappedData.IsRelevant + }; + yield return new ViewInfo, IEnumerable, StabilityStoneCoverResultView> @@ -101,18 +109,18 @@ yield return new TreeNodeInfo { - Text = emptyPipingOutput => RingtoetsCommonFormsResources.CalculationOutput_DisplayName, - Image = emptyPipingOutput => RingtoetsCommonFormsResources.GeneralOutputIcon, - ForeColor = emptyPipingOutput => Color.FromKnownColor(KnownColor.GrayText), + Text = emptyOutput => RingtoetsCommonFormsResources.CalculationOutput_DisplayName, + Image = emptyOutput => RingtoetsCommonFormsResources.GeneralOutputIcon, + ForeColor = emptyOutput => Color.FromKnownColor(KnownColor.GrayText), ContextMenuStrip = (nodeData, parentData, treeViewControl) => Gui.Get(nodeData, treeViewControl) .AddPropertiesItem() .Build() }; yield return new TreeNodeInfo { - Text = emptyPipingOutput => RingtoetsCommonFormsResources.CalculationOutput_DisplayName, - Image = emptyPipingOutput => RingtoetsCommonFormsResources.GeneralOutputIcon, + Text = emptyOutput => RingtoetsCommonFormsResources.CalculationOutput_DisplayName, + Image = emptyOutput => RingtoetsCommonFormsResources.GeneralOutputIcon, ContextMenuStrip = (nodeData, parentData, treeViewControl) => Gui.Get(nodeData, treeViewControl) .AddPropertiesItem() .Build() @@ -159,6 +167,23 @@ #region ViewInfos + # region StabilityStoneCoverFailureMechanismView ViewInfo + + private bool CloseStabilityStoneCoverFailureMechanismViewForData(StabilityStoneCoverFailureMechanismView view, object o) + { + var assessmentSection = o as IAssessmentSection; + var failureMechanism = o as StabilityStoneCoverFailureMechanism; + + var viewFailureMechanismContext = (StabilityStoneCoverFailureMechanismContext)view.Data; + var viewFailureMechanism = viewFailureMechanismContext.WrappedData; + + return assessmentSection != null + ? ReferenceEquals(viewFailureMechanismContext.Parent, assessmentSection) + : ReferenceEquals(viewFailureMechanism, failureMechanism); + } + + # endregion + #region FailureMechanismSectionResultContext private static bool CloseFailureMechanismResultViewForData(StabilityStoneCoverResultView view, object dataToCloseFor) @@ -231,8 +256,10 @@ { var builder = new RingtoetsContextMenuBuilder(Gui.Get(failureMechanismContext, treeViewControl)); - return builder.AddToggleRelevancyOfFailureMechanismItem(failureMechanismContext, RemoveAllViewsForItem) + return builder.AddOpenItem() .AddSeparator() + .AddToggleRelevancyOfFailureMechanismItem(failureMechanismContext, RemoveAllViewsForItem) + .AddSeparator() .AddExpandAllItem() .AddCollapseAllItem() .AddSeparator() Index: Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Forms.Test/Ringtoets.StabilityStoneCover.Forms.Test.csproj =================================================================== diff -u -r98f01944e8ac182e2a1e9b1ed4deb48a07952529 -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Forms.Test/Ringtoets.StabilityStoneCover.Forms.Test.csproj (.../Ringtoets.StabilityStoneCover.Forms.Test.csproj) (revision 98f01944e8ac182e2a1e9b1ed4deb48a07952529) +++ Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Forms.Test/Ringtoets.StabilityStoneCover.Forms.Test.csproj (.../Ringtoets.StabilityStoneCover.Forms.Test.csproj) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -87,6 +87,7 @@ + @@ -131,6 +132,18 @@ Core.Common.TestUtil True + + {5a91174a-fb95-4c9d-9ca5-81c0b8d4361a} + Core.Components.DotSpatial.Forms + + + {4a06df0d-5d75-4bad-a95a-a3db9b7c4ad5} + Core.Components.Gis.Forms + + + {318ba582-88c9-4816-a54a-a7e431461de3} + Core.Components.Gis + {d4200f43-3f72-4f42-af0a-8ced416a38ec} Ringtoets.Common.Data Index: Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Forms.Test/TreeNodeInfos/StabilityStoneCoverFailureMechanismContextTreeNodeInfoTest.cs =================================================================== diff -u -rb5accd775c390fa85f815ef13c3c3e54a6d10ada -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Forms.Test/TreeNodeInfos/StabilityStoneCoverFailureMechanismContextTreeNodeInfoTest.cs (.../StabilityStoneCoverFailureMechanismContextTreeNodeInfoTest.cs) (revision b5accd775c390fa85f815ef13c3c3e54a6d10ada) +++ Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Forms.Test/TreeNodeInfos/StabilityStoneCoverFailureMechanismContextTreeNodeInfoTest.cs (.../StabilityStoneCoverFailureMechanismContextTreeNodeInfoTest.cs) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -44,7 +44,7 @@ [TestFixture] public class StabilityStoneCoverFailureMechanismContextTreeNodeInfoTest { - private const int contextMenuRelevancyIndexWhenRelevant = 0; + private const int contextMenuRelevancyIndexWhenRelevant = 2; private const int contextMenuRelevancyIndexWhenNotRelevant = 0; private MockRepository mocks; private StabilityStoneCoverPlugin plugin; @@ -254,6 +254,8 @@ assessmentSection); var menuBuilder = mocks.StrictMock(); + menuBuilder.Expect(mb => mb.AddOpenItem()).Return(menuBuilder); + menuBuilder.Expect(mb => mb.AddSeparator()).Return(menuBuilder); menuBuilder.Expect(mb => mb.AddCustomItem(null)).IgnoreArguments().Return(menuBuilder); menuBuilder.Expect(mb => mb.AddSeparator()).Return(menuBuilder); menuBuilder.Expect(mb => mb.AddExpandAllItem()).Return(menuBuilder); Index: Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Forms.Test/Views/StabilityStoneCoverFailureMechanismViewTest.cs =================================================================== diff -u --- Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Forms.Test/Views/StabilityStoneCoverFailureMechanismViewTest.cs (revision 0) +++ Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Forms.Test/Views/StabilityStoneCoverFailureMechanismViewTest.cs (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -0,0 +1,628 @@ +// 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.Collections.Generic; +using System.Linq; +using System.Windows.Forms; +using Core.Common.Base; +using Core.Common.Base.Geometry; +using Core.Components.DotSpatial.Forms; +using Core.Components.Gis.Data; +using Core.Components.Gis.Forms; +using NUnit.Framework; +using Ringtoets.Common.Data.AssessmentSection; +using Ringtoets.Common.Data.Contribution; +using Ringtoets.Common.Data.DikeProfiles; +using Ringtoets.Common.Data.FailureMechanism; +using Ringtoets.Common.Data.TestUtil; +using Ringtoets.HydraRing.Data; +using Ringtoets.StabilityStoneCover.Data; +using Ringtoets.StabilityStoneCover.Forms.PresentationObjects; +using Ringtoets.StabilityStoneCover.Forms.Views; +using RingtoetsCommonFormsResources = Ringtoets.Common.Forms.Properties.Resources; +using RingtoetsCommonDataResources = Ringtoets.Common.Data.Properties.Resources; +using StabilityStoneCoverDataResources = Ringtoets.StabilityStoneCover.Data.Properties.Resources; +using StabilityStoneCoverFormsResources = Ringtoets.StabilityStoneCover.Forms.Properties.Resources; + +namespace Ringtoets.StabilityStoneCover.Forms.Test.Views +{ + [TestFixture] + public class StabilityStoneCoverFailureMechanismViewTest + { + private const int referenceLineIndex = 0; + private const int sectionsIndex = 1; + private const int sectionsStartPointIndex = 2; + private const int sectionsEndPointIndex = 3; + private const int hydraulicBoundaryDatabaseIndex = 4; + private const int foreshoreProfilesIndex = 5; + + [Test] + public void DefaultConstructor_DefaultValues() + { + // Call + using (var view = new StabilityStoneCoverFailureMechanismView()) + { + // Assert + Assert.IsInstanceOf(view); + Assert.IsInstanceOf(view); + Assert.IsNotNull(view.Map); + Assert.IsNull(view.Data); + } + } + + [Test] + public void DefaultConstructor_Always_AddMapControlWithCollectionOfEmptyMapData() + { + // Call + using (var view = new StabilityStoneCoverFailureMechanismView()) + { + // Assert + Assert.AreEqual(1, view.Controls.Count); + Assert.AreSame(view.Map, view.Controls[0]); + Assert.AreEqual(DockStyle.Fill, ((Control)view.Map).Dock); + Assert.AreEqual(StabilityStoneCoverDataResources.StabilityStoneCoverFailureMechanism_DisplayName, view.Map.Data.Name); + AssertEmptyMapData(view.Map.Data); + } + } + + [Test] + public void Data_StabilityStoneCoverFailureMechanismContext_DataSet() + { + // Setup + using (var view = new StabilityStoneCoverFailureMechanismView()) + { + var failureMechanismContext = new StabilityStoneCoverFailureMechanismContext(new StabilityStoneCoverFailureMechanism(), new TestAssessmentSection()); + + // Call + view.Data = failureMechanismContext; + + // Assert + Assert.AreSame(failureMechanismContext, view.Data); + } + } + + [Test] + public void Data_OtherThanStabilityStoneCoverFailureMechanismContext_DataNull() + { + // Setup + using (var view = new StabilityStoneCoverFailureMechanismView()) + { + var data = new object(); + + // Call + view.Data = data; + + // Assert + Assert.IsNull(view.Data); + } + } + + [Test] + public void Data_SetToNull_MapDataCleared() + { + // Setup + using (var view = new StabilityStoneCoverFailureMechanismView()) + { + var failureMechanismContext = new StabilityStoneCoverFailureMechanismContext(new StabilityStoneCoverFailureMechanism(), new TestAssessmentSection()); + + view.Data = failureMechanismContext; + + // Precondition + Assert.AreEqual(6, view.Map.Data.Collection.Count()); + + // Call + view.Data = null; + + // Assert + Assert.IsNull(view.Data); + Assert.IsNull(view.Map.Data); + } + } + + [Test] + public void Data_EmptyStabilityStoneCoverFailureMechanismContext_NoMapDataSet() + { + // Setup + using (var view = new StabilityStoneCoverFailureMechanismView()) + { + var failureMechanismContext = new StabilityStoneCoverFailureMechanismContext(new StabilityStoneCoverFailureMechanism(), new TestAssessmentSection()); + + // Call + view.Data = failureMechanismContext; + + // Assert + Assert.AreSame(failureMechanismContext, view.Data); + AssertEmptyMapData(view.Map.Data); + } + } + + [Test] + public void Data_StabilityStoneCoverFailureMechanismContext_DataUpdatedToCollectionOfFilledMapData() + { + // Setup + using (var view = new StabilityStoneCoverFailureMechanismView()) + { + var map = (MapControl)view.Controls[0]; + + var geometryPoints = 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 hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase(); + hydraulicBoundaryDatabase.Locations.Add(new HydraulicBoundaryLocation(1, "test", 1.0, 2.0)); + + var referenceLine = new ReferenceLine(); + referenceLine.SetGeometry(new[] + { + new Point2D(1.0, 2.0), + new Point2D(2.0, 1.0) + }); + + var assessmentSection = new TestAssessmentSection + { + HydraulicBoundaryDatabase = hydraulicBoundaryDatabase, + ReferenceLine = referenceLine + }; + + var failureMechanism = new StabilityStoneCoverFailureMechanism(); + failureMechanism.AddSection(new FailureMechanismSection("A", geometryPoints.Take(2))); + failureMechanism.AddSection(new FailureMechanismSection("B", geometryPoints.Skip(1).Take(2))); + failureMechanism.AddSection(new FailureMechanismSection("C", geometryPoints.Skip(2).Take(2))); + + failureMechanism.ForeshoreProfiles.Add(new TestForeshoreProfile()); + failureMechanism.ForeshoreProfiles.Add(new TestForeshoreProfile()); + + var failureMechanismContext = new StabilityStoneCoverFailureMechanismContext(failureMechanism, assessmentSection); + + // Call + view.Data = failureMechanismContext; + + // Assert + Assert.AreSame(failureMechanismContext, view.Data); + + var mapData = map.Data; + Assert.IsInstanceOf(mapData); + + var mapDataList = mapData.Collection.ToList(); + Assert.AreEqual(6, mapDataList.Count); + AssertReferenceLineMapData(assessmentSection.ReferenceLine, mapDataList[referenceLineIndex]); + AssertFailureMechanismSectionsMapData(failureMechanism.Sections, mapDataList[sectionsIndex]); + AssertFailureMechanismSectionsStartPointMapData(failureMechanism.Sections, mapDataList[sectionsStartPointIndex]); + AssertFailureMechanismSectionsEndPointMapData(failureMechanism.Sections, mapDataList[sectionsEndPointIndex]); + AssertHydraulicBoundaryLocationsMapData(assessmentSection.HydraulicBoundaryDatabase, mapDataList[hydraulicBoundaryDatabaseIndex]); + AssertForeshoreProfiles(failureMechanism.ForeshoreProfiles, mapDataList[foreshoreProfilesIndex]); + } + } + + [Test] + public void UpdateObserver_HydraulicBoundaryDatabaseUpdated_MapDataUpdated() + { + // Setup + using (var view = new StabilityStoneCoverFailureMechanismView()) + { + var map = (MapControl)view.Controls[0]; + + var hydraulicBoundaryDatabase1 = new HydraulicBoundaryDatabase + { + Locations = + { + new HydraulicBoundaryLocation(1, "test1", 1.0, 2.0) + } + }; + var hydraulicBoundaryDatabase2 = new HydraulicBoundaryDatabase + { + Locations = + { + new HydraulicBoundaryLocation(2, "test2", 2.0, 3.0) + } + }; + + var assessmentSection = new TestAssessmentSection + { + HydraulicBoundaryDatabase = hydraulicBoundaryDatabase1 + }; + + var failureMechanismContext = new StabilityStoneCoverFailureMechanismContext(new StabilityStoneCoverFailureMechanism(), assessmentSection); + + view.Data = failureMechanismContext; + + var hydraulicBoundaryDatabaseMapData = map.Data.Collection.ElementAt(hydraulicBoundaryDatabaseIndex); + + // Precondition + AssertHydraulicBoundaryLocationsMapData(hydraulicBoundaryDatabase1, hydraulicBoundaryDatabaseMapData); + + // Call + assessmentSection.HydraulicBoundaryDatabase = hydraulicBoundaryDatabase2; + assessmentSection.NotifyObservers(); + + // Assert + AssertHydraulicBoundaryLocationsMapData(hydraulicBoundaryDatabase2, hydraulicBoundaryDatabaseMapData); + } + } + + [Test] + public void UpdateObserver_ReferenceLineUpdated_MapDataUpdated() + { + // Setup + using (var view = new StabilityStoneCoverFailureMechanismView()) + { + var map = (MapControl)view.Controls[0]; + + var points1 = new List + { + new Point2D(1.0, 2.0), + new Point2D(2.0, 1.0) + }; + + var points2 = new List + { + new Point2D(2.0, 5.0), + new Point2D(4.0, 3.0) + }; + + var assessmentSection = new TestAssessmentSection + { + ReferenceLine = new ReferenceLine() + }; + assessmentSection.ReferenceLine.SetGeometry(points1); + + var failureMechanismContext = new StabilityStoneCoverFailureMechanismContext(new StabilityStoneCoverFailureMechanism(), assessmentSection); + + view.Data = failureMechanismContext; + + var referenceLineMapData = map.Data.Collection.ElementAt(referenceLineIndex); + + // Precondition + AssertReferenceLineMapData(assessmentSection.ReferenceLine, referenceLineMapData); + + // Call + assessmentSection.ReferenceLine.SetGeometry(points2); + assessmentSection.NotifyObservers(); + + // Assert + AssertReferenceLineMapData(assessmentSection.ReferenceLine, referenceLineMapData); + } + } + + [Test] + public void UpdateObserver_FailureMechanismSectionsUpdated_MapDataUpdated() + { + // Setup + using (var view = new StabilityStoneCoverFailureMechanismView()) + { + var map = (MapControl)view.Controls[0]; + + var failureMechanism = new StabilityStoneCoverFailureMechanism(); + var failureMechanismContext = new StabilityStoneCoverFailureMechanismContext(failureMechanism, new TestAssessmentSection()); + + view.Data = failureMechanismContext; + + var sectionMapData = (MapLineData)map.Data.Collection.ElementAt(sectionsIndex); + var sectionStartsMapData = (MapPointData)map.Data.Collection.ElementAt(sectionsStartPointIndex); + var sectionsEndsMapData = (MapPointData)map.Data.Collection.ElementAt(sectionsEndPointIndex); + + // Call + failureMechanism.AddSection(new FailureMechanismSection(string.Empty, new[] + { + new Point2D(1, 2), + new Point2D(1, 2) + })); + failureMechanism.NotifyObservers(); + + // Assert + AssertFailureMechanismSectionsMapData(failureMechanism.Sections, sectionMapData); + AssertFailureMechanismSectionsStartPointMapData(failureMechanism.Sections, sectionStartsMapData); + AssertFailureMechanismSectionsEndPointMapData(failureMechanism.Sections, sectionsEndsMapData); + } + } + + [Test] + public void UpdateObserver_ForeshoreProfilesUpdated_MapDataUpdated() + { + // Setup + using (var view = new StabilityStoneCoverFailureMechanismView()) + { + var map = (MapControl)view.Controls[0]; + + var failureMechanism = new StabilityStoneCoverFailureMechanism(); + var failureMechanismContext = new StabilityStoneCoverFailureMechanismContext(failureMechanism, new TestAssessmentSection()); + + failureMechanism.ForeshoreProfiles.Add(new TestForeshoreProfile()); + + view.Data = failureMechanismContext; + + var foreshoreProfileData = map.Data.Collection.ElementAt(foreshoreProfilesIndex); + + // Precondition + AssertForeshoreProfiles(failureMechanism.ForeshoreProfiles, foreshoreProfileData); + + // Call + failureMechanism.ForeshoreProfiles.Add(new TestForeshoreProfile()); + failureMechanism.ForeshoreProfiles.NotifyObservers(); + + // Assert + AssertForeshoreProfiles(failureMechanism.ForeshoreProfiles, foreshoreProfileData); + } + } + + [Test] + public void UpdateObserver_DataUpdated_MapLayersSameOrder() + { + // Setup + const int updatedRefenceLineLayerIndex = referenceLineIndex + 5; + const int updatedSectionsLayerIndex = sectionsIndex - 1; + const int updateSectionStartLayerIndex = sectionsStartPointIndex - 1; + const int updatedSectionEndLayerIndex = sectionsEndPointIndex - 1; + const int updatedHydraulicLocationsLayerIndex = hydraulicBoundaryDatabaseIndex - 1; + const int updatedForeshoreProfilesLayerIndex = foreshoreProfilesIndex - 1; + + using (var view = new StabilityStoneCoverFailureMechanismView()) + { + var map = (MapControl)view.Controls[0]; + + var assessmentSection = new TestAssessmentSection(); + var failureMechanism = new StabilityStoneCoverFailureMechanism(); + var failureMechanismContext = new StabilityStoneCoverFailureMechanismContext(failureMechanism, assessmentSection); + + view.Data = failureMechanismContext; + + var mapData = map.Data; + + var dataToMove = (MapLineData)map.Data.Collection.ElementAt(referenceLineIndex); + mapData.Remove(dataToMove); + mapData.Add(dataToMove); + + var mapDataList = mapData.Collection.ToList(); + + // Precondition + var referenceLineData = (MapLineData)mapDataList[updatedRefenceLineLayerIndex]; + Assert.AreEqual("Referentielijn", referenceLineData.Name); + + var sectionsData = (MapLineData)mapDataList[updatedSectionsLayerIndex]; + Assert.AreEqual("Vakindeling", sectionsData.Name); + + var sectionStartsData = (MapPointData)mapDataList[updateSectionStartLayerIndex]; + Assert.AreEqual("Vakindeling (startpunten)", sectionStartsData.Name); + + var sectionEndsData = (MapPointData)mapDataList[updatedSectionEndLayerIndex]; + Assert.AreEqual("Vakindeling (eindpunten)", sectionEndsData.Name); + + var hydraulicLocationsData = (MapPointData)mapDataList[updatedHydraulicLocationsLayerIndex]; + Assert.AreEqual("Hydraulische randvoorwaarden", hydraulicLocationsData.Name); + + var foreshoreProfilesData = (MapLineData)mapDataList[updatedForeshoreProfilesLayerIndex]; + Assert.AreEqual("Voorlandprofielen", foreshoreProfilesData.Name); + + var points = new List + { + new Point2D(2.0, 5.0), + new Point2D(4.0, 3.0) + }; + ReferenceLine referenceLine = new ReferenceLine(); + referenceLine.SetGeometry(points); + assessmentSection.ReferenceLine = referenceLine; + + // Call + assessmentSection.NotifyObservers(); + + // Call + var actualReferenceLineData = (MapLineData)mapDataList[updatedRefenceLineLayerIndex]; + Assert.AreEqual("Referentielijn", actualReferenceLineData.Name); + + var actualSectionsData = (MapLineData)mapDataList[updatedSectionsLayerIndex]; + Assert.AreEqual("Vakindeling", actualSectionsData.Name); + + var actualSectionStartsData = (MapPointData)mapDataList[updateSectionStartLayerIndex]; + Assert.AreEqual("Vakindeling (startpunten)", actualSectionStartsData.Name); + + var actualSectionEndsData = (MapPointData)mapDataList[updatedSectionEndLayerIndex]; + Assert.AreEqual("Vakindeling (eindpunten)", actualSectionEndsData.Name); + + var actualHydraulicLocationsData = (MapPointData)mapDataList[updatedHydraulicLocationsLayerIndex]; + Assert.AreEqual("Hydraulische randvoorwaarden", actualHydraulicLocationsData.Name); + + var actualForeshoreProfilesData = (MapLineData)mapDataList[updatedForeshoreProfilesLayerIndex]; + Assert.AreEqual("Voorlandprofielen", actualForeshoreProfilesData.Name); + } + } + + [Test] + public void NotifyObservers_DataUpdatedNotifyObserversOnOldData_NoUpdateInViewData() + { + // Setup + IAssessmentSection oldAssessmentSection = new TestAssessmentSection(); + IAssessmentSection newAssessmentSection = new TestAssessmentSection(); + + newAssessmentSection.ReferenceLine = new ReferenceLine(); + newAssessmentSection.ReferenceLine.SetGeometry(new[] + { + new Point2D(2, 4), + new Point2D(3, 4) + }); + + var oldStabilityStoneCoverFailureMechanismContext = new StabilityStoneCoverFailureMechanismContext(new StabilityStoneCoverFailureMechanism(), oldAssessmentSection); + var newStabilityStoneCoverFailureMechanismContext = new StabilityStoneCoverFailureMechanismContext(new StabilityStoneCoverFailureMechanism(), newAssessmentSection); + using (var view = new StabilityStoneCoverFailureMechanismView()) + { + var map = (MapControl)view.Controls[0]; + + view.Data = oldStabilityStoneCoverFailureMechanismContext; + view.Data = newStabilityStoneCoverFailureMechanismContext; + MapData dataBeforeUpdate = map.Data; + + newAssessmentSection.ReferenceLine.SetGeometry(Enumerable.Empty()); + + // Call + oldAssessmentSection.NotifyObservers(); + + // Assert + Assert.AreEqual(dataBeforeUpdate, map.Data); + } + } + + private static void AssertReferenceLineMapData(ReferenceLine referenceLine, MapData mapData) + { + Assert.IsInstanceOf(mapData); + var referenceLineData = (MapLineData)mapData; + if (referenceLine == null) + { + CollectionAssert.IsEmpty(referenceLineData.Features.First().MapGeometries.First().PointCollections.First()); + } + else + { + CollectionAssert.AreEqual(referenceLine.Points, referenceLineData.Features.First().MapGeometries.First().PointCollections.First()); + } + Assert.AreEqual("Referentielijn", mapData.Name); + } + + private static void AssertForeshoreProfiles(IEnumerable foreshoreProfiles, MapData mapData) + { + Assert.NotNull(foreshoreProfiles, "foreshoreProfiles should never be null."); + + var foreshoreProfilesData = (MapLineData)mapData; + var foreshoreProfileArray = foreshoreProfiles.ToArray(); + + Assert.IsInstanceOf(mapData); + Assert.AreEqual(foreshoreProfileArray.Length, foreshoreProfilesData.Features.Length); + + for (int i = 0; i < foreshoreProfileArray.Length; i++) + { + var profileDataA = foreshoreProfilesData.Features.ElementAt(i).MapGeometries.First(); + CollectionAssert.AreEquivalent(foreshoreProfileArray[0].Geometry, profileDataA.PointCollections.First()); + } + + Assert.AreEqual("Voorlandprofielen", mapData.Name); + } + + private static void AssertHydraulicBoundaryLocationsMapData(HydraulicBoundaryDatabase database, MapData mapData) + { + Assert.IsInstanceOf(mapData); + var hydraulicLocationsMapData = (MapPointData)mapData; + if (database == null) + { + CollectionAssert.IsEmpty(hydraulicLocationsMapData.Features.First().MapGeometries.First().PointCollections.First()); + } + else + { + CollectionAssert.AreEqual(database.Locations.Select(hrp => hrp.Location), hydraulicLocationsMapData.Features.First().MapGeometries.First().PointCollections.First()); + } + Assert.AreEqual("Hydraulische randvoorwaarden", mapData.Name); + } + + private static void AssertFailureMechanismSectionsMapData(IEnumerable sections, MapData mapData) + { + Assert.IsInstanceOf(mapData); + var sectionsMapLinesData = (MapLineData)mapData; + var sectionMapLinesFeatures = sectionsMapLinesData.Features.ToArray(); + Assert.AreEqual(1, sectionMapLinesFeatures.Length); + + var geometries = sectionMapLinesFeatures.First().MapGeometries.ToArray(); + var sectionsArray = sections.ToArray(); + Assert.AreEqual(sectionsArray.Length, geometries.Length); + + for (int index = 0; index < sectionsArray.Length; index++) + { + var failureMechanismSection = sectionsArray[index]; + CollectionAssert.AreEquivalent(failureMechanismSection.Points, geometries[index].PointCollections.First()); + } + Assert.AreEqual("Vakindeling", mapData.Name); + } + + private static void AssertFailureMechanismSectionsStartPointMapData(IEnumerable sections, MapData mapData) + { + Assert.IsInstanceOf(mapData); + var sectionsStartPointData = (MapPointData)mapData; + CollectionAssert.AreEqual(sections.Select(s => s.GetStart()), sectionsStartPointData.Features.First().MapGeometries.First().PointCollections.First()); + Assert.AreEqual("Vakindeling (startpunten)", mapData.Name); + } + + private static void AssertFailureMechanismSectionsEndPointMapData(IEnumerable sections, MapData mapData) + { + Assert.IsInstanceOf(mapData); + var sectionsStartPointData = (MapPointData)mapData; + CollectionAssert.AreEqual(sections.Select(s => s.GetLast()), sectionsStartPointData.Features.First().MapGeometries.First().PointCollections.First()); + Assert.AreEqual("Vakindeling (eindpunten)", mapData.Name); + } + + private static void AssertEmptyMapData(MapDataCollection mapData) + { + Assert.IsInstanceOf(mapData); + + var mapDataList = mapData.Collection.ToList(); + + Assert.AreEqual(6, mapDataList.Count); + + var referenceLineMapData = (MapLineData)mapDataList[referenceLineIndex]; + var sectionsMapData = (MapLineData)mapDataList[sectionsIndex]; + var foreshoreProfilesMapData = (MapLineData)mapDataList[foreshoreProfilesIndex]; + var sectionsStartPointMapData = (MapPointData)mapDataList[sectionsStartPointIndex]; + var sectionsEndPointMapData = (MapPointData)mapDataList[sectionsEndPointIndex]; + var hydraulicBoundaryDatabaseMapData = (MapPointData)mapDataList[hydraulicBoundaryDatabaseIndex]; + + CollectionAssert.IsEmpty(referenceLineMapData.Features); + CollectionAssert.IsEmpty(sectionsMapData.Features); + CollectionAssert.IsEmpty(foreshoreProfilesMapData.Features); + CollectionAssert.IsEmpty(foreshoreProfilesMapData.Features); + CollectionAssert.IsEmpty(sectionsStartPointMapData.Features); + CollectionAssert.IsEmpty(sectionsEndPointMapData.Features); + CollectionAssert.IsEmpty(hydraulicBoundaryDatabaseMapData.Features); + + Assert.AreEqual(RingtoetsCommonDataResources.ReferenceLine_DisplayName, referenceLineMapData.Name); + Assert.AreEqual(RingtoetsCommonFormsResources.FailureMechanism_Sections_DisplayName, sectionsMapData.Name); + Assert.AreEqual(GetSectionPointDisplayName(RingtoetsCommonFormsResources.FailureMechanismSections_StartPoints_DisplayName), sectionsStartPointMapData.Name); + Assert.AreEqual(GetSectionPointDisplayName(RingtoetsCommonFormsResources.FailureMechanismSections_EndPoints_DisplayName), sectionsEndPointMapData.Name); + Assert.AreEqual(RingtoetsCommonDataResources.HydraulicBoundaryConditions_DisplayName, hydraulicBoundaryDatabaseMapData.Name); + } + + private static string GetSectionPointDisplayName(string name) + { + return string.Format("{0} ({1})", + RingtoetsCommonFormsResources.FailureMechanism_Sections_DisplayName, + name); + } + + private class TestAssessmentSection : Observable, IAssessmentSection + { + public string Id { get; set; } + public string Name { get; set; } + public string Comments { get; set; } + public AssessmentSectionComposition Composition { get; private set; } + public ReferenceLine ReferenceLine { get; set; } + public FailureMechanismContribution FailureMechanismContribution { get; private set; } + public HydraulicBoundaryDatabase HydraulicBoundaryDatabase { get; set; } + + public IEnumerable GetFailureMechanisms() + { + yield break; + } + + public void ChangeComposition(AssessmentSectionComposition newComposition) + { + throw new NotImplementedException(); + } + } + } +} \ No newline at end of file Index: Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Plugin.Test/Ringtoets.StabilityStoneCover.Plugin.Test.csproj =================================================================== diff -u -r2d5e2d09b0cb1a7f48e1b0a067d332347c89d4a8 -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Plugin.Test/Ringtoets.StabilityStoneCover.Plugin.Test.csproj (.../Ringtoets.StabilityStoneCover.Plugin.Test.csproj) (revision 2d5e2d09b0cb1a7f48e1b0a067d332347c89d4a8) +++ Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Plugin.Test/Ringtoets.StabilityStoneCover.Plugin.Test.csproj (.../Ringtoets.StabilityStoneCover.Plugin.Test.csproj) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -58,6 +58,7 @@ + @@ -91,6 +92,10 @@ {d749ee4c-ce50-4c17-bf01-9a953028c126} Core.Common.TestUtil + + {4a06df0d-5d75-4bad-a95a-a3db9b7c4ad5} + Core.Components.Gis.Forms + {d4200f43-3f72-4f42-af0a-8ced416a38ec} Ringtoets.Common.Data Index: Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Plugin.Test/StabilityStoneCoverPluginTest.cs =================================================================== diff -u -r2973c5f790a5131e427bd5f73e2a620044199639 -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Plugin.Test/StabilityStoneCoverPluginTest.cs (.../StabilityStoneCoverPluginTest.cs) (revision 2973c5f790a5131e427bd5f73e2a620044199639) +++ Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Plugin.Test/StabilityStoneCoverPluginTest.cs (.../StabilityStoneCoverPluginTest.cs) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -81,12 +81,18 @@ ViewInfo[] viewInfos = plugin.GetViewInfos().ToArray(); // Assert - Assert.AreEqual(1, viewInfos.Length); + Assert.AreEqual(2, viewInfos.Length); - var stabilityStoneCoverResultViewInfo = viewInfos.Single(vi => vi.DataType == typeof(FailureMechanismSectionResultContext)); - Assert.AreEqual(typeof(IEnumerable), stabilityStoneCoverResultViewInfo.ViewDataType); - Assert.AreEqual(typeof(StabilityStoneCoverResultView), stabilityStoneCoverResultViewInfo.ViewType); - TestHelper.AssertImagesAreEqual(RingtoetsCommonFormsResources.FailureMechanismSectionResultIcon, stabilityStoneCoverResultViewInfo.Image); + PluginTestHelper.AssertViewInfoDefined( + viewInfos, + typeof(StabilityStoneCoverFailureMechanismContext), + typeof(StabilityStoneCoverFailureMechanismView)); + + PluginTestHelper.AssertViewInfoDefined( + viewInfos, + typeof(FailureMechanismSectionResultContext), + typeof(IEnumerable), + typeof(StabilityStoneCoverResultView)); } } Index: Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Plugin.Test/ViewInfos/StabilityStoneCoverFailureMechanismViewInfoTest.cs =================================================================== diff -u --- Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Plugin.Test/ViewInfos/StabilityStoneCoverFailureMechanismViewInfoTest.cs (revision 0) +++ Ringtoets/StabilityStoneCover/test/Ringtoets.StabilityStoneCover.Plugin.Test/ViewInfos/StabilityStoneCoverFailureMechanismViewInfoTest.cs (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -0,0 +1,210 @@ +// 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.Linq; +using Core.Common.Gui.Plugin; +using Core.Common.TestUtil; +using NUnit.Framework; +using Rhino.Mocks; +using Ringtoets.Common.Data.AssessmentSection; +using Ringtoets.StabilityStoneCover.Data; +using Ringtoets.StabilityStoneCover.Forms.PresentationObjects; +using Ringtoets.StabilityStoneCover.Forms.Views; +using StabilityStoneCoverDataResources = Ringtoets.StabilityStoneCover.Data.Properties.Resources; +using StabilityStoneCoverFormsResources = Ringtoets.StabilityStoneCover.Forms.Properties.Resources; +using RingtoetsCommonFormsResources = Ringtoets.Common.Forms.Properties.Resources; + +namespace Ringtoets.StabilityStoneCover.Plugin.Test.ViewInfos +{ + [TestFixture] + public class StabilityStoneCoverFailureMechanismViewInfoTest + { + private MockRepository mocks; + private StabilityStoneCoverPlugin plugin; + private ViewInfo info; + + [SetUp] + public void SetUp() + { + mocks = new MockRepository(); + plugin = new StabilityStoneCoverPlugin(); + info = plugin.GetViewInfos().First(tni => tni.ViewType == typeof(StabilityStoneCoverFailureMechanismView)); + } + + [TearDown] + public void TearDown() + { + plugin.Dispose(); + } + + [Test] + public void Initialized_Always_ExpectedPropertiesSet() + { + // Assert + Assert.AreEqual(typeof(StabilityStoneCoverFailureMechanismContext), info.DataType); + Assert.AreEqual(typeof(StabilityStoneCoverFailureMechanismContext), info.ViewDataType); + TestHelper.AssertImagesAreEqual(RingtoetsCommonFormsResources.CalculationIcon, info.Image); + } + + [Test] + public void GetViewName_WithStabilityStoneCoverFailureMechanism_ReturnsNameOfFailureMechanism() + { + // Setup + var assessmentSectionMock = mocks.Stub(); + mocks.ReplayAll(); + + var stabilityStoneCoverFailureMechanism = new StabilityStoneCoverFailureMechanism(); + var stabilityStoneCoverFailureMechanismContext = new StabilityStoneCoverFailureMechanismContext(stabilityStoneCoverFailureMechanism, assessmentSectionMock); + + using (var view = new StabilityStoneCoverFailureMechanismView()) + { + // Call + string viewName = info.GetViewName(view, stabilityStoneCoverFailureMechanismContext); + + // Assert + Assert.AreEqual(stabilityStoneCoverFailureMechanism.Name, viewName); + } + } + + [Test] + public void CloseForData_ViewNotCorrespondingToRemovedAssessmentSection_ReturnsFalse() + { + // Setup + var assessmentSectionMock = mocks.Stub(); + var otherAssessmentSectionMock = mocks.Stub(); + mocks.ReplayAll(); + + var stabilityStoneCoverFailureMechanism = new StabilityStoneCoverFailureMechanism(); + var stabilityStoneCoverFailureMechanismContext = new StabilityStoneCoverFailureMechanismContext(stabilityStoneCoverFailureMechanism, assessmentSectionMock); + + using (var view = new StabilityStoneCoverFailureMechanismView + { + Data = stabilityStoneCoverFailureMechanismContext + }) + { + // Call + bool closeForData = info.CloseForData(view, otherAssessmentSectionMock); + + // Assert + Assert.IsFalse(closeForData); + } + mocks.VerifyAll(); + } + + [Test] + public void CloseForData_ViewCorrespondingToRemovedAssessmentSection_ReturnsTrue() + { + // Setup + var assessmentSectionMock = mocks.Stub(); + mocks.ReplayAll(); + + var stabilityStoneCoverFailureMechanism = new StabilityStoneCoverFailureMechanism(); + var stabilityStoneCoverFailureMechanismContext = new StabilityStoneCoverFailureMechanismContext(stabilityStoneCoverFailureMechanism, assessmentSectionMock); + + using (var view = new StabilityStoneCoverFailureMechanismView + { + Data = stabilityStoneCoverFailureMechanismContext + }) + { + // Call + bool closeForData = info.CloseForData(view, assessmentSectionMock); + + // Assert + Assert.IsTrue(closeForData); + } + mocks.VerifyAll(); + } + + [Test] + public void CloseForData_ViewNotCorrespondingToRemovedFailureMechanism_ReturnsFalse() + { + // Setup + var assessmentSectionMock = mocks.Stub(); + mocks.ReplayAll(); + + var stabilityStoneCoverFailureMechanism = new StabilityStoneCoverFailureMechanism(); + var otherStabilityStoneCoverFailureMechanism = new StabilityStoneCoverFailureMechanism(); + + var stabilityStoneCoverFailureMechanismContext = new StabilityStoneCoverFailureMechanismContext(stabilityStoneCoverFailureMechanism, assessmentSectionMock); + + using (var view = new StabilityStoneCoverFailureMechanismView + { + Data = stabilityStoneCoverFailureMechanismContext + }) + { + // Call + bool closeForData = info.CloseForData(view, otherStabilityStoneCoverFailureMechanism); + + // Assert + Assert.IsFalse(closeForData); + } + mocks.VerifyAll(); + } + + [Test] + public void CloseForData_ViewCorrespondingToRemovedFailureMechanism_ReturnsTrue() + { + // Setup + var assessmentSectionMock = mocks.Stub(); + mocks.ReplayAll(); + + var stabilityStoneCoverFailureMechanism = new StabilityStoneCoverFailureMechanism(); + var stabilityStoneCoverFailureMechanismContext = new StabilityStoneCoverFailureMechanismContext(stabilityStoneCoverFailureMechanism, assessmentSectionMock); + + using (var view = new StabilityStoneCoverFailureMechanismView + { + Data = stabilityStoneCoverFailureMechanismContext + }) + { + // Call + bool closeForData = info.CloseForData(view, stabilityStoneCoverFailureMechanism); + + // Assert + Assert.IsTrue(closeForData); + } + mocks.VerifyAll(); + } + + [Test] + [TestCase(true)] + [TestCase(false)] + public void AdditionalDataCheck_Always_ReturnTrueOnlyIfFailureMechanismRelevant(bool isRelevant) + { + // Setup + var assessmentSection = mocks.Stub(); + mocks.ReplayAll(); + + var failureMechanism = new StabilityStoneCoverFailureMechanism + { + IsRelevant = isRelevant + }; + + var context = new StabilityStoneCoverFailureMechanismContext(failureMechanism, assessmentSection); + + // Call + bool result = info.AdditionalDataCheck(context); + + // Assert + Assert.AreEqual(isRelevant, result); + mocks.VerifyAll(); + } + } +} \ No newline at end of file Index: Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Forms/Ringtoets.WaveImpactAsphaltCover.Forms.csproj =================================================================== diff -u -rbc4c4000ca4a850b49a88156ca2b919ea690494b -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Forms/Ringtoets.WaveImpactAsphaltCover.Forms.csproj (.../Ringtoets.WaveImpactAsphaltCover.Forms.csproj) (revision bc4c4000ca4a850b49a88156ca2b919ea690494b) +++ Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Forms/Ringtoets.WaveImpactAsphaltCover.Forms.csproj (.../Ringtoets.WaveImpactAsphaltCover.Forms.csproj) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -34,6 +34,7 @@ + @@ -54,6 +55,12 @@ Resources.resx + + UserControl + + + WaveImpactAsphaltCoverFailureMechanismView.cs + UserControl @@ -87,6 +94,21 @@ Core.Common.Utils False + + {5a91174a-fb95-4c9d-9ca5-81c0b8d4361a} + Core.Components.DotSpatial.Forms + False + + + {4A06DF0D-5D75-4BAD-A95A-A3DB9B7C4AD5} + Core.Components.Gis.Forms + False + + + {318BA582-88C9-4816-A54A-A7E431461DE3} + Core.Components.Gis + False + {d4200f43-3f72-4f42-af0a-8ced416a38ec} Ringtoets.Common.Data @@ -124,6 +146,9 @@ Resources.Designer.cs Designer + + WaveImpactAsphaltCoverFailureMechanismView.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file Index: Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Plugin/Ringtoets.WaveImpactAsphaltCover.Plugin.csproj =================================================================== diff -u -rbc4c4000ca4a850b49a88156ca2b919ea690494b -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Plugin/Ringtoets.WaveImpactAsphaltCover.Plugin.csproj (.../Ringtoets.WaveImpactAsphaltCover.Plugin.csproj) (revision bc4c4000ca4a850b49a88156ca2b919ea690494b) +++ Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Plugin/Ringtoets.WaveImpactAsphaltCover.Plugin.csproj (.../Ringtoets.WaveImpactAsphaltCover.Plugin.csproj) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -70,6 +70,11 @@ Core.Common.Gui False + + {4a06df0d-5d75-4bad-a95a-a3db9b7c4ad5} + Core.Components.Gis.Forms + False + {d4200f43-3f72-4f42-af0a-8ced416a38ec} Ringtoets.Common.Data Index: Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Plugin/WaveImpactAsphaltCoverPlugin.cs =================================================================== diff -u -rb5accd775c390fa85f815ef13c3c3e54a6d10ada -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Plugin/WaveImpactAsphaltCoverPlugin.cs (.../WaveImpactAsphaltCoverPlugin.cs) (revision b5accd775c390fa85f815ef13c3c3e54a6d10ada) +++ Ringtoets/WaveImpactAsphaltCover/src/Ringtoets.WaveImpactAsphaltCover.Plugin/WaveImpactAsphaltCoverPlugin.cs (.../WaveImpactAsphaltCoverPlugin.cs) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -68,6 +68,14 @@ public override IEnumerable GetViewInfos() { + yield return new ViewInfo + { + GetViewName = (view, mechanism) => mechanism.WrappedData.Name, + Image = RingtoetsCommonFormsResources.CalculationIcon, + CloseForData = CloseWaveImpactAsphaltCoverFailureMechanismViewForData, + AdditionalDataCheck = context => context.WrappedData.IsRelevant + }; + yield return new ViewInfo, IEnumerable, WaveImpactAsphaltCoverFailureMechanismResultView> @@ -109,18 +117,18 @@ yield return new TreeNodeInfo { - Text = emptyPipingOutput => RingtoetsCommonFormsResources.CalculationOutput_DisplayName, - Image = emptyPipingOutput => RingtoetsCommonFormsResources.GeneralOutputIcon, - ForeColor = emptyPipingOutput => Color.FromKnownColor(KnownColor.GrayText), + Text = emptyOutput => RingtoetsCommonFormsResources.CalculationOutput_DisplayName, + Image = emptyOutput => RingtoetsCommonFormsResources.GeneralOutputIcon, + ForeColor = emptyOutput => Color.FromKnownColor(KnownColor.GrayText), ContextMenuStrip = (nodeData, parentData, treeViewControl) => Gui.Get(nodeData, treeViewControl) .AddPropertiesItem() .Build() }; yield return new TreeNodeInfo { - Text = emptyPipingOutput => RingtoetsCommonFormsResources.CalculationOutput_DisplayName, - Image = emptyPipingOutput => RingtoetsCommonFormsResources.GeneralOutputIcon, + Text = emptyOutput => RingtoetsCommonFormsResources.CalculationOutput_DisplayName, + Image = emptyOutput => RingtoetsCommonFormsResources.GeneralOutputIcon, ContextMenuStrip = (nodeData, parentData, treeViewControl) => Gui.Get(nodeData, treeViewControl) .AddPropertiesItem() .Build() @@ -162,6 +170,23 @@ #region ViewInfos + # region WaveImpactAsphaltCoverFailureMechanismView ViewInfo + + private bool CloseWaveImpactAsphaltCoverFailureMechanismViewForData(WaveImpactAsphaltCoverFailureMechanismView view, object o) + { + var assessmentSection = o as IAssessmentSection; + var failureMechanism = o as WaveImpactAsphaltCoverFailureMechanism; + + var viewFailureMechanismContext = (WaveImpactAsphaltCoverFailureMechanismContext)view.Data; + var viewFailureMechanism = viewFailureMechanismContext.WrappedData; + + return assessmentSection != null + ? ReferenceEquals(viewFailureMechanismContext.Parent, assessmentSection) + : ReferenceEquals(viewFailureMechanism, failureMechanism); + } + + # endregion + #region FailureMechanismSectionResultContext private static bool CloseFailureMechanismResultViewForData(WaveImpactAsphaltCoverFailureMechanismResultView view, object dataToCloseFor) @@ -234,8 +259,10 @@ { var builder = new RingtoetsContextMenuBuilder(Gui.Get(failureMechanismContext, treeViewControl)); - return builder.AddToggleRelevancyOfFailureMechanismItem(failureMechanismContext, RemoveAllViewsForItem) + return builder.AddOpenItem() .AddSeparator() + .AddToggleRelevancyOfFailureMechanismItem(failureMechanismContext, RemoveAllViewsForItem) + .AddSeparator() .AddExpandAllItem() .AddCollapseAllItem() .AddSeparator() Index: Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Forms.Test/Ringtoets.WaveImpactAsphaltCover.Forms.Test.csproj =================================================================== diff -u -r98f01944e8ac182e2a1e9b1ed4deb48a07952529 -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Forms.Test/Ringtoets.WaveImpactAsphaltCover.Forms.Test.csproj (.../Ringtoets.WaveImpactAsphaltCover.Forms.Test.csproj) (revision 98f01944e8ac182e2a1e9b1ed4deb48a07952529) +++ Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Forms.Test/Ringtoets.WaveImpactAsphaltCover.Forms.Test.csproj (.../Ringtoets.WaveImpactAsphaltCover.Forms.Test.csproj) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -74,6 +74,7 @@ + @@ -114,6 +115,18 @@ {D749EE4C-CE50-4C17-BF01-9A953028C126} Core.Common.TestUtil + + {5A91174A-FB95-4C9D-9CA5-81C0B8D4361A} + Core.Components.DotSpatial.Forms + + + {4a06df0d-5d75-4bad-a95a-a3db9b7c4ad5} + Core.Components.Gis.Forms + + + {318ba582-88c9-4816-a54a-a7e431461de3} + Core.Components.Gis + {D4200F43-3F72-4F42-AF0A-8CED416A38EC} Ringtoets.Common.Data Index: Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Forms.Test/Views/WaveImpactAsphaltCoverFailureMechanismViewTest.cs =================================================================== diff -u --- Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Forms.Test/Views/WaveImpactAsphaltCoverFailureMechanismViewTest.cs (revision 0) +++ Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Forms.Test/Views/WaveImpactAsphaltCoverFailureMechanismViewTest.cs (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -0,0 +1,628 @@ +// 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.Collections.Generic; +using System.Linq; +using System.Windows.Forms; +using Core.Common.Base; +using Core.Common.Base.Geometry; +using Core.Components.DotSpatial.Forms; +using Core.Components.Gis.Data; +using Core.Components.Gis.Forms; +using NUnit.Framework; +using Ringtoets.Common.Data.AssessmentSection; +using Ringtoets.Common.Data.Contribution; +using Ringtoets.Common.Data.DikeProfiles; +using Ringtoets.Common.Data.FailureMechanism; +using Ringtoets.Common.Data.TestUtil; +using Ringtoets.HydraRing.Data; +using Ringtoets.WaveImpactAsphaltCover.Data; +using Ringtoets.WaveImpactAsphaltCover.Forms.PresentationObjects; +using Ringtoets.WaveImpactAsphaltCover.Forms.Views; +using RingtoetsCommonFormsResources = Ringtoets.Common.Forms.Properties.Resources; +using RingtoetsCommonDataResources = Ringtoets.Common.Data.Properties.Resources; +using WaveImpactAsphaltCoverDataResources = Ringtoets.WaveImpactAsphaltCover.Data.Properties.Resources; +using WaveImpactAsphaltCoverFormsResources = Ringtoets.WaveImpactAsphaltCover.Forms.Properties.Resources; + +namespace Ringtoets.WaveImpactAsphaltCover.Forms.Test.Views +{ + [TestFixture] + public class WaveImpactAsphaltCoverFailureMechanismViewTest + { + private const int referenceLineIndex = 0; + private const int sectionsIndex = 1; + private const int sectionsStartPointIndex = 2; + private const int sectionsEndPointIndex = 3; + private const int hydraulicBoundaryDatabaseIndex = 4; + private const int foreshoreProfilesIndex = 5; + + [Test] + public void DefaultConstructor_DefaultValues() + { + // Call + using (var view = new WaveImpactAsphaltCoverFailureMechanismView()) + { + // Assert + Assert.IsInstanceOf(view); + Assert.IsInstanceOf(view); + Assert.IsNotNull(view.Map); + Assert.IsNull(view.Data); + } + } + + [Test] + public void DefaultConstructor_Always_AddMapControlWithCollectionOfEmptyMapData() + { + // Call + using (var view = new WaveImpactAsphaltCoverFailureMechanismView()) + { + // Assert + Assert.AreEqual(1, view.Controls.Count); + Assert.AreSame(view.Map, view.Controls[0]); + Assert.AreEqual(DockStyle.Fill, ((Control) view.Map).Dock); + Assert.AreEqual(WaveImpactAsphaltCoverDataResources.WaveImpactAsphaltCoverFailureMechanism_DisplayName, view.Map.Data.Name); + AssertEmptyMapData(view.Map.Data); + } + } + + [Test] + public void Data_WaveImpactAsphaltCoverFailureMechanismContext_DataSet() + { + // Setup + using (var view = new WaveImpactAsphaltCoverFailureMechanismView()) + { + var failureMechanismContext = new WaveImpactAsphaltCoverFailureMechanismContext(new WaveImpactAsphaltCoverFailureMechanism(), new TestAssessmentSection()); + + // Call + view.Data = failureMechanismContext; + + // Assert + Assert.AreSame(failureMechanismContext, view.Data); + } + } + + [Test] + public void Data_OtherThanWaveImpactAsphaltCoverFailureMechanismContext_DataNull() + { + // Setup + using (var view = new WaveImpactAsphaltCoverFailureMechanismView()) + { + var data = new object(); + + // Call + view.Data = data; + + // Assert + Assert.IsNull(view.Data); + } + } + + [Test] + public void Data_SetToNull_MapDataCleared() + { + // Setup + using (var view = new WaveImpactAsphaltCoverFailureMechanismView()) + { + var failureMechanismContext = new WaveImpactAsphaltCoverFailureMechanismContext(new WaveImpactAsphaltCoverFailureMechanism(), new TestAssessmentSection()); + + view.Data = failureMechanismContext; + + // Precondition + Assert.AreEqual(6, view.Map.Data.Collection.Count()); + + // Call + view.Data = null; + + // Assert + Assert.IsNull(view.Data); + Assert.IsNull(view.Map.Data); + } + } + + [Test] + public void Data_EmptyWaveImpactAsphaltCoverFailureMechanismContext_NoMapDataSet() + { + // Setup + using (var view = new WaveImpactAsphaltCoverFailureMechanismView()) + { + var failureMechanismContext = new WaveImpactAsphaltCoverFailureMechanismContext(new WaveImpactAsphaltCoverFailureMechanism(), new TestAssessmentSection()); + + // Call + view.Data = failureMechanismContext; + + // Assert + Assert.AreSame(failureMechanismContext, view.Data); + AssertEmptyMapData(view.Map.Data); + } + } + + [Test] + public void Data_WaveImpactAsphaltCoverFailureMechanismContext_DataUpdatedToCollectionOfFilledMapData() + { + // Setup + using (var view = new WaveImpactAsphaltCoverFailureMechanismView()) + { + var map = (MapControl) view.Controls[0]; + + var geometryPoints = 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 hydraulicBoundaryDatabase = new HydraulicBoundaryDatabase(); + hydraulicBoundaryDatabase.Locations.Add(new HydraulicBoundaryLocation(1, "test", 1.0, 2.0)); + + var referenceLine = new ReferenceLine(); + referenceLine.SetGeometry(new[] + { + new Point2D(1.0, 2.0), + new Point2D(2.0, 1.0) + }); + + var assessmentSection = new TestAssessmentSection + { + HydraulicBoundaryDatabase = hydraulicBoundaryDatabase, + ReferenceLine = referenceLine + }; + + var failureMechanism = new WaveImpactAsphaltCoverFailureMechanism(); + failureMechanism.AddSection(new FailureMechanismSection("A", geometryPoints.Take(2))); + failureMechanism.AddSection(new FailureMechanismSection("B", geometryPoints.Skip(1).Take(2))); + failureMechanism.AddSection(new FailureMechanismSection("C", geometryPoints.Skip(2).Take(2))); + + failureMechanism.ForeshoreProfiles.Add(new TestForeshoreProfile()); + failureMechanism.ForeshoreProfiles.Add(new TestForeshoreProfile()); + + var failureMechanismContext = new WaveImpactAsphaltCoverFailureMechanismContext(failureMechanism, assessmentSection); + + // Call + view.Data = failureMechanismContext; + + // Assert + Assert.AreSame(failureMechanismContext, view.Data); + + var mapData = map.Data; + Assert.IsInstanceOf(mapData); + + var mapDataList = mapData.Collection.ToList(); + Assert.AreEqual(6, mapDataList.Count); + AssertReferenceLineMapData(assessmentSection.ReferenceLine, mapDataList[referenceLineIndex]); + AssertFailureMechanismSectionsMapData(failureMechanism.Sections, mapDataList[sectionsIndex]); + AssertFailureMechanismSectionsStartPointMapData(failureMechanism.Sections, mapDataList[sectionsStartPointIndex]); + AssertFailureMechanismSectionsEndPointMapData(failureMechanism.Sections, mapDataList[sectionsEndPointIndex]); + AssertHydraulicBoundaryLocationsMapData(assessmentSection.HydraulicBoundaryDatabase, mapDataList[hydraulicBoundaryDatabaseIndex]); + AssertForeshoreProfiles(failureMechanism.ForeshoreProfiles, mapDataList[foreshoreProfilesIndex]); + } + } + + [Test] + public void UpdateObserver_HydraulicBoundaryDatabaseUpdated_MapDataUpdated() + { + // Setup + using (var view = new WaveImpactAsphaltCoverFailureMechanismView()) + { + var map = (MapControl) view.Controls[0]; + + var hydraulicBoundaryDatabase1 = new HydraulicBoundaryDatabase + { + Locations = + { + new HydraulicBoundaryLocation(1, "test1", 1.0, 2.0) + } + }; + var hydraulicBoundaryDatabase2 = new HydraulicBoundaryDatabase + { + Locations = + { + new HydraulicBoundaryLocation(2, "test2", 2.0, 3.0) + } + }; + + var assessmentSection = new TestAssessmentSection + { + HydraulicBoundaryDatabase = hydraulicBoundaryDatabase1 + }; + + var failureMechanismContext = new WaveImpactAsphaltCoverFailureMechanismContext(new WaveImpactAsphaltCoverFailureMechanism(), assessmentSection); + + view.Data = failureMechanismContext; + + var hydraulicBoundaryDatabaseMapData = map.Data.Collection.ElementAt(hydraulicBoundaryDatabaseIndex); + + // Precondition + AssertHydraulicBoundaryLocationsMapData(hydraulicBoundaryDatabase1, hydraulicBoundaryDatabaseMapData); + + // Call + assessmentSection.HydraulicBoundaryDatabase = hydraulicBoundaryDatabase2; + assessmentSection.NotifyObservers(); + + // Assert + AssertHydraulicBoundaryLocationsMapData(hydraulicBoundaryDatabase2, hydraulicBoundaryDatabaseMapData); + } + } + + [Test] + public void UpdateObserver_ReferenceLineUpdated_MapDataUpdated() + { + // Setup + using (var view = new WaveImpactAsphaltCoverFailureMechanismView()) + { + var map = (MapControl) view.Controls[0]; + + var points1 = new List + { + new Point2D(1.0, 2.0), + new Point2D(2.0, 1.0) + }; + + var points2 = new List + { + new Point2D(2.0, 5.0), + new Point2D(4.0, 3.0) + }; + + var assessmentSection = new TestAssessmentSection + { + ReferenceLine = new ReferenceLine() + }; + assessmentSection.ReferenceLine.SetGeometry(points1); + + var failureMechanismContext = new WaveImpactAsphaltCoverFailureMechanismContext(new WaveImpactAsphaltCoverFailureMechanism(), assessmentSection); + + view.Data = failureMechanismContext; + + var referenceLineMapData = map.Data.Collection.ElementAt(referenceLineIndex); + + // Precondition + AssertReferenceLineMapData(assessmentSection.ReferenceLine, referenceLineMapData); + + // Call + assessmentSection.ReferenceLine.SetGeometry(points2); + assessmentSection.NotifyObservers(); + + // Assert + AssertReferenceLineMapData(assessmentSection.ReferenceLine, referenceLineMapData); + } + } + + [Test] + public void UpdateObserver_FailureMechanismSectionsUpdated_MapDataUpdated() + { + // Setup + using (var view = new WaveImpactAsphaltCoverFailureMechanismView()) + { + var map = (MapControl) view.Controls[0]; + + var failureMechanism = new WaveImpactAsphaltCoverFailureMechanism(); + var failureMechanismContext = new WaveImpactAsphaltCoverFailureMechanismContext(failureMechanism, new TestAssessmentSection()); + + view.Data = failureMechanismContext; + + var sectionMapData = (MapLineData) map.Data.Collection.ElementAt(sectionsIndex); + var sectionStartsMapData = (MapPointData) map.Data.Collection.ElementAt(sectionsStartPointIndex); + var sectionsEndsMapData = (MapPointData) map.Data.Collection.ElementAt(sectionsEndPointIndex); + + // Call + failureMechanism.AddSection(new FailureMechanismSection(string.Empty, new[] + { + new Point2D(1, 2), + new Point2D(1, 2) + })); + failureMechanism.NotifyObservers(); + + // Assert + AssertFailureMechanismSectionsMapData(failureMechanism.Sections, sectionMapData); + AssertFailureMechanismSectionsStartPointMapData(failureMechanism.Sections, sectionStartsMapData); + AssertFailureMechanismSectionsEndPointMapData(failureMechanism.Sections, sectionsEndsMapData); + } + } + + [Test] + public void UpdateObserver_ForeshoreProfilesUpdated_MapDataUpdated() + { + // Setup + using (var view = new WaveImpactAsphaltCoverFailureMechanismView()) + { + var map = (MapControl)view.Controls[0]; + + var failureMechanism = new WaveImpactAsphaltCoverFailureMechanism(); + var failureMechanismContext = new WaveImpactAsphaltCoverFailureMechanismContext(failureMechanism, new TestAssessmentSection()); + + failureMechanism.ForeshoreProfiles.Add(new TestForeshoreProfile()); + + view.Data = failureMechanismContext; + + var foreshoreProfileData = map.Data.Collection.ElementAt(foreshoreProfilesIndex); + + // Precondition + AssertForeshoreProfiles(failureMechanism.ForeshoreProfiles, foreshoreProfileData); + + // Call + failureMechanism.ForeshoreProfiles.Add(new TestForeshoreProfile()); + failureMechanism.ForeshoreProfiles.NotifyObservers(); + + // Assert + AssertForeshoreProfiles(failureMechanism.ForeshoreProfiles, foreshoreProfileData); + } + } + + [Test] + public void UpdateObserver_DataUpdated_MapLayersSameOrder() + { + // Setup + const int updatedRefenceLineLayerIndex = referenceLineIndex + 5; + const int updatedSectionsLayerIndex = sectionsIndex - 1; + const int updateSectionStartLayerIndex = sectionsStartPointIndex - 1; + const int updatedSectionEndLayerIndex = sectionsEndPointIndex - 1; + const int updatedHydraulicLocationsLayerIndex = hydraulicBoundaryDatabaseIndex - 1; + const int updatedForeshoreProfilesLayerIndex = foreshoreProfilesIndex - 1; + + using (var view = new WaveImpactAsphaltCoverFailureMechanismView()) + { + var map = (MapControl) view.Controls[0]; + + var assessmentSection = new TestAssessmentSection(); + var failureMechanism = new WaveImpactAsphaltCoverFailureMechanism(); + var failureMechanismContext = new WaveImpactAsphaltCoverFailureMechanismContext(failureMechanism, assessmentSection); + + view.Data = failureMechanismContext; + + var mapData = map.Data; + + var dataToMove = (MapLineData) map.Data.Collection.ElementAt(referenceLineIndex); + mapData.Remove(dataToMove); + mapData.Add(dataToMove); + + var mapDataList = mapData.Collection.ToList(); + + // Precondition + var referenceLineData = (MapLineData) mapDataList[updatedRefenceLineLayerIndex]; + Assert.AreEqual("Referentielijn", referenceLineData.Name); + + var sectionsData = (MapLineData) mapDataList[updatedSectionsLayerIndex]; + Assert.AreEqual("Vakindeling", sectionsData.Name); + + var sectionStartsData = (MapPointData) mapDataList[updateSectionStartLayerIndex]; + Assert.AreEqual("Vakindeling (startpunten)", sectionStartsData.Name); + + var sectionEndsData = (MapPointData) mapDataList[updatedSectionEndLayerIndex]; + Assert.AreEqual("Vakindeling (eindpunten)", sectionEndsData.Name); + + var hydraulicLocationsData = (MapPointData) mapDataList[updatedHydraulicLocationsLayerIndex]; + Assert.AreEqual("Hydraulische randvoorwaarden", hydraulicLocationsData.Name); + + var foreshoreProfilesData = (MapLineData)mapDataList[updatedForeshoreProfilesLayerIndex]; + Assert.AreEqual("Voorlandprofielen", foreshoreProfilesData.Name); + + var points = new List + { + new Point2D(2.0, 5.0), + new Point2D(4.0, 3.0) + }; + ReferenceLine referenceLine = new ReferenceLine(); + referenceLine.SetGeometry(points); + assessmentSection.ReferenceLine = referenceLine; + + // Call + assessmentSection.NotifyObservers(); + + // Call + var actualReferenceLineData = (MapLineData) mapDataList[updatedRefenceLineLayerIndex]; + Assert.AreEqual("Referentielijn", actualReferenceLineData.Name); + + var actualSectionsData = (MapLineData) mapDataList[updatedSectionsLayerIndex]; + Assert.AreEqual("Vakindeling", actualSectionsData.Name); + + var actualSectionStartsData = (MapPointData) mapDataList[updateSectionStartLayerIndex]; + Assert.AreEqual("Vakindeling (startpunten)", actualSectionStartsData.Name); + + var actualSectionEndsData = (MapPointData) mapDataList[updatedSectionEndLayerIndex]; + Assert.AreEqual("Vakindeling (eindpunten)", actualSectionEndsData.Name); + + var actualHydraulicLocationsData = (MapPointData) mapDataList[updatedHydraulicLocationsLayerIndex]; + Assert.AreEqual("Hydraulische randvoorwaarden", actualHydraulicLocationsData.Name); + + var actualForeshoreProfilesData = (MapLineData) mapDataList[updatedForeshoreProfilesLayerIndex]; + Assert.AreEqual("Voorlandprofielen", actualForeshoreProfilesData.Name); + } + } + + [Test] + public void NotifyObservers_DataUpdatedNotifyObserversOnOldData_NoUpdateInViewData() + { + // Setup + IAssessmentSection oldAssessmentSection = new TestAssessmentSection(); + IAssessmentSection newAssessmentSection = new TestAssessmentSection(); + + newAssessmentSection.ReferenceLine = new ReferenceLine(); + newAssessmentSection.ReferenceLine.SetGeometry(new[] + { + new Point2D(2, 4), + new Point2D(3, 4) + }); + + var oldWaveImpactAsphaltCoverFailureMechanismContext = new WaveImpactAsphaltCoverFailureMechanismContext(new WaveImpactAsphaltCoverFailureMechanism(), oldAssessmentSection); + var newWaveImpactAsphaltCoverFailureMechanismContext = new WaveImpactAsphaltCoverFailureMechanismContext(new WaveImpactAsphaltCoverFailureMechanism(), newAssessmentSection); + using (var view = new WaveImpactAsphaltCoverFailureMechanismView()) + { + var map = (MapControl) view.Controls[0]; + + view.Data = oldWaveImpactAsphaltCoverFailureMechanismContext; + view.Data = newWaveImpactAsphaltCoverFailureMechanismContext; + MapData dataBeforeUpdate = map.Data; + + newAssessmentSection.ReferenceLine.SetGeometry(Enumerable.Empty()); + + // Call + oldAssessmentSection.NotifyObservers(); + + // Assert + Assert.AreEqual(dataBeforeUpdate, map.Data); + } + } + + private static void AssertReferenceLineMapData(ReferenceLine referenceLine, MapData mapData) + { + Assert.IsInstanceOf(mapData); + var referenceLineData = (MapLineData) mapData; + if (referenceLine == null) + { + CollectionAssert.IsEmpty(referenceLineData.Features.First().MapGeometries.First().PointCollections.First()); + } + else + { + CollectionAssert.AreEqual(referenceLine.Points, referenceLineData.Features.First().MapGeometries.First().PointCollections.First()); + } + Assert.AreEqual("Referentielijn", mapData.Name); + } + + private static void AssertForeshoreProfiles(IEnumerable foreshoreProfiles, MapData mapData) + { + Assert.NotNull(foreshoreProfiles, "foreshoreProfiles should never be null."); + + var foreshoreProfilesData = (MapLineData) mapData; + var foreshoreProfileArray = foreshoreProfiles.ToArray(); + + Assert.IsInstanceOf(mapData); + Assert.AreEqual(foreshoreProfileArray.Length, foreshoreProfilesData.Features.Length); + + for (int i = 0; i < foreshoreProfileArray.Length; i++) + { + var profileDataA = foreshoreProfilesData.Features.ElementAt(i).MapGeometries.First(); + CollectionAssert.AreEquivalent(foreshoreProfileArray[0].Geometry, profileDataA.PointCollections.First()); + } + + Assert.AreEqual("Voorlandprofielen", mapData.Name); + } + + private static void AssertHydraulicBoundaryLocationsMapData(HydraulicBoundaryDatabase database, MapData mapData) + { + Assert.IsInstanceOf(mapData); + var hydraulicLocationsMapData = (MapPointData) mapData; + if (database == null) + { + CollectionAssert.IsEmpty(hydraulicLocationsMapData.Features.First().MapGeometries.First().PointCollections.First()); + } + else + { + CollectionAssert.AreEqual(database.Locations.Select(hrp => hrp.Location), hydraulicLocationsMapData.Features.First().MapGeometries.First().PointCollections.First()); + } + Assert.AreEqual("Hydraulische randvoorwaarden", mapData.Name); + } + + private static void AssertFailureMechanismSectionsMapData(IEnumerable sections, MapData mapData) + { + Assert.IsInstanceOf(mapData); + var sectionsMapLinesData = (MapLineData) mapData; + var sectionMapLinesFeatures = sectionsMapLinesData.Features.ToArray(); + Assert.AreEqual(1, sectionMapLinesFeatures.Length); + + var geometries = sectionMapLinesFeatures.First().MapGeometries.ToArray(); + var sectionsArray = sections.ToArray(); + Assert.AreEqual(sectionsArray.Length, geometries.Length); + + for (int index = 0; index < sectionsArray.Length; index++) + { + var failureMechanismSection = sectionsArray[index]; + CollectionAssert.AreEquivalent(failureMechanismSection.Points, geometries[index].PointCollections.First()); + } + Assert.AreEqual("Vakindeling", mapData.Name); + } + + private static void AssertFailureMechanismSectionsStartPointMapData(IEnumerable sections, MapData mapData) + { + Assert.IsInstanceOf(mapData); + var sectionsStartPointData = (MapPointData) mapData; + CollectionAssert.AreEqual(sections.Select(s => s.GetStart()), sectionsStartPointData.Features.First().MapGeometries.First().PointCollections.First()); + Assert.AreEqual("Vakindeling (startpunten)", mapData.Name); + } + + private static void AssertFailureMechanismSectionsEndPointMapData(IEnumerable sections, MapData mapData) + { + Assert.IsInstanceOf(mapData); + var sectionsStartPointData = (MapPointData) mapData; + CollectionAssert.AreEqual(sections.Select(s => s.GetLast()), sectionsStartPointData.Features.First().MapGeometries.First().PointCollections.First()); + Assert.AreEqual("Vakindeling (eindpunten)", mapData.Name); + } + + private static void AssertEmptyMapData(MapDataCollection mapData) + { + Assert.IsInstanceOf(mapData); + + var mapDataList = mapData.Collection.ToList(); + + Assert.AreEqual(6, mapDataList.Count); + + var referenceLineMapData = (MapLineData) mapDataList[referenceLineIndex]; + var sectionsMapData = (MapLineData) mapDataList[sectionsIndex]; + var foreshoreProfilesMapData = (MapLineData) mapDataList[foreshoreProfilesIndex]; + var sectionsStartPointMapData = (MapPointData) mapDataList[sectionsStartPointIndex]; + var sectionsEndPointMapData = (MapPointData) mapDataList[sectionsEndPointIndex]; + var hydraulicBoundaryDatabaseMapData = (MapPointData) mapDataList[hydraulicBoundaryDatabaseIndex]; + + CollectionAssert.IsEmpty(referenceLineMapData.Features); + CollectionAssert.IsEmpty(sectionsMapData.Features); + CollectionAssert.IsEmpty(foreshoreProfilesMapData.Features); + CollectionAssert.IsEmpty(foreshoreProfilesMapData.Features); + CollectionAssert.IsEmpty(sectionsStartPointMapData.Features); + CollectionAssert.IsEmpty(sectionsEndPointMapData.Features); + CollectionAssert.IsEmpty(hydraulicBoundaryDatabaseMapData.Features); + + Assert.AreEqual(RingtoetsCommonDataResources.ReferenceLine_DisplayName, referenceLineMapData.Name); + Assert.AreEqual(RingtoetsCommonFormsResources.FailureMechanism_Sections_DisplayName, sectionsMapData.Name); + Assert.AreEqual(GetSectionPointDisplayName(RingtoetsCommonFormsResources.FailureMechanismSections_StartPoints_DisplayName), sectionsStartPointMapData.Name); + Assert.AreEqual(GetSectionPointDisplayName(RingtoetsCommonFormsResources.FailureMechanismSections_EndPoints_DisplayName), sectionsEndPointMapData.Name); + Assert.AreEqual(RingtoetsCommonDataResources.HydraulicBoundaryConditions_DisplayName, hydraulicBoundaryDatabaseMapData.Name); + } + + private static string GetSectionPointDisplayName(string name) + { + return string.Format("{0} ({1})", + RingtoetsCommonFormsResources.FailureMechanism_Sections_DisplayName, + name); + } + + private class TestAssessmentSection : Observable, IAssessmentSection + { + public string Id { get; set; } + public string Name { get; set; } + public string Comments { get; set; } + public AssessmentSectionComposition Composition { get; private set; } + public ReferenceLine ReferenceLine { get; set; } + public FailureMechanismContribution FailureMechanismContribution { get; private set; } + public HydraulicBoundaryDatabase HydraulicBoundaryDatabase { get; set; } + + public IEnumerable GetFailureMechanisms() + { + yield break; + } + + public void ChangeComposition(AssessmentSectionComposition newComposition) + { + throw new NotImplementedException(); + } + } + } +} \ No newline at end of file Index: Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Plugin.Test/Ringtoets.WaveImpactAsphaltCover.Plugin.Test.csproj =================================================================== diff -u -r2d5e2d09b0cb1a7f48e1b0a067d332347c89d4a8 -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Plugin.Test/Ringtoets.WaveImpactAsphaltCover.Plugin.Test.csproj (.../Ringtoets.WaveImpactAsphaltCover.Plugin.Test.csproj) (revision 2d5e2d09b0cb1a7f48e1b0a067d332347c89d4a8) +++ Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Plugin.Test/Ringtoets.WaveImpactAsphaltCover.Plugin.Test.csproj (.../Ringtoets.WaveImpactAsphaltCover.Plugin.Test.csproj) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -58,6 +58,7 @@ + @@ -93,6 +94,10 @@ {D749EE4C-CE50-4C17-BF01-9A953028C126} Core.Common.TestUtil + + {4a06df0d-5d75-4bad-a95a-a3db9b7c4ad5} + Core.Components.Gis.Forms + {d4200f43-3f72-4f42-af0a-8ced416a38ec} Ringtoets.Common.Data Index: Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Plugin.Test/TreeNodeInfos/WaveImpactAsphaltCoverFailureMechanismContextTreeNodeInfoTest.cs =================================================================== diff -u -rb5accd775c390fa85f815ef13c3c3e54a6d10ada -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Plugin.Test/TreeNodeInfos/WaveImpactAsphaltCoverFailureMechanismContextTreeNodeInfoTest.cs (.../WaveImpactAsphaltCoverFailureMechanismContextTreeNodeInfoTest.cs) (revision b5accd775c390fa85f815ef13c3c3e54a6d10ada) +++ Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Plugin.Test/TreeNodeInfos/WaveImpactAsphaltCoverFailureMechanismContextTreeNodeInfoTest.cs (.../WaveImpactAsphaltCoverFailureMechanismContextTreeNodeInfoTest.cs) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -43,7 +43,7 @@ [TestFixture] public class WaveImpactAsphaltCoverFailureMechanismContextTreeNodeInfoTest { - private const int contextMenuRelevancyIndexWhenRelevant = 0; + private const int contextMenuRelevancyIndexWhenRelevant = 2; private const int contextMenuRelevancyIndexWhenNotRelevant = 0; private MockRepository mocks; @@ -275,6 +275,8 @@ assessmentSection); var menuBuilder = mocks.StrictMock(); + menuBuilder.Expect(mb => mb.AddOpenItem()).Return(menuBuilder); + menuBuilder.Expect(mb => mb.AddSeparator()).Return(menuBuilder); menuBuilder.Expect(mb => mb.AddCustomItem(null)).IgnoreArguments().Return(menuBuilder); menuBuilder.Expect(mb => mb.AddSeparator()).Return(menuBuilder); menuBuilder.Expect(mb => mb.AddExpandAllItem()).Return(menuBuilder); Index: Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Plugin.Test/ViewInfos/WaveImpactAsphaltCoverFailureMechanismViewInfoTest.cs =================================================================== diff -u --- Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Plugin.Test/ViewInfos/WaveImpactAsphaltCoverFailureMechanismViewInfoTest.cs (revision 0) +++ Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Plugin.Test/ViewInfos/WaveImpactAsphaltCoverFailureMechanismViewInfoTest.cs (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -0,0 +1,210 @@ +// 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.Linq; +using Core.Common.Gui.Plugin; +using Core.Common.TestUtil; +using NUnit.Framework; +using Rhino.Mocks; +using Ringtoets.Common.Data.AssessmentSection; +using Ringtoets.WaveImpactAsphaltCover.Data; +using Ringtoets.WaveImpactAsphaltCover.Forms.PresentationObjects; +using Ringtoets.WaveImpactAsphaltCover.Forms.Views; +using WaveImpactAsphaltCoverDataResources = Ringtoets.WaveImpactAsphaltCover.Data.Properties.Resources; +using WaveImpactAsphaltCoverFormsResources = Ringtoets.WaveImpactAsphaltCover.Forms.Properties.Resources; +using RingtoetsCommonFormsResources = Ringtoets.Common.Forms.Properties.Resources; + +namespace Ringtoets.WaveImpactAsphaltCover.Plugin.Test.ViewInfos +{ + [TestFixture] + public class WaveImpactAsphaltCoverFailureMechanismViewInfoTest + { + private MockRepository mocks; + private WaveImpactAsphaltCoverPlugin plugin; + private ViewInfo info; + + [SetUp] + public void SetUp() + { + mocks = new MockRepository(); + plugin = new WaveImpactAsphaltCoverPlugin(); + info = plugin.GetViewInfos().First(tni => tni.ViewType == typeof(WaveImpactAsphaltCoverFailureMechanismView)); + } + + [TearDown] + public void TearDown() + { + plugin.Dispose(); + } + + [Test] + public void Initialized_Always_ExpectedPropertiesSet() + { + // Assert + Assert.AreEqual(typeof(WaveImpactAsphaltCoverFailureMechanismContext), info.DataType); + Assert.AreEqual(typeof(WaveImpactAsphaltCoverFailureMechanismContext), info.ViewDataType); + TestHelper.AssertImagesAreEqual(RingtoetsCommonFormsResources.CalculationIcon, info.Image); + } + + [Test] + public void GetViewName_WithWaveImpactAsphaltCoverFailureMechanism_ReturnsNameOfFailureMechanism() + { + // Setup + var assessmentSectionMock = mocks.Stub(); + mocks.ReplayAll(); + + var waveImpactAsphaltCoverFailureMechanism = new WaveImpactAsphaltCoverFailureMechanism(); + var waveImpactAsphaltCoverFailureMechanismContext = new WaveImpactAsphaltCoverFailureMechanismContext(waveImpactAsphaltCoverFailureMechanism, assessmentSectionMock); + + using (var view = new WaveImpactAsphaltCoverFailureMechanismView()) + { + // Call + string viewName = info.GetViewName(view, waveImpactAsphaltCoverFailureMechanismContext); + + // Assert + Assert.AreEqual(waveImpactAsphaltCoverFailureMechanism.Name, viewName); + } + } + + [Test] + public void CloseForData_ViewNotCorrespondingToRemovedAssessmentSection_ReturnsFalse() + { + // Setup + var assessmentSectionMock = mocks.Stub(); + var otherAssessmentSectionMock = mocks.Stub(); + mocks.ReplayAll(); + + var waveImpactAsphaltCoverFailureMechanism = new WaveImpactAsphaltCoverFailureMechanism(); + var waveImpactAsphaltCoverFailureMechanismContext = new WaveImpactAsphaltCoverFailureMechanismContext(waveImpactAsphaltCoverFailureMechanism, assessmentSectionMock); + + using (var view = new WaveImpactAsphaltCoverFailureMechanismView + { + Data = waveImpactAsphaltCoverFailureMechanismContext + }) + { + // Call + bool closeForData = info.CloseForData(view, otherAssessmentSectionMock); + + // Assert + Assert.IsFalse(closeForData); + } + mocks.VerifyAll(); + } + + [Test] + public void CloseForData_ViewCorrespondingToRemovedAssessmentSection_ReturnsTrue() + { + // Setup + var assessmentSectionMock = mocks.Stub(); + mocks.ReplayAll(); + + var waveImpactAsphaltCoverFailureMechanism = new WaveImpactAsphaltCoverFailureMechanism(); + var waveImpactAsphaltCoverFailureMechanismContext = new WaveImpactAsphaltCoverFailureMechanismContext(waveImpactAsphaltCoverFailureMechanism, assessmentSectionMock); + + using (var view = new WaveImpactAsphaltCoverFailureMechanismView + { + Data = waveImpactAsphaltCoverFailureMechanismContext + }) + { + // Call + bool closeForData = info.CloseForData(view, assessmentSectionMock); + + // Assert + Assert.IsTrue(closeForData); + } + mocks.VerifyAll(); + } + + [Test] + public void CloseForData_ViewNotCorrespondingToRemovedFailureMechanism_ReturnsFalse() + { + // Setup + var assessmentSectionMock = mocks.Stub(); + mocks.ReplayAll(); + + var waveImpactAsphaltCoverFailureMechanism = new WaveImpactAsphaltCoverFailureMechanism(); + var otherWaveImpactAsphaltCoverFailureMechanism = new WaveImpactAsphaltCoverFailureMechanism(); + + var waveImpactAsphaltCoverFailureMechanismContext = new WaveImpactAsphaltCoverFailureMechanismContext(waveImpactAsphaltCoverFailureMechanism, assessmentSectionMock); + + using (var view = new WaveImpactAsphaltCoverFailureMechanismView + { + Data = waveImpactAsphaltCoverFailureMechanismContext + }) + { + // Call + bool closeForData = info.CloseForData(view, otherWaveImpactAsphaltCoverFailureMechanism); + + // Assert + Assert.IsFalse(closeForData); + } + mocks.VerifyAll(); + } + + [Test] + public void CloseForData_ViewCorrespondingToRemovedFailureMechanism_ReturnsTrue() + { + // Setup + var assessmentSectionMock = mocks.Stub(); + mocks.ReplayAll(); + + var waveImpactAsphaltCoverFailureMechanism = new WaveImpactAsphaltCoverFailureMechanism(); + var waveImpactAsphaltCoverFailureMechanismContext = new WaveImpactAsphaltCoverFailureMechanismContext(waveImpactAsphaltCoverFailureMechanism, assessmentSectionMock); + + using (var view = new WaveImpactAsphaltCoverFailureMechanismView + { + Data = waveImpactAsphaltCoverFailureMechanismContext + }) + { + // Call + bool closeForData = info.CloseForData(view, waveImpactAsphaltCoverFailureMechanism); + + // Assert + Assert.IsTrue(closeForData); + } + mocks.VerifyAll(); + } + + [Test] + [TestCase(true)] + [TestCase(false)] + public void AdditionalDataCheck_Always_ReturnTrueOnlyIfFailureMechanismRelevant(bool isRelevant) + { + // Setup + var assessmentSection = mocks.Stub(); + mocks.ReplayAll(); + + var failureMechanism = new WaveImpactAsphaltCoverFailureMechanism + { + IsRelevant = isRelevant + }; + + var context = new WaveImpactAsphaltCoverFailureMechanismContext(failureMechanism, assessmentSection); + + // Call + bool result = info.AdditionalDataCheck(context); + + // Assert + Assert.AreEqual(isRelevant, result); + mocks.VerifyAll(); + } + } +} \ No newline at end of file Index: Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Plugin.Test/WaveImpactAsphaltCoverPluginTest.cs =================================================================== diff -u -r2973c5f790a5131e427bd5f73e2a620044199639 -rf718135c08ce7b90cc0eaf40bfb83c9af48a1776 --- Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Plugin.Test/WaveImpactAsphaltCoverPluginTest.cs (.../WaveImpactAsphaltCoverPluginTest.cs) (revision 2973c5f790a5131e427bd5f73e2a620044199639) +++ Ringtoets/WaveImpactAsphaltCover/test/Ringtoets.WaveImpactAsphaltCover.Plugin.Test/WaveImpactAsphaltCoverPluginTest.cs (.../WaveImpactAsphaltCoverPluginTest.cs) (revision f718135c08ce7b90cc0eaf40bfb83c9af48a1776) @@ -96,12 +96,18 @@ ViewInfo[] viewInfos = plugin.GetViewInfos().ToArray(); // Assert - Assert.AreEqual(1, viewInfos.Length); + Assert.AreEqual(2, viewInfos.Length); + + PluginTestHelper.AssertViewInfoDefined( + viewInfos, + typeof(WaveImpactAsphaltCoverFailureMechanismContext), + typeof(WaveImpactAsphaltCoverFailureMechanismView)); - var waveImpactAsphaltCoverResultViewInfo = viewInfos.Single(vi => vi.DataType == typeof(FailureMechanismSectionResultContext)); - Assert.AreEqual(typeof(IEnumerable), waveImpactAsphaltCoverResultViewInfo.ViewDataType); - Assert.AreEqual(typeof(WaveImpactAsphaltCoverFailureMechanismResultView), waveImpactAsphaltCoverResultViewInfo.ViewType); - TestHelper.AssertImagesAreEqual(RingtoetsCommonFormsResources.FailureMechanismSectionResultIcon, waveImpactAsphaltCoverResultViewInfo.Image); + PluginTestHelper.AssertViewInfoDefined( + viewInfos, + typeof(FailureMechanismSectionResultContext), + typeof(IEnumerable), + typeof(WaveImpactAsphaltCoverFailureMechanismResultView)); } }