Index: Core/Common/test/Core.Common.TestUtil/TestDataPath.cs =================================================================== diff -u -r3d088548dfdebfd5c3adbbd67075b42e134f5c03 -rc5a240be9791693799cd7916cb3f2fc6ad0ad65c --- Core/Common/test/Core.Common.TestUtil/TestDataPath.cs (.../TestDataPath.cs) (revision 3d088548dfdebfd5c3adbbd67075b42e134f5c03) +++ Core/Common/test/Core.Common.TestUtil/TestDataPath.cs (.../TestDataPath.cs) (revision c5a240be9791693799cd7916cb3f2fc6ad0ad65c) @@ -51,6 +51,8 @@ public static readonly TestDataPath IO = "Core.Components.Gis.IO.Test"; } } + + public static readonly TestDataPath Gui = "Core.Gui.Test"; } public static class Riskeer Index: Core/Gui/src/Core.Gui/Forms/MainWindow/MainWindow.xaml =================================================================== diff -u -r577bf2384ad70fef1d46fe46c399fee1a3401718 -rc5a240be9791693799cd7916cb3f2fc6ad0ad65c --- Core/Gui/src/Core.Gui/Forms/MainWindow/MainWindow.xaml (.../MainWindow.xaml) (revision 577bf2384ad70fef1d46fe46c399fee1a3401718) +++ Core/Gui/src/Core.Gui/Forms/MainWindow/MainWindow.xaml (.../MainWindow.xaml) (revision c5a240be9791693799cd7916cb3f2fc6ad0ad65c) @@ -50,7 +50,7 @@ + Command="{Binding Path=ToggleBackstageCommand, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=metro:MetroWindow}}" /> Index: Core/Gui/src/Core.Gui/Forms/MainWindow/MainWindow.xaml.cs =================================================================== diff -u -rb441bd9ffa8a255a522abceffd49201e96808502 -rc5a240be9791693799cd7916cb3f2fc6ad0ad65c --- Core/Gui/src/Core.Gui/Forms/MainWindow/MainWindow.xaml.cs (.../MainWindow.xaml.cs) (revision b441bd9ffa8a255a522abceffd49201e96808502) +++ Core/Gui/src/Core.Gui/Forms/MainWindow/MainWindow.xaml.cs (.../MainWindow.xaml.cs) (revision c5a240be9791693799cd7916cb3f2fc6ad0ad65c) @@ -87,7 +87,7 @@ CloseApplicationCommand = new RelayCommand(OnCloseApplication); CloseViewTabCommand = new RelayCommand(OnCloseViewTab, CanCloseViewTab); - ToggleBackStageCommand = new RelayCommand(OnToggleBackstage); + ToggleBackstageCommand = new RelayCommand(OnToggleBackstage); } /// @@ -357,7 +357,7 @@ /// /// Gets the command to toggle the backstage. /// - public ICommand ToggleBackStageCommand { get; } + public ICommand ToggleBackstageCommand { get; } private void OnNewProject(object obj) { Index: Core/Gui/test/Core.Gui.Test/Forms/MainWindow/MainWindowTest.cs =================================================================== diff -u -r6be31462252a65cf54edd67c4005f66c944260fe -rc5a240be9791693799cd7916cb3f2fc6ad0ad65c --- Core/Gui/test/Core.Gui.Test/Forms/MainWindow/MainWindowTest.cs (.../MainWindowTest.cs) (revision 6be31462252a65cf54edd67c4005f66c944260fe) +++ Core/Gui/test/Core.Gui.Test/Forms/MainWindow/MainWindowTest.cs (.../MainWindowTest.cs) (revision c5a240be9791693799cd7916cb3f2fc6ad0ad65c) @@ -21,13 +21,15 @@ using System; using System.ComponentModel; +using System.IO; using System.Linq; using System.Threading; using System.Windows; using Core.Common.Base.Data; using Core.Common.Base.Storage; using Core.Common.Controls.TreeView; using Core.Common.Controls.Views; +using Core.Common.TestUtil; using Core.Common.Util.Reflection; using Core.Components.Chart.Forms; using Core.Components.DotSpatial.Forms; @@ -42,17 +44,19 @@ using Core.Gui.Plugin; using Core.Gui.PropertyBag; using Core.Gui.Settings; +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; namespace Core.Gui.Test.Forms.MainWindow { [TestFixture] [Apartment(ApartmentState.STA)] - public class MainWindowTest + public class MainWindowTest : NUnitFormTest { private MessageWindowLogAppender originalValue; @@ -64,9 +68,10 @@ } [TearDown] - public void TearDown() + public override void TearDown() { MessageWindowLogAppender.Instance = originalValue; + base.TearDown(); } [Test] @@ -95,6 +100,13 @@ Assert.AreEqual(ResizeMode.CanResizeWithGrip, mainWindow.ResizeMode); Assert.AreEqual(FlowDirection.LeftToRight, mainWindow.FlowDirection); Assert.AreEqual("RiskeerMainWindow", mainWindow.Name); + + Assert.IsNotNull(mainWindow.NewProjectCommand); + Assert.IsNotNull(mainWindow.SaveProjectCommand); + Assert.IsNotNull(mainWindow.SaveProjectAsCommand); + Assert.IsNotNull(mainWindow.OpenProjectCommand); + Assert.IsNotNull(mainWindow.CloseApplicationCommand); + Assert.IsNotNull(mainWindow.ToggleBackstageCommand); } } @@ -994,6 +1006,305 @@ mocks.VerifyAll(); } + [Test] + public void GivenMainWindow_WhenNewProjectIsCalled_ThenCreateNewProject() + { + // Given + var mocks = new MockRepository(); + var projectStore = mocks.Stub(); + var projectMigrator = mocks.Stub(); + var projectFactory = mocks.StrictMock(); + projectFactory.Expect(pf => pf.CreateNewProject()) + .Return(mocks.Stub()) + .Repeat.Times(3); + mocks.ReplayAll(); + + using (var mainWindow = new Gui.Forms.MainWindow.MainWindow()) + using (var gui = new GuiCore(mainWindow, projectStore, projectMigrator, projectFactory, new GuiCoreSettings())) + { + gui.Plugins.Add(new TestPlugin()); + gui.Run(); + + mainWindow.SetGui(gui); + + // When + mainWindow.NewProjectCommand.Execute(null); + } + + // Then + mocks.VerifyAll(); + } + + [Test] + public void GivenMainWindow_WhenSaveProjectIsCalled_ThenProjectSaved() + { + // Given + string directoryPath = TestHelper.GetScratchPadPath(nameof(MainWindowTest)); + string someValidFilePath = Path.Combine(directoryPath, nameof(GivenMainWindow_WhenSaveProjectIsCalled_ThenProjectSaved)); + + using (new DirectoryDisposeHelper(TestHelper.GetScratchPadPath(), directoryPath)) + { + var mocks = new MockRepository(); + var project = mocks.Stub(); + + var projectStore = mocks.StrictMock(); + projectStore.Expect(ps => ps.SaveProjectAs(someValidFilePath)); + projectStore.Expect(ps => ps.SaveProjectFileFilter).Return(string.Empty); + projectStore.Expect(ps => ps.HasStagedProject).Return(false); + projectStore.Expect(ps => ps.StageProject(project)); + + var projectMigrator = mocks.Stub(); + var projectFactory = mocks.Stub(); + projectFactory.Stub(pf => pf.CreateNewProject()) + .Return(project); + mocks.ReplayAll(); + + DialogBoxHandler = (s, hWnd) => + { + var saveFileDialogTester = new SaveFileDialogTester(hWnd); + saveFileDialogTester.SaveFile(someValidFilePath); + + DialogBoxHandler = (name, wnd) => + { + // Expect progress dialog, which will close automatically. + }; + }; + + using (var mainWindow = new Gui.Forms.MainWindow.MainWindow()) + using (var gui = new GuiCore(mainWindow, projectStore, projectMigrator, projectFactory, new GuiCoreSettings())) + { + gui.Plugins.Add(new TestPlugin()); + gui.Run(); + + mainWindow.SetGui(gui); + + // When + mainWindow.SaveProjectCommand.Execute(null); + } + + // Then + mocks.VerifyAll(); + } + } + + [Test] + public void GivenMainWindow_WhenSaveProjectAsIsCalled_ThenProjectSaved() + { + // Given + string directoryPath = TestHelper.GetScratchPadPath(nameof(MainWindowTest)); + string someValidFilePath = Path.Combine(directoryPath, nameof(GivenMainWindow_WhenSaveProjectAsIsCalled_ThenProjectSaved)); + + using (new DirectoryDisposeHelper(TestHelper.GetScratchPadPath(), directoryPath)) + { + var mocks = new MockRepository(); + var project = mocks.Stub(); + + var projectStore = mocks.StrictMock(); + projectStore.Expect(ps => ps.SaveProjectAs(someValidFilePath)); + projectStore.Expect(ps => ps.SaveProjectFileFilter).Return(string.Empty); + projectStore.Expect(ps => ps.HasStagedProject).Return(false); + projectStore.Expect(ps => ps.StageProject(project)); + + var projectMigrator = mocks.Stub(); + var projectFactory = mocks.Stub(); + projectFactory.Stub(pf => pf.CreateNewProject()) + .Return(project); + mocks.ReplayAll(); + + DialogBoxHandler = (s, hWnd) => + { + var saveFileDialogTester = new SaveFileDialogTester(hWnd); + saveFileDialogTester.SaveFile(someValidFilePath); + + DialogBoxHandler = (name, wnd) => + { + // Expect progress dialog, which will close automatically. + }; + }; + + using (var mainWindow = new Gui.Forms.MainWindow.MainWindow()) + using (var gui = new GuiCore(mainWindow, projectStore, projectMigrator, projectFactory, new GuiCoreSettings())) + { + gui.Plugins.Add(new TestPlugin()); + gui.Run(); + + mainWindow.SetGui(gui); + + // When + mainWindow.SaveProjectAsCommand.Execute(null); + } + + // Then + mocks.VerifyAll(); + } + } + + [Test] + public void GivenMainWindow_WhenOpenProjectIsCalled_ThenProjectOpened() + { + // Given + string directoryPath = TestHelper.GetTestDataPath(TestDataPath.Core.Gui); + string filePath = Path.Combine(directoryPath, nameof(MainWindowTest), "Project.risk"); + + var mocks = new MockRepository(); + var project = mocks.Stub(); + + var projectStore = mocks.StrictMock(); + projectStore.Expect(ps => ps.LoadProject(filePath)); + projectStore.Expect(ps => ps.OpenProjectFileFilter).Return(string.Empty); + + var projectMigrator = mocks.Stub(); + var projectFactory = mocks.Stub(); + projectFactory.Stub(pf => pf.CreateNewProject()) + .Return(project); + mocks.ReplayAll(); + + DialogBoxHandler = (s, hWnd) => + { + var openFileDialogTester = new OpenFileDialogTester(hWnd); + openFileDialogTester.OpenFile(filePath); + + DialogBoxHandler = (name, wnd) => + { + // Expect progress dialog, which will close automatically. + }; + }; + + using (var mainWindow = new Gui.Forms.MainWindow.MainWindow()) + using (var gui = new GuiCore(mainWindow, projectStore, projectMigrator, projectFactory, new GuiCoreSettings())) + { + gui.Plugins.Add(new TestPlugin()); + gui.Run(); + + mainWindow.SetGui(gui); + + // When + mainWindow.OpenProjectCommand.Execute(null); + } + + // Then + mocks.VerifyAll(); + } + + [Test] + public void GivenMainWindowWithoutViewTabOpen_WhenCanExecuteCloseViewTabCommand_ThenFalse() + { + // Given + var mocks = new MockRepository(); + var project = mocks.Stub(); + var projectStore = mocks.Stub(); + var projectMigrator = mocks.Stub(); + var projectFactory = mocks.Stub(); + projectFactory.Stub(pf => pf.CreateNewProject()) + .Return(project); + mocks.ReplayAll(); + + using (var mainWindow = new Gui.Forms.MainWindow.MainWindow()) + using (var gui = new GuiCore(mainWindow, projectStore, projectMigrator, projectFactory, new GuiCoreSettings())) + { + gui.Plugins.Add(new TestPlugin()); + gui.Run(); + + mainWindow.SetGui(gui); + + // When + bool canExecute = mainWindow.CloseViewTabCommand.CanExecute(null); + + // Then + Assert.IsFalse(canExecute); + } + + mocks.VerifyAll(); + } + + [Test] + public void GivenMainWindowWithViewTabOpen_WhenCanExecuteCloseViewTabCommand_ThenTrue() + { + // Given + var mocks = new MockRepository(); + var project = mocks.Stub(); + var projectStore = mocks.Stub(); + var projectMigrator = mocks.Stub(); + var projectFactory = mocks.Stub(); + projectFactory.Stub(pf => pf.CreateNewProject()) + .Return(project); + mocks.ReplayAll(); + + using (var mainWindow = new Gui.Forms.MainWindow.MainWindow()) + using (var gui = new GuiCore(mainWindow, projectStore, projectMigrator, projectFactory, new GuiCoreSettings())) + { + gui.Plugins.Add(new TestPlugin()); + gui.Run(); + + mainWindow.SetGui(gui); + + gui.ViewHost.AddDocumentView(new TestView()); + + // When + bool canExecute = mainWindow.CloseViewTabCommand.CanExecute(null); + + // Then + Assert.IsTrue(canExecute); + } + + mocks.VerifyAll(); + } + + [Test] + [TestCase(true)] + [TestCase(false)] + public void GivenMainWindow_WhenExecuteToggleBackstageCommand_ThenBackstageToggled(bool backstageVisible) + { + // Given + var mocks = new MockRepository(); + var project = mocks.Stub(); + var projectStore = mocks.Stub(); + var projectMigrator = mocks.Stub(); + var projectFactory = mocks.Stub(); + projectFactory.Stub(pf => pf.CreateNewProject()) + .Return(project); + mocks.ReplayAll(); + + using (var mainWindow = new Gui.Forms.MainWindow.MainWindow()) + using (var gui = new GuiCore(mainWindow, projectStore, projectMigrator, projectFactory, new GuiCoreSettings())) + { + gui.Plugins.Add(new TestPlugin()); + gui.Run(); + + mainWindow.SetGui(gui); + + if (backstageVisible) + { + mainWindow.ToggleBackstageCommand.Execute(null); + } + + // Precondition + AssertVisibility(mainWindow, backstageVisible); + + // When + mainWindow.ToggleBackstageCommand.Execute(null); + + // Then + AssertVisibility(mainWindow, !backstageVisible); + } + + mocks.VerifyAll(); + } + + private static void AssertVisibility(Gui.Forms.MainWindow.MainWindow mainWindow, bool backStageVisible) + { + if (backStageVisible) + { + Assert.AreEqual(Visibility.Collapsed, mainWindow.MainDockPanel.Visibility); + Assert.AreEqual(Visibility.Visible, mainWindow.BackstageDockPanel.Visibility); + } + else + { + Assert.AreEqual(Visibility.Visible, mainWindow.MainDockPanel.Visibility); + Assert.AreEqual(Visibility.Collapsed, mainWindow.BackstageDockPanel.Visibility); + } + } + private static IMapControl GetMapControl(MapLegendView mapLegendView) { return TypeUtils.GetProperty(mapLegendView, "MapControl"); Index: Core/Gui/test/Core.Gui.Test/test-data/MainWindowTest/Project.risk =================================================================== diff -u Binary files differ