Index: Application/Ringtoets/test/Application.Ringtoets.Storage.Test/StorageSqLiteTest.cs =================================================================== diff -u -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 -r4c653ca26b45ca9141158597fd548fb052dbe0df --- Application/Ringtoets/test/Application.Ringtoets.Storage.Test/StorageSqLiteTest.cs (.../StorageSqLiteTest.cs) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) +++ Application/Ringtoets/test/Application.Ringtoets.Storage.Test/StorageSqLiteTest.cs (.../StorageSqLiteTest.cs) (revision 4c653ca26b45ca9141158597fd548fb052dbe0df) @@ -480,6 +480,25 @@ } [Test] + public void HasStagedProjectChanges_InvalidPath_ThrowsArgumentException() + { + // Setup + var storage = new StorageSqLite(); + storage.StageProject(new RingtoetsProject()); + + string path = Path.Combine(testDataPath, "ValidCharacteristics.csv"); + char[] invalidCharacters = Path.GetInvalidPathChars(); + string corruptPath = path.Replace('V', invalidCharacters[0]); + + + // Call + TestDelegate call = () => storage.HasStagedProjectChanges(corruptPath); + + // Assert + Assert.Throws(call); + } + + [Test] public void HasStagedProjectChanges_NoProjectStaged_ThrowInvalidOperationException() { // Setup Index: Core/Common/src/Core.Common.Base/Storage/IStoreProject.cs =================================================================== diff -u -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 -r4c653ca26b45ca9141158597fd548fb052dbe0df --- Core/Common/src/Core.Common.Base/Storage/IStoreProject.cs (.../IStoreProject.cs) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) +++ Core/Common/src/Core.Common.Base/Storage/IStoreProject.cs (.../IStoreProject.cs) (revision 4c653ca26b45ca9141158597fd548fb052dbe0df) @@ -25,7 +25,7 @@ namespace Core.Common.Base.Storage { /// - /// Interface that describes the methods that need to be implemented on classes that provide a storage for Ringtoets projects. + /// Interface that describes the methods that need to be implemented on classes that provide a storage for projects. /// public interface IStoreProject { @@ -52,7 +52,7 @@ /// Thrown when /// /// No new storage was created. - /// The storage is no valid Ringtoets project. + /// The storage is no valid project. /// Saving the staged project to the storage failed. /// The connection to the storage failed. /// Index: Core/Common/src/Core.Common.Gui/Commands/IStorageCommands.cs =================================================================== diff -u -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 -r4c653ca26b45ca9141158597fd548fb052dbe0df --- Core/Common/src/Core.Common.Gui/Commands/IStorageCommands.cs (.../IStorageCommands.cs) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) +++ Core/Common/src/Core.Common.Gui/Commands/IStorageCommands.cs (.../IStorageCommands.cs) (revision 4c653ca26b45ca9141158597fd548fb052dbe0df) @@ -33,7 +33,13 @@ /// void CreateNewProject(); - bool AskConfirmationUnsavedChanges(); + /// + /// Checks whether the current project has unsaved changes. If so, these unsaved changes + /// will be handled. + /// + /// True if there were no unsaved changes or when the changes were + /// successfully handled, false if the unsaved changes were not handled. + bool HandleUnsavedChanges(); /// /// Asks the user for a file-location to save the current project, then proceeds Index: Core/Common/src/Core.Common.Gui/Commands/StorageCommandHandler.cs =================================================================== diff -u -r77c0ac1bef69ef7d39d3c05673a015f692b2f71b -r4c653ca26b45ca9141158597fd548fb052dbe0df --- Core/Common/src/Core.Common.Gui/Commands/StorageCommandHandler.cs (.../StorageCommandHandler.cs) (revision 77c0ac1bef69ef7d39d3c05673a015f692b2f71b) +++ Core/Common/src/Core.Common.Gui/Commands/StorageCommandHandler.cs (.../StorageCommandHandler.cs) (revision 4c653ca26b45ca9141158597fd548fb052dbe0df) @@ -46,7 +46,7 @@ /// Initializes a new instance of the class. /// /// Class responsible to storing and loading the application project. - /// + /// The factory to use when creating new projects. /// The class owning the application project. /// Controller for UI. public StorageCommandHandler(IStoreProject projectStorage, IProjectFactory projectFactory, IProjectOwner projectOwner, IWin32Window dialogParent) @@ -57,11 +57,7 @@ this.projectFactory = projectFactory; } - /// - /// Checks if an action may continue when changes are detected. - /// - /// True if the action should continue, false otherwise. - public bool AskConfirmationUnsavedChanges() + public bool HandleUnsavedChanges() { if (IsCurrentNew()) { @@ -84,34 +80,26 @@ return false; } - var openSaveOrDiscardProjectDialog = OpenSaveOrDiscardProjectDialog(); + var unsavedChangesHandled = ShowSaveUnsavedChangesDialog(); + if (projectPersistor.HasStagedProject) { projectPersistor.UnstageProject(); } - if (!openSaveOrDiscardProjectDialog) - { - log.Info(Resources.StorageCommandHandler_NewProject_Creating_new_project_cancelled); - } - return openSaveOrDiscardProjectDialog; + return unsavedChangesHandled; } - private bool IsCurrentNew() - { - return projectOwner.Project.Equals(projectFactory.CreateNewProject()); - } - public void CreateNewProject() { - if (!AskConfirmationUnsavedChanges()) + if (!HandleUnsavedChanges()) { log.Info(Resources.StorageCommandHandler_NewProject_Creating_new_project_cancelled); return; } log.Info(Resources.Creating_new_project); projectOwner.SetProject(projectFactory.CreateNewProject(), null); - log.Info(Resources.Created_new_project_succesful); + log.Info(Resources.Created_new_project_successful); } public bool OpenExistingProject() @@ -122,13 +110,13 @@ Title = Resources.OpenFileDialog_Title }) { - if (openFileDialog.ShowDialog(dialogParent) != DialogResult.Cancel && AskConfirmationUnsavedChanges()) + if (openFileDialog.ShowDialog(dialogParent) != DialogResult.Cancel && HandleUnsavedChanges()) { return OpenExistingProject(openFileDialog.FileName); } } - log.Warn(Resources.StorageCommandHandler_OpenExistingProject_Opening_existing_project_cancelled); + log.Info(Resources.StorageCommandHandler_OpenExistingProject_Opening_existing_project_cancelled); return false; } @@ -158,12 +146,8 @@ public bool SaveProjectAs() { var project = projectOwner.Project; - if (project == null) - { - return false; - } - var filePath = OpenProjectSaveFileDialog(project.Name); + if (string.IsNullOrWhiteSpace(filePath)) { return false; @@ -188,10 +172,6 @@ public bool SaveProject() { var project = projectOwner.Project; - if (project == null) - { - return false; - } var filePath = projectOwner.ProjectFilePath; // If filepath is not set, go to SaveAs @@ -211,8 +191,13 @@ return true; } - private bool OpenSaveOrDiscardProjectDialog() + private bool IsCurrentNew() { + return projectOwner.Project.Equals(projectFactory.CreateNewProject()); + } + + private bool ShowSaveUnsavedChangesDialog() + { var confirmation = MessageBox.Show( string.Format(CultureInfo.CurrentCulture, Resources.StorageCommandHandler_OpenSaveOrDiscardProjectDialog_SaveChangesToProject_0, @@ -278,7 +263,7 @@ { if (saveFileDialog.ShowDialog() != DialogResult.OK) { - log.Warn(Resources.StorageCommandHandler_SaveProject_Saving_project_cancelled); + log.Info(Resources.StorageCommandHandler_SaveProject_Saving_project_cancelled); return null; } return saveFileDialog.FileName; Index: Core/Common/src/Core.Common.Gui/GuiCore.cs =================================================================== diff -u -r219cfb0a4817b990ca5e7a63b8670effe61669f7 -r4c653ca26b45ca9141158597fd548fb052dbe0df --- Core/Common/src/Core.Common.Gui/GuiCore.cs (.../GuiCore.cs) (revision 219cfb0a4817b990ca5e7a63b8670effe61669f7) +++ Core/Common/src/Core.Common.Gui/GuiCore.cs (.../GuiCore.cs) (revision 4c653ca26b45ca9141158597fd548fb052dbe0df) @@ -178,7 +178,7 @@ } // Store project? - if (!storageCommandHandler.AskConfirmationUnsavedChanges()) + if (!storageCommandHandler.HandleUnsavedChanges()) { // User pressed cancel return; @@ -685,7 +685,7 @@ private readonly ViewCommandHandler viewCommandHandler; private readonly GuiImportHandler importCommandHandler; private readonly GuiExportHandler exportCommandHandler; - private readonly StorageCommandHandler storageCommandHandler; + private readonly IStorageCommands storageCommandHandler; public IApplicationFeatureCommands ApplicationCommands { @@ -773,7 +773,7 @@ { mainWindow.Title = string.Format(CultureInfo.CurrentCulture, "{0} - {1} {2}", - Project != null ? Project.Name : Resources.GuiCore_UpdateTitle_Unknown, + Project.Name, FixedSettings.MainWindowTitle, SettingsHelper.ApplicationVersion); } Index: Core/Common/src/Core.Common.Gui/IProjectOwner.cs =================================================================== diff -u -r219cfb0a4817b990ca5e7a63b8670effe61669f7 -r4c653ca26b45ca9141158597fd548fb052dbe0df --- Core/Common/src/Core.Common.Gui/IProjectOwner.cs (.../IProjectOwner.cs) (revision 219cfb0a4817b990ca5e7a63b8670effe61669f7) +++ Core/Common/src/Core.Common.Gui/IProjectOwner.cs (.../IProjectOwner.cs) (revision 4c653ca26b45ca9141158597fd548fb052dbe0df) @@ -40,15 +40,12 @@ event Action ProjectOpened; /// - /// Gets or sets the project of the application. + /// Gets the project of the application. /// - /// Thrown when a null project is - /// assigned. - /// null is not a valid return value. IProject Project { get; } /// - /// Gets or sets the project path of the application. + /// Gets the project path of the application. /// string ProjectFilePath { get; } Index: Core/Common/src/Core.Common.Gui/Properties/Resources.Designer.cs =================================================================== diff -u -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 -r4c653ca26b45ca9141158597fd548fb052dbe0df --- Core/Common/src/Core.Common.Gui/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) +++ Core/Common/src/Core.Common.Gui/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 4c653ca26b45ca9141158597fd548fb052dbe0df) @@ -304,9 +304,9 @@ /// /// Looks up a localized string similar to Nieuw Ringtoetsproject succesvol aangemaakt.. /// - public static string Created_new_project_succesful { + public static string Created_new_project_successful { get { - return ResourceManager.GetString("Created_new_project_succesful", resourceCulture); + return ResourceManager.GetString("Created_new_project_successful", resourceCulture); } } @@ -767,15 +767,6 @@ } /// - /// Looks up a localized string similar to Onbekend. - /// - public static string GuiCore_UpdateTitle_Unknown { - get { - return ResourceManager.GetString("GuiCore_UpdateTitle_Unknown", resourceCulture); - } - } - - /// /// Looks up a localized string similar to Exporteren mislukt.. /// public static string GuiExportHandler_ExportItemUsingDialog_Export_failed { @@ -1409,7 +1400,7 @@ } /// - /// Looks up a localized string similar to Openen van een nieuw Ringtoetsproject geannuleerd.. + /// Looks up a localized string similar to Aanmaken van een nieuw Ringtoetsproject geannuleerd.. /// public static string StorageCommandHandler_NewProject_Creating_new_project_cancelled { get { Index: Core/Common/src/Core.Common.Gui/Properties/Resources.resx =================================================================== diff -u -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 -r4c653ca26b45ca9141158597fd548fb052dbe0df --- Core/Common/src/Core.Common.Gui/Properties/Resources.resx (.../Resources.resx) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) +++ Core/Common/src/Core.Common.Gui/Properties/Resources.resx (.../Resources.resx) (revision 4c653ca26b45ca9141158597fd548fb052dbe0df) @@ -208,7 +208,7 @@ Berichten - + Nieuw Ringtoetsproject succesvol aangemaakt. @@ -520,17 +520,14 @@ Voor vragen: Helpdesk Water. - - Onbekend - Sla wijzigingen in het project op: {0}? Project aan het sluiten... - Openen van een nieuw Ringtoetsproject geannuleerd. + Aanmaken van een nieuw Ringtoetsproject geannuleerd. Algemeen filter Index: Core/Common/test/Core.Common.Gui.Test/Commands/StorageCommandHandlerTest.cs =================================================================== diff -u -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 -r4c653ca26b45ca9141158597fd548fb052dbe0df --- Core/Common/test/Core.Common.Gui.Test/Commands/StorageCommandHandlerTest.cs (.../StorageCommandHandlerTest.cs) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) +++ Core/Common/test/Core.Common.Gui.Test/Commands/StorageCommandHandlerTest.cs (.../StorageCommandHandlerTest.cs) (revision 4c653ca26b45ca9141158597fd548fb052dbe0df) @@ -49,15 +49,16 @@ // Setup const string savedProjectPath = @"C:\savedProject.rtd"; - var project = mocks.Stub(); - var projectStub = mocks.StrictMock(); + var oldProject = mocks.Stub(); + var newProject = mocks.Stub(); + var projectStorage = mocks.Stub(); var projectOwner = mocks.Stub(); - projectOwner.Stub(po => po.Project).Return(projectStub); + projectOwner.Stub(po => po.Project).Return(oldProject); projectOwner.Stub(po => po.ProjectFilePath).Return(savedProjectPath); var projectFactory = mocks.Stub(); - projectFactory.Stub(pf => pf.CreateNewProject()).Return(project); - projectOwner.Expect(po => po.SetProject(project, null)); + projectFactory.Stub(pf => pf.CreateNewProject()).Return(newProject); + projectOwner.Expect(po => po.SetProject(newProject, null)); var mainWindowController = mocks.Stub(); @@ -84,32 +85,6 @@ } [Test] - public void SaveProject_ProjectIsNull_DoNothingAndReturnFalse() - { - // Setup - var projectStorage = mocks.StrictMock(); - var mainWindowController = mocks.StrictMock(); - var projectOwner = mocks.StrictMock(); - var projectFactory = mocks.Stub(); - projectOwner.Expect(po => po.Project).Return(null); - mocks.ReplayAll(); - - var storageCommandHandler = new StorageCommandHandler( - projectStorage, - projectFactory, - projectOwner, - mainWindowController); - - // Call - var result = storageCommandHandler.SaveProject(); - - // Assert - Assert.IsFalse(result); - - mocks.VerifyAll(); - } - - [Test] public void SaveProject_SavingProjectThrowsStorageException_AbortSaveAndReturnFalse() { // Setup @@ -368,25 +343,25 @@ { // Setup var mainWindowController = mocks.Stub(); - var projectStub = mocks.StrictMock(); + var project = mocks.Stub(); var projectFactory = mocks.Stub(); var projectStorageMock = mocks.Stub(); - var projectOwnerStub = mocks.Stub(); - projectOwnerStub.Stub(po => po.Project).Return(projectStub); - projectOwnerStub.Stub(po => po.ProjectFilePath).Return(""); + var projectOwner = mocks.Stub(); + projectOwner.Stub(po => po.Project).Return(project); + projectOwner.Stub(po => po.ProjectFilePath).Return(""); mocks.ReplayAll(); var storageCommandHandler = new StorageCommandHandler( projectStorageMock, projectFactory, - projectOwnerStub, + projectOwner, mainWindowController); // Call - bool actionMaycontinue = storageCommandHandler.AskConfirmationUnsavedChanges(); + bool changesHandled = storageCommandHandler.HandleUnsavedChanges(); // Assert - Assert.IsTrue(actionMaycontinue); + Assert.IsTrue(changesHandled); mocks.VerifyAll(); } @@ -397,18 +372,18 @@ { // Setup var mainWindowController = mocks.Stub(); - var projectStub = mocks.Stub(); + var project = mocks.Stub(); var projectFactory = mocks.Stub(); const string projectName = "Project"; - projectStub.Name = projectName; + project.Name = projectName; var projectStorageMock = mocks.StrictMock(); - projectStorageMock.Expect(ps => ps.StageProject(projectStub)); + projectStorageMock.Expect(ps => ps.StageProject(project)); projectStorageMock.Expect(ps => ps.HasStagedProject).Return(true); projectStorageMock.Expect(ps => ps.HasStagedProjectChanges(null)).IgnoreArguments().Return(true); projectStorageMock.Expect(ps => ps.UnstageProject()); var projectOwnerStub = mocks.Stub(); - projectOwnerStub.Stub(po => po.Project).Return(projectStub); + projectOwnerStub.Stub(po => po.Project).Return(project); projectOwnerStub.Stub(po => po.ProjectFilePath).Return(""); mocks.ReplayAll(); @@ -429,10 +404,10 @@ }; // Call - bool actionMaycontinue = storageCommandHandler.AskConfirmationUnsavedChanges(); + bool changesHandled = storageCommandHandler.HandleUnsavedChanges(); // Assert - Assert.IsFalse(actionMaycontinue); + Assert.IsFalse(changesHandled); mocks.VerifyAll(); Assert.AreEqual(expectedMessage, messageBoxText); @@ -444,18 +419,18 @@ { // Setup var mainWindowController = mocks.Stub(); - var projectStub = mocks.Stub(); + var project = mocks.Stub(); var projectFactory = mocks.Stub(); const string projectName = "Project"; - projectStub.Name = projectName; + project.Name = projectName; var projectStorageMock = mocks.StrictMock(); - projectStorageMock.Expect(ps => ps.StageProject(projectStub)); + projectStorageMock.Expect(ps => ps.StageProject(project)); projectStorageMock.Expect(ps => ps.HasStagedProject).Return(true); projectStorageMock.Expect(ps => ps.HasStagedProjectChanges(null)).IgnoreArguments().Return(true); projectStorageMock.Expect(ps => ps.UnstageProject()); var projectOwnerStub = mocks.Stub(); - projectOwnerStub.Stub(po => po.Project).Return(projectStub); + projectOwnerStub.Stub(po => po.Project).Return(project); projectOwnerStub.Stub(po => po.ProjectFilePath).Return(""); mocks.ReplayAll(); @@ -476,10 +451,10 @@ }; // Call - bool actionMaycontinue = storageCommandHandler.AskConfirmationUnsavedChanges(); + bool changesHandled = storageCommandHandler.HandleUnsavedChanges(); // Assert - Assert.IsTrue(actionMaycontinue); + Assert.IsTrue(changesHandled); mocks.VerifyAll(); Assert.AreEqual(expectedMessage, messageBoxText); @@ -491,20 +466,20 @@ { // Setup var mainWindowController = mocks.Stub(); - var projectStub = mocks.Stub(); + var project = mocks.Stub(); var projectFactory = mocks.Stub(); const string projectName = "Project"; - projectStub.Name = projectName; + project.Name = projectName; var projectFilePath = "some path"; var projectStorageMock = mocks.StrictMock(); - projectStorageMock.Expect(ps => ps.StageProject(projectStub)); + projectStorageMock.Expect(ps => ps.StageProject(project)); projectStorageMock.Expect(ps => ps.HasStagedProject).Return(true).Repeat.Twice(); projectStorageMock.Expect(ps => ps.HasStagedProjectChanges(null)).IgnoreArguments().Return(true); projectStorageMock.Expect(ps => ps.UnstageProject()); var projectOwnerStub = mocks.Stub(); - projectOwnerStub.Stub(po => po.Project).Return(projectStub); + projectOwnerStub.Stub(po => po.Project).Return(project); projectOwnerStub.Stub(po => po.ProjectFilePath).Return(projectFilePath); projectStorageMock.Expect(p => p.SaveProjectAs(projectFilePath)); @@ -527,10 +502,10 @@ }; // Call - bool actionMaycontinue = storageCommandHandler.AskConfirmationUnsavedChanges(); + bool changesHandled = storageCommandHandler.HandleUnsavedChanges(); // Assert - Assert.IsTrue(actionMaycontinue); + Assert.IsTrue(changesHandled); mocks.VerifyAll(); Assert.AreEqual(expectedMessage, messageBoxText); Index: Core/Common/test/Core.Common.Gui.Test/GuiCoreTest.cs =================================================================== diff -u -r219cfb0a4817b990ca5e7a63b8670effe61669f7 -r4c653ca26b45ca9141158597fd548fb052dbe0df --- Core/Common/test/Core.Common.Gui.Test/GuiCoreTest.cs (.../GuiCoreTest.cs) (revision 219cfb0a4817b990ca5e7a63b8670effe61669f7) +++ Core/Common/test/Core.Common.Gui.Test/GuiCoreTest.cs (.../GuiCoreTest.cs) (revision 4c653ca26b45ca9141158597fd548fb052dbe0df) @@ -165,7 +165,6 @@ var mocks = new MockRepository(); var projectStore = mocks.Stub(); var projectFactory = CreateProjectFactory(mocks); - projectFactory.Stub(pf => pf.CreateNewProject()).Return(mocks.Stub()); mocks.ReplayAll(); var guiCoreSettings = new GuiCoreSettings();