public void WindowClosed_WillStoreCurrentWindowPositionToWindowConfig_Always()
        {
            var mainVM = new MainViewModel();
            var configGuard = new ConfigurableWindowGuard();
            var win1 = new Mock<IConfigurableWindow>();
            var win2 = new Mock<IConfigurableWindow>();
            configGuard.Init(mainVM);
            var winConfig1 = new Fake_WindowConfiguration("win1");
            var winConfig2 = new Fake_WindowConfiguration("win2");
            var win1Rect = new Rect(10, 20, 100, 200);
            var win2Rect = new Rect(30, 40, 300, 400);
            win1.Setup(window => window.GetPlacement()).Returns(win1Rect);
            win2.Setup(window => window.GetPlacement()).Returns(win2Rect);
            win1.Setup(window => window.GetAlwaysOnTop()).Returns(false);
            win2.Setup(window => window.GetAlwaysOnTop()).Returns(false);
            configGuard.RegisterConfigurableWindow(win1.Object, winConfig1);
            configGuard.RegisterConfigurableWindow(win2.Object, winConfig2);

            win1.Raise(window => window.ConfigurableWindowClosed += null, EventArgs.Empty);
            win2.Raise(window => window.ConfigurableWindowClosed += null, EventArgs.Empty);

            Assert.AreEqual((int)win1Rect.Left,   winConfig1.SettingsSaved["Left"]);
            Assert.AreEqual((int)win1Rect.Top,    winConfig1.SettingsSaved["Top"]);
            Assert.AreEqual((int)win1Rect.Width,  winConfig1.SettingsSaved["Width"]);
            Assert.AreEqual((int)win1Rect.Height, winConfig1.SettingsSaved["Height"]);
            Assert.AreEqual(0 /*false*/, winConfig1.SettingsSaved["IsTopMostWindow"]);
            Assert.AreEqual((int)win2Rect.Left,   winConfig2.SettingsSaved["Left"]);
            Assert.AreEqual((int)win2Rect.Top,    winConfig2.SettingsSaved["Top"]);
            Assert.AreEqual((int)win2Rect.Width,  winConfig2.SettingsSaved["Width"]);
            Assert.AreEqual((int)win2Rect.Height, winConfig2.SettingsSaved["Height"]);
            Assert.AreEqual(0 /*false*/, winConfig2.SettingsSaved["IsTopMostWindow"]);
        }
        public void PropertyChangeEventOfMainViewModel_WontTouchWindowTopMostFlags_WhenChangedPropertyIsUninteresting()
        {
            var mainVM = new MainViewModel();
            var configGuard = new ConfigurableWindowGuard();
            var win1 = new Mock<IConfigurableWindow>();
            var win2 = new Mock<IConfigurableWindow>();
            bool win1TopMost = false;
            bool win2TopMost = false;
            win1.Setup(window => window.SetAlwaysOnTop(true)).Callback(() => win1TopMost = true);
            win2.Setup(window => window.SetAlwaysOnTop(true)).Callback(() => win2TopMost = true);
            configGuard.Init(mainVM);

            configGuard.RegisterConfigurableWindow(win1.Object, new Fake_WindowConfiguration("win1"));
            configGuard.RegisterConfigurableWindow(win2.Object, new Fake_WindowConfiguration("win2"));
            mainVM.IsManualRestartButtonShown = true;

            Assert.IsFalse(win1TopMost);
            Assert.IsFalse(win2TopMost);
        }
        public void TurningOnTopMostFlag_WillSetEachWindowAsTopMost_Always()
        {
            var mainVM = new MainViewModel();
            var configGuard = new ConfigurableWindowGuard();
            var win1 = new Mock<IConfigurableWindow>();
            var win2 = new Mock<IConfigurableWindow>();
            bool win1TopMost = false;
            bool win2TopMost = false;
            win1.Setup(window => window.SetAlwaysOnTop(true)).Callback(() => win1TopMost = true);
            win2.Setup(window => window.SetAlwaysOnTop(true)).Callback(() => win2TopMost = true);
            mainVM.IsTopMostMainWindow = false; // simulate transition of false => true
            configGuard.Init(mainVM);

            configGuard.RegisterConfigurableWindow(win1.Object, new Fake_WindowConfiguration("win1"));
            configGuard.RegisterConfigurableWindow(win2.Object, new Fake_WindowConfiguration("win2"));
            mainVM.IsTopMostMainWindow = true;

            Assert.IsTrue(win1TopMost);
            Assert.IsTrue(win2TopMost);
        }
        public void WindowInitialized_WillPositionWindowAccordingToLoadedConfig_Always()
        {
            var mainVM = new MainViewModel();
            var configGuard = new ConfigurableWindowGuard();
            var win1 = new Mock<IConfigurableWindow>();
            var win2 = new Mock<IConfigurableWindow>();
            configGuard.Init(mainVM);
            var winConfig1 = new Fake_WindowConfiguration("win1");
            var winConfig2 = new Fake_WindowConfiguration("win2");
            var win1Rect = new Rect(10, 20, 100, 200);
            var win2Rect = new Rect(30, 40, 300, 400);
            winConfig1.ForcedSettingsToLoad["Left"] = (int)win1Rect.Left;
            winConfig2.ForcedSettingsToLoad["Left"] = (int)win2Rect.Left;
            winConfig1.ForcedSettingsToLoad["Top"] = (int)win1Rect.Top;
            winConfig2.ForcedSettingsToLoad["Top"] = (int)win2Rect.Top;
            winConfig1.ForcedSettingsToLoad["Width"] = (int)win1Rect.Width;
            winConfig2.ForcedSettingsToLoad["Width"] = (int)win2Rect.Width;
            winConfig1.ForcedSettingsToLoad["Height"] = (int)win1Rect.Height;
            winConfig2.ForcedSettingsToLoad["Height"] = (int)win2Rect.Height;
            winConfig1.ForcedSettingsToLoad["IsTopMostWindow"] = 0 /*false*/;
            winConfig2.ForcedSettingsToLoad["IsTopMostWindow"] = 0 /*false*/;
            configGuard.RegisterConfigurableWindow(win1.Object, winConfig1);
            configGuard.RegisterConfigurableWindow(win2.Object, winConfig2);

            win1.Raise(window => window.ConfigurableWindowInitialized += null, EventArgs.Empty);
            win2.Raise(window => window.ConfigurableWindowInitialized += null, EventArgs.Empty);

            win1.Verify(window => window.SetPlacement(It.Is<Rect>(r => r.Left   == win1Rect.Left)));
            win1.Verify(window => window.SetPlacement(It.Is<Rect>(r => r.Top    == win1Rect.Top)));
            win1.Verify(window => window.SetPlacement(It.Is<Rect>(r => r.Width  == win1Rect.Width)));
            win1.Verify(window => window.SetPlacement(It.Is<Rect>(r => r.Height == win1Rect.Height)));
            win1.Verify(window => window.SetAlwaysOnTop(false));
            win2.Verify(window => window.SetPlacement(It.Is<Rect>(r => r.Left   == win2Rect.Left)));
            win2.Verify(window => window.SetPlacement(It.Is<Rect>(r => r.Top    == win2Rect.Top)));
            win2.Verify(window => window.SetPlacement(It.Is<Rect>(r => r.Width  == win2Rect.Width)));
            win2.Verify(window => window.SetPlacement(It.Is<Rect>(r => r.Height == win2Rect.Height)));
            win2.Verify(window => window.SetAlwaysOnTop(false));
        }
        public void WindowInitialized_WillLoadWindowConfiguration_Always()
        {
            var mainVM = new MainViewModel();
            var configGuard = new ConfigurableWindowGuard();
            var win1 = new Mock<IConfigurableWindow>();
            var win2 = new Mock<IConfigurableWindow>();
            configGuard.Init(mainVM);
            var winConfig1 = new Mock<WindowConfiguration>("win1");
            var winConfig2 = new Mock<WindowConfiguration>("win2");
            configGuard.RegisterConfigurableWindow(win1.Object, winConfig1.Object);
            configGuard.RegisterConfigurableWindow(win2.Object, winConfig2.Object);

            win1.Raise(window => window.ConfigurableWindowInitialized += null, EventArgs.Empty);
            win2.Raise(window => window.ConfigurableWindowInitialized += null, EventArgs.Empty);

            winConfig1.Verify(config => config.LoadSettings());
            winConfig2.Verify(config => config.LoadSettings());
        }