コード例 #1
0
        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
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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
        }
コード例 #5
0
        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);
        }