コード例 #1
0
        public void TestDebugInfoState(
            [Values(true, false)] bool debug,
            [Values(true, false)] bool secondAsync)
        {
            OcConfiguration.SaveOcDispatcherInvocationInstantiationStackTrace = debug;

            object          context    = new object();
            object          state      = new object();
            OcDispatcher    dispatcher = new OcDispatcher(2);
            Action <object> action     = null;
            Invocation      parentInvocation;

            action = s =>
            {
                Assert.AreEqual(s, state);
                Assert.IsTrue(dispatcher.CheckAccess());

                Assert.AreEqual(OcDispatcher.Current, dispatcher);
                parentInvocation = dispatcher.CurrentInvocation;
                Assert.AreEqual(parentInvocation.Parent, null);
                Assert.AreEqual(parentInvocation.State, state);
                Assert.AreEqual(parentInvocation.Action, null);
                Assert.AreEqual(parentInvocation.ActionWithState, action);
                if (debug)
                {
                    Assert.IsTrue(parentInvocation.InstantiationStackTrace != null);
                }
                Assert.AreEqual(parentInvocation.Context, context);
                Assert.AreEqual(parentInvocation.OcDispatcher, dispatcher);
                Assert.AreEqual(parentInvocation.Priority, 1);

                object state1 = new object();

                Func <object, int> func1 = null;

                func1 = s1 =>
                {
                    Assert.IsTrue(dispatcher.CheckAccess());

                    Assert.AreEqual(OcDispatcher.Current, dispatcher);
                    Invocation invocation1 = dispatcher.CurrentInvocation;
                    Assert.AreEqual(invocation1.Parent, parentInvocation);
                    Assert.AreEqual(invocation1.State, state1);
                    Assert.AreEqual(invocation1.Action, null);
                    if (debug)
                    {
                        Assert.IsTrue(invocation1.InstantiationStackTrace != null);
                    }
                    Assert.AreEqual(invocation1.Context, null);
                    Assert.AreEqual(invocation1.OcDispatcher, dispatcher);
                    Assert.AreEqual(invocation1.Priority, 0);

                    return(3);
                };

                if (secondAsync)
                {
                    dispatcher.InvokeAsync(func1, state1).PropertyChanged += (sender, args) =>
                    {
                        if (args.PropertyName == "Value")
                        {
                            Assert.AreEqual(((InvocationResult <int>)sender).Value, 3);
                        }
                    };
                }
                else
                {
                    Assert.AreEqual(dispatcher.Invoke(func1, state1).Value, 3);
                }
            };

            Assert.IsFalse(dispatcher.CheckAccess());
            dispatcher.Invoke(action, state, 1, context);

            dispatcher.Pass();
            dispatcher.Pass();
            Assert.AreEqual(dispatcher, StaticInfo.OcDispatchers[dispatcher.ManagedThreadId]);
            Assert.IsTrue(dispatcher.CurrentInvocation == null);
            Assert.IsTrue(OcDispatcher.Current == null);
            dispatcher.Dispose();
        }