public void ShouldPassParametersCorrectly()
        {
            IDelegateReference actionDelegateReference = new MockDelegateReference()
            {
                Target =
                    (Action<object>)(arg1 =>
                    {
                        return;
                    })
            };
            IDelegateReference filterDelegateReference = new MockDelegateReference
            {
                Target = (Predicate<object>)(arg => true)
            };

            var mockSyncContext = new MockSynchronizationContext();

            DispatcherEventSubscription<object> eventSubscription = new DispatcherEventSubscription<object>(actionDelegateReference, filterDelegateReference, mockSyncContext, null, EventCommunicatorsRelationship.All);

            var executionStrategy = eventSubscription.GetExecutionStrategy();
            Assert.NotNull(executionStrategy);

            object argument1 = new object();

            executionStrategy.Invoke(new[] { argument1 });

            Assert.Same(argument1, mockSyncContext.InvokeArg);
        }
Esempio n. 2
0
        /// <summary>
        /// Subscribes the given delegate reference to the SelectionChanging event. The delegate will be invoked on the specified thread.
        /// </summary>
        /// <param name="actionReference"></param>
        /// <param name="threadOption"></param>
        /// <returns></returns>
        public SubscriptionToken Subscribe(IDelegateReference actionReference, ThreadOption threadOption)
        {
            IDelegateReference filterReference =
                new DelegateReference(new Predicate <SelectionBase <T> >(_ => true), true);

            EventSubscription <SelectionBase <T> > subscription;

            switch (threadOption)
            {
            case ThreadOption.PublisherThread:
                subscription = new EventSubscription <SelectionBase <T> >(actionReference, filterReference);
                break;

            case ThreadOption.BackgroundThread:
                subscription = new BackgroundEventSubscription <SelectionBase <T> >(actionReference, filterReference);
                break;

            case ThreadOption.UIThread:
                subscription = new DispatcherEventSubscription <SelectionBase <T> >(actionReference, filterReference, UIDispatcher);
                break;

            default:
                throw new NotImplementedException("Thread Option not available.");     // Impossible to happen
            }
            return(base.InternalSubscribe(subscription));
        }
        public void ShouldPassParametersCorrectly()
        {
            IDelegateReference actionDelegateReference = new MockDelegateReference()
            {
                Target =
                    (Action<object>)(arg1 =>
                    {
                        return;
                    })
            };
            IDelegateReference filterDelegateReference = new MockDelegateReference
            {
                Target = (Predicate<object>)(arg => true)
            };

            var mockDispatcher = new MockDispatcher();
            DispatcherEventSubscription<object> eventSubscription = new DispatcherEventSubscription<object>(actionDelegateReference, filterDelegateReference, mockDispatcher);

            var executionStrategy = eventSubscription.GetExecutionStrategy();
            Assert.IsNotNull(executionStrategy);

            object argument1 = new object();

            executionStrategy.Invoke(new[] { argument1 });

            Assert.AreSame(argument1, mockDispatcher.InvokeArg);
        }
Esempio n. 4
0
        /// <summary>
        /// Subscribes a delegate to an event.
        /// </summary>
        /// <param name="action">The delegate that gets executed when the event is published.</param>
        /// <param name="threadOption">Specifies on which thread to receive the delegate callback.</param>
        /// <param name="keepSubscriberReferenceAlive">When <see langword="true"/>, the <see cref="PubSubEvent"/> keeps a reference to the subscriber so it does not get garbage collected.</param>
        /// <returns>A <see cref="SubscriptionToken"/> that uniquely identifies the added subscription.</returns>
        /// <remarks>
        /// If <paramref name="keepSubscriberReferenceAlive"/> is set to <see langword="false" />, <see cref="PubSubEvent"/> will maintain a <see cref="WeakReference"/> to the Target of the supplied <paramref name="action"/> delegate.
        /// If not using a WeakReference (<paramref name="keepSubscriberReferenceAlive"/> is <see langword="true" />), the user must explicitly call Unsubscribe for the event when disposing the subscriber in order to avoid memory leaks or unexpected behavior.
        /// <para/>
        /// The PubSubEvent collection is thread-safe.
        /// </remarks>
        public virtual SubscriptionToken Subscribe(Action action, ThreadOption threadOption, bool keepSubscriberReferenceAlive)
        {
            IDelegateReference actionReference = new DelegateReference(action, keepSubscriberReferenceAlive);

            EventSubscription subscription;

            switch (threadOption)
            {
            case ThreadOption.PublisherThread:
                subscription = new EventSubscription(actionReference);
                break;

            case ThreadOption.BackgroundThread:
                subscription = new BackgroundEventSubscription(actionReference);
                break;

            case ThreadOption.UIThread:
                if (SynchronizationContext == null)
                {
                    throw new InvalidOperationException(Resources.EventAggregatorNotConstructedOnUIThread);
                }
                subscription = new DispatcherEventSubscription(actionReference, SynchronizationContext);
                break;

            default:
                subscription = new EventSubscription(actionReference);
                break;
            }

            return(InternalSubscribe(subscription));
        }
Esempio n. 5
0
        /// <summary>
        /// Subscribe a <see cref="Action"/> to the <see cref="PubSubEvent"/>
        /// </summary>
        /// <param name="action">The <see cref="Action"/> that gets executed when the event is published</param>
        /// <param name="threadOption">Specifies on which thread the received delegate is executed</param>
        /// <param name="keepSubscriberReferenceAlive">If set to <see langword="true"/> the <see cref="PubSubEvent"/> will hold a strong reference to the action, otherwise a weak reference will be kept</param>
        /// <returns>Returns <see cref="SubscriptionToken"/> that uniquely identifies the subscription</returns>
        public virtual SubscriptionToken Subscribe(Action action, ThreadOption threadOption, bool keepSubscriberReferenceAlive)
        {
            var actionReference = new DelegateReference(action, keepSubscriberReferenceAlive);

            EventSubscription subscription;

            switch (threadOption)
            {
            case ThreadOption.BackgroundThread:
                subscription = new BackgroundEventSubscription(actionReference);
                break;

            case ThreadOption.PublisherThread:
                subscription = new EventSubscription(actionReference);
                break;

            case ThreadOption.UIThread:
                if (SynchronizationContext == null)
                {
                    throw new ArgumentNullException(nameof(SynchronizationContext));
                }
                subscription = new DispatcherEventSubscription(actionReference, SynchronizationContext);
                break;

            default:
                subscription = new EventSubscription(actionReference);
                break;
            }

            return(InternalSubscribe(subscription));
        }
Esempio n. 6
0
        public void ShouldPassParametersCorrectly()
        {
            Microsoft.Practices.Prism.PubSubEvents.IDelegateReference actionDelegateReference = new MockDelegateReference()
            {
                Target =
                    (Action <object>)(arg1 =>
                {
                    return;
                })
            };
            Microsoft.Practices.Prism.PubSubEvents.IDelegateReference filterDelegateReference = new MockDelegateReference
            {
                Target = (Predicate <object>)(arg => true)
            };

            var mockDispatcher = new MockDispatcher();
            DispatcherEventSubscription <object> eventSubscription = new DispatcherEventSubscription <object>(actionDelegateReference, filterDelegateReference, mockDispatcher);

            var executionStrategy = eventSubscription.GetExecutionStrategy();

            Assert.IsNotNull(executionStrategy);

            object argument1 = new object();

            executionStrategy.Invoke(new[] { argument1 });

            Assert.AreSame(argument1, mockDispatcher.InvokeArg);
        }
Esempio n. 7
0
        public void ShouldPassParametersCorrectly()
        {
            IDelegateReference actionDelegateReference = new MockDelegateReference()
            {
                Target =
                    (Action <object>)(arg1 =>
                {
                    return;
                })
            };
            IDelegateReference filterDelegateReference = new MockDelegateReference
            {
                Target = (Predicate <object>)(arg => true)
            };

            var mockSyncContext = new MockSynchronizationContext();

            DispatcherEventSubscription <object> eventSubscription = new DispatcherEventSubscription <object>(actionDelegateReference, filterDelegateReference, mockSyncContext);

            var executionStrategy = eventSubscription.GetExecutionStrategy();

            Assert.IsNotNull(executionStrategy);

            object argument1 = new object();

            executionStrategy.Invoke(new[] { argument1 });

            Assert.AreSame(argument1, mockSyncContext.InvokeArg);
        }
        public void ShouldReceiveDelegateOnDifferentThread()
        {
            int threadId                = -1;
            int calledThreadId          = -1;
            ManualResetEvent setupEvent = new ManualResetEvent(false);
            bool             completed  = false;
            DispatcherEventSubscription <object> eventSubscription = null;

            IDelegateReference actionDelegateReference = new MockDelegateReference()
            {
                Target = (Action <object>)(arg =>
                {
                    calledThreadId = Thread.CurrentThread.ManagedThreadId;
                    completed      = true;
                })
            };

            IDelegateReference filterDelegateReference = new MockDelegateReference
            {
                Target = (Predicate <object>)(arg => true)
            };

            Thread mockUIThread = new Thread(delegate()
            {
                threadId = Thread.CurrentThread.ManagedThreadId;
                //eventSubscription = new DispatcherEventSubscription<object>(actionDelegateReference, filterDelegateReference, Dispatcher.CurrentDispatcher);
                eventSubscription = new DispatcherEventSubscription <object>(actionDelegateReference, filterDelegateReference, Application.Current.RootVisual.Dispatcher);
                setupEvent.Set();

                while (!completed)
                {
                    WPFThreadHelper.DoEvents();
                }
            }
                                             );

            mockUIThread.Start();
            //setupEvent.WaitOne(5000, false);
            setupEvent.WaitOne(5000);

            var executionStrategy = eventSubscription.GetExecutionStrategy();

            Assert.IsNotNull(executionStrategy);

            executionStrategy.Invoke(new object[0]);

            bool joined = mockUIThread.Join(5000);

            completed = true;
            Assert.IsTrue(joined);

            Assert.AreEqual(threadId, calledThreadId);
        }
        public void ShouldReceiveDelegateOnDifferentThread()
        {
            int threadId = -1;
            int calledThreadId = -1;
            ManualResetEvent setupEvent = new ManualResetEvent(false);
            bool completed = false;
            DispatcherEventSubscription<object> eventSubscription = null;

            IDelegateReference actionDelegateReference = new MockDelegateReference()
            {
                Target = (Action<object>)(arg =>
                {
                    calledThreadId = Thread.CurrentThread.ManagedThreadId;
                    completed = true;
                })
            };

            IDelegateReference filterDelegateReference = new MockDelegateReference
            {
                Target = (Predicate<object>)(arg => true)
            };

            Thread mockUIThread = new Thread(delegate()
                                                 {
                                                     threadId = Thread.CurrentThread.ManagedThreadId;
                                                     //eventSubscription = new DispatcherEventSubscription<object>(actionDelegateReference, filterDelegateReference, Dispatcher.CurrentDispatcher);
                                                     eventSubscription = new DispatcherEventSubscription<object>(actionDelegateReference, filterDelegateReference, Application.Current.RootVisual.Dispatcher);
                                                     setupEvent.Set();

                                                     while (!completed)
                                                     {
                                                         WPFThreadHelper.DoEvents();
                                                     }
                                                 }
                );

            mockUIThread.Start();
            //setupEvent.WaitOne(5000, false);
            setupEvent.WaitOne(5000);

            var executionStrategy = eventSubscription.GetExecutionStrategy();
            Assert.IsNotNull(executionStrategy);

            executionStrategy.Invoke(new object[0]);

            bool joined = mockUIThread.Join(5000);
            completed = true;
            Assert.IsTrue(joined);

            Assert.AreEqual(threadId, calledThreadId);
        }
        public void ShouldCallInvokeOnDispatcherNonGeneric()
        {
            DispatcherEventSubscription eventSubscription = null;

            IDelegateReference actionDelegateReference = new MockDelegateReference()
            {
                Target = (Action)(() =>
                                  { })
            };

            var mockSyncContext = new MockSynchronizationContext();

            eventSubscription = new DispatcherEventSubscription(actionDelegateReference, mockSyncContext);

            eventSubscription.GetExecutionStrategy().Invoke(new object[0]);

            Assert.True(mockSyncContext.InvokeCalled);
        }
Esempio n. 11
0
        /// <summary>
        /// Subscribes a delegate to an event.
        /// </summary>
        /// <param name="action">The delegate that gets executed when the event is published.</param>
        /// <param name="threadOption">Specifies on which thread to receive the delegate callback.</param>
        /// <param name="keepSubscriberReferenceAlive">When <see langword="true"/>, the <see cref="PubSubEvent{TPayload}"/> keeps a reference to the subscriber so it does not get garbage collected.</param>
        /// <param name="filter">Filter to evaluate if the subscriber should receive the event.</param>
        /// <returns>A <see cref="SubscriptionToken"/> that uniquely identifies the added subscription.</returns>
        /// <remarks>
        /// If <paramref name="keepSubscriberReferenceAlive"/> is set to <see langword="false" />, <see cref="PubSubEvent{TPayload}"/> will maintain a <see cref="WeakReference"/> to the Target of the supplied <paramref name="action"/> delegate.
        /// If not using a WeakReference (<paramref name="keepSubscriberReferenceAlive"/> is <see langword="true" />), the user must explicitly call Unsubscribe for the event when disposing the subscriber in order to avoid memory leaks or unexpected behavior.
        ///
        /// The PubSubEvent collection is thread-safe.
        /// </remarks>
        public virtual SubscriptionToken Subscribe(Action <TPayload> action, ThreadOption threadOption, bool keepSubscriberReferenceAlive, Predicate <TPayload> filter)
        {
            IDelegateReference actionReference = new DelegateReference(action, keepSubscriberReferenceAlive);
            IDelegateReference filterReference;

            if (filter != null)
            {
                filterReference = new DelegateReference(filter, keepSubscriberReferenceAlive);
            }
            else
            {
                filterReference = new DelegateReference(new Predicate <TPayload>(delegate { return(true); }), true);
            }
            EventSubscription <TPayload> subscription;

            switch (threadOption)
            {
            case ThreadOption.PublisherThread:
                subscription = new EventSubscription <TPayload>(actionReference, filterReference);
                break;

            case ThreadOption.BackgroundThread:
                subscription = new BackgroundEventSubscription <TPayload>(actionReference, filterReference);
                break;

            case ThreadOption.UIThread:
                if (SynchronizationContext == null)
                {
                    throw new InvalidOperationException("Resources.EventAggregatorNotConstructedOnUIThread");
                }
                subscription = new DispatcherEventSubscription <TPayload>(actionReference, filterReference, SynchronizationContext);
                break;

            default:
                subscription = new EventSubscription <TPayload>(actionReference, filterReference);
                break;
            }


            return(base.InternalSubscribe(subscription));
        }
        public void ShouldCallInvokeOnDispatcher()
        {
            DispatcherEventSubscription <object> eventSubscription = null;

            IDelegateReference actionDelegateReference = new MockDelegateReference()
            {
                Target = (Action <object>)(_ => { })
            };

            IDelegateReference filterDelegateReference = new MockDelegateReference
            {
                Target = (Predicate <object>)(arg => true)
            };
            var mockSyncContext = new MockSynchronizationContext();

            eventSubscription = new DispatcherEventSubscription <object>(actionDelegateReference, filterDelegateReference, mockSyncContext);

            eventSubscription.GetExecutionStrategy().Invoke(new object[0]);

            Assert.True(mockSyncContext.InvokeCalled);
        }
        public void ShouldCallInvokeOnDispatcher()
        {
            DispatcherEventSubscription<object> eventSubscription = null;

            IDelegateReference actionDelegateReference = new MockDelegateReference()
            {
                Target = (Action<object>)(arg =>
                {
                    return;
                })
            };

            IDelegateReference filterDelegateReference = new MockDelegateReference
            {
                Target = (Predicate<object>)(arg => true)
            };
            var mockDispatcher = new MockDispatcher();
            eventSubscription = new DispatcherEventSubscription<object>(actionDelegateReference, filterDelegateReference, mockDispatcher);

            eventSubscription.GetExecutionStrategy().Invoke(new object[0]);

            Assert.IsTrue(mockDispatcher.InvokeCalled);
        }
Esempio n. 14
0
        public void ShouldCallInvokeOnDispatcher()
        {
            DispatcherEventSubscription <object> eventSubscription = null;

            Microsoft.Practices.Prism.PubSubEvents.IDelegateReference actionDelegateReference = new MockDelegateReference()
            {
                Target = (Action <object>)(arg =>
                {
                    return;
                })
            };

            Microsoft.Practices.Prism.PubSubEvents.IDelegateReference filterDelegateReference = new MockDelegateReference
            {
                Target = (Predicate <object>)(arg => true)
            };
            var mockDispatcher = new MockDispatcher();

            eventSubscription = new DispatcherEventSubscription <object>(actionDelegateReference, filterDelegateReference, mockDispatcher);

            eventSubscription.GetExecutionStrategy().Invoke(new object[0]);

            Assert.IsTrue(mockDispatcher.InvokeCalled);
        }
        public void ShouldCallInvokeOnDispatcher()
        {
            DispatcherEventSubscription<object> eventSubscription = null;

            IDelegateReference actionDelegateReference = new MockDelegateReference()
            {
                Target = (Action<object>)(arg =>
                {
                    return;
                })
            };

            IDelegateReference filterDelegateReference = new MockDelegateReference
            {
                Target = (Predicate<object>)(arg => true)
            };
            var mockSyncContext = new MockSynchronizationContext();

            eventSubscription = new DispatcherEventSubscription<object>(actionDelegateReference, filterDelegateReference, mockSyncContext, null, EventCommunicatorsRelationship.All);

            eventSubscription.GetExecutionStrategy().Invoke(new object[0]);

            Assert.True(mockSyncContext.InvokeCalled);
        }
        public void ShouldPassParametersCorrectly()
        {
            int threadId = -1;
            int calledThreadId = -1;
            ManualResetEvent setupEvent = new ManualResetEvent(false);
            bool completed = false;
            object receivedArgument1 = null;

            IDelegateReference actionDelegateReference = new MockDelegateReference()
            {
                Target =
                    (Action<object>)(arg1 =>
                                         {
                                             calledThreadId
                                                 =
                                                 Thread
                                                     .
                                                     CurrentThread
                                                     .
                                                     ManagedThreadId;
                                             receivedArgument1
                                                 =
                                                 arg1;
                                             completed
                                                 =
                                                 true;
                                         })
            };
            IDelegateReference filterDelegateReference = new MockDelegateReference
            {
                Target = (Predicate<object>)delegate
                                           {
                                               return true;
                                           }
            };

            DispatcherEventSubscription<object> eventSubscription = null;
            Thread mockUIThread = new Thread(delegate()
                                                 {
                                                     threadId = Thread.CurrentThread.ManagedThreadId;
                                                     eventSubscription =
                                                         new DispatcherEventSubscription<object>(actionDelegateReference, filterDelegateReference, Dispatcher.CurrentDispatcher);
                                                     setupEvent.Set();

                                                     while (!completed)
                                                     {
                                                         WPFThreadHelper.DoEvents();
                                                     }
                                                 }
                );

            mockUIThread.Start();

            setupEvent.WaitOne(5000, false);


            var executionStrategy = eventSubscription.GetExecutionStrategy();
            Assert.IsNotNull(executionStrategy);

            object argument1 = new object();

            executionStrategy.Invoke(new[] { argument1 });

            bool joined = mockUIThread.Join(5000);
            completed = true;
            Assert.IsTrue(joined);

            Assert.AreEqual(threadId, calledThreadId);
            Assert.AreSame(argument1, receivedArgument1);
        }
Esempio n. 17
0
        public void ShouldPassParametersCorrectly()
        {
            int threadId                       = -1;
            int calledThreadId                 = -1;
            ManualResetEvent setupEvent        = new ManualResetEvent(false);
            bool             completed         = false;
            object           receivedArgument1 = null;

            IDelegateReference actionDelegateReference = new MockDelegateReference()
            {
                Target =
                    (Action <object>)(arg1 =>
                {
                    calledThreadId
                        =
                            Thread
                            .
                            CurrentThread
                            .
                            ManagedThreadId;
                    receivedArgument1
                        =
                            arg1;
                    completed
                        =
                            true;
                })
            };
            IDelegateReference filterDelegateReference = new MockDelegateReference
            {
                Target = (Predicate <object>) delegate
                {
                    return(true);
                }
            };

            DispatcherEventSubscription <object> eventSubscription = null;
            Thread mockUIThread = new Thread(delegate()
            {
                threadId          = Thread.CurrentThread.ManagedThreadId;
                eventSubscription =
                    new DispatcherEventSubscription <object>(actionDelegateReference, filterDelegateReference, Dispatcher.CurrentDispatcher);
                setupEvent.Set();

                while (!completed)
                {
                    WPFThreadHelper.DoEvents();
                }
            }
                                             );

            mockUIThread.Start();

            setupEvent.WaitOne(5000, false);


            var executionStrategy = eventSubscription.GetExecutionStrategy();

            Assert.IsNotNull(executionStrategy);

            object argument1 = new object();

            executionStrategy.Invoke(new[] { argument1 });

            bool joined = mockUIThread.Join(5000);

            completed = true;
            Assert.IsTrue(joined);

            Assert.AreEqual(threadId, calledThreadId);
            Assert.AreSame(argument1, receivedArgument1);
        }