public void ApplicationMonitor_MustValidateQuitPasswordIfTerminationFailed()
        {
            var hash       = "12345";
            var lockScreen = new Mock <ILockScreen>();
            var result     = new LockScreenResult {
                Password = "******"
            };
            var attempt          = 0;
            var correct          = new Random().Next(1, 50);
            var lockScreenResult = new Func <LockScreenResult>(() => ++ attempt == correct ? result : new LockScreenResult());

            context.Settings.Security.QuitPasswordHash = hash;
            hashAlgorithm.Setup(a => a.GenerateHashFor(It.Is <string>(p => p == result.Password))).Returns(hash);
            lockScreen.Setup(l => l.WaitForResult()).Returns(lockScreenResult);
            uiFactory
            .Setup(f => f.CreateLockScreen(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <IEnumerable <LockScreenOption> >()))
            .Returns(lockScreen.Object);

            sut.TryStart();
            applicationMonitor.Raise(m => m.TerminationFailed += null, new List <RunningApplication>());

            hashAlgorithm.Verify(a => a.GenerateHashFor(It.Is <string>(p => p == result.Password)), Times.Once);
            hashAlgorithm.Verify(a => a.GenerateHashFor(It.Is <string>(p => p != result.Password)), Times.Exactly(attempt - 1));
            messageBox.Verify(m => m.Show(
                                  It.IsAny <TextKey>(),
                                  It.IsAny <TextKey>(),
                                  It.IsAny <MessageBoxAction>(),
                                  It.IsAny <MessageBoxIcon>(),
                                  It.Is <IWindow>(w => w == lockScreen.Object)), Times.Exactly(attempt - 1));
        }
        public void ApplicationMonitor_MustRequestShutdownIfChosenByUserAfterFailedTermination()
        {
            var lockScreen = new Mock <ILockScreen>();
            var result     = new LockScreenResult();

            lockScreen.Setup(l => l.WaitForResult()).Returns(result);
            runtimeProxy.Setup(p => p.RequestShutdown()).Returns(new CommunicationResult(true));
            uiFactory
            .Setup(f => f.CreateLockScreen(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <IEnumerable <LockScreenOption> >()))
            .Returns(lockScreen.Object)
            .Callback <string, string, IEnumerable <LockScreenOption> >((m, t, o) => result.OptionId = o.Last().Id);

            sut.TryStart();
            applicationMonitor.Raise(m => m.TerminationFailed += null, new List <RunningApplication>());

            runtimeProxy.Verify(p => p.RequestShutdown(), Times.Once);
        }
        public void ApplicationMonitor_MustShowLockScreenIfTerminationFailed()
        {
            var activator1 = new Mock <IActivator>();
            var activator2 = new Mock <IActivator>();
            var activator3 = new Mock <IActivator>();
            var lockScreen = new Mock <ILockScreen>();
            var result     = new LockScreenResult();
            var order      = 0;
            var pause      = 0;
            var show       = 0;
            var wait       = 0;
            var close      = 0;
            var resume     = 0;

            activator1.Setup(a => a.Pause()).Callback(() => pause   = ++order);
            activator1.Setup(a => a.Resume()).Callback(() => resume = ++order);
            context.Activators.Add(activator1.Object);
            context.Activators.Add(activator2.Object);
            context.Activators.Add(activator3.Object);
            lockScreen.Setup(l => l.Show()).Callback(() => show          = ++order);
            lockScreen.Setup(l => l.WaitForResult()).Callback(() => wait = ++order).Returns(result);
            lockScreen.Setup(l => l.Close()).Callback(() => close        = ++order);
            uiFactory
            .Setup(f => f.CreateLockScreen(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <IEnumerable <LockScreenOption> >()))
            .Returns(lockScreen.Object);

            sut.TryStart();
            applicationMonitor.Raise(m => m.TerminationFailed += null, new List <RunningApplication>());

            activator1.Verify(a => a.Pause(), Times.Once);
            activator1.Verify(a => a.Resume(), Times.Once);
            activator2.Verify(a => a.Pause(), Times.Once);
            activator2.Verify(a => a.Resume(), Times.Once);
            activator3.Verify(a => a.Pause(), Times.Once);
            activator3.Verify(a => a.Resume(), Times.Once);
            lockScreen.Verify(l => l.Show(), Times.Once);
            lockScreen.Verify(l => l.WaitForResult(), Times.Once);
            lockScreen.Verify(l => l.Close(), Times.Once);

            Assert.IsTrue(pause == 1);
            Assert.IsTrue(show == 2);
            Assert.IsTrue(wait == 3);
            Assert.IsTrue(close == 4);
            Assert.IsTrue(resume == 5);
        }
        public LockScreenResult WaitForResult()
        {
            var result = new LockScreenResult();

            autoResetEvent.WaitOne();

            Dispatcher.Invoke(() =>
            {
                result.Password = Password.Password;

                foreach (var child in Options.Children)
                {
                    if (child is RadioButton option && option.IsChecked == true)
                    {
                        result.OptionId = option.Tag as Guid?;
                    }
                }
            });

            return(result);
        }