Index: Core/Gui/src/Core.Gui/Forms/Main/MainWindow.xaml.cs =================================================================== diff -u -r38628d40c8fe8a67f2186bce447026397907e9eb -r747fccb3885c38bfce3564c54d65c63befd4eaf4 --- Core/Gui/src/Core.Gui/Forms/Main/MainWindow.xaml.cs (.../MainWindow.xaml.cs) (revision 38628d40c8fe8a67f2186bce447026397907e9eb) +++ Core/Gui/src/Core.Gui/Forms/Main/MainWindow.xaml.cs (.../MainWindow.xaml.cs) (revision 747fccb3885c38bfce3564c54d65c63befd4eaf4) @@ -85,8 +85,8 @@ Name = "MainWindow"; NewProjectCommand = new RelayCommand(OnNewProject); - SaveProjectCommand = new RelayCommand(OnSaveProject); - SaveProjectAsCommand = new RelayCommand(OnSaveProjectAs); + SaveProjectCommand = new RelayCommand(OnSaveProject, CanExecuteSaveCommand); + SaveProjectAsCommand = new RelayCommand(OnSaveProjectAs, CanExecuteSaveCommand); OpenProjectCommand = new RelayCommand(OnOpenProject); CloseApplicationCommand = new RelayCommand(OnCloseApplication); CloseViewTabCommand = new RelayCommand(OnCloseViewTab, CanCloseViewTab); @@ -428,6 +428,11 @@ CloseBackstage(); } + private bool CanExecuteSaveCommand(object obj) + { + return gui?.Project != null; + } + private void OnSaveProject(object obj) { commands.StorageCommands.SaveProject(); Index: Core/Gui/test/Core.Gui.Test/Forms/Main/MainWindowTest.cs =================================================================== diff -u -r38628d40c8fe8a67f2186bce447026397907e9eb -r747fccb3885c38bfce3564c54d65c63befd4eaf4 --- Core/Gui/test/Core.Gui.Test/Forms/Main/MainWindowTest.cs (.../MainWindowTest.cs) (revision 38628d40c8fe8a67f2186bce447026397907e9eb) +++ Core/Gui/test/Core.Gui.Test/Forms/Main/MainWindowTest.cs (.../MainWindowTest.cs) (revision 747fccb3885c38bfce3564c54d65c63befd4eaf4) @@ -35,7 +35,6 @@ using Core.Common.TestUtil; using Core.Common.Util.Reflection; using Core.Components.Chart.Forms; -using Core.Components.DotSpatial.Forms; using Core.Components.Gis.Forms; using Core.Gui.Commands; using Core.Gui.Forms.Chart; @@ -51,7 +50,6 @@ using Core.Gui.Test.Forms.ViewHost; using Core.Gui.TestUtil; using Core.Gui.TestUtil.Map; -using DotSpatial.Data; using NUnit.Extensions.Forms; using NUnit.Framework; using Rhino.Mocks; @@ -959,6 +957,76 @@ } [Test] + public void GivenMainWindowWithoutGui_WhenSaveProjectCanExecuteIsCalled_ThenReturnsFalse() + { + // Given + using (var mainWindow = new MainWindow()) + { + // When + bool canExecute = mainWindow.SaveProjectCommand.CanExecute(null); + + // Then + Assert.IsFalse(canExecute); + } + } + + [Test] + public void GivenMainWindowWithoutProject_WhenSaveProjectCanExecuteIsCalled_ThenReturnsFalse() + { + // Given + var mocks = new MockRepository(); + var projectStore = mocks.Stub(); + var projectMigrator = mocks.Stub(); + var projectFactory = mocks.Stub(); + mocks.ReplayAll(); + + using (var mainWindow = new MainWindow()) + using (var gui = new GuiCore(mainWindow, projectStore, projectMigrator, projectFactory, new GuiCoreSettings())) + { + gui.Run(); + + mainWindow.SetGui(gui); + + // When + bool canExecute = mainWindow.SaveProjectCommand.CanExecute(null); + + // Then + Assert.IsFalse(canExecute); + } + + mocks.VerifyAll(); + } + + [Test] + public void GivenMainWindowWithProject_WhenSaveProjectCanExecuteIsCalled_ThenReturnsTrue() + { + // Given + var mocks = new MockRepository(); + var project = mocks.Stub(); + var projectStore = mocks.Stub(); + var projectMigrator = mocks.Stub(); + var projectFactory = mocks.Stub(); + mocks.ReplayAll(); + + using (var mainWindow = new MainWindow()) + using (var gui = new GuiCore(mainWindow, projectStore, projectMigrator, projectFactory, new GuiCoreSettings())) + { + gui.Run(); + + mainWindow.SetGui(gui); + gui.SetProject(project, null); + + // When + bool canExecute = mainWindow.SaveProjectCommand.CanExecute(null); + + // Then + Assert.IsTrue(canExecute); + } + + mocks.VerifyAll(); + } + + [Test] [TestCase(true)] [TestCase(false)] public void GivenMainWindow_WhenSaveProjectIsCalled_ThenProjectSaved(bool backstageVisible) @@ -1024,6 +1092,76 @@ } [Test] + public void GivenMainWindowWithoutGui_WhenSaveProjectAsCanExecuteIsCalled_ThenReturnsFalse() + { + // Given + using (var mainWindow = new MainWindow()) + { + // When + bool canExecute = mainWindow.SaveProjectAsCommand.CanExecute(null); + + // Then + Assert.IsFalse(canExecute); + } + } + + [Test] + public void GivenMainWindowWithoutProject_WhenSaveProjectAsCanExecuteIsCalled_ThenReturnsFalse() + { + // Given + var mocks = new MockRepository(); + var projectStore = mocks.Stub(); + var projectMigrator = mocks.Stub(); + var projectFactory = mocks.Stub(); + mocks.ReplayAll(); + + using (var mainWindow = new MainWindow()) + using (var gui = new GuiCore(mainWindow, projectStore, projectMigrator, projectFactory, new GuiCoreSettings())) + { + gui.Run(); + + mainWindow.SetGui(gui); + + // When + bool canExecute = mainWindow.SaveProjectAsCommand.CanExecute(null); + + // Then + Assert.IsFalse(canExecute); + } + + mocks.VerifyAll(); + } + + [Test] + public void GivenMainWindowWithProject_WhenSaveProjectAsCanExecuteIsCalled_ThenReturnsTrue() + { + // Given + var mocks = new MockRepository(); + var project = mocks.Stub(); + var projectStore = mocks.Stub(); + var projectMigrator = mocks.Stub(); + var projectFactory = mocks.Stub(); + mocks.ReplayAll(); + + using (var mainWindow = new MainWindow()) + using (var gui = new GuiCore(mainWindow, projectStore, projectMigrator, projectFactory, new GuiCoreSettings())) + { + gui.Run(); + + mainWindow.SetGui(gui); + gui.SetProject(project, null); + + // When + bool canExecute = mainWindow.SaveProjectAsCommand.CanExecute(null); + + // Then + Assert.IsTrue(canExecute); + } + + mocks.VerifyAll(); + } + + [Test] [TestCase(true)] [TestCase(false)] public void GivenMainWindow_WhenSaveProjectAsIsCalled_ThenProjectSaved(bool backstageVisible)