public void WhenQueryingForQuestionnares_ThenProvidesQuestionnaireResult()
        {
            AsyncResult <Questionnaire> ar      = null;
            Questionnaire suppliedQuestionnaire = new Questionnaire();

            var serviceMock = new MockQuestionnaireService();

            serviceMock.HandleBeginGetQuestionnaire = (r) => ar = r;

            var repository = new QuestionnaireRepository(serviceMock);

            IOperationResult <Questionnaire> getResult = null;

            repository.GetQuestionnaireAsync((result) => getResult = result);

            serviceMock.ProceedGetQuestionnaire(ar, suppliedQuestionnaire);

            EnqueueConditional(() => getResult != null);
            EnqueueCallback(() =>
            {
                Assert.AreSame(suppliedQuestionnaire, getResult.Result);
            });

            EnqueueTestComplete();
        }
        public void WhenServiceThrowsAnError_ThenErrorIsCaptured()
        {
            var mockAsyncResult = new Mock <IAsyncResult>();
            var mockService     = new Mock <IQuestionnaireService>();

            mockService
            .Setup(s => s.BeginGetQuestionnaire(It.IsAny <AsyncCallback>(), It.IsAny <object>()))
            .Returns(mockAsyncResult.Object)
            .Callback <AsyncCallback, object>((c, o) =>
            {
                c(mockAsyncResult.Object);
            });

            mockService
            .Setup(s => s.EndGetQuestionnaire(It.IsAny <IAsyncResult>()))
            .Throws(new NotImplementedException("TestException"));

            var repository = new QuestionnaireRepository(mockService.Object);

            IOperationResult <Questionnaire> getResult = null;

            repository.GetQuestionnaireAsync((r) => { getResult = r; });

            EnqueueConditional(() => getResult != null);
            EnqueueCallback(() => { Assert.IsInstanceOfType(getResult.Error, typeof(NotImplementedException)); });

            EnqueueTestComplete();
        }
        public void WhenQueryingForQuestionnaires_ThenInvokesCallback()
        {
            AsyncResult <Questionnaire> ar = null;

            var serviceMock = new MockQuestionnaireService();

            serviceMock.HandleBeginGetQuestionnaire = (r) => ar = r;

            var repository = new QuestionnaireRepository(serviceMock);

            bool calledBack = false;

            repository.GetQuestionnaireAsync((result) => { calledBack = true; });

            serviceMock.ProceedGetQuestionnaire(ar, new Questionnaire());

            EnqueueConditional(() => calledBack);

            EnqueueCallback(() => { Assert.IsTrue(calledBack); });
            EnqueueTestComplete();
        }
        public void WhenQueryingForQuestionnaires_ThenPostsCallingThreadsSyncContext()
        {
            var mockAsyncResult = new Mock <IAsyncResult>();
            var mockService     = new Mock <IQuestionnaireService>();

            mockService
            .Setup(s => s.BeginGetQuestionnaire(It.IsAny <AsyncCallback>(), It.IsAny <object>()))
            .Returns(mockAsyncResult.Object)
            .Callback <AsyncCallback, object>((c, o) =>
            {
                System.Threading.ThreadPool.QueueUserWorkItem(
                    (state) =>
                {
                    c(mockAsyncResult.Object);
                });
            });

            mockService
            .Setup(s => s.EndGetQuestionnaire(It.IsAny <IAsyncResult>()))
            .Returns(new Questionnaire());

            var repository         = new QuestionnaireRepository(mockService.Object);
            int callingThreadId    = System.Threading.Thread.CurrentThread.ManagedThreadId;
            int calledBackThreadId = 0;

            IOperationResult <Questionnaire> getResult = null;

            repository.GetQuestionnaireAsync((r) =>
            {
                getResult          = r;
                calledBackThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId;
            }
                                             );

            EnqueueConditional(() => getResult != null);
            EnqueueCallback(() => { Assert.AreEqual(callingThreadId, calledBackThreadId); });

            EnqueueTestComplete();
        }