Index: Core/Gui/src/Core.Gui/Commands/StorageCommandHandler.cs =================================================================== diff -u -r0b2ced50ea462a414327ccdaa7157457f13529e6 -rf29cd4e0c4b452d785cae19cd258012978b25366 --- Core/Gui/src/Core.Gui/Commands/StorageCommandHandler.cs (.../StorageCommandHandler.cs) (revision 0b2ced50ea462a414327ccdaa7157457f13529e6) +++ Core/Gui/src/Core.Gui/Commands/StorageCommandHandler.cs (.../StorageCommandHandler.cs) (revision f29cd4e0c4b452d785cae19cd258012978b25366) @@ -164,6 +164,7 @@ catch (Exception e) when (e is ArgumentException || e is CriticalFileReadException || e is StorageValidationException) { log.Error(e.Message, e); + projectOwner.SetProject(null, null); return false; } } Index: Core/Gui/src/Core.Gui/OpenProjectActivity.cs =================================================================== diff -u -re426893bd2c1d93c5d054e505957ab6d20f02b2f -rf29cd4e0c4b452d785cae19cd258012978b25366 --- Core/Gui/src/Core.Gui/OpenProjectActivity.cs (.../OpenProjectActivity.cs) (revision e426893bd2c1d93c5d054e505957ab6d20f02b2f) +++ Core/Gui/src/Core.Gui/OpenProjectActivity.cs (.../OpenProjectActivity.cs) (revision f29cd4e0c4b452d785cae19cd258012978b25366) @@ -107,6 +107,9 @@ case ActivityState.Executed: InitializeSuccessfulOpenedProject(); break; + case ActivityState.Failed: + projectOwner.SetProject(null, null); + break; case ActivityState.Canceled: ClearOpenedProject(); break; Index: Core/Gui/test/Core.Gui.Test/Commands/StorageCommandHandlerTest.cs =================================================================== diff -u -r0b2ced50ea462a414327ccdaa7157457f13529e6 -rf29cd4e0c4b452d785cae19cd258012978b25366 --- Core/Gui/test/Core.Gui.Test/Commands/StorageCommandHandlerTest.cs (.../StorageCommandHandlerTest.cs) (revision 0b2ced50ea462a414327ccdaa7157457f13529e6) +++ Core/Gui/test/Core.Gui.Test/Commands/StorageCommandHandlerTest.cs (.../StorageCommandHandlerTest.cs) (revision f29cd4e0c4b452d785cae19cd258012978b25366) @@ -449,7 +449,7 @@ [Test] [TestCaseSource(nameof(GetExceptions))] - public void OpenExistingProject_ShouldMigrateThrowsException_LogFailureAndCreateNewProjectAndReturnsFalse(Exception exception, string errorMessage) + public void OpenExistingProject_ShouldMigrateThrowsException_LogFailureAndSetNullProjectAndReturnsFalse(Exception exception, string errorMessage) { // Setup const string pathToSomeValidFile = " "; @@ -467,7 +467,7 @@ var projectOwner = mocks.Stub(); projectOwner.Stub(po => po.Project).Return(project); - projectOwner.Stub(po => po.SetProject(project, null)); + projectOwner.Expect(po => po.SetProject(null, null)); var inquiryHelper = mocks.Stub(); var mainWindowController = mocks.Stub(); @@ -492,7 +492,7 @@ } [Test] - public void OpenExistingProject_ShouldMigrateYesAndDetermineMigrationLocationThrowsArgumentException_LogFailureAndReturnsFalse() + public void OpenExistingProject_ShouldMigrateYesAndDetermineMigrationLocationThrowsArgumentException_LogFailureAndSetProjectNullAndReturnsFalse() { // Setup const string errorMessage = "I am an error message."; @@ -510,6 +510,7 @@ var projectFactory = mocks.StrictMock(); var projectOwner = mocks.StrictMock(); + projectOwner.Expect(po => po.SetProject(null, null)); var inquiryHelper = mocks.Stub(); var mainWindowController = mocks.Stub(); @@ -534,7 +535,7 @@ } [Test] - public void OpenExistingProject_ShouldMigrateTrueAndMigrateThrowsArgumentException_LogFailureAndReturnsFalse() + public void OpenExistingProject_ShouldMigrateTrueAndMigrateThrowsArgumentException_LogFailureAndSetProjectNullAndReturnsFalse() { // Setup const string errorMessage = "I am an error message."; @@ -560,6 +561,7 @@ var projectFactory = mocks.StrictMock(); var projectOwner = mocks.StrictMock(); + projectOwner.Expect(po => po.SetProject(null, null)); var inquiryHelper = mocks.Stub(); mocks.ReplayAll(); @@ -588,7 +590,7 @@ } [Test] - public void OpenExistingProject_LoadingProjectThrowsStorageException_LogFailureCreateNewProjectAndReturnFalse() + public void OpenExistingProject_LoadingProjectThrowsStorageException_LogFailureSetNullProjectAndReturnFalse() { // Setup const string pathToSomeInvalidFile = ""; @@ -608,7 +610,7 @@ var projectOwner = mocks.Stub(); projectOwner.Stub(po => po.Project).Return(project); - projectOwner.Stub(po => po.SetProject(project, null)); + projectOwner.Expect(po => po.SetProject(null, null)); var inquiryHelper = mocks.Stub(); var mainWindow = mocks.Stub(); @@ -649,7 +651,7 @@ } [Test] - public void OpenExistingProject_LoadingNull_LogFailureCreateNewProjectAndReturnFalse() + public void OpenExistingProject_LoadingNull_LogFailureSetNullProjectAndReturnFalse() { // Setup const string pathToSomeInvalidFile = ""; @@ -667,7 +669,7 @@ var projectOwner = mocks.Stub(); projectOwner.Stub(po => po.Project).Return(project); - projectOwner.Stub(po => po.SetProject(project, null)); + projectOwner.Expect(po => po.SetProject(null, null)); var inquiryHelper = mocks.Stub(); var mainWindow = mocks.Stub(); Index: Core/Gui/test/Core.Gui.Test/OpenProjectActivityTest.cs =================================================================== diff -u -r2bb78c041989c4970c56a3d74f0afa82083625ae -rf29cd4e0c4b452d785cae19cd258012978b25366 --- Core/Gui/test/Core.Gui.Test/OpenProjectActivityTest.cs (.../OpenProjectActivityTest.cs) (revision 2bb78c041989c4970c56a3d74f0afa82083625ae) +++ Core/Gui/test/Core.Gui.Test/OpenProjectActivityTest.cs (.../OpenProjectActivityTest.cs) (revision f29cd4e0c4b452d785cae19cd258012978b25366) @@ -710,7 +710,7 @@ } [Test] - public void GivenOpenProjectActivityAndFailedDueToNoProject_WhenFinishingOpenProjectActivity_ThenMessageLogged() + public void GivenOpenProjectActivityAndFailedDueToNoProject_WhenFinishingOpenProjectActivity_ThenProjectSetToNullAndMessageLogged() { // Given const string someFilePath = @"c:\\folder\someFilePath.rtd"; @@ -722,6 +722,7 @@ var projectFactory = mocks.Stub(); var projectOwner = mocks.Stub(); + projectOwner.Expect(po => po.SetProject(null, null)); mocks.ReplayAll(); var openProjectProperties = new OpenProjectActivity.OpenProjectConstructionProperties @@ -758,7 +759,7 @@ [Test] [TestCaseSource(nameof(ExceptionCases))] - public void GivenOpenProjectActivityFailedDueToException_WhenFinishingOpenProjectActivity_ThenProjectOwnerHasNewEmptyProjectWithLogMessage(Exception exceptionToThrow) + public void GivenOpenProjectActivityFailedDueToException_WhenFinishingOpenProjectActivity_ThenProjectOwnerHasNullProjectWithLogMessage(Exception exceptionToThrow) { // Given const string someFilePath = @"c:\\folder\someFilePath.rtd"; @@ -770,6 +771,7 @@ var projectFactory = mocks.StrictMock(); var projectOwner = mocks.StrictMock(); + projectOwner.Expect(po => po.SetProject(null, null)); mocks.ReplayAll(); var openProjectProperties = new OpenProjectActivity.OpenProjectConstructionProperties @@ -963,7 +965,55 @@ mocks.VerifyAll(); } + + [Test] + public void Finish_ProjectMigrationFailed_ProjectSetToNull() + { + // Setup + var mocks = new MockRepository(); + var projectFactory = mocks.Stub(); + var projectOwner = mocks.Stub(); + projectOwner.Expect(po => po.SetProject(null, null)); + var storeProject = mocks.Stub(); + var migrateProject = mocks.Stub(); + migrateProject.Stub(pm => pm.Migrate(null, null)) + .IgnoreArguments() + .Throw(new ArgumentException()); + mocks.ReplayAll(); + var openProjectProperties = new OpenProjectActivity.OpenProjectConstructionProperties + { + FilePath = "", + ProjectFactory = projectFactory, + ProjectOwner = projectOwner, + ProjectStorage = storeProject + }; + var migrateProjectProperties = new OpenProjectActivity.ProjectMigrationConstructionProperties + { + MigrationFilePath = "", + Migrator = migrateProject + }; + + var activity = new OpenProjectActivity(openProjectProperties, + migrateProjectProperties); + activity.Run(); + + // Precondition + Assert.AreEqual(ActivityState.Failed, activity.State); + + activity.ProgressChanged += (sender, args) => + { + Assert.AreSame(activity, sender); + Assert.AreEqual(EventArgs.Empty, args); + }; + + // Call + activity.Finish(); + + // Assert + mocks.VerifyAll(); + } + [Test] [TestCase(true)] [TestCase(false)] @@ -1006,7 +1056,7 @@ } [Test] - public void GivenActivityMigratinProject_WhenCancellingAndMigrationThrowsException_DoNotLoadProject() + public void GivenActivityMigrationProject_WhenCancellingAndMigrationThrowsException_DoNotLoadProject() { // Setup var mocks = new MockRepository();