public void WatchesForGameProcessChanges()
        {
            var nm = new NativeMethodsMock()
            {
                Processes =
                {
                    [0]    = "System",
                    [1000] = "Process 1000",
                    [2000] = _gif.MainExecutable.FullName,
                },
            };

            using var gpw = new GameProcessWatcher(_gif, nm);
            var evs = new EventCollector <GameProcessState>(h => gpw.Changed += h, h => gpw.Changed -= h, nameof(WatchesForGameProcessChanges));

            var pss = evs.Wait(3, () =>
            {
                InvokeTimerElapsed(gpw);

                nm.ForegroundWindow = new IntPtr(2000);
                InvokeTimerElapsed(gpw);

                nm.ForegroundWindow = new IntPtr(1000);
                InvokeTimerElapsed(gpw);
            });

            Assert.Equal(GameProcessState.NotRunning, pss[0]);
            Assert.Equal(GameProcessState.InForeground, pss[1]);
            Assert.Equal(GameProcessState.InBackground, pss[2]);
        }
        public void RaisesEventsForEachGameStateChange()
        {
            var expected = new[]
            {
                ChangeType.StatusEntry,
                ChangeType.BindingPreset,
                ChangeType.GraphicsConfig,
                ChangeType.DeviceKeySet,
                ChangeType.GameProcessState,
                ChangeType.JournalEntry,
                ChangeType.JournalEntry,
                ChangeType.JournalEntry,
                ChangeType.JournalDrain,
            };

            using var watcher = new GameStateWatcher(_gameRootFolder, _gameOptionsFolder, _journalFolder)
                  {
                      RaisePreStartupEvents = true,
                  };

            var evs = new EventCollector <ChangeType>(h => watcher.Changed += h, h => watcher.Changed -= h, nameof(RaisesEventsForEachGameStateChange));

            var events = evs.Wait(expected.Length, watcher.Start, 5000);

            watcher.Stop();

            var mismatches = expected.Except(events);

            Assert.Empty(mismatches);
        }
示例#3
0
        public void RaisesEventsForEachGameStateChange()
        {
            using var watcher = new GameStateWatcher(_gameRootFolder, _gameOptionsFolder, _journalFolder)
                  {
                      RaisePreStartupEvents = true,
                  };

            var evs = new EventCollector <EventArgs>(h => watcher.Changed += h, h => watcher.Changed -= h);

            evs.Wait(8, watcher.Start, 5000);
            watcher.Stop();
        }
        public void OnChangedIsNotReentrant()
        {
            using var watcher = new GameStateWatcher(_gameRootFolder, _gameOptionsFolder, _journalFolder)
                  {
                      RaisePreStartupEvents = false,
                  };

            var evs = new EventCollector <ChangeType>(h => watcher.Changed += h, h => watcher.Changed -= h, nameof(OnChangedIsNotReentrant));

            evs.Wait(watcher.Start, 5000);

            var nOnChangedCalls = 0;

            using var mre = new ManualResetEventSlim();

            watcher.Changed += (sender, e) =>
            {
                Interlocked.Increment(ref nOnChangedCalls);
                mre.Wait();
            };

            void OnChanged()
            {
                watcher.InvokePrivateMethod <object>("OnChanged", new object[] { null });
                mre.Set();
            }

            Task.WaitAll(new[]
            {
                Task.Run(OnChanged),
                Task.Run(OnChanged),
            });

            watcher.Stop();

            Assert.Equal(1, nOnChangedCalls);
        }