Index: Core/Gui/src/Core.Gui/Forms/Backstage/InfoViewModel.cs =================================================================== diff -u -r05b63bf3a91f31ec8bc2125730554f19eeca73d1 -r9a5cee082a60641cdc3661d5aabf2bb04f8bc445 --- Core/Gui/src/Core.Gui/Forms/Backstage/InfoViewModel.cs (.../InfoViewModel.cs) (revision 05b63bf3a91f31ec8bc2125730554f19eeca73d1) +++ Core/Gui/src/Core.Gui/Forms/Backstage/InfoViewModel.cs (.../InfoViewModel.cs) (revision 9a5cee082a60641cdc3661d5aabf2bb04f8bc445) @@ -61,11 +61,6 @@ /// is null. public void SetProject(IProject projectToSet) { - if (projectToSet == null) - { - throw new ArgumentNullException(nameof(projectToSet)); - } - project = projectToSet; OnPropertyChanged(nameof(ProjectName)); OnPropertyChanged(nameof(ProjectDescription)); Index: Core/Gui/src/Core.Gui/Forms/Main/MainWindow.xaml =================================================================== diff -u -r5fad04eb4f743ebc8b04307b6c7c04b2d9fbbf36 -r9a5cee082a60641cdc3661d5aabf2bb04f8bc445 --- Core/Gui/src/Core.Gui/Forms/Main/MainWindow.xaml (.../MainWindow.xaml) (revision 5fad04eb4f743ebc8b04307b6c7c04b2d9fbbf36) +++ Core/Gui/src/Core.Gui/Forms/Main/MainWindow.xaml (.../MainWindow.xaml) (revision 9a5cee082a60641cdc3661d5aabf2bb04f8bc445) @@ -31,7 +31,6 @@ xmlns:backstage="clr-namespace:Core.Gui.Forms.Backstage" xmlns:commands="clr-namespace:Core.Gui.Commands" mc:Ignorable="d" - Title="MainWindow" Width="1366" Height="768" x:Name="Window" Index: Core/Gui/src/Core.Gui/GuiCore.cs =================================================================== diff -u -r62e55324ba5c5cda247f17fe63dc999202ee5b58 -r9a5cee082a60641cdc3661d5aabf2bb04f8bc445 --- Core/Gui/src/Core.Gui/GuiCore.cs (.../GuiCore.cs) (revision 62e55324ba5c5cda247f17fe63dc999202ee5b58) +++ Core/Gui/src/Core.Gui/GuiCore.cs (.../GuiCore.cs) (revision 9a5cee082a60641cdc3661d5aabf2bb04f8bc445) @@ -64,6 +64,7 @@ private static bool isAlreadyRunningInstanceOfIGui; private static string instanceCreationStackTrace; + private readonly string applicationTitle; private readonly Observer projectObserver; private ISelectionProvider currentSelectionProvider; @@ -143,6 +144,12 @@ ProjectOpened += ApplicationProjectOpened; BeforeProjectOpened += ApplicationBeforeProjectOpened; projectObserver = new Observer(UpdateProjectData); + + applicationTitle = string.Format(CultureInfo.CurrentCulture, "{0} {1}", + FixedSettings.ApplicationName, + SettingsHelper.Instance.ApplicationVersion); + + SetTitle(); } public IPropertyResolver PropertyResolver { get; private set; } @@ -534,6 +541,14 @@ } } + private void SetTitle() + { + mainWindow.Title = Project != null + ? string.Format(CultureInfo.CurrentCulture, + "{0} - {1}", Project.Name, applicationTitle) + : applicationTitle; + } + ~GuiCore() { Dispose(false); @@ -549,17 +564,9 @@ public IProject Project { - get - { - return project; - } + get => project; private set { - if (value == null) - { - throw new ArgumentNullException(nameof(value), @"There should always be a project."); - } - if (!ReferenceEquals(project, value)) { OnBeforeProjectOpened(); @@ -684,12 +691,7 @@ private void UpdateProjectData() { - mainWindow.Title = string.Format(CultureInfo.CurrentCulture, - "{0} - {1} {2}", - Project.Name, - FixedSettings.ApplicationName, - SettingsHelper.Instance.ApplicationVersion); - + SetTitle(); mainWindow.BackstageViewModel.InfoViewModel.SetProject(project); } Index: Core/Gui/test/Core.Gui.Test/Forms/Backstage/InfoViewModelTest.cs =================================================================== diff -u -r51a9721e725b26c1cd23d0cd54dc384aa8bbb927 -r9a5cee082a60641cdc3661d5aabf2bb04f8bc445 --- Core/Gui/test/Core.Gui.Test/Forms/Backstage/InfoViewModelTest.cs (.../InfoViewModelTest.cs) (revision 51a9721e725b26c1cd23d0cd54dc384aa8bbb927) +++ Core/Gui/test/Core.Gui.Test/Forms/Backstage/InfoViewModelTest.cs (.../InfoViewModelTest.cs) (revision 9a5cee082a60641cdc3661d5aabf2bb04f8bc445) @@ -19,7 +19,6 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. -using System; using System.Collections.Generic; using System.ComponentModel; using Core.Common.Base.Data; @@ -50,11 +49,11 @@ { // Given const string description = "new description"; - + var mocks = new MockRepository(); var project = mocks.Stub(); mocks.ReplayAll(); - + var viewModel = new InfoViewModel(); viewModel.SetProject(project); @@ -74,17 +73,25 @@ } [Test] - public void SetProject_ProjectNull_ThrowsArgumentNullException() + public void SetProject_ProjectNull_ExpectedValuesAndPropertyChangedEventsFired() { // Setup var viewModel = new InfoViewModel(); + var propertyNames = new List(); + viewModel.PropertyChanged += (sender, args) => { propertyNames.Add(args.PropertyName); }; + // Call - void Call() => viewModel.SetProject(null); + viewModel.SetProject(null); // Assert - var exception = Assert.Throws(Call); - Assert.AreEqual("projectToSet", exception.ParamName); + Assert.IsNull(viewModel.ProjectName); + Assert.IsNull(viewModel.ProjectDescription); + CollectionAssert.AreEqual(new[] + { + nameof(viewModel.ProjectName), + nameof(viewModel.ProjectDescription) + }, propertyNames); } [Test] Index: Core/Gui/test/Core.Gui.Test/Forms/Main/MainWindowTest.cs =================================================================== diff -u -re3002162ba9aa7f50147c45c18ca1c34a49a7ff9 -r9a5cee082a60641cdc3661d5aabf2bb04f8bc445 --- Core/Gui/test/Core.Gui.Test/Forms/Main/MainWindowTest.cs (.../MainWindowTest.cs) (revision e3002162ba9aa7f50147c45c18ca1c34a49a7ff9) +++ Core/Gui/test/Core.Gui.Test/Forms/Main/MainWindowTest.cs (.../MainWindowTest.cs) (revision 9a5cee082a60641cdc3661d5aabf2bb04f8bc445) @@ -101,7 +101,7 @@ Assert.IsFalse(mainWindow.InvokeRequired, "'mainWindow' instance on same thread as test, therefore invocation not required."); - Assert.AreEqual("MainWindow", mainWindow.Title); + Assert.IsEmpty(mainWindow.Title); Assert.AreEqual(WindowState.Maximized, mainWindow.WindowState); Assert.AreEqual(ResizeMode.CanResizeWithGrip, mainWindow.ResizeMode); Assert.AreEqual(FlowDirection.LeftToRight, mainWindow.FlowDirection); Index: Core/Gui/test/Core.Gui.Test/GuiCoreTest.cs =================================================================== diff -u -ra79026549254c82cf85550eb8fea2b7229bf9b1b -r9a5cee082a60641cdc3661d5aabf2bb04f8bc445 --- Core/Gui/test/Core.Gui.Test/GuiCoreTest.cs (.../GuiCoreTest.cs) (revision a79026549254c82cf85550eb8fea2b7229bf9b1b) +++ Core/Gui/test/Core.Gui.Test/GuiCoreTest.cs (.../GuiCoreTest.cs) (revision 9a5cee082a60641cdc3661d5aabf2bb04f8bc445) @@ -114,6 +114,8 @@ CollectionAssert.IsEmpty(gui.Plugins); Assert.AreEqual(mainWindow, gui.MainWindow); + var expectedTitle = $"{guiCoreSettings.ApplicationName} {SettingsHelper.Instance.ApplicationVersion}"; + Assert.AreEqual(expectedTitle, mainWindow.Title); Assert.AreSame(ViewPropertyEditor.ViewCommands, gui.ViewCommands); @@ -268,32 +270,6 @@ } [Test] - public void SetProject_SetNull_ThrowsArgumentNullException() - { - var mocks = new MockRepository(); - var projectStore = mocks.Stub(); - var projectMigrator = mocks.Stub(); - var plugin = mocks.Stub(); - plugin.Expect(p => p.Deactivate()); - plugin.Expect(p => p.Dispose()); - IProjectFactory projectFactory = CreateProjectFactory(mocks); - mocks.ReplayAll(); - - using (var gui = new GuiCore(new MainWindow(), projectStore, projectMigrator, projectFactory, new GuiCoreSettings())) - { - gui.Plugins.Add(plugin); - - // Call - void Call() => gui.SetProject(null, null); - - // Assert - Assert.Throws(Call); - } - - mocks.VerifyAll(); - } - - [Test] public void Dispose_WithPlugin_PluginRemoved() { // Setup @@ -1210,9 +1186,9 @@ } [Test] - public void SetProject_SetNewValue_FiresProjectOpenedEvents() + public void GivenGuiWithoutSetProject_WhenSettingNewProject_ThenProjectOpenedEventsFired() { - // Setup + // Given var mocks = new MockRepository(); var storeProject = mocks.Stub(); var projectMigrator = mocks.Stub(); @@ -1235,10 +1211,10 @@ openedCallCount++; }; - // Call + // When gui.SetProject(newProject, null); - // Assert + // Then Assert.AreEqual(1, openedCallCount); Assert.AreEqual(1, beforeOpenCallCount); } @@ -1247,6 +1223,81 @@ } [Test] + public void GivenGuiWithoutSetProject_WhenSettingNewProjectToNull_ThenNothingHappens() + { + // Given + var mocks = new MockRepository(); + var storeProject = mocks.Stub(); + var projectMigrator = mocks.Stub(); + var projectFactory = mocks.Stub(); + mocks.ReplayAll(); + + using (var gui = new GuiCore(new MainWindow(), storeProject, projectMigrator, projectFactory, new GuiCoreSettings())) + { + var openedCallCount = 0; + var beforeOpenCallCount = 0; + gui.BeforeProjectOpened += project => + { + Assert.IsNull(project); + beforeOpenCallCount++; + }; + gui.ProjectOpened += project => + { + Assert.IsNull(project); + openedCallCount++; + }; + + // When + gui.SetProject(null, null); + + // Then + Assert.AreEqual(0, openedCallCount); + Assert.AreEqual(0, beforeOpenCallCount); + } + + mocks.VerifyAll(); + } + + [Test] + public void GivenGuiWithSetProject_WhenSettingNewProjectToNull_ThenProjectOpenedEventsFired() + { + // Given + var mocks = new MockRepository(); + var storeProject = mocks.Stub(); + var projectMigrator = mocks.Stub(); + var projectFactory = mocks.Stub(); + var originalProject = mocks.Stub(); + mocks.ReplayAll(); + + using (var gui = new GuiCore(new MainWindow(), storeProject, projectMigrator, projectFactory, new GuiCoreSettings())) + { + gui.SetProject(originalProject, null); + + var openedCallCount = 0; + var beforeOpenCallCount = 0; + gui.BeforeProjectOpened += project => + { + Assert.AreSame(originalProject, project); + beforeOpenCallCount++; + }; + gui.ProjectOpened += project => + { + Assert.IsNull(project); + openedCallCount++; + }; + + // When + gui.SetProject(null, null); + + // Then + Assert.AreEqual(1, openedCallCount); + Assert.AreEqual(1, beforeOpenCallCount); + } + + mocks.VerifyAll(); + } + + [Test] public void GivenGuiWithoutSelection_WhenSelectionProviderSetAsActiveView_ThenSelectionSynced() { // Given