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