Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsPlugin.cs =================================================================== diff -u -r37fc59cc0f3becb92e14b8263bd8e9fc71aa0e79 -r0d29de0eb92a426c8e1b3725656a3f608b93f951 --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsPlugin.cs (.../GrassCoverErosionInwardsPlugin.cs) (revision 37fc59cc0f3becb92e14b8263bd8e9fc71aa0e79) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/GrassCoverErosionInwardsPlugin.cs (.../GrassCoverErosionInwardsPlugin.cs) (revision 0d29de0eb92a426c8e1b3725656a3f608b93f951) @@ -25,6 +25,7 @@ using System.Linq; using System.Windows.Forms; using Core.Common.Controls.TreeView; +using Core.Common.Gui; using Core.Common.Gui.ContextMenu; using Core.Common.Gui.Forms.ProgressDialog; using Core.Common.Gui.Plugin; @@ -44,6 +45,7 @@ using Ringtoets.GrassCoverErosionInwards.Forms.PresentationObjects; using Ringtoets.GrassCoverErosionInwards.Forms.PropertyClasses; using Ringtoets.GrassCoverErosionInwards.Forms.Views; +using Ringtoets.GrassCoverErosionInwards.IO; using Ringtoets.GrassCoverErosionInwards.Service; using Ringtoets.GrassCoverErosionInwards.Utils; using GrassCoverErosionInwardsPluginResources = Ringtoets.GrassCoverErosionInwards.Plugin.Properties.Resources; @@ -62,7 +64,7 @@ yield return new PropertyInfo { CreateInstance = context => new GrassCoverErosionInwardsFailureMechanismContextProperties( - context, + context, new FailureMechanismPropertyChangeHandler()) }; yield return new PropertyInfo(); @@ -75,6 +77,17 @@ yield return new PropertyInfo(); } + public override IEnumerable GetExportInfos() + { + yield return new ExportInfo + { + FileFilterGenerator = new FileFilterGenerator(RingtoetsCommonFormsResources.DataTypeDisplayName_xml_file_filter_Extension, + RingtoetsCommonFormsResources.DataTypeDisplayName_xml_file_filter_Description), + CreateFileExporter = (context, filePath) => new GrassCoverErosionInwardsConfigurationExporter(context.WrappedData, filePath), + IsEnabled = context => context.WrappedData.Children.Any() + }; + } + public override IEnumerable GetViewInfos() { yield return new ViewInfo @@ -200,11 +213,11 @@ ActivityProgressDialogRunner.Run( Gui.MainWindow, calculations.Select(calc => - new GrassCoverErosionInwardsCalculationActivity( - calc, - assessmentSection.HydraulicBoundaryDatabase.FilePath, - failureMechanism, - assessmentSection)).ToArray()); + new GrassCoverErosionInwardsCalculationActivity( + calc, + assessmentSection.HydraulicBoundaryDatabase.FilePath, + failureMechanism, + assessmentSection)).ToArray()); } private static string ValidateAllDataAvailableAndGetErrorMessage(IAssessmentSection assessmentSection, IFailureMechanism failureMechanism) @@ -488,6 +501,9 @@ StrictContextMenuItem generateCalculationsItem = CreateGenerateCalculationsItem(context); + builder.AddExportItem() + .AddSeparator(); + if (!isNestedGroup) { builder.AddCustomItem(generateCalculationsItem) Index: Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/Ringtoets.GrassCoverErosionInwards.Plugin.csproj =================================================================== diff -u -r7cc1fd960a912443ccc3c6995eccb5673d1d8d22 -r0d29de0eb92a426c8e1b3725656a3f608b93f951 --- Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/Ringtoets.GrassCoverErosionInwards.Plugin.csproj (.../Ringtoets.GrassCoverErosionInwards.Plugin.csproj) (revision 7cc1fd960a912443ccc3c6995eccb5673d1d8d22) +++ Ringtoets/GrassCoverErosionInwards/src/Ringtoets.GrassCoverErosionInwards.Plugin/Ringtoets.GrassCoverErosionInwards.Plugin.csproj (.../Ringtoets.GrassCoverErosionInwards.Plugin.csproj) (revision 0d29de0eb92a426c8e1b3725656a3f608b93f951) @@ -96,6 +96,11 @@ Ringtoets.Common.Forms False + + {52BA7627-CBAB-4209-BE77-3B5F31378277} + Ringtoets.Common.IO + False + {d951d6da-fe83-4920-9fdb-63bf96480b54} Ringtoets.Common.Service @@ -116,6 +121,11 @@ Ringtoets.GrassCoverErosionInwards.Forms False + + {AA3AB46F-1664-40C4-A620-A12513184BD4} + Ringtoets.GrassCoverErosionInwards.IO + False + {5D158D8E-A5EB-489C-A885-87E13BC0D3B3} Ringtoets.GrassCoverErosionInwards.Service Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Plugin.Test/ExportInfos/GrassCoverErosionInwardsCalculationGroupContextExportInfoTest.cs =================================================================== diff -u --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Plugin.Test/ExportInfos/GrassCoverErosionInwardsCalculationGroupContextExportInfoTest.cs (revision 0) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Plugin.Test/ExportInfos/GrassCoverErosionInwardsCalculationGroupContextExportInfoTest.cs (revision 0d29de0eb92a426c8e1b3725656a3f608b93f951) @@ -0,0 +1,169 @@ +// 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.Base.IO; +using Core.Common.Gui; +using Core.Common.Gui.Plugin; +using NUnit.Framework; +using Rhino.Mocks; +using Ringtoets.Common.Data.AssessmentSection; +using Ringtoets.Common.Data.Calculation; +using Ringtoets.GrassCoverErosionInwards.Data; +using Ringtoets.GrassCoverErosionInwards.Forms.PresentationObjects; +using Ringtoets.GrassCoverErosionInwards.IO; + +namespace Ringtoets.GrassCoverErosionInwards.Plugin.Test.ExportInfos +{ + [TestFixture] + public class GrassCoverErosionInwardsCalculationGroupContextExportInfoTest + { + + [Test] + public void Initialized_Always_ExpectedPropertiesSet() + { + // Setup + using (var plugin = new GrassCoverErosionInwardsPlugin()) + { + // Call + ExportInfo info = GetExportInfo(plugin); + + // Assert + Assert.IsNotNull(info.CreateFileExporter); + Assert.IsNotNull(info.IsEnabled); + Assert.IsNull(info.Name); + Assert.IsNull(info.Category); + Assert.IsNull(info.Image); + Assert.IsNotNull(info.FileFilterGenerator); + } + } + + [Test] + public void CreateFileExporter_Always_ReturnFileExporter() + { + // Setup + var mocks = new MockRepository(); + var assessmentSection = mocks.Stub(); + mocks.ReplayAll(); + + var context = new GrassCoverErosionInwardsCalculationGroupContext(new CalculationGroup(), + new GrassCoverErosionInwardsFailureMechanism(), + assessmentSection); + + using (var plugin = new GrassCoverErosionInwardsPlugin()) + { + ExportInfo info = GetExportInfo(plugin); + + // Call + IFileExporter fileExporter = info.CreateFileExporter(context, "test"); + + // Assert + Assert.IsInstanceOf(fileExporter); + } + mocks.VerifyAll(); + } + + [Test] + public void FileFilterGenerator_Always_ReturnFileFilter() + { + // Setup + using (var plugin = new GrassCoverErosionInwardsPlugin()) + { + ExportInfo info = GetExportInfo(plugin); + + // Call + FileFilterGenerator fileFilterGenerator = info.FileFilterGenerator; + + // Assert + Assert.AreEqual("Ringtoets berekeningenconfiguratie (*.xml)|*.xml", fileFilterGenerator.Filter); + } + } + + [Test] + public void IsEnabled_CalculationGroupNoChildren_ReturnFalse() + { + // Setup + var mocks = new MockRepository(); + var assessmentSection = mocks.Stub(); + mocks.ReplayAll(); + + var context = new GrassCoverErosionInwardsCalculationGroupContext(new CalculationGroup(), + new GrassCoverErosionInwardsFailureMechanism(), + assessmentSection); + + using (var plugin = new GrassCoverErosionInwardsPlugin()) + { + ExportInfo info = GetExportInfo(plugin); + + // Call + bool isEnabled = info.IsEnabled(context); + + // Assert + Assert.IsFalse(isEnabled); + } + mocks.VerifyAll(); + } + + [Test] + [TestCase(true, false)] + [TestCase(false, true)] + public void IsEnabled_CalculationGroupWithChildren_ReturnTrue(bool hasNestedGroup, bool hasCalculation) + { + // Setup + var mocks = new MockRepository(); + var assessmentSection = mocks.Stub(); + mocks.ReplayAll(); + + var calculationGroup = new CalculationGroup(); + + if (hasNestedGroup) + { + calculationGroup.Children.Add(new CalculationGroup()); + } + + if (hasCalculation) + { + calculationGroup.Children.Add(new GrassCoverErosionInwardsCalculation()); + } + + var context = new GrassCoverErosionInwardsCalculationGroupContext(calculationGroup, + new GrassCoverErosionInwardsFailureMechanism(), + assessmentSection); + + using (var plugin = new GrassCoverErosionInwardsPlugin()) + { + ExportInfo info = GetExportInfo(plugin); + + // Call + bool isEnabled = info.IsEnabled(context); + + // Assert + Assert.IsTrue(isEnabled); + } + mocks.VerifyAll(); + } + + private static ExportInfo GetExportInfo(GrassCoverErosionInwardsPlugin plugin) + { + return plugin.GetExportInfos().First(ei => ei.DataType == typeof(GrassCoverErosionInwardsCalculationGroupContext)); + } + } +} \ No newline at end of file Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Plugin.Test/GrassCoverErosionInwardsPluginTest.cs =================================================================== diff -u -r0cc64a130e25bd1cb8ffa996799b2556c7798269 -r0d29de0eb92a426c8e1b3725656a3f608b93f951 --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Plugin.Test/GrassCoverErosionInwardsPluginTest.cs (.../GrassCoverErosionInwardsPluginTest.cs) (revision 0cc64a130e25bd1cb8ffa996799b2556c7798269) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Plugin.Test/GrassCoverErosionInwardsPluginTest.cs (.../GrassCoverErosionInwardsPluginTest.cs) (revision 0d29de0eb92a426c8e1b3725656a3f608b93f951) @@ -121,5 +121,20 @@ Assert.IsTrue(viewInfos.Any(vi => vi.ViewType == typeof(GrassCoverErosionInwardsScenariosView))); } } + + [Test] + public void GetExportInfos_ReturnsSupportedExportInfos() + { + // Setup + using (var plugin = new GrassCoverErosionInwardsPlugin()) + { + // Call + ExportInfo[] exportInfos = plugin.GetExportInfos().ToArray(); + + // Assert + Assert.AreEqual(1, exportInfos.Length); + Assert.IsTrue(exportInfos.Any(tni => tni.DataType == typeof(GrassCoverErosionInwardsCalculationGroupContext))); + } + } } } \ No newline at end of file Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Plugin.Test/Ringtoets.GrassCoverErosionInwards.Plugin.Test.csproj =================================================================== diff -u -r6a5d7b40b7ba4dcb73e393075338352d194e97c2 -r0d29de0eb92a426c8e1b3725656a3f608b93f951 --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Plugin.Test/Ringtoets.GrassCoverErosionInwards.Plugin.Test.csproj (.../Ringtoets.GrassCoverErosionInwards.Plugin.Test.csproj) (revision 6a5d7b40b7ba4dcb73e393075338352d194e97c2) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Plugin.Test/Ringtoets.GrassCoverErosionInwards.Plugin.Test.csproj (.../Ringtoets.GrassCoverErosionInwards.Plugin.Test.csproj) (revision 0d29de0eb92a426c8e1b3725656a3f608b93f951) @@ -63,6 +63,7 @@ Properties\GlobalAssembly.cs + @@ -149,6 +150,10 @@ {C540E627-B95B-4CC0-A1B6-A0BDF74936C7} Ringtoets.GrassCoverErosionInwards.Forms + + {AA3AB46F-1664-40C4-A620-A12513184BD4} + Ringtoets.GrassCoverErosionInwards.IO + {20955E2A-8CEB-46B0-ADC4-A97D4C6BBDF5} Ringtoets.GrassCoverErosionInwards.Plugin Index: Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Plugin.Test/TreeNodeInfos/GrassCoverErosionInwardsCalculationGroupContextTreeNodeInfoTest.cs =================================================================== diff -u -r45440093089496f59ed420e772136756c229e30b -r0d29de0eb92a426c8e1b3725656a3f608b93f951 --- Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Plugin.Test/TreeNodeInfos/GrassCoverErosionInwardsCalculationGroupContextTreeNodeInfoTest.cs (.../GrassCoverErosionInwardsCalculationGroupContextTreeNodeInfoTest.cs) (revision 45440093089496f59ed420e772136756c229e30b) +++ Ringtoets/GrassCoverErosionInwards/test/Ringtoets.GrassCoverErosionInwards.Plugin.Test/TreeNodeInfos/GrassCoverErosionInwardsCalculationGroupContextTreeNodeInfoTest.cs (.../GrassCoverErosionInwardsCalculationGroupContextTreeNodeInfoTest.cs) (revision 0d29de0eb92a426c8e1b3725656a3f608b93f951) @@ -56,18 +56,18 @@ [TestFixture] public class GrassCoverErosionInwardsCalculationGroupContextTreeNodeInfoTest : NUnitFormTest { - private const int contextMenuGenerateCalculationsIndexRootGroup = 0; - private const int contextMenuAddCalculationGroupIndexRootGroup = 2; - private const int contextMenuAddCalculationIndexRootGroup = 3; - private const int contextMenuValidateAllIndexRootGroup = 5; - private const int contextMenuCalculateAllIndexRootGroup = 6; - private const int contextMenuClearAllIndexRootGroup = 8; + private const int contextMenuGenerateCalculationsIndexRootGroup = 2; + private const int contextMenuAddCalculationGroupIndexRootGroup = 4; + private const int contextMenuAddCalculationIndexRootGroup = 5; + private const int contextMenuValidateAllIndexRootGroup = 7; + private const int contextMenuCalculateAllIndexRootGroup = 8; + private const int contextMenuClearAllIndexRootGroup = 10; - private const int contextMenuAddCalculationGroupIndexNestedGroup = 0; - private const int contextMenuAddCalculationIndexNestedGroup = 1; - private const int contextMenuValidateAllIndexNestedGroup = 4; - private const int contextMenuCalculateAllIndexNestedGroup = 5; - private const int contextMenuClearAllIndexNestedGroup = 7; + private const int contextMenuAddCalculationGroupIndexNestedGroup = 2; + private const int contextMenuAddCalculationIndexNestedGroup = 3; + private const int contextMenuValidateAllIndexNestedGroup = 6; + private const int contextMenuCalculateAllIndexNestedGroup = 7; + private const int contextMenuClearAllIndexNestedGroup = 9; private readonly string testDataPath = TestHelper.GetTestDataPath(TestDataPath.Ringtoets.Common.IO, "HydraulicBoundaryDatabaseImporter"); private IGui gui; @@ -185,6 +185,8 @@ var menuBuilderMock = mocks.StrictMock(); using (mocks.Ordered()) { + menuBuilderMock.Expect(mb => mb.AddExportItem()).IgnoreArguments().Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddSeparator()).Return(menuBuilderMock); menuBuilderMock.Expect(mb => mb.AddCustomItem(null)).IgnoreArguments().Return(menuBuilderMock); menuBuilderMock.Expect(mb => mb.AddSeparator()).Return(menuBuilderMock); menuBuilderMock.Expect(mb => mb.AddCustomItem(null)).IgnoreArguments().Return(menuBuilderMock); @@ -240,7 +242,7 @@ using (ContextMenuStrip menu = info.ContextMenuStrip(groupContext, null, treeViewControl)) { // Assert - Assert.AreEqual(15, menu.Items.Count); + Assert.AreEqual(17, menu.Items.Count); TestHelper.AssertContextMenuStripContainsItem(menu, contextMenuAddCalculationGroupIndexRootGroup, RingtoetsCommonFormsResources.CalculationGroup_Add_CalculationGroup, RingtoetsCommonFormsResources.CalculationGroup_Add_CalculationGroup_Tooltip, @@ -288,6 +290,8 @@ var menuBuilderMock = mocks.StrictMock(); using (mocks.Ordered()) { + menuBuilderMock.Expect(mb => mb.AddExportItem()).IgnoreArguments().Return(menuBuilderMock); + menuBuilderMock.Expect(mb => mb.AddSeparator()).Return(menuBuilderMock); menuBuilderMock.Expect(mb => mb.AddCustomItem(null)).IgnoreArguments().Return(menuBuilderMock); menuBuilderMock.Expect(mb => mb.AddCustomItem(null)).IgnoreArguments().Return(menuBuilderMock); menuBuilderMock.Expect(mb => mb.AddSeparator()).Return(menuBuilderMock); @@ -341,7 +345,7 @@ using (ContextMenuStrip menu = info.ContextMenuStrip(groupContext, parentGroupContext, treeViewControl)) { // Assert - Assert.AreEqual(14, menu.Items.Count); + Assert.AreEqual(16, menu.Items.Count); TestHelper.AssertContextMenuStripContainsItem(menu, contextMenuAddCalculationGroupIndexNestedGroup, RingtoetsCommonFormsResources.CalculationGroup_Add_CalculationGroup, @@ -392,18 +396,18 @@ assessmentSection); var applicationFeatureCommandHandlerStub = mocks.Stub(); - var importHandlerMock = mocks.StrictMock(); - var exportHandlerMock = mocks.StrictMock(); - var updateHandlerMock = mocks.StrictMock(); - var viewCommandsHandlerMock = mocks.StrictMock(); + var importHandler = mocks.Stub(); + var exportHandler = mocks.Stub(); + var updateHandler = mocks.Stub(); + var viewCommandsHandler = mocks.Stub(); using (var treeViewControl = new TreeViewControl()) { var menuBuilder = new ContextMenuBuilder(applicationFeatureCommandHandlerStub, - importHandlerMock, - exportHandlerMock, - updateHandlerMock, - viewCommandsHandlerMock, + importHandler, + exportHandler, + updateHandler, + viewCommandsHandler, nodeData, treeViewControl); gui.Stub(g => g.Get(nodeData, treeViewControl)).Return(menuBuilder); @@ -446,18 +450,18 @@ assessmentSection); var applicationFeatureCommandHandlerStub = mocks.Stub(); - var importHandlerMock = mocks.StrictMock(); - var exportHandlerMock = mocks.StrictMock(); - var updateHandlerMock = mocks.StrictMock(); - var viewCommandsHandlerMock = mocks.StrictMock(); + var importHandler = mocks.Stub(); + var exportHandler = mocks.Stub(); + var updateHandler = mocks.Stub(); + var viewCommandsHandler = mocks.Stub(); using (var treeViewControl = new TreeViewControl()) { var menuBuilder = new ContextMenuBuilder(applicationFeatureCommandHandlerStub, - importHandlerMock, - exportHandlerMock, - updateHandlerMock, - viewCommandsHandlerMock, + importHandler, + exportHandler, + updateHandler, + viewCommandsHandler, nodeData, treeViewControl); gui.Stub(g => g.Get(nodeData, treeViewControl)).Return(menuBuilder); @@ -595,18 +599,18 @@ assessmentSection); var applicationFeatureCommandHandlerStub = mocks.Stub(); - var importHandlerMock = mocks.StrictMock(); - var exportHandlerMock = mocks.StrictMock(); - var updateHandlerMock = mocks.StrictMock(); - var viewCommandsHandlerMock = mocks.StrictMock(); + var importHandler = mocks.Stub(); + var exportHandler = mocks.Stub(); + var updateHandler = mocks.Stub(); + var viewCommandsHandler = mocks.Stub(); using (var treeViewControl = new TreeViewControl()) { var menuBuilder = new ContextMenuBuilder(applicationFeatureCommandHandlerStub, - importHandlerMock, - exportHandlerMock, - updateHandlerMock, - viewCommandsHandlerMock, + importHandler, + exportHandler, + updateHandler, + viewCommandsHandler, nodeData, treeViewControl); gui.Stub(g => g.Get(nodeData, treeViewControl)).Return(menuBuilder); @@ -649,10 +653,10 @@ assessmentSection); var applicationFeatureCommandHandlerStub = mocks.Stub(); - var importHandlerMock = mocks.StrictMock(); - var exportHandlerMock = mocks.StrictMock(); - var updateHandlerMock = mocks.StrictMock(); - var viewCommandsHandlerMock = mocks.StrictMock(); + var importHandlerMock = mocks.Stub(); + var exportHandlerMock = mocks.Stub(); + var updateHandlerMock = mocks.Stub(); + var viewCommandsHandlerMock = mocks.Stub(); using (var treeViewControl = new TreeViewControl()) { @@ -943,7 +947,7 @@ assessmentSection.HydraulicBoundaryDatabase = hydraulicBoundaryDatabaseStub; assessmentSection.Stub(a => a.Id).Return(string.Empty); assessmentSection.Stub(a => a.FailureMechanismContribution) - .Return(new FailureMechanismContribution(Enumerable.Empty(), 1, 1)); + .Return(new FailureMechanismContribution(Enumerable.Empty(), 1, 1)); var groupContext = new GrassCoverErosionInwardsCalculationGroupContext(failureMechanism.CalculationsGroup, failureMechanism,