[DataRow(69, 100, 27, 3, true)] //Internet ok; gpu0(ld=100%, t=69 C);  gpu1(ld=3%, t=27 C)
        public void VerifySupervisedAppRestarts(Single t0, Single l0, Single t1, Single l1, Boolean ic)
        {
            pr.UtilityManager.Stub(x => x.IsOnline()).Return(ic).Repeat.Times(7);
            pr.Args.CheckInet = false;
            gpu0.Temperature.Stub(x => x.Value).Return(t0);
            gpu0.Load.Stub(x => x.Value).Return(l0);
            gpu1.Temperature.Stub(x => x.Value).Return(t1);
            gpu1.Load.Stub(x => x.Value).Return(l1);

            pr.Process.Stub(x => x.WaitForExit()).WhenCalled(x => Thread.Sleep(200));
            using (var tm = new System.Timers.Timer(10))
            {
                void OnElapsed(Object sender, System.Timers.ElapsedEventArgs e)
                => pr.Timer.Raise(x => x.Elapsed += null);

                var superviser = new Superviser(pr);
                tm.Elapsed += OnElapsed;
                tm.Start();
                superviser.Start();

                tm.Elapsed -= OnElapsed;
            }

            pr.UtilityManager.AssertWasCalled(x => x.RestartProcess(Arg <IProcess> .Is.Anything));
        }
        [DataRow(69, 100, 27, 3)]  //Internet ok; gpu0(ld=100%, t=69 C);  gpu1(ld=3%, t=27 C)
        public void VerifySupervisedAppStopsAndRunsOnInetFail(Single t0, Single l0, Single t1, Single l1)
        {
            pr.UtilityManager.Stub(x => x.IsOnline()).Return(true).Repeat.Times(2);
            pr.UtilityManager.Stub(x => x.IsOnline()).Return(false).Repeat.Times(9);
            pr.UtilityManager.Stub(x => x.IsOnline()).Return(true);

            gpu0.Temperature.Stub(x => x.Value).Return(t0);
            gpu0.Load.Stub(x => x.Value).Return(l0);
            gpu1.Temperature.Stub(x => x.Value).Return(t1);
            gpu1.Load.Stub(x => x.Value).Return(l1);

            pr.Process.Stub(x => x.WaitForExit()).WhenCalled(x => Thread.Sleep(200));
            using (var tm = new System.Timers.Timer(5))
            {
                void OnElapsed(Object sender, System.Timers.ElapsedEventArgs e)
                => pr.Timer.Raise(x => x.Elapsed += null);

                var superviser = new Superviser(pr);
                tm.Elapsed += OnElapsed;
                tm.Start();
                superviser.Start();

                tm.Elapsed -= OnElapsed;
            }

            pr.UtilityManager.AssertWasCalled(x => x.StopProcess(Arg <IProcess> .Is.Anything), opt => opt.Repeat.Times(1));
            pr.UtilityManager.AssertWasCalled(x => x.StartProcess(Arg <IProcess> .Is.Anything), opt => opt.Repeat.Times(1));
        }