Index: Application/Ringtoets/src/Application.Ringtoets.Storage/StorageSqLite.cs =================================================================== diff -u -r469d272ed231584a9b8312c6eaa26c274215e7d4 -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 --- Application/Ringtoets/src/Application.Ringtoets.Storage/StorageSqLite.cs (.../StorageSqLite.cs) (revision 469d272ed231584a9b8312c6eaa26c274215e7d4) +++ Application/Ringtoets/src/Application.Ringtoets.Storage/StorageSqLite.cs (.../StorageSqLite.cs) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) @@ -48,9 +48,7 @@ private const int currentDatabaseVersion = 4; private static readonly ILog log = LogManager.GetLogger(typeof(StorageSqLite)); - private string connectionString; - private RingtoetsProject stagedProject; - private ProjectEntity stagedProjectEntity; + private StagedProject stagedProject; public string FileFilter { @@ -64,7 +62,7 @@ { get { - return stagedProjectEntity != null; + return stagedProject != null; } } @@ -75,16 +73,14 @@ { throw new ArgumentNullException("project"); } - stagedProject = ringtoetsProject; - var registry = new PersistenceRegistry(); - stagedProjectEntity = ringtoetsProject.Create(registry); + + stagedProject = new StagedProject(ringtoetsProject, ringtoetsProject.Create(registry)); } public void UnstageProject() { stagedProject = null; - stagedProjectEntity = null; } public void SaveProjectAs(string databaseFilePath) @@ -97,11 +93,7 @@ try { BackedUpFileWriter writer = new BackedUpFileWriter(databaseFilePath); - writer.Perform(() => - { - SetConnectionToNewFile(databaseFilePath); - SaveProjectInDatabase(databaseFilePath); - }); + writer.Perform(() => { SaveProjectInDatabase(databaseFilePath); }); } catch (IOException e) { @@ -119,7 +111,7 @@ public IProject LoadProject(string databaseFilePath) { - SetConnectionToExistingFile(databaseFilePath); + var connectionString = GetConnectionToExistingFile(databaseFilePath); try { RingtoetsProject project; @@ -154,23 +146,18 @@ } } - public void CloseProject() + public bool HasStagedProjectChanges(string filePath) { - connectionString = null; - } - - public bool HasStagedProjectChanges() - { if (!HasStagedProject) { throw new InvalidOperationException("Call 'StageProject(IProject)' first before calling this method."); } - - if (string.IsNullOrWhiteSpace(connectionString)) + if (string.IsNullOrWhiteSpace(filePath)) { return true; } + var connectionString = GetConnectionToExistingFile(filePath); try { byte[] originalHash; @@ -179,7 +166,7 @@ originalHash = dbContext.VersionEntities.Select(v => v.FingerPrint).First(); } - byte[] hash = FingerprintHelper.Get(stagedProjectEntity); + byte[] hash = FingerprintHelper.Get(stagedProject.Entity); return !FingerprintHelper.AreEqual(originalHash, hash); } catch (QuotaExceededException e) @@ -188,36 +175,9 @@ } } - private void ValidateDatabaseVersion(RingtoetsEntities ringtoetsEntities, string databaseFilePath) - { - try - { - long databaseVersion = ringtoetsEntities.VersionEntities.Select(v => v.Version).Single(); - if (databaseVersion <= 0) - { - string m = string.Format(Resources.StorageSqLite_ValidateDatabaseVersion_DatabaseVersion_0_is_invalid, - databaseVersion); - var message = new FileReaderErrorMessageBuilder(databaseFilePath).Build(m); - throw new StorageValidationException(message); - } - - if (databaseVersion > currentDatabaseVersion) - { - string m = string.Format(Resources.StorageSqLite_ValidateDatabaseVersion_DatabaseVersion_0_higher_then_current_DatabaseVersion_1_, - databaseVersion, currentDatabaseVersion); - var message = new FileReaderErrorMessageBuilder(databaseFilePath).Build(m); - throw new StorageValidationException(message); - } - } - catch (InvalidOperationException e) - { - var message = new FileReaderErrorMessageBuilder(databaseFilePath).Build(Resources.StorageSqLite_ValidateDatabaseVersion_Database_must_have_one_VersionEntity_row); - throw new StorageValidationException(message, e); - } - } - private void SaveProjectInDatabase(string databaseFilePath) { + var connectionString = GetConnectionToNewFile(databaseFilePath); using (var dbContext = new RingtoetsEntities(connectionString)) { try @@ -226,9 +186,9 @@ { Version = currentDatabaseVersion, Timestamp = DateTime.Now, - FingerPrint = FingerprintHelper.Get(stagedProjectEntity) + FingerPrint = FingerprintHelper.Get(stagedProject.Entity) }); - dbContext.ProjectEntities.Add(stagedProjectEntity); + dbContext.ProjectEntities.Add(stagedProject.Entity); dbContext.SaveChanges(); } catch (DataException exception) @@ -247,10 +207,38 @@ } throw; } - stagedProject.Name = Path.GetFileNameWithoutExtension(databaseFilePath); + stagedProject.Model.Name = Path.GetFileNameWithoutExtension(databaseFilePath); } } + private static void ValidateDatabaseVersion(RingtoetsEntities ringtoetsEntities, string databaseFilePath) + { + try + { + long databaseVersion = ringtoetsEntities.VersionEntities.Select(v => v.Version).Single(); + if (databaseVersion <= 0) + { + string m = string.Format(Resources.StorageSqLite_ValidateDatabaseVersion_DatabaseVersion_0_is_invalid, + databaseVersion); + var message = new FileReaderErrorMessageBuilder(databaseFilePath).Build(m); + throw new StorageValidationException(message); + } + + if (databaseVersion > currentDatabaseVersion) + { + string m = string.Format(Resources.StorageSqLite_ValidateDatabaseVersion_DatabaseVersion_0_higher_then_current_DatabaseVersion_1_, + databaseVersion, currentDatabaseVersion); + var message = new FileReaderErrorMessageBuilder(databaseFilePath).Build(m); + throw new StorageValidationException(message); + } + } + catch (InvalidOperationException e) + { + var message = new FileReaderErrorMessageBuilder(databaseFilePath).Build(Resources.StorageSqLite_ValidateDatabaseVersion_Database_must_have_one_VersionEntity_row); + throw new StorageValidationException(message, e); + } + } + /// /// Attempts to set the connection to an existing storage file . /// @@ -261,10 +249,10 @@ /// the database has an invalid schema. /// /// - private void SetConnectionToExistingFile(string databaseFilePath) + private static string GetConnectionToExistingFile(string databaseFilePath) { FileUtils.ValidateFilePath(databaseFilePath); - SetConnectionToFile(databaseFilePath); + return GetConnectionToFile(databaseFilePath); } /// @@ -280,37 +268,37 @@ /// executing DatabaseStructure script failed /// /// - private void SetConnectionToNewFile(string databaseFilePath) + private static string GetConnectionToNewFile(string databaseFilePath) { FileUtils.ValidateFilePath(databaseFilePath); StorageSqliteCreator.CreateDatabaseStructure(databaseFilePath); - SetConnectionToFile(databaseFilePath); + return GetConnectionToFile(databaseFilePath); } /// /// Establishes a connection to an existing . /// /// The path of the database file to connect to. /// No file exists at . - private void SetConnectionToFile(string databaseFilePath) + private static string GetConnectionToFile(string databaseFilePath) { if (!File.Exists(databaseFilePath)) { var message = new FileReaderErrorMessageBuilder(databaseFilePath).Build(UtilsResources.Error_File_does_not_exist); throw new CouldNotConnectException(message); } - SetConnectionToStorage(databaseFilePath); + return GetConnectionToStorage(databaseFilePath); } /// /// Sets the connection to the Ringtoets database. /// /// The path of the file, which is used for creating exceptions. /// Thrown when the database does not contain the table version. - private void SetConnectionToStorage(string databaseFilePath) + private static string GetConnectionToStorage(string databaseFilePath) { - connectionString = SqLiteConnectionStringBuilder.BuildSqLiteEntityConnectionString(databaseFilePath); + var connectionString = SqLiteConnectionStringBuilder.BuildSqLiteEntityConnectionString(databaseFilePath); using (var dbContext = new RingtoetsEntities(connectionString)) { @@ -325,6 +313,7 @@ throw new StorageValidationException(message, exception); } } + return connectionString; } /// @@ -334,7 +323,7 @@ /// The critical error message. /// Exception that caused this exception to be thrown. /// Returns a new . - private StorageException CreateStorageWriterException(string databaseFilePath, string errorMessage, Exception innerException) + private static StorageException CreateStorageWriterException(string databaseFilePath, string errorMessage, Exception innerException) { var message = new FileWriterErrorMessageBuilder(databaseFilePath).Build(errorMessage); return new StorageException(message, innerException); @@ -347,10 +336,22 @@ /// The critical error message. /// Exception that caused this exception to be thrown. /// Returns a new . - private StorageException CreateStorageReaderException(string databaseFilePath, string errorMessage, Exception innerException = null) + private static StorageException CreateStorageReaderException(string databaseFilePath, string errorMessage, Exception innerException = null) { var message = new FileReaderErrorMessageBuilder(databaseFilePath).Build(errorMessage); return new StorageException(message, innerException); } + + private class StagedProject + { + public StagedProject(RingtoetsProject projectModel, ProjectEntity projectEntity) + { + Model = projectModel; + Entity = projectEntity; + } + + public RingtoetsProject Model { get; private set; } + public ProjectEntity Entity { get; private set; } + } } } \ No newline at end of file Index: Application/Ringtoets/test/Application.Ringtoets.Storage.Test/IntegrationTests/StorageSqLiteIntegrationTest.cs =================================================================== diff -u -r2aa9661130f20e88c41dac921ffb780573dcf799 -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 --- Application/Ringtoets/test/Application.Ringtoets.Storage.Test/IntegrationTests/StorageSqLiteIntegrationTest.cs (.../StorageSqLiteIntegrationTest.cs) (revision 2aa9661130f20e88c41dac921ffb780573dcf799) +++ Application/Ringtoets/test/Application.Ringtoets.Storage.Test/IntegrationTests/StorageSqLiteIntegrationTest.cs (.../StorageSqLiteIntegrationTest.cs) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) @@ -161,97 +161,61 @@ [Test] [STAThread] - public void GivenRingtoetsGuiWithStorageSql_WhenRunWithValidFile_ProjectSet() + [TestCase(null)] + [TestCase("")] + [TestCase(" ")] + public void GivenRingtoetsGuiWithStorageSql_WhenRunWithEmptyFile_DefaultProjectStillSet(string testFile) { // Given var projectStore = new StorageSqLite(); - RingtoetsProject fullProject = RingtoetsProjectTestHelper.GetFullTestProject(); - var expectedProjectName = Path.GetFileNameWithoutExtension(tempRingtoetsFile); - var expectedProjectDescription = fullProject.Description; - // Precondition - SqLiteDatabaseHelper.CreateValidRingtoetsDatabase(tempRingtoetsFile, fullProject); - using (var gui = new GuiCore(new MainWindow(), projectStore, new RingtoetsProjectFactory(), new GuiCoreSettings())) { // When - Action action = () => gui.Run(tempRingtoetsFile); + gui.Run(testFile); // Then - var expectedMessages = new[] - { - "Openen van bestaand Ringtoetsproject.", - "Bestaand Ringtoetsproject succesvol geopend." - }; - TestHelper.AssertLogMessagesAreGenerated(action, expectedMessages, 3); - Assert.AreEqual(tempRingtoetsFile, gui.ProjectFilePath); - Assert.NotNull(gui.Project); - Assert.AreEqual(expectedProjectName, gui.Project.Name); - Assert.AreEqual(expectedProjectDescription, gui.Project.Description); - - Assert.IsInstanceOf(gui.Project); - AssertProjectsAreEqual((RingtoetsProject) gui.Project, fullProject); - } - } - - [Test] - [STAThread] - public void GivenRingtoetsGuiWithStorageSql_WhenRunWithInvalidFile_EmptyProjectSet() - { - // Given - var testFile = "SomeFile"; - var projectStore = new StorageSqLite(); - - using (var gui = new GuiCore(new MainWindow(), projectStore, new RingtoetsProjectFactory(), new GuiCoreSettings())) - { - // When - Action action = () => gui.Run(testFile); - - // Then - var expectedMessages = new[] - { - "Openen van bestaand Ringtoetsproject.", - string.Format("Fout bij het lezen van bestand '{0}': het bestand bestaat niet.", testFile), - "Het is niet gelukt om het Ringtoetsproject te laden.", - "Nieuw project aanmaken..." - }; - TestHelper.AssertLogMessagesAreGenerated(action, expectedMessages, 5); Assert.AreEqual(null, gui.ProjectFilePath); Assert.NotNull(gui.Project); Assert.AreEqual("Project", gui.Project.Name); Assert.IsEmpty(gui.Project.Description); Assert.IsInstanceOf(gui.Project); - CollectionAssert.IsEmpty(((RingtoetsProject) gui.Project).AssessmentSections); + CollectionAssert.IsEmpty(((RingtoetsProject)gui.Project).AssessmentSections); } } [Test] [STAThread] - [TestCase(null)] - [TestCase("")] - [TestCase(" ")] - public void GivenRingtoetsGuiWithStorageSql_WhenRunWithEmptyFile_EmptyProjectSet(string testFile) + public void GivenRingtoetsGuiWithStorageSql_WhenRunWithValidFile_ProjectSet() { // Given var projectStore = new StorageSqLite(); + RingtoetsProject fullProject = RingtoetsProjectTestHelper.GetFullTestProject(); + var expectedProjectName = Path.GetFileNameWithoutExtension(tempRingtoetsFile); + var expectedProjectDescription = fullProject.Description; + // Precondition + SqLiteDatabaseHelper.CreateValidRingtoetsDatabase(tempRingtoetsFile, fullProject); + using (var gui = new GuiCore(new MainWindow(), projectStore, new RingtoetsProjectFactory(), new GuiCoreSettings())) { // When - Action action = () => gui.Run(testFile); + Action action = () => gui.Run(tempRingtoetsFile); // Then var expectedMessages = new[] { - "Nieuw project aanmaken..." + "Openen van bestaand Ringtoetsproject...", + "Bestaand Ringtoetsproject succesvol geopend." }; - TestHelper.AssertLogMessagesAreGenerated(action, expectedMessages, 2); - Assert.AreEqual(null, gui.ProjectFilePath); + TestHelper.AssertLogMessagesAreGenerated(action, expectedMessages, 3); + Assert.AreEqual(tempRingtoetsFile, gui.ProjectFilePath); Assert.NotNull(gui.Project); - Assert.AreEqual("Project", gui.Project.Name); - Assert.IsEmpty(gui.Project.Description); + Assert.AreEqual(expectedProjectName, gui.Project.Name); + Assert.AreEqual(expectedProjectDescription, gui.Project.Description); + Assert.IsInstanceOf(gui.Project); - CollectionAssert.IsEmpty(((RingtoetsProject) gui.Project).AssessmentSections); + AssertProjectsAreEqual((RingtoetsProject) gui.Project, fullProject); } } Index: Application/Ringtoets/test/Application.Ringtoets.Storage.Test/StorageSqLiteTest.cs =================================================================== diff -u -r2aa9661130f20e88c41dac921ffb780573dcf799 -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 --- Application/Ringtoets/test/Application.Ringtoets.Storage.Test/StorageSqLiteTest.cs (.../StorageSqLiteTest.cs) (revision 2aa9661130f20e88c41dac921ffb780573dcf799) +++ Application/Ringtoets/test/Application.Ringtoets.Storage.Test/StorageSqLiteTest.cs (.../StorageSqLiteTest.cs) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) @@ -489,22 +489,22 @@ Assert.IsFalse(storage.HasStagedProject); // Call - TestDelegate call = () => storage.HasStagedProjectChanges(); + TestDelegate call = () => storage.HasStagedProjectChanges(null); // Assert string message = Assert.Throws(call).Message; Assert.AreEqual("Call 'StageProject(IProject)' first before calling this method.", message); } [Test] - public void HasStagedProjectChanges_NoConnectionSet_ReturnsTrue() + public void HasStagedProjectChanges_NoPathGiven_ReturnsTrue() { // Setup StorageSqLite storageSqLite = new StorageSqLite(); storageSqLite.StageProject(new RingtoetsProject()); // Call - bool hasChanges = storageSqLite.HasStagedProjectChanges(); + bool hasChanges = storageSqLite.HasStagedProjectChanges(null); // Assert Assert.IsTrue(hasChanges); @@ -525,7 +525,7 @@ storageSqLite.StageProject(loadedProject); // Call - bool hasChanges = storageSqLite.HasStagedProjectChanges(); + bool hasChanges = storageSqLite.HasStagedProjectChanges(tempRingtoetsFile); // Assert Assert.IsFalse(hasChanges); @@ -538,35 +538,6 @@ } [Test] - public void HasStagedProjectChanges_ValidProjectLoadedAndThenClosed_ReturnsTrue() - { - // Setup - StorageSqLite storageSqLite = new StorageSqLite(); - RingtoetsProject storedProject = new RingtoetsProject(); - - FileDisposeHelper fileDisposeHelper = new FileDisposeHelper(tempRingtoetsFile); - try - { - SqLiteDatabaseHelper.CreateValidRingtoetsDatabase(tempRingtoetsFile, storedProject); - IProject loadedProject = storageSqLite.LoadProject(tempRingtoetsFile); - storageSqLite.CloseProject(); - - storageSqLite.StageProject(loadedProject); - - // Call - bool hasChanges = storageSqLite.HasStagedProjectChanges(); - - // Assert - Assert.IsTrue(hasChanges); - } - finally - { - CallGarbageCollector(); - fileDisposeHelper.Dispose(); - } - } - - [Test] public void HasStagedProjectChanges_ValidProjectLoadedWithUnaffectedChange_ReturnsFalse() { // Setup @@ -583,7 +554,7 @@ // Call loadedProject.Name = changedName; - bool hasChanges = storageSqLite.HasStagedProjectChanges(); + bool hasChanges = storageSqLite.HasStagedProjectChanges(tempRingtoetsFile); // Assert Assert.IsFalse(hasChanges); @@ -613,7 +584,7 @@ storageSqLite.StageProject(loadedProject); // Call - bool hasChanges = storageSqLite.HasStagedProjectChanges(); + bool hasChanges = storageSqLite.HasStagedProjectChanges(tempRingtoetsFile); // Assert Assert.IsTrue(hasChanges); @@ -645,7 +616,7 @@ storage.StageProject(projectMock); // Call - var hasChanges = storage.HasStagedProjectChanges(); + var hasChanges = storage.HasStagedProjectChanges(tempRingtoetsFile); // Assert Assert.IsFalse(hasChanges); Index: Core/Common/src/Core.Common.Base/Storage/IStoreProject.cs =================================================================== diff -u -r19aad937d34ae8aa2309b5b8aba14c31b1887d26 -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 --- Core/Common/src/Core.Common.Base/Storage/IStoreProject.cs (.../IStoreProject.cs) (revision 19aad937d34ae8aa2309b5b8aba14c31b1887d26) +++ Core/Common/src/Core.Common.Base/Storage/IStoreProject.cs (.../IStoreProject.cs) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) @@ -41,7 +41,8 @@ bool HasStagedProject { get; } /// - /// Converts the staged project to a new storage entry. + /// Converts the staged project to a new storage entry. Upon return, the staged project is released and + /// will be false. /// /// Arguments required to connect to the storage. /// Thrown when no project has been staged @@ -76,11 +77,6 @@ IProject LoadProject(string connectionArguments); /// - /// Removes the connection to a database that has been made previously. - /// - void CloseProject(); - - /// /// Stages the project (does some prep-work and validity checking) to be saved. /// /// The project to be prepared to be saved. @@ -93,13 +89,16 @@ void UnstageProject(); /// - /// Checks if the staged project differs from the last saved or loaded , if any. + /// Checks if the staged project differs from the which can be found at + /// , if any. /// - /// true if last was set and is different - /// from the staged project, false otherwise. + /// The currently set path to the loaded project. + /// true if can be loaded from + /// and is different from the staged project, false otherwise. + /// Thrown when is invalid. /// Thrown when no project has been staged. /// Thrown when the staged project contains /// more than unique object instances. - bool HasStagedProjectChanges(); + bool HasStagedProjectChanges(string filePath); } } \ No newline at end of file Index: Core/Common/src/Core.Common.Gui/Commands/IStorageCommands.cs =================================================================== diff -u -r1eed3e3f652618c52a462edc502cfd4250772314 -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 --- Core/Common/src/Core.Common.Gui/Commands/IStorageCommands.cs (.../IStorageCommands.cs) (revision 1eed3e3f652618c52a462edc502cfd4250772314) +++ Core/Common/src/Core.Common.Gui/Commands/IStorageCommands.cs (.../IStorageCommands.cs) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) @@ -33,6 +33,8 @@ /// void CreateNewProject(); + bool AskConfirmationUnsavedChanges(); + /// /// Asks the user for a file-location to save the current project, then proceeds /// to persist the data to that location. Index: Core/Common/src/Core.Common.Gui/Commands/StorageCommandHandler.cs =================================================================== diff -u -r0df7cded06f5afbac08b97e025242ba55c90ec57 -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 --- Core/Common/src/Core.Common.Gui/Commands/StorageCommandHandler.cs (.../StorageCommandHandler.cs) (revision 0df7cded06f5afbac08b97e025242ba55c90ec57) +++ Core/Common/src/Core.Common.Gui/Commands/StorageCommandHandler.cs (.../StorageCommandHandler.cs) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) @@ -40,35 +40,38 @@ private readonly IWin32Window dialogParent; private readonly IProjectOwner projectOwner; private readonly IStoreProject projectPersistor; + private readonly IProjectFactory projectFactory; /// /// Initializes a new instance of the class. /// /// Class responsible to storing and loading the application project. + /// /// The class owning the application project. /// Controller for UI. - public StorageCommandHandler(IStoreProject projectStorage, IProjectOwner projectOwner, IWin32Window dialogParent) + public StorageCommandHandler(IStoreProject projectStorage, IProjectFactory projectFactory, IProjectOwner projectOwner, IWin32Window dialogParent) { this.dialogParent = dialogParent; this.projectOwner = projectOwner; projectPersistor = projectStorage; + this.projectFactory = projectFactory; } /// /// Checks if an action may continue when changes are detected. /// /// True if the action should continue, false otherwise. - public bool ContinueIfHasChanges() + public bool AskConfirmationUnsavedChanges() { - var project = projectOwner.Project; - if (project == null || projectOwner.IsCurrentNew()) + if (IsCurrentNew()) { return true; } + var project = projectOwner.Project; projectPersistor.StageProject(project); try { - if (!projectPersistor.HasStagedProjectChanges()) + if (!projectPersistor.HasStagedProjectChanges(projectOwner.ProjectFilePath)) { projectPersistor.UnstageProject(); return true; @@ -86,22 +89,29 @@ { projectPersistor.UnstageProject(); } + if (!openSaveOrDiscardProjectDialog) + { + log.Info(Resources.StorageCommandHandler_NewProject_Creating_new_project_cancelled); + } + return openSaveOrDiscardProjectDialog; } + private bool IsCurrentNew() + { + return projectOwner.Project.Equals(projectFactory.CreateNewProject()); + } + public void CreateNewProject() { - if (!ContinueIfHasChanges()) + if (!AskConfirmationUnsavedChanges()) { log.Info(Resources.StorageCommandHandler_NewProject_Creating_new_project_cancelled); return; } - CloseProject(); - - log.Info(Resources.StorageCommandHandler_NewProject_Creating_new_project); - projectOwner.CreateNewProject(); - projectOwner.ProjectFilePath = ""; - log.Info(Resources.StorageCommandHandler_NewProject_Created_new_project_succesful); + log.Info(Resources.Creating_new_project); + projectOwner.SetProject(projectFactory.CreateNewProject(), null); + log.Info(Resources.Created_new_project_succesful); } public bool OpenExistingProject() @@ -112,7 +122,7 @@ Title = Resources.OpenFileDialog_Title }) { - if (openFileDialog.ShowDialog(dialogParent) != DialogResult.Cancel && ContinueIfHasChanges()) + if (openFileDialog.ShowDialog(dialogParent) != DialogResult.Cancel && AskConfirmationUnsavedChanges()) { return OpenExistingProject(openFileDialog.FileName); } @@ -126,20 +136,19 @@ { log.Info(Resources.StorageCommandHandler_OpenExistingProject_Opening_existing_project); - CloseProject(); - var newProject = LoadProjectFromStorage(filePath); var isOpenProjectSuccessful = newProject != null; - if (!isOpenProjectSuccessful) + + if (isOpenProjectSuccessful) { - log.Error(Resources.StorageCommandHandler_OpeningExistingProject_Opening_existing_project_failed); + log.Info(Resources.StorageCommandHandler_OpeningExistingProject_Opening_existing_project_successful); + newProject.Name = Path.GetFileNameWithoutExtension(filePath); + projectOwner.SetProject(newProject, filePath); } else { - log.Info(Resources.StorageCommandHandler_OpeningExistingProject_Opening_existing_project_successful); - newProject.Name = Path.GetFileNameWithoutExtension(filePath); - projectOwner.ProjectFilePath = filePath; - projectOwner.Project = newProject; + log.Error(Resources.StorageCommandHandler_OpeningExistingProject_Opening_existing_project_failed); + projectOwner.SetProject(projectFactory.CreateNewProject(), null); } return isOpenProjectSuccessful; @@ -165,9 +174,9 @@ } // Save was successful, store location - projectOwner.ProjectFilePath = filePath; project.Name = Path.GetFileNameWithoutExtension(filePath); - project.NotifyObservers(); + projectOwner.SetProject(project, filePath); + log.Info(string.Format(CultureInfo.CurrentCulture, Resources.StorageCommandHandler_SaveProject_Successfully_saved_project_0_, project.Name)); @@ -200,17 +209,6 @@ return true; } - private void CloseProject() - { - if (projectOwner.Project == null) - { - return; - } - projectOwner.CloseProject(); - projectOwner.ProjectFilePath = ""; - projectPersistor.CloseProject(); - } - private bool OpenSaveOrDiscardProjectDialog() { var confirmation = MessageBox.Show( Index: Core/Common/src/Core.Common.Gui/Forms/MainWindow/MainWindow.xaml.cs =================================================================== diff -u -r00f45b1bba92f5171087885039c8b8261860a1ba -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 --- Core/Common/src/Core.Common.Gui/Forms/MainWindow/MainWindow.xaml.cs (.../MainWindow.xaml.cs) (revision 00f45b1bba92f5171087885039c8b8261860a1ba) +++ Core/Common/src/Core.Common.Gui/Forms/MainWindow/MainWindow.xaml.cs (.../MainWindow.xaml.cs) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) @@ -431,7 +431,6 @@ private void OnFileNewClicked(object sender, RoutedEventArgs e) { - // Original code: commands.StorageCommands.CreateNewProject(); ValidateItems(); } Index: Core/Common/src/Core.Common.Gui/GuiCore.cs =================================================================== diff -u -r00f45b1bba92f5171087885039c8b8261860a1ba -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 --- Core/Common/src/Core.Common.Gui/GuiCore.cs (.../GuiCore.cs) (revision 00f45b1bba92f5171087885039c8b8261860a1ba) +++ Core/Common/src/Core.Common.Gui/GuiCore.cs (.../GuiCore.cs) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) @@ -62,8 +62,6 @@ private static bool isAlreadyRunningInstanceOfIGui; private static string instanceCreationStackTrace; - private readonly IProjectFactory projectFactory; - private bool isExiting; private bool runFinished; private SplashScreen splashScreen; @@ -107,7 +105,6 @@ { throw new ArgumentNullException("fixedSettings"); } - this.projectFactory = projectFactory; MainWindow = mainWindow; FixedSettings = fixedSettings; @@ -118,7 +115,7 @@ Plugins = new List(); viewCommandHandler = new ViewCommandHandler(this, this, this); - storageCommandHandler = new StorageCommandHandler(projectStore, this, MainWindow); + storageCommandHandler = new StorageCommandHandler(projectStore, projectFactory, this, MainWindow); importCommandHandler = new GuiImportHandler(MainWindow, Plugins.SelectMany(p => p.GetImportInfos())); exportCommandHandler = new GuiExportHandler(MainWindow, Plugins.SelectMany(p => p.GetExportInfos())); @@ -127,6 +124,8 @@ ProjectOpened += ApplicationProjectOpened; projectObserver = new Observer(UpdateTitle); + + Project = projectFactory.CreateNewProject(); } public IPropertyResolver PropertyResolver { get; private set; } @@ -176,7 +175,7 @@ } // Store project? - if (!storageCommandHandler.ContinueIfHasChanges()) + if (!storageCommandHandler.AskConfirmationUnsavedChanges()) { // User pressed cancel return; @@ -239,7 +238,6 @@ } Selection = null; - Project = null; if (ViewHost != null) { @@ -348,16 +346,11 @@ private void InitializeProjectFromPath(string projectPath) { - var setDefaultProject = string.IsNullOrWhiteSpace(projectPath); - if (!setDefaultProject) + var isPathGiven = !string.IsNullOrWhiteSpace(projectPath); + if (isPathGiven) { - setDefaultProject = !storageCommandHandler.OpenExistingProject(projectPath); + storageCommandHandler.OpenExistingProject(projectPath); } - if (setDefaultProject) - { - log.Info(Resources.GuiCore_Run_Creating_new_project); - CreateNewProject(); - } } private void DeactivatePlugin(PluginBase plugin) @@ -598,42 +591,34 @@ { return project; } - set + private set { - if (project != null) + if (value == null) { - ViewCommands.RemoveAllViewsForItem(project); + throw new ArgumentNullException("value", @"There should always be a project."); } - - project = value; - projectObserver.Observable = project; - UpdateTitle(); - - if (project != null) + if (!ReferenceEquals(project, value)) { + ViewCommands.RemoveAllViewsForItem(project); + project = value; + projectObserver.Observable = project; + if (ProjectOpened != null) { ProjectOpened(project); } } + + UpdateTitle(); } } - public bool IsCurrentNew() + public void SetProject(IProject newProject, string projectPath) { - return Project != null && Project.Equals(projectFactory.CreateNewProject()); + Project = newProject; + ProjectFilePath = projectPath; } - public void CreateNewProject() - { - Project = projectFactory.CreateNewProject(); - } - - public void CloseProject() - { - Project = null; - } - #endregion #region Implementation: IApplicationSelection Index: Core/Common/src/Core.Common.Gui/IProjectOwner.cs =================================================================== diff -u -rbe66e1bec38a780abb27fedea8632acf4d24a173 -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 --- Core/Common/src/Core.Common.Gui/IProjectOwner.cs (.../IProjectOwner.cs) (revision be66e1bec38a780abb27fedea8632acf4d24a173) +++ Core/Common/src/Core.Common.Gui/IProjectOwner.cs (.../IProjectOwner.cs) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) @@ -37,27 +37,23 @@ /// /// Gets or sets the project of the application. /// - IProject Project { get; set; } + /// 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. /// - string ProjectFilePath { get; set; } + string ProjectFilePath { get; } /// - /// Indicates whether the current is a new project. + /// Sets the project and the path of the project that was used for obtaining it. /// - /// true if is equal to a new project, false otherwise. - bool IsCurrentNew(); - - /// - /// Creates a new . - /// - void CreateNewProject(); - - /// - /// Closes the current . - /// - void CloseProject(); + /// The project that is used in the application. + /// The file location where the was + /// loaded from, or null if it was not loaded from a file source. + /// Thrown when is null. + void SetProject(IProject project, string projectPath); } } \ No newline at end of file Index: Core/Common/src/Core.Common.Gui/Properties/Resources.Designer.cs =================================================================== diff -u -r45607cccad23ec38561120539e1109e69a9e82cb -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 --- Core/Common/src/Core.Common.Gui/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 45607cccad23ec38561120539e1109e69a9e82cb) +++ Core/Common/src/Core.Common.Gui/Properties/Resources.Designer.cs (.../Resources.Designer.cs) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) @@ -302,6 +302,24 @@ } /// + /// Looks up a localized string similar to Nieuw Ringtoetsproject succesvol aangemaakt.. + /// + public static string Created_new_project_succesful { + get { + return ResourceManager.GetString("Created_new_project_succesful", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Nieuw Ringtoetsproject aanmaken.... + /// + public static string Creating_new_project { + get { + return ResourceManager.GetString("Creating_new_project", resourceCulture); + } + } + + /// /// Looks up a localized string similar to Verwij&deren.... /// public static string Delete { @@ -731,15 +749,6 @@ } /// - /// Looks up a localized string similar to Nieuw project aanmaken.... - /// - public static string GuiCore_Run_Creating_new_project { - get { - return ResourceManager.GetString("GuiCore_Run_Creating_new_project", resourceCulture); - } - } - - /// /// Looks up a localized string similar to Gestart in {0:f2} seconden.. /// public static string GuiCore_Run_Started_in_0_f2_sec { @@ -1400,24 +1409,6 @@ } /// - /// Looks up a localized string similar to Nieuw Ringtoetsproject succesvol geopend.. - /// - public static string StorageCommandHandler_NewProject_Created_new_project_succesful { - get { - return ResourceManager.GetString("StorageCommandHandler_NewProject_Created_new_project_succesful", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Openen van nieuw Ringtoetsproject.. - /// - public static string StorageCommandHandler_NewProject_Creating_new_project { - get { - return ResourceManager.GetString("StorageCommandHandler_NewProject_Creating_new_project", resourceCulture); - } - } - - /// /// Looks up a localized string similar to Openen van een nieuw Ringtoetsproject geannuleerd.. /// public static string StorageCommandHandler_NewProject_Creating_new_project_cancelled { @@ -1427,7 +1418,7 @@ } /// - /// Looks up a localized string similar to Openen van bestaand Ringtoetsproject.. + /// Looks up a localized string similar to Openen van bestaand Ringtoetsproject.... /// public static string StorageCommandHandler_OpenExistingProject_Opening_existing_project { get { Index: Core/Common/src/Core.Common.Gui/Properties/Resources.resx =================================================================== diff -u -r45607cccad23ec38561120539e1109e69a9e82cb -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 --- Core/Common/src/Core.Common.Gui/Properties/Resources.resx (.../Resources.resx) (revision 45607cccad23ec38561120539e1109e69a9e82cb) +++ Core/Common/src/Core.Common.Gui/Properties/Resources.resx (.../Resources.resx) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) @@ -154,8 +154,8 @@ Kritieke fout opgetreden tijdens deactivering van de grafische interface plugin. - - Nieuw project aanmaken... + + Nieuw Ringtoetsproject aanmaken... Berichten @@ -208,8 +208,8 @@ Berichten - - Nieuw Ringtoetsproject succesvol geopend. + + Nieuw Ringtoetsproject succesvol aangemaakt. Beeld @@ -253,9 +253,6 @@ Openen - - Openen van nieuw Ringtoetsproject. - Logbestand kan niet worden geopend. @@ -269,7 +266,7 @@ Eigenschappen - Openen van bestaand Ringtoetsproject. + Openen van bestaand Ringtoetsproject... ../Resources/brick.png;System.Drawing.Bitmap, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a Index: Core/Common/test/Core.Common.Gui.Test/Commands/StorageCommandHandlerTest.cs =================================================================== diff -u -r11f0867b39150ae5fac83dc178a89fee46d27611 -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 --- Core/Common/test/Core.Common.Gui.Test/Commands/StorageCommandHandlerTest.cs (.../StorageCommandHandlerTest.cs) (revision 11f0867b39150ae5fac83dc178a89fee46d27611) +++ Core/Common/test/Core.Common.Gui.Test/Commands/StorageCommandHandlerTest.cs (.../StorageCommandHandlerTest.cs) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) @@ -24,7 +24,6 @@ using Core.Common.Base.Data; using Core.Common.Base.Storage; using Core.Common.Gui.Commands; -using Core.Common.Gui.Properties; using Core.Common.Gui.Selection; using Core.Common.TestUtil; using NUnit.Extensions.Forms; @@ -45,56 +44,28 @@ } [Test] - public void CreateNewProject_NoProjectSet_NewProjectIsSet() - { - // Setup - var projectStorage = mocks.Stub(); - var projectOwner = mocks.Stub(); - projectOwner.Expect(po => po.CreateNewProject()); - var mainWindowController = mocks.Stub(); - - mocks.ReplayAll(); - - var storageCommandHandler = new StorageCommandHandler( - projectStorage, - projectOwner, - mainWindowController); - - // Call - Action call = () => storageCommandHandler.CreateNewProject(); - - // Assert - var expectedMessages = new[] - { - "Openen van nieuw Ringtoetsproject.", - "Nieuw Ringtoetsproject succesvol geopend." - }; - TestHelper.AssertLogMessagesAreGenerated(call, expectedMessages, 2); - Assert.AreEqual("", projectOwner.ProjectFilePath); - mocks.VerifyAll(); - } - - [Test] public void CreateNewProject_SavedProjectThenNewProject_NewProjectAndPathAreSet() { // Setup const string savedProjectPath = @"C:\savedProject.rtd"; - var projectMock = mocks.StrictMock(); + var project = mocks.Stub(); + var projectStub = mocks.StrictMock(); var projectStorage = mocks.Stub(); var projectOwner = mocks.Stub(); - projectOwner.Project = projectMock; - projectOwner.ProjectFilePath = savedProjectPath; - projectOwner.Expect(po => po.CreateNewProject()); - projectOwner.Expect(po => po.IsCurrentNew()).Return(true); - projectOwner.Expect(po => po.CloseProject()); + projectOwner.Stub(po => po.Project).Return(projectStub); + 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)); var mainWindowController = mocks.Stub(); mocks.ReplayAll(); var storageCommandHandler = new StorageCommandHandler( projectStorage, + projectFactory, projectOwner, mainWindowController); @@ -104,14 +75,11 @@ // Assert var expectedMessages = new[] { - "Openen van nieuw Ringtoetsproject.", - "Nieuw Ringtoetsproject succesvol geopend." + "Nieuw Ringtoetsproject aanmaken...", + "Nieuw Ringtoetsproject succesvol aangemaakt." }; TestHelper.AssertLogMessagesAreGenerated(call, expectedMessages, 2); - Assert.IsInstanceOf(projectOwner.Project); - Assert.AreEqual("", projectOwner.ProjectFilePath); - mocks.VerifyAll(); } @@ -122,11 +90,13 @@ 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); @@ -144,24 +114,26 @@ { // Setup const string someValidFilePath = ""; - var projectMock = mocks.Stub(); + var projectStub = mocks.Stub(); + var projectFactory = mocks.Stub(); const string exceptionMessage = ""; var projectStorage = mocks.StrictMock(); projectStorage.Expect(ps => ps.HasStagedProject).Return(false); - projectStorage.Expect(ps => ps.StageProject(projectMock)); + projectStorage.Expect(ps => ps.StageProject(projectStub)); projectStorage.Expect(ps => ps.SaveProjectAs(someValidFilePath)). Throw(new StorageException(exceptionMessage, new Exception("l33t h4xor!"))); var mainWindowController = mocks.StrictMock(); var projectOwner = mocks.Stub(); - projectOwner.Project = projectMock; - projectOwner.ProjectFilePath = someValidFilePath; + projectOwner.Stub(po => po.Project).Return(projectStub); + projectOwner.Stub(po => po.ProjectFilePath).Return(someValidFilePath); mocks.ReplayAll(); var storageCommandHandler = new StorageCommandHandler( projectStorage, + projectFactory, projectOwner, mainWindowController); @@ -185,22 +157,24 @@ public void SaveProject_SavingProjectIsSuccessful_LogSuccessAndReturnTrue() { // Setup - var projectMock = mocks.Stub(); + var projectStub = mocks.Stub(); + var projectFactory = mocks.Stub(); const string someValidFilePath = ""; var projectStorage = mocks.Stub(); - projectStorage.Expect(ps => ps.StageProject(projectMock)); + projectStorage.Expect(ps => ps.StageProject(projectStub)); projectStorage.Expect(ps => ps.HasStagedProject).Return(false); projectStorage.Expect(ps => ps.SaveProjectAs(someValidFilePath)); var mainWindowController = mocks.StrictMock(); var projectOwner = mocks.Stub(); - projectOwner.Project = projectMock; - projectOwner.ProjectFilePath = someValidFilePath; + projectOwner.Stub(po => po.Project).Return(projectStub); + projectOwner.Stub(po => po.ProjectFilePath).Return(someValidFilePath); mocks.ReplayAll(); var storageCommandHandler = new StorageCommandHandler( projectStorage, + projectFactory, projectOwner, mainWindowController); @@ -210,29 +184,35 @@ // Assert var expectedMessage = string.Format("Het Ringtoetsproject '{0}' is succesvol opgeslagen.", - projectMock.Name); + projectStub.Name); TestHelper.AssertLogMessageIsGenerated(call, expectedMessage, 1); Assert.IsTrue(result); mocks.VerifyAll(); } [Test] - public void OpenExistingProject_LoadingProjectThrowsStorageException_LogFailureAndReturnFalse() + public void OpenExistingProject_LoadingProjectThrowsStorageException_LogFailureCreateNewProjectAndReturnFalse() { // Setup const string pathToSomeInvalidFile = ""; const string goodErrorMessageText = ""; + var project = mocks.Stub(); var projectStorage = mocks.Stub(); + var projectFactory = mocks.Stub(); + projectFactory.Stub(pf => pf.CreateNewProject()).Return(project); projectStorage.Stub(ps => ps.LoadProject(pathToSomeInvalidFile)) .Throw(new StorageException(goodErrorMessageText, new Exception("H@X!"))); var mainWindowController = mocks.Stub(); var projectOwner = mocks.Stub(); + projectOwner.Stub(po => po.Project).Return(project); + projectOwner.Stub(po => po.SetProject(project, null)); mocks.ReplayAll(); var storageCommandHandler = new StorageCommandHandler( projectStorage, + projectFactory, projectOwner, mainWindowController); @@ -243,7 +223,7 @@ // Assert var expectedMessages = new[] { - "Openen van bestaand Ringtoetsproject.", + "Openen van bestaand Ringtoetsproject...", goodErrorMessageText, "Het is niet gelukt om het Ringtoetsproject te laden." }; @@ -254,20 +234,26 @@ } [Test] - public void OpenExistingProject_LoadingNull_LogFailureAndReturnFalse() + public void OpenExistingProject_LoadingNull_LogFailureCreateNewProjectAndReturnFalse() { // Setup const string pathToSomeInvalidFile = ""; + IProject project = mocks.Stub(); var projectStorage = mocks.Stub(); + var projectFactory = mocks.Stub(); + projectFactory.Stub(pf => pf.CreateNewProject()).Return(project); projectStorage.Stub(ps => ps.LoadProject(pathToSomeInvalidFile)) .Return(null); var mainWindowController = mocks.Stub(); var projectOwner = mocks.Stub(); + projectOwner.Stub(po => po.Project).Return(project); + projectOwner.Stub(po => po.SetProject(project, null)); mocks.ReplayAll(); var storageCommandHandler = new StorageCommandHandler( projectStorage, + projectFactory, projectOwner, mainWindowController); @@ -278,7 +264,7 @@ // Assert var expectedMessages = new[] { - "Openen van bestaand Ringtoetsproject.", + "Openen van bestaand Ringtoetsproject...", "Het is niet gelukt om het Ringtoetsproject te laden." }; TestHelper.AssertLogMessagesAreGenerated(call, expectedMessages, 2); @@ -292,40 +278,40 @@ { // Setup const string fileName = "newProject"; - string pathToSomeInvalidFile = string.Format("C://folder/directory/{0}.rtd", + string pathToSomeValidFile = string.Format("C://folder/directory/{0}.rtd", fileName); var loadedProject = mocks.Stub(); + var projectFactory = mocks.Stub(); var projectStorage = mocks.Stub(); - projectStorage.Stub(ps => ps.LoadProject(pathToSomeInvalidFile)) + projectStorage.Stub(ps => ps.LoadProject(pathToSomeValidFile)) .Return(loadedProject); var mainWindowController = mocks.Stub(); var projectOwner = mocks.Stub(); + projectOwner.Stub(po => po.SetProject(loadedProject, pathToSomeValidFile)); mocks.ReplayAll(); var storageCommandHandler = new StorageCommandHandler( projectStorage, + projectFactory, projectOwner, mainWindowController); // Call bool result = false; - Action call = () => result = storageCommandHandler.OpenExistingProject(pathToSomeInvalidFile); + Action call = () => result = storageCommandHandler.OpenExistingProject(pathToSomeValidFile); // Assert var expectedMessages = new[] { - "Openen van bestaand Ringtoetsproject.", + "Openen van bestaand Ringtoetsproject...", "Bestaand Ringtoetsproject succesvol geopend." }; TestHelper.AssertLogMessagesAreGenerated(call, expectedMessages, 2); Assert.IsTrue(result); - Assert.IsInstanceOf(projectOwner.Project); - Assert.AreEqual(pathToSomeInvalidFile, projectOwner.ProjectFilePath); - Assert.AreEqual(fileName, projectOwner.Project.Name); mocks.VerifyAll(); } @@ -338,23 +324,26 @@ fileName); var loadedProject = mocks.Stub(); var originalProject = mocks.Stub(); + var projectFactory = mocks.Stub(); var projectStorage = mocks.Stub(); projectStorage.Stub(ps => ps.LoadProject(pathToSomeValidFile)) .Return(loadedProject); - projectStorage.Stub(ps => ps.CloseProject()); var applicationSelection = mocks.Stub(); applicationSelection.Selection = originalProject; var mainWindowController = mocks.Stub(); var projectOwner = mocks.Stub(); - projectOwner.Project = originalProject; - projectOwner.ProjectFilePath = ""; + projectOwner.Stub(po => po.Project).Return(originalProject); + projectOwner.Stub(po => po.ProjectFilePath).Return(""); + projectOwner.Stub(po => po.SetProject(loadedProject, pathToSomeValidFile)); + mocks.ReplayAll(); var storageCommandHandler = new StorageCommandHandler( projectStorage, + projectFactory, projectOwner, mainWindowController); @@ -365,59 +354,36 @@ // Assert var expectedMessages = new[] { - "Openen van bestaand Ringtoetsproject.", + "Openen van bestaand Ringtoetsproject...", "Bestaand Ringtoetsproject succesvol geopend." }; TestHelper.AssertLogMessagesAreGenerated(call, expectedMessages, 2); Assert.IsTrue(result); - Assert.IsInstanceOf(projectOwner.Project); - Assert.AreEqual(pathToSomeValidFile, projectOwner.ProjectFilePath); - Assert.AreEqual(fileName, projectOwner.Project.Name); mocks.VerifyAll(); } [Test] - public void ContinueIfHasChanges_NoProjectSet_ReturnsTrue() + public void AskConfirmationUnsavedChanges_ProjectSetNoChange_ReturnsTrue() { // Setup - var projectStorage = mocks.Stub(); var mainWindowController = mocks.Stub(); - var projectOwner = mocks.Stub(); - mocks.ReplayAll(); - - var storageCommandHandler = new StorageCommandHandler( - projectStorage, - projectOwner, - mainWindowController); - - // Call - bool result = storageCommandHandler.ContinueIfHasChanges(); - - // Assert - Assert.IsTrue(result); - - mocks.VerifyAll(); - } - - [Test] - public void ContinueIfHasChanges_ProjectSetNoChange_ReturnsTrue() - { - // Setup - var mainWindowController = mocks.Stub(); - var projectMock = mocks.StrictMock(); + var projectStub = mocks.StrictMock(); + var projectFactory = mocks.Stub(); var projectStorageMock = mocks.Stub(); - var projectOwnerMock = mocks.Stub(); - projectOwnerMock.Project = projectMock; + var projectOwnerStub = mocks.Stub(); + projectOwnerStub.Stub(po => po.Project).Return(projectStub); + projectOwnerStub.Stub(po => po.ProjectFilePath).Return(""); mocks.ReplayAll(); var storageCommandHandler = new StorageCommandHandler( projectStorageMock, - projectOwnerMock, + projectFactory, + projectOwnerStub, mainWindowController); // Call - bool actionMaycontinue = storageCommandHandler.ContinueIfHasChanges(); + bool actionMaycontinue = storageCommandHandler.AskConfirmationUnsavedChanges(); // Assert Assert.IsTrue(actionMaycontinue); @@ -427,29 +393,32 @@ [Test] [RequiresSTA] - public void ContinueIfHasChanges_ProjectSetWithChangeCancelPressed_ReturnsFalse() + public void AskConfirmationUnsavedChanges_ProjectSetWithChangeCancelPressed_ReturnsFalse() { // Setup var mainWindowController = mocks.Stub(); - var projectMock = mocks.Stub(); + var projectStub = mocks.Stub(); + var projectFactory = mocks.Stub(); const string projectName = "Project"; - projectMock.Name = projectName; - var projectStorageMock = mocks.Stub(); - projectStorageMock.Expect(ps => ps.StageProject(projectMock)); + projectStub.Name = projectName; + var projectStorageMock = mocks.StrictMock(); + projectStorageMock.Expect(ps => ps.StageProject(projectStub)); projectStorageMock.Expect(ps => ps.HasStagedProject).Return(true); - projectStorageMock.Expect(ps => ps.HasStagedProjectChanges()).IgnoreArguments().Return(true); + projectStorageMock.Expect(ps => ps.HasStagedProjectChanges(null)).IgnoreArguments().Return(true); projectStorageMock.Expect(ps => ps.UnstageProject()); - var projectOwnerMock = mocks.Stub(); - projectOwnerMock.Project = projectMock; + var projectOwnerStub = mocks.Stub(); + projectOwnerStub.Stub(po => po.Project).Return(projectStub); + projectOwnerStub.Stub(po => po.ProjectFilePath).Return(""); mocks.ReplayAll(); string messageBoxText = null; string expectedMessage = string.Format("Sla wijzigingen in het project op: {0}?", projectName); var storageCommandHandler = new StorageCommandHandler( projectStorageMock, - projectOwnerMock, + projectFactory, + projectOwnerStub, mainWindowController); DialogBoxHandler = (name, wnd) => @@ -460,7 +429,7 @@ }; // Call - bool actionMaycontinue = storageCommandHandler.ContinueIfHasChanges(); + bool actionMaycontinue = storageCommandHandler.AskConfirmationUnsavedChanges(); // Assert Assert.IsFalse(actionMaycontinue); @@ -471,29 +440,32 @@ [Test] [RequiresSTA] - public void ContinueIfHasChanges_ProjectSetWithChangeNoPressed_ReturnsTrue() + public void AskConfirmationUnsavedChanges_ProjectSetWithChangeNoPressed_ReturnsTrue() { // Setup var mainWindowController = mocks.Stub(); - var projectMock = mocks.Stub(); + var projectStub = mocks.Stub(); + var projectFactory = mocks.Stub(); const string projectName = "Project"; - projectMock.Name = projectName; - var projectStorageMock = mocks.Stub(); - projectStorageMock.Expect(ps => ps.StageProject(projectMock)); + projectStub.Name = projectName; + var projectStorageMock = mocks.StrictMock(); + projectStorageMock.Expect(ps => ps.StageProject(projectStub)); projectStorageMock.Expect(ps => ps.HasStagedProject).Return(true); - projectStorageMock.Expect(ps => ps.HasStagedProjectChanges()).IgnoreArguments().Return(true); + projectStorageMock.Expect(ps => ps.HasStagedProjectChanges(null)).IgnoreArguments().Return(true); projectStorageMock.Expect(ps => ps.UnstageProject()); - var projectOwnerMock = mocks.Stub(); - projectOwnerMock.Project = projectMock; + var projectOwnerStub = mocks.Stub(); + projectOwnerStub.Stub(po => po.Project).Return(projectStub); + projectOwnerStub.Stub(po => po.ProjectFilePath).Return(""); mocks.ReplayAll(); string messageBoxText = null; string expectedMessage = string.Format("Sla wijzigingen in het project op: {0}?", projectName); var storageCommandHandler = new StorageCommandHandler( projectStorageMock, - projectOwnerMock, + projectFactory, + projectOwnerStub, mainWindowController); DialogBoxHandler = (name, wnd) => @@ -504,7 +476,7 @@ }; // Call - bool actionMaycontinue = storageCommandHandler.ContinueIfHasChanges(); + bool actionMaycontinue = storageCommandHandler.AskConfirmationUnsavedChanges(); // Assert Assert.IsTrue(actionMaycontinue); @@ -515,24 +487,25 @@ [Test] [RequiresSTA] - public void ContinueIfHasChanges_ProjectSetWithChangeYesPressed_ReturnsTrue() + public void AskConfirmationUnsavedChanges_ProjectSetWithChangeYesPressed_ReturnsTrue() { // Setup var mainWindowController = mocks.Stub(); - var projectMock = mocks.Stub(); + var projectStub = mocks.Stub(); + var projectFactory = mocks.Stub(); const string projectName = "Project"; - projectMock.Name = projectName; + projectStub.Name = projectName; var projectFilePath = "some path"; - var projectStorageMock = mocks.Stub(); - projectStorageMock.Expect(ps => ps.StageProject(projectMock)); + var projectStorageMock = mocks.StrictMock(); + projectStorageMock.Expect(ps => ps.StageProject(projectStub)); projectStorageMock.Expect(ps => ps.HasStagedProject).Return(true).Repeat.Twice(); - projectStorageMock.Expect(ps => ps.HasStagedProjectChanges()).IgnoreArguments().Return(true); + projectStorageMock.Expect(ps => ps.HasStagedProjectChanges(null)).IgnoreArguments().Return(true); projectStorageMock.Expect(ps => ps.UnstageProject()); - var projectOwnerMock = mocks.Stub(); - projectOwnerMock.Project = projectMock; - projectOwnerMock.ProjectFilePath = projectFilePath; + var projectOwnerStub = mocks.Stub(); + projectOwnerStub.Stub(po => po.Project).Return(projectStub); + projectOwnerStub.Stub(po => po.ProjectFilePath).Return(projectFilePath); projectStorageMock.Expect(p => p.SaveProjectAs(projectFilePath)); mocks.ReplayAll(); @@ -542,7 +515,8 @@ var storageCommandHandler = new StorageCommandHandler( projectStorageMock, - projectOwnerMock, + projectFactory, + projectOwnerStub, mainWindowController); DialogBoxHandler = (name, wnd) => @@ -553,57 +527,13 @@ }; // Call - bool actionMaycontinue = storageCommandHandler.ContinueIfHasChanges(); + bool actionMaycontinue = storageCommandHandler.AskConfirmationUnsavedChanges(); // Assert Assert.IsTrue(actionMaycontinue); mocks.VerifyAll(); Assert.AreEqual(expectedMessage, messageBoxText); } - - [Test] - [RequiresSTA] - public void CreateNewProject_ProjectSetWithChangeCancelPressed_CancelAndLog() - { - // Setup - var mainWindowController = mocks.Stub(); - var projectMock = mocks.Stub(); - const string projectName = "Project"; - projectMock.Name = projectName; - var projectStorageMock = mocks.Stub(); - projectStorageMock.Expect(ps => ps.StageProject(projectMock)); - projectStorageMock.Expect(ps => ps.HasStagedProject).Return(true); - projectStorageMock.Expect(ps => ps.HasStagedProjectChanges()).IgnoreArguments().Return(true); - projectStorageMock.Expect(ps => ps.UnstageProject()); - - var projectOwnerMock = mocks.Stub(); - projectOwnerMock.Project = projectMock; - mocks.ReplayAll(); - - string messageBoxText = null; - string expectedMessage = string.Format("Sla wijzigingen in het project op: {0}?", projectName); - - var storageCommandHandler = new StorageCommandHandler( - projectStorageMock, - projectOwnerMock, - mainWindowController); - - DialogBoxHandler = (name, wnd) => - { - var helper = new MessageBoxTester(wnd); - messageBoxText = helper.Text; - helper.SendCommand(MessageBoxTester.Command.Cancel); - }; - - // Call - Action call = () => storageCommandHandler.CreateNewProject(); - - // Assert - TestHelper.AssertLogMessageIsGenerated(call, Resources.StorageCommandHandler_NewProject_Creating_new_project_cancelled, 1); - - mocks.VerifyAll(); - Assert.AreEqual(expectedMessage, messageBoxText); - } } } \ No newline at end of file Index: Core/Common/test/Core.Common.Gui.Test/Forms/MainWindow/MainWindowTest.cs =================================================================== diff -u -re59a206ea06e40bbc9959cd98fc1a10ae7cdcf8c -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 --- Core/Common/test/Core.Common.Gui.Test/Forms/MainWindow/MainWindowTest.cs (.../MainWindowTest.cs) (revision e59a206ea06e40bbc9959cd98fc1a10ae7cdcf8c) +++ Core/Common/test/Core.Common.Gui.Test/Forms/MainWindow/MainWindowTest.cs (.../MainWindowTest.cs) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) @@ -422,6 +422,7 @@ var mocks = new MockRepository(); var projectStore = mocks.Stub(); var projectFactory = mocks.Stub(); + projectFactory.Stub(pf => pf.CreateNewProject()).Return(mocks.Stub()); mocks.ReplayAll(); using (var mainWindow = new Gui.Forms.MainWindow.MainWindow()) @@ -452,6 +453,7 @@ var mocks = new MockRepository(); var projectStore = mocks.Stub(); var projectFactory = mocks.Stub(); + projectFactory.Stub(pf => pf.CreateNewProject()).Return(mocks.Stub()); mocks.ReplayAll(); using (var mainWindow = new Gui.Forms.MainWindow.MainWindow()) Index: Core/Common/test/Core.Common.Gui.Test/GuiCoreTest.cs =================================================================== diff -u -rb099f576f45f1a8fb167d965b357ba675105f4e4 -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 --- Core/Common/test/Core.Common.Gui.Test/GuiCoreTest.cs (.../GuiCoreTest.cs) (revision b099f576f45f1a8fb167d965b357ba675105f4e4) +++ Core/Common/test/Core.Common.Gui.Test/GuiCoreTest.cs (.../GuiCoreTest.cs) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) @@ -76,6 +76,8 @@ var mocks = new MockRepository(); var projectStore = mocks.Stub(); var projectFactory = mocks.Stub(); + var project = mocks.Stub(); + projectFactory.Stub(pf => pf.CreateNewProject()).Return(project); mocks.ReplayAll(); var guiCoreSettings = new GuiCoreSettings(); @@ -87,8 +89,8 @@ // Assert Assert.AreEqual(null, gui.PropertyResolver); - Assert.AreEqual(null, gui.ProjectFilePath); - Assert.AreEqual(null, gui.Project); + Assert.IsNull(gui.ProjectFilePath); + Assert.AreSame(project, gui.Project); Assert.AreEqual(null, gui.Selection); @@ -135,7 +137,7 @@ // Setup var mocks = new MockRepository(); IStoreProject projectStore = nullArgumentIndex == 1 ? null : mocks.Stub(); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); GuiCoreSettings guiCoreSettings = nullArgumentIndex == 2 ? null : new GuiCoreSettings(); @@ -162,7 +164,8 @@ // Setup var mocks = new MockRepository(); var projectStore = mocks.Stub(); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); + projectFactory.Stub(pf => pf.CreateNewProject()).Return(mocks.Stub()); mocks.ReplayAll(); var guiCoreSettings = new GuiCoreSettings(); @@ -181,6 +184,31 @@ [Test] [STAThread] + public void SetProject_SetNull_ThrowsArgumentNullException() + { + var mocks = new MockRepository(); + var projectStore = mocks.Stub(); + var pluginMock = mocks.Stub(); + pluginMock.Expect(p => p.Deactivate()); + pluginMock.Expect(p => p.Dispose()); + var projectFactory = CreateProjectFactory(mocks); + mocks.ReplayAll(); + + using (var gui = new GuiCore(new MainWindow(), projectStore, projectFactory, new GuiCoreSettings())) + { + gui.Plugins.Add(pluginMock); + + // Call + TestDelegate test = () => gui.SetProject(null, null); + + // Assert + Assert.Throws(test); + } + mocks.VerifyAll(); + } + + [Test] + [STAThread] public void Dispose_PluginsAdded_PluginsDisabledAndRemovedAndDisposed() { // Setup @@ -189,7 +217,7 @@ var pluginMock = mocks.Stub(); pluginMock.Expect(p => p.Deactivate()); pluginMock.Expect(p => p.Dispose()); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); var gui = new GuiCore(new MainWindow(), projectStore, projectFactory, new GuiCoreSettings()); @@ -213,7 +241,7 @@ var pluginMock = mocks.Stub(); pluginMock.Expect(p => p.Deactivate()).Throw(new Exception("Bad stuff happening!")); pluginMock.Expect(p => p.Dispose()); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); var gui = new GuiCore(new MainWindow(), projectStore, projectFactory, new GuiCoreSettings()); @@ -235,7 +263,7 @@ // Setup var mocks = new MockRepository(); var projectStore = mocks.Stub(); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); var gui = new GuiCore(new MainWindow(), projectStore, projectFactory, new GuiCoreSettings()) @@ -253,36 +281,12 @@ [Test] [STAThread] - public void Dispose_HasProject_ClearProject() - { - // Setup - var mocks = new MockRepository(); - var projectStore = mocks.Stub(); - var projectMock = mocks.Stub(); - var projectFactory = mocks.Stub(); - mocks.ReplayAll(); - - var gui = new GuiCore(new MainWindow(), projectStore, projectFactory, new GuiCoreSettings()) - { - Project = projectMock - }; - - // Call - gui.Dispose(); - - // Assert - Assert.IsNull(gui.Project); - mocks.VerifyAll(); - } - - [Test] - [STAThread] public void Dispose_HasMainWindow_DiposeOfMainWindow() { // Setup var mocks = new MockRepository(); var projectStore = mocks.Stub(); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); using (var mainWindow = new MainWindow()) @@ -306,7 +310,7 @@ // Setup var mocks = new MockRepository(); var projectStore = mocks.Stub(); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); var messageWindowLogAppender = new MessageWindowLogAppender(); @@ -347,7 +351,7 @@ // Setup var mocks = new MockRepository(); var projectStore = mocks.Stub(); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); using (var toolView = new TestView()) @@ -374,7 +378,7 @@ // Setup var mocks = new MockRepository(); var projectStore = mocks.Stub(); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); using (var documentView = new TestView()) @@ -402,7 +406,7 @@ // Setup var mocks = new MockRepository(); var projectStore = mocks.Stub(); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); Logger rootLogger = ((Hierarchy) LogManager.GetRepository()).Root; @@ -444,7 +448,7 @@ // Setup var mocks = new MockRepository(); var projectStore = mocks.Stub(); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); var appender = new MessageWindowLogAppender(); @@ -494,7 +498,7 @@ var projectStore = mocks.Stub(); var deserializedProject = mocks.Stub(); projectStore.Expect(ps => ps.LoadProject(testFile)).Return(deserializedProject); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); var fixedSettings = new GuiCoreSettings @@ -511,7 +515,7 @@ // Assert var expectedMessages = new[] { - "Openen van bestaand Ringtoetsproject.", + "Openen van bestaand Ringtoetsproject...", "Bestaand Ringtoetsproject succesvol geopend." }; TestHelper.AssertLogMessagesAreGenerated(call, expectedMessages); @@ -544,7 +548,8 @@ var project = mocks.Stub(); project.Name = expectedProjectName; var projectFactory = mocks.Stub(); - projectFactory.Expect(ph => ph.CreateNewProject()).Return(project); + projectFactory.Stub(ph => ph.CreateNewProject()).Return(project); + mocks.ReplayAll(); var fixedSettings = new GuiCoreSettings @@ -561,10 +566,9 @@ // Assert var expectedMessages = new[] { - "Openen van bestaand Ringtoetsproject.", + "Openen van bestaand Ringtoetsproject...", storageExceptionText, "Het is niet gelukt om het Ringtoetsproject te laden.", - "Nieuw project aanmaken..." }; TestHelper.AssertLogMessagesAreGenerated(call, expectedMessages); @@ -581,7 +585,7 @@ [TestCase(" ")] [TestCase(null)] [STAThread] - public void Run_WithoutFile_CreateNewDefaultProject(string path) + public void Run_WithoutFile_DefaultProjectStillSet(string path) { // Setup var mocks = new MockRepository(); @@ -591,7 +595,7 @@ var project = mocks.Stub(); project.Name = expectedProjectName; var projectFactory = mocks.Stub(); - projectFactory.Expect(ph => ph.CreateNewProject()).Return(project); + projectFactory.Stub(ph => ph.CreateNewProject()).Return(project); mocks.ReplayAll(); var fixedSettings = new GuiCoreSettings @@ -603,11 +607,11 @@ using (var gui = new GuiCore(mainWindow, projectStore, projectFactory, fixedSettings)) { // Call - Action call = () => gui.Run(path); + gui.Run(path); // Assert - TestHelper.AssertLogMessageIsGenerated(call, "Nieuw project aanmaken..."); Assert.IsNull(gui.ProjectFilePath); + Assert.AreSame(project, gui.Project); var expectedTitle = string.Format("{0} - {1} {2}", expectedProjectName, fixedSettings.MainWindowTitle, SettingsHelper.ApplicationVersion); Assert.AreEqual(expectedTitle, mainWindow.Title); @@ -627,7 +631,7 @@ plugin.Expect(p => p.Activate()); plugin.Expect(p => p.GetViewInfos()).Return(Enumerable.Empty()); plugin.Expect(p => p.GetPropertyInfos()).Return(Enumerable.Empty()); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); // Setup @@ -656,7 +660,7 @@ plugin.Stub(p => p.Activate()).Throw(new Exception("ERROR!")); plugin.Expect(p => p.Deactivate()); plugin.Expect(p => p.Dispose()); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); // Setup @@ -683,7 +687,7 @@ plugin.Stub(p => p.Activate()).Throw(new Exception("ERROR!")); plugin.Stub(p => p.Deactivate()).Throw(new Exception("MORE ERROR!")); plugin.Expect(p => p.Dispose()); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); // Setup @@ -708,7 +712,7 @@ // Setup var mocks = new MockRepository(); var projectStore = mocks.Stub(); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); using (var gui = new GuiCore(new MainWindow(), projectStore, projectFactory, new GuiCoreSettings())) @@ -737,7 +741,7 @@ // Setup var mocks = new MockRepository(); var projectStore = mocks.Stub(); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); using (var gui = new GuiCore(new MainWindow(), projectStore, projectFactory, new GuiCoreSettings())) @@ -777,7 +781,7 @@ }); plugin2.Stub(p => p.Dispose()); plugin2.Stub(p => p.Deactivate()); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); using (var gui = new GuiCore(new MainWindow(), projectStore, projectFactory, new GuiCoreSettings())) @@ -832,7 +836,7 @@ }); plugin2.Stub(p => p.Dispose()); plugin2.Stub(p => p.Deactivate()); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); using (var gui = new GuiCore(new MainWindow(), projectStore, projectFactory, new GuiCoreSettings())) @@ -861,7 +865,7 @@ // Setup var mocks = new MockRepository(); var projectStore = mocks.Stub(); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); using (var gui = new GuiCore(new MainWindow(), projectStore, projectFactory, new GuiCoreSettings())) @@ -912,7 +916,7 @@ pluginC.Stub(p => p.GetTreeNodeInfos()).Return(nodesPluginC); pluginC.Stub(p => p.Dispose()); pluginC.Stub(p => p.Deactivate()); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); using (var gui = new GuiCore(new MainWindow(), projectStore, projectFactory, new GuiCoreSettings())) @@ -939,7 +943,7 @@ // Setup var mocks = new MockRepository(); var projectStore = mocks.Stub(); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); using (var treeView = new TreeViewControl()) @@ -962,7 +966,7 @@ // Setup var mocks = new MockRepository(); var projectStore = mocks.Stub(); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); using (var treeView = new TreeViewControl()) @@ -991,19 +995,19 @@ [Test] [STAThread] - public void Project_SetNewValue_FireProjectOpenedEvents() + public void SetProject_SetNewValue_FireProjectOpenedEvents() { // Setup var mocks = new MockRepository(); var storeProject = mocks.Stub(); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); var oldProjectMock = mocks.Stub(); var newProjectMock = mocks.Stub(); mocks.ReplayAll(); using (var gui = new GuiCore(new MainWindow(), storeProject, projectFactory, new GuiCoreSettings())) { - gui.Project = oldProjectMock; + gui.SetProject(oldProjectMock, null); int openedCallCount = 0; gui.ProjectOpened += project => @@ -1013,7 +1017,7 @@ }; // Call - gui.Project = newProjectMock; + gui.SetProject(newProjectMock, null); // Assert Assert.AreEqual(1, openedCallCount); @@ -1028,7 +1032,7 @@ // Given var mocks = new MockRepository(); var projectStore = mocks.Stub(); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); var selectionProvider = new TestSelectionProvider(); @@ -1056,7 +1060,7 @@ // Given var mocks = new MockRepository(); var projectStore = mocks.Stub(); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); var selectionProvider = new TestSelectionProvider(); @@ -1083,7 +1087,7 @@ // Given var mocks = new MockRepository(); var projectStore = mocks.Stub(); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); var selection = new object(); @@ -1110,7 +1114,7 @@ // Given var mocks = new MockRepository(); var projectStore = mocks.Stub(); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); var selectionProvider = new TestSelectionProvider(); @@ -1138,7 +1142,7 @@ // Given var mocks = new MockRepository(); var projectStore = mocks.Stub(); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); var selection = new object(); @@ -1168,7 +1172,7 @@ // Given var mocks = new MockRepository(); var projectStore = mocks.Stub(); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); var selectionProvider = new TestSelectionProvider(); @@ -1197,7 +1201,7 @@ // Given var mocks = new MockRepository(); var projectStore = mocks.Stub(); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); var testView = new TestView(); @@ -1226,7 +1230,7 @@ // Given var mocks = new MockRepository(); var projectStore = mocks.Stub(); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); var testView = new TestView(); @@ -1255,7 +1259,7 @@ // Given var mocks = new MockRepository(); var projectStore = mocks.Stub(); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); var selectionProvider = new TestSelectionProvider(); @@ -1284,7 +1288,7 @@ // Given var mocks = new MockRepository(); var projectStore = mocks.Stub(); - var projectFactory = mocks.Stub(); + var projectFactory = CreateProjectFactory(mocks); mocks.ReplayAll(); var selectionProvider = new TestSelectionProvider(); @@ -1308,30 +1312,30 @@ mocks.VerifyAll(); } - private class TestSelectionProvider : Control, ISelectionProvider + private static IProjectFactory CreateProjectFactory(MockRepository mocks) { - private object selection; + var projectFactory = mocks.Stub(); + projectFactory.Stub(pf => pf.CreateNewProject()).Return(mocks.Stub()); + return projectFactory; + } + + private class TestSelectionProvider : Control, ISelectionProvider + { public event EventHandler SelectionChanged; public TestSelectionProvider() { - selection = new object(); + Selection = new object(); } public object Data { get; set; } - public object Selection - { - get - { - return selection; - } - } + public object Selection { get; private set; } public void ChangeSelection() { - selection = new object(); + Selection = new object(); if (SelectionChanged != null) { Index: Core/Common/test/Core.Common.Integration.Test/Ringtoets/Application.Ringtoets/GuiCoreIntegrationTest.cs =================================================================== diff -u -r1eed3e3f652618c52a462edc502cfd4250772314 -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 --- Core/Common/test/Core.Common.Integration.Test/Ringtoets/Application.Ringtoets/GuiCoreIntegrationTest.cs (.../GuiCoreIntegrationTest.cs) (revision 1eed3e3f652618c52a462edc502cfd4250772314) +++ Core/Common/test/Core.Common.Integration.Test/Ringtoets/Application.Ringtoets/GuiCoreIntegrationTest.cs (.../GuiCoreIntegrationTest.cs) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) @@ -56,6 +56,7 @@ var mocks = new MockRepository(); var projectStore = mocks.Stub(); var projectFactory = mocks.Stub(); + projectFactory.Stub(pf => pf.CreateNewProject()).Return(mocks.Stub()); mocks.ReplayAll(); using (var gui = new GuiCore(new MainWindow(), projectStore, projectFactory, new GuiCoreSettings())) @@ -82,6 +83,7 @@ var mocks = new MockRepository(); var projectStore = mocks.Stub(); var projectFactory = mocks.Stub(); + projectFactory.Stub(pf => pf.CreateNewProject()).Return(mocks.Stub()); mocks.ReplayAll(); using (var gui = new GuiCore(new MainWindow(), projectStore, projectFactory, new GuiCoreSettings())) @@ -99,6 +101,7 @@ var mocks = new MockRepository(); var projectStore = mocks.Stub(); var projectFactory = mocks.Stub(); + projectFactory.Stub(pf => pf.CreateNewProject()).Return(mocks.Stub()); mocks.ReplayAll(); using (var gui = new GuiCore(new MainWindow(), projectStore, projectFactory, new GuiCoreSettings())) Index: Core/Plugins/test/Core.Plugins.Chart.Test/ChartPluginTest.cs =================================================================== diff -u -r1eed3e3f652618c52a462edc502cfd4250772314 -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 --- Core/Plugins/test/Core.Plugins.Chart.Test/ChartPluginTest.cs (.../ChartPluginTest.cs) (revision 1eed3e3f652618c52a462edc502cfd4250772314) +++ Core/Plugins/test/Core.Plugins.Chart.Test/ChartPluginTest.cs (.../ChartPluginTest.cs) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) @@ -111,6 +111,7 @@ var mocks = new MockRepository(); var projectStore = mocks.Stub(); var projectFactory = mocks.Stub(); + projectFactory.Stub(pf => pf.CreateNewProject()).Return(mocks.Stub()); mocks.ReplayAll(); using (var gui = new GuiCore(new MainWindow(), projectStore, projectFactory, new GuiCoreSettings())) Index: Core/Plugins/test/Core.Plugins.Map.Test/MapPluginTest.cs =================================================================== diff -u -r7a02214c204a80a085b50b8d5fd7f90b9e0b4149 -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 --- Core/Plugins/test/Core.Plugins.Map.Test/MapPluginTest.cs (.../MapPluginTest.cs) (revision 7a02214c204a80a085b50b8d5fd7f90b9e0b4149) +++ Core/Plugins/test/Core.Plugins.Map.Test/MapPluginTest.cs (.../MapPluginTest.cs) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) @@ -165,6 +165,7 @@ var mocks = new MockRepository(); var projectStore = mocks.Stub(); var projectFactory = mocks.Stub(); + projectFactory.Stub(pf => pf.CreateNewProject()).Return(mocks.Stub()); mocks.ReplayAll(); using (var gui = new GuiCore(new MainWindow(), projectStore, projectFactory, new GuiCoreSettings())) Index: Core/Plugins/test/Core.Plugins.ProjectExplorer.Test/ProjectExplorerPluginTest.cs =================================================================== diff -u -r650277f75faab8d29b4a07b738f0fd2a99ac7ed3 -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 --- Core/Plugins/test/Core.Plugins.ProjectExplorer.Test/ProjectExplorerPluginTest.cs (.../ProjectExplorerPluginTest.cs) (revision 650277f75faab8d29b4a07b738f0fd2a99ac7ed3) +++ Core/Plugins/test/Core.Plugins.ProjectExplorer.Test/ProjectExplorerPluginTest.cs (.../ProjectExplorerPluginTest.cs) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) @@ -84,6 +84,7 @@ guiStub.Stub(g => g.ViewHost).Return(viewHost); guiStub.Expect(g => g.ProjectOpened += null).IgnoreArguments(); guiStub.Stub(g => g.ProjectOpened -= null).IgnoreArguments(); + guiStub.Stub(g => g.Project).Return(mocks.Stub()); mocks.ReplayAll(); using (var plugin = new ProjectExplorerPlugin @@ -116,6 +117,7 @@ guiStub.Stub(g => g.ViewHost).Return(viewHost); guiStub.Stub(g => g.ProjectOpened += null).IgnoreArguments(); guiStub.Stub(g => g.ProjectOpened -= null).IgnoreArguments(); + guiStub.Stub(g => g.Project).Return(mocks.Stub()); mocks.ReplayAll(); using (var plugin = new ProjectExplorerPlugin @@ -152,6 +154,7 @@ viewHost.Stub(vm => vm.SetImage(null, null)).IgnoreArguments(); guiStub.Stub(g => g.ViewHost).Return(viewHost); guiStub.Stub(g => g.ProjectOpened += null).IgnoreArguments(); + guiStub.Stub(g => g.Project).Return(mocks.Stub()); guiStub.Expect(g => g.ProjectOpened -= null).IgnoreArguments(); mocks.ReplayAll(); @@ -246,6 +249,8 @@ guiStub.Expect(g => g.ProjectOpened += null).IgnoreArguments(); guiStub.Expect(g => g.ProjectOpened -= null).IgnoreArguments(); + guiStub.Expect(g => g.Project).Return(initialProjectMock); + guiStub.Expect(g => g.Project).Return(newProjectMock); mocks.ReplayAll(); @@ -254,15 +259,13 @@ Gui = guiStub }) { - guiStub.Project = initialProjectMock; plugin.Activate(); // Precondition Assert.AreEqual(1, toolViews.Count); Assert.AreSame(initialProjectMock, toolViews[0].Data); // Call - guiStub.Project = newProjectMock; guiStub.Raise(s => s.ProjectOpened += null, newProjectMock); // Assert Index: Demo/Ringtoets/test/Demo.Ringtoets.Test/Commands/AddNewDemoAssessmentSectionCommandTest.cs =================================================================== diff -u -r69f931d615d8cd933b51ce0b087c45db08a19a16 -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 --- Demo/Ringtoets/test/Demo.Ringtoets.Test/Commands/AddNewDemoAssessmentSectionCommandTest.cs (.../AddNewDemoAssessmentSectionCommandTest.cs) (revision 69f931d615d8cd933b51ce0b087c45db08a19a16) +++ Demo/Ringtoets/test/Demo.Ringtoets.Test/Commands/AddNewDemoAssessmentSectionCommandTest.cs (.../AddNewDemoAssessmentSectionCommandTest.cs) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) @@ -79,7 +79,7 @@ var mocks = new MockRepository(); var projectOwnerStub = mocks.Stub(); - projectOwnerStub.Project = project; + projectOwnerStub.Stub(po => po.Project).Return(project); var observerMock = mocks.StrictMock(); observerMock.Expect(o => o.UpdateObserver()); Index: Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/Commands/AssessmentSectionFromFileCommandHandlerTest.cs =================================================================== diff -u -r74d6d66cabf1b53c7b1d485efb53a940752eb070 -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 --- Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/Commands/AssessmentSectionFromFileCommandHandlerTest.cs (.../AssessmentSectionFromFileCommandHandlerTest.cs) (revision 74d6d66cabf1b53c7b1d485efb53a940752eb070) +++ Ringtoets/Integration/test/Ringtoets.Integration.Forms.Test/Commands/AssessmentSectionFromFileCommandHandlerTest.cs (.../AssessmentSectionFromFileCommandHandlerTest.cs) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) @@ -184,7 +184,7 @@ var parentDialogStub = mockRepository.Stub(); var project = new RingtoetsProject(); var projectOwnerStub = mockRepository.Stub(); - projectOwnerStub.Project = project; + projectOwnerStub.Stub(po => po.Project).Return(project); var viewControllerMock = mockRepository.StrictMock(); mockRepository.ReplayAll(); @@ -215,7 +215,7 @@ var parentDialogStub = mockRepository.Stub(); var project = new RingtoetsProject(); var projectOwnerStub = mockRepository.Stub(); - projectOwnerStub.Project = project; + projectOwnerStub.Stub(po => po.Project).Return(project); var viewControllerMock = mockRepository.StrictMock(); viewControllerMock.Expect(dvc => dvc.OpenViewForData(null)).IgnoreArguments().Return(true); mockRepository.ReplayAll(); @@ -253,7 +253,7 @@ var parentDialogStub = mockRepository.Stub(); var project = new RingtoetsProject(); var projectOwnerStub = mockRepository.Stub(); - projectOwnerStub.Project = project; + projectOwnerStub.Stub(po => po.Project).Return(project); var viewControllerMock = mockRepository.StrictMock(); viewControllerMock.Expect(dvc => dvc.OpenViewForData(null)).IgnoreArguments().Return(true); mockRepository.ReplayAll(); @@ -298,7 +298,7 @@ var parentDialogStub = mockRepository.Stub(); var project = new RingtoetsProject(); var projectOwnerStub = mockRepository.Stub(); - projectOwnerStub.Project = project; + projectOwnerStub.Stub(po => po.Project).Return(project); var viewControllerMock = mockRepository.StrictMock(); viewControllerMock.Expect(dvc => dvc.OpenViewForData(null)).IgnoreArguments().Return(true); mockRepository.ReplayAll(); @@ -333,7 +333,7 @@ var parentDialogStub = mockRepository.Stub(); var project = new RingtoetsProject(); var projectOwnerStub = mockRepository.Stub(); - projectOwnerStub.Project = project; + projectOwnerStub.Stub(po => po.Project).Return(project); var viewControllerMock = mockRepository.StrictMock(); viewControllerMock.Expect(dvc => dvc.OpenViewForData(null)).IgnoreArguments().Return(true); mockRepository.ReplayAll(); @@ -373,7 +373,7 @@ var parentDialogStub = mockRepository.Stub(); var project = new RingtoetsProject(); var projectOwnerStub = mockRepository.Stub(); - projectOwnerStub.Project = project; + projectOwnerStub.Stub(po => po.Project).Return(project); var viewControllerMock = mockRepository.StrictMock(); viewControllerMock.Expect(dvc => dvc.OpenViewForData(null)).IgnoreArguments().Return(true); mockRepository.ReplayAll(); @@ -413,7 +413,7 @@ var parentDialogStub = mockRepository.Stub(); var project = new RingtoetsProject(); var projectOwnerStub = mockRepository.Stub(); - projectOwnerStub.Project = project; + projectOwnerStub.Stub(po => po.Project).Return(project); var viewControllerMock = mockRepository.StrictMock(); viewControllerMock.Expect(dvc => dvc.OpenViewForData(null)).IgnoreArguments().Return(true); mockRepository.ReplayAll(); @@ -457,7 +457,7 @@ var parentDialogStub = mockRepository.Stub(); var project = new RingtoetsProject(); var projectOwnerStub = mockRepository.Stub(); - projectOwnerStub.Project = project; + projectOwnerStub.Stub(po => po.Project).Return(project); var viewControllerMock = mockRepository.StrictMock(); viewControllerMock.Expect(dvc => dvc.OpenViewForData(null)).IgnoreArguments().Return(true); mockRepository.ReplayAll(); Index: Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/RingtoetsPluginTest.cs =================================================================== diff -u -r8c1fffbb415e7c2470be6d3fa2971103777d418e -r0be8a14b7c545ae5a07d1da6a0fa70829323b0f2 --- Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/RingtoetsPluginTest.cs (.../RingtoetsPluginTest.cs) (revision 8c1fffbb415e7c2470be6d3fa2971103777d418e) +++ Ringtoets/Integration/test/Ringtoets.Integration.Plugin.Test/RingtoetsPluginTest.cs (.../RingtoetsPluginTest.cs) (revision 0be8a14b7c545ae5a07d1da6a0fa70829323b0f2) @@ -94,7 +94,7 @@ gui.Run(); // When - Action action = () => gui.Project = new RingtoetsProject(); + Action action = () => gui.SetProject(new RingtoetsProject(), null); // Then TestHelper.AssertLogMessagesCount(action, 0); @@ -135,7 +135,7 @@ project.AssessmentSections.Add(section); // When - Action action = () => gui.Project = project; + Action action = () => gui.SetProject(project, null); // Then TestHelper.AssertLogMessagesCount(action, 0); @@ -175,7 +175,7 @@ gui.Run(); // When - Action action = () => gui.Project = project; + Action action = () => gui.SetProject(project, null); // Then var fileMissingMessage = string.Format("Fout bij het lezen van bestand '{0}': het bestand bestaat niet.", nonExistingFileExistingFile);