public void RefireThrottledEvents() { var resetevent = new AutoResetEvent(false); var controller = new Mock <IEventController>(); var observer = new EventObserver <int, int>( x => controller.Object.RaiseEvent(EventX, x), (x, y) => x + y ).Throttle(TimeSpan.FromMilliseconds(10)); var list = Enumerable.Range(1, 10); var result = Parallel.ForEach(list, x => observer.OnEvent(x)); resetevent.WaitOne(250); Assert.IsTrue(result.IsCompleted); controller.Verify(c => c.RaiseEvent(EventX, It.IsAny <int>()), Times.Once); controller.Verify(c => c.RaiseEvent(EventX, list.Sum()), Times.Once); var list2 = Enumerable.Range(11, 10); //different range of values result = Parallel.ForEach(list2, x => observer.OnEvent(x)); resetevent.WaitOne(250); resetevent.Dispose(); Assert.IsTrue(result.IsCompleted); controller.Verify(c => c.RaiseEvent(EventX, It.IsAny <int>()), Times.Exactly(2)); controller.Verify(c => c.RaiseEvent(EventX, list2.Sum()), Times.Once); //doesn't contain old values }
public void EvenNumberEventObserver() { const string EvenNumber = "Even Number"; var controller = new Mock <IEventController>(); int number = -1; var observer = new EventObserver <int, bool>( x => { if (x) { controller.Object.RaiseEvent(EvenNumber, number); } }, x => { number = x; return(number % 2 == 0); } ); var list = Enumerable.Range(1, 10).ToList(); list.ForEach(x => observer.OnEvent(x)); //notify OnEvent controller.Verify(c => c.RaiseEvent(It.IsAny <string>(), It.IsAny <object[]>()), Times.Exactly(5)); controller.Verify(c => c.RaiseEvent(EvenNumber, 2), Times.Once); controller.Verify(c => c.RaiseEvent(EvenNumber, 4), Times.Once); controller.Verify(c => c.RaiseEvent(EvenNumber, 6), Times.Once); controller.Verify(c => c.RaiseEvent(EvenNumber, 8), Times.Once); controller.Verify(c => c.RaiseEvent(EvenNumber, 10), Times.Once); }
public void ParallelEventObserver() { var resetevent = new AutoResetEvent(false); var controller = new Mock <IEventController>(); var observer = new EventObserver <int, int>( x => controller.Object.RaiseEvent(EventX, x), (x, y) => x + y ).Throttle(TimeSpan.FromMilliseconds(10)); var list = Enumerable.Range(1, 10); var result = Parallel.ForEach(list, x => observer.OnEvent(x)); resetevent.WaitOne(250); Assert.IsTrue(result.IsCompleted); controller.Verify(c => c.RaiseEvent(EventX, It.IsAny <int>()), Times.Once); controller.Verify(c => c.RaiseEvent(EventX, 55), Times.Once); }
public void SimpleEventObserver() { const string disposed = "Disposed"; var controller = new Mock <IEventController>(); using (var observer = new EventObserver <int, bool>( x => controller.Object.RaiseEvent(EventX, x), x => x % 2 == 0 )) { observer.Disposed += () => controller.Object.RaiseEvent(disposed); var list = Enumerable.Range(1, 10).ToList(); list.ForEach(x => observer.OnEvent(x)); //notify OnEvent controller.Verify(c => c.RaiseEvent(EventX, It.IsAny <bool>()), Times.Exactly(10)); controller.Verify(c => c.RaiseEvent(EventX, true), Times.Exactly(5)); controller.Verify(c => c.RaiseEvent(EventX, false), Times.Exactly(5)); //Dispose is not yet called controller.Verify(c => c.RaiseEvent(disposed), Times.Never); } controller.Verify(c => c.RaiseEvent(disposed), Times.Once); //must be called once }
public void ThrottleIdentityEventObserver() { var timeout = 50; var resetevent = new AutoResetEvent(false); var controller = new Mock <IEventController>(); controller.Setup(c => c.RaiseEvent(It.IsAny <string>(), It.IsAny <object[]>())).Callback(() => resetevent.Set()); var observer = new EventObserver <int, int>( x => controller.Object.RaiseEvent(EventX, x), EventObserver <int, int> .Identity ).Throttle(TimeSpan.FromMilliseconds(timeout)); var list = Enumerable.Range(1, 10).ToList(); list.ForEach(x => observer.OnEvent(x)); //notify OnEvent resetevent.WaitOne(timeout * 3); controller.Verify(c => c.RaiseEvent(EventX, It.IsAny <int>()), Times.Once); controller.Verify(c => c.RaiseEvent(EventX, list.Last()), Times.Once); }