/// <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 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 base.InternalSubscribe(subscription); }
public void NullTargetInActionThrowsNonGeneric() { Assert.Throws<ArgumentException>(() => { var actionDelegateReference = new MockDelegateReference() { Target = null }; var eventSubscription = new EventSubscription(actionDelegateReference); }); }
public void DifferentTargetTypeInActionThrowsNonGeneric() { Assert.Throws<ArgumentException>(() => { var actionDelegateReference = new MockDelegateReference() { Target = (Action<int>)delegate { } }; var eventSubscription = new EventSubscription(actionDelegateReference); }); }
public void NullActionThrows() { Assert.Throws<ArgumentNullException>(() => { var filterDelegateReference = new MockDelegateReference() { Target = (Predicate<object>)(arg => { return true; }) }; var eventSubscription = new EventSubscription<object>(null, filterDelegateReference); }); }
public void CanInitEventSubscription() { var actionDelegateReference = new MockDelegateReference((Action<object>)delegate { }); var filterDelegateReference = new MockDelegateReference((Predicate<object>)delegate { return true; }); var eventSubscription = new EventSubscription<object>(actionDelegateReference, filterDelegateReference); var subscriptionToken = new SubscriptionToken(t => { }); eventSubscription.SubscriptionToken = subscriptionToken; Assert.AreSame(actionDelegateReference.Target, eventSubscription.Action); Assert.AreSame(filterDelegateReference.Target, eventSubscription.Filter); Assert.AreSame(subscriptionToken, eventSubscription.SubscriptionToken); }
public void DifferentTargetTypeInActionThrows() { var actionDelegateReference = new MockDelegateReference() { Target = (Action<int>)delegate { } }; var filterDelegateReference = new MockDelegateReference() { Target = (Predicate<string>)(arg => { return true; }) }; var eventSubscription = new EventSubscription<string>(actionDelegateReference, filterDelegateReference); }
public void NullTargetInFilterThrows() { Assert.Throws<ArgumentException>(() => { var actionDelegateReference = new MockDelegateReference() { Target = (Action<object>)delegate { } }; var filterDelegateReference = new MockDelegateReference() { Target = null }; var eventSubscription = new EventSubscription<object>(actionDelegateReference, filterDelegateReference); }); }
public void GetPublishActionDoesNotExecuteActionIfFilterReturnsFalse() { bool actionExecuted = false; var actionDelegateReference = new MockDelegateReference() { Target = (Action<int>)delegate { actionExecuted = true; } }; var filterDelegateReference = new MockDelegateReference((Predicate<int>)delegate { return false; }); var eventSubscription = new EventSubscription<int>(actionDelegateReference, filterDelegateReference); var publishAction = eventSubscription.GetExecutionStrategy(); publishAction.Invoke(new object[] { null }); Assert.IsFalse(actionExecuted); }
public void StrategyPassesArgumentToDelegates() { string passedArgumentToAction = null; string passedArgumentToFilter = null; var actionDelegateReference = new MockDelegateReference((Action<string>)(obj => passedArgumentToAction = obj)); var filterDelegateReference = new MockDelegateReference((Predicate<string>)(obj => { passedArgumentToFilter = obj; return true; })); var eventSubscription = new EventSubscription<string>(actionDelegateReference, filterDelegateReference); var publishAction = eventSubscription.GetExecutionStrategy(); publishAction.Invoke(new[] { "TestString" }); Assert.Equal("TestString", passedArgumentToAction); Assert.Equal("TestString", passedArgumentToFilter); }
public void GetPublishActionReturnsNullIfFilterIsNull() { var actionDelegateReference = new MockDelegateReference((Action<object>)delegate { }); var filterDelegateReference = new MockDelegateReference((Predicate<object>)delegate { return true; }); var eventSubscription = new EventSubscription<object>(actionDelegateReference, filterDelegateReference); var publishAction = eventSubscription.GetExecutionStrategy(); Assert.NotNull(publishAction); filterDelegateReference.Target = null; publishAction = eventSubscription.GetExecutionStrategy(); Assert.Null(publishAction); }
public void GetPublishActionReturnsNullIfActionIsNullNonGeneric() { var actionDelegateReference = new MockDelegateReference((Action)delegate { }); var eventSubscription = new EventSubscription(actionDelegateReference); var publishAction = eventSubscription.GetExecutionStrategy(); Assert.NotNull(publishAction); actionDelegateReference.Target = null; publishAction = eventSubscription.GetExecutionStrategy(); Assert.Null(publishAction); }
public void GetPublishActionReturnsDelegateThatExecutesTheFilterAndThenTheAction() { var executedDelegates = new List<string>(); var actionDelegateReference = new MockDelegateReference((Action<object>)delegate { executedDelegates.Add("Action"); }); var filterDelegateReference = new MockDelegateReference((Predicate<object>)delegate { executedDelegates.Add( "Filter"); return true; }); var eventSubscription = new EventSubscription<object>(actionDelegateReference, filterDelegateReference); var publishAction = eventSubscription.GetExecutionStrategy(); Assert.NotNull(publishAction); publishAction.Invoke(null); Assert.Equal(2, executedDelegates.Count); Assert.Equal("Filter", executedDelegates[0]); Assert.Equal("Action", executedDelegates[1]); }
public void CanInitEventSubscriptionNonGeneric() { var actionDelegateReference = new MockDelegateReference((Action)delegate { }); var eventSubscription = new EventSubscription(actionDelegateReference); var subscriptionToken = new SubscriptionToken(t => { }); eventSubscription.SubscriptionToken = subscriptionToken; Assert.Same(actionDelegateReference.Target, eventSubscription.Action); Assert.Same(subscriptionToken, eventSubscription.SubscriptionToken); }
public void NullFilterThrows() { var actionDelegateReference = new MockDelegateReference() { Target = (Action<object>)delegate { } }; var eventSubscription = new EventSubscription<object>(actionDelegateReference, null); }
public void NullTargetInActionThrows() { var actionDelegateReference = new MockDelegateReference() { Target = null }; var filterDelegateReference = new MockDelegateReference() { Target = (Predicate<object>)(arg => { return true; }) }; var eventSubscription = new EventSubscription<object>(actionDelegateReference, filterDelegateReference); }
public void NullActionThrowsNonGeneric() { Assert.Throws<ArgumentNullException>(() => { var eventSubscription = new EventSubscription(null); }); }
public void DifferentTargetTypeInFilterThrows() { Assert.Throws<ArgumentException>(() => { var actionDelegateReference = new MockDelegateReference() { Target = (Action<string>)delegate { } }; var filterDelegateReference = new MockDelegateReference() { Target = (Predicate<int>)(arg => { return true; }) }; var eventSubscription = new EventSubscription<string>(actionDelegateReference, filterDelegateReference); }); }