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); }
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); }