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