public void WhenQueryingForQuestionnareTemplates_ThenProvidesQuestionnaireTemplateResult()
        {
            AsyncResult<IEnumerable<QuestionnaireTemplate>> ar = null;
            QuestionnaireTemplate[] suppliedQuestionnaire = new[] { new QuestionnaireTemplate() };

            var serviceMock = new MockQuestionnaireService();

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


            var repository = new QuestionnaireRepository(serviceMock);

            IOperationResult<IEnumerable<QuestionnaireTemplate>> getResult = null;
            repository.GetQuestionnaireTemplatesAsync((result) => getResult = result);

            serviceMock.ProceedGetQuestionnaireTemplates(ar, suppliedQuestionnaire);

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

            EnqueueTestComplete();
        }
        public void WhenQueryingForQuestionnaireTemplates_ThenInvokesCallback()
        {
            AsyncResult<IEnumerable<QuestionnaireTemplate>> ar = null;

            var serviceMock = new MockQuestionnaireService();

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

            var repository = new QuestionnaireRepository(serviceMock);

            bool calledBack = false;

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

            serviceMock.ProceedGetQuestionnaireTemplates(ar, new[] { new QuestionnaireTemplate() });

            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.BeginGetQuestionnaireTemplates(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.EndGetQuestionnaireTemplates(It.IsAny<IAsyncResult>()))
                .Returns(new[] { new QuestionnaireTemplate() });

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

            IOperationResult<IEnumerable<QuestionnaireTemplate>> getResult = null;
            repository.GetQuestionnaireTemplatesAsync((r) =>
            {
                getResult = r;
                calledBackThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId;
            }
            );

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

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

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

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

            var repository = new QuestionnaireRepository(mockService.Object);

            IOperationResult<QuestionnaireTemplateSummary> getResult = null;
            repository.GetQuestionnaireTemplateSummaryAsync(new QuestionnaireTemplate(), (r) => { getResult = r; });

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

            EnqueueTestComplete();
        }
        public void WhenQueryingForQuestionnareTemplateSummary_ThenProvidesQuestionnaireTemplateSummaryResult()
        {
            AsyncResult<QuestionnaireTemplateSummary> ar = null;
            QuestionnaireTemplateSummary suppliedQuestionnaireTemplateSummary = new QuestionnaireTemplateSummary();

            var serviceMock = new MockQuestionnaireService();

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


            var repository = new QuestionnaireRepository(serviceMock);

            IOperationResult<QuestionnaireTemplateSummary> getResult = null;
            repository.GetQuestionnaireTemplateSummaryAsync(new QuestionnaireTemplate(), (result) => getResult = result);

            serviceMock.ProceedGetQuestionnaireTemplateSummary(ar, suppliedQuestionnaireTemplateSummary);

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

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

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

            mockService
                .Setup(s => s.EndSubmitQuestionnaire(It.IsAny<IAsyncResult>()));

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

            IOperationResult submitResult = null;
            repository.SubmitQuestionnaireAsync(
                new Questionnaire(),
                (r) =>
                {
                    submitResult = r;
                    calledBackThreadId = System.Threading.Thread.CurrentThread.ManagedThreadId;
                }
            );

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

            EnqueueTestComplete();
        }
        public void WhenSubmittingQuestionnare_ThenInvokesCallback()
        {
            AsyncResult<object> ar = null;

            var serviceMock = new MockQuestionnaireService();
            serviceMock.HandleBeginSubmitResponses = (r) => ar = r;

            var repository = new QuestionnaireRepository(serviceMock);

            bool calledBack = false;

            repository.SubmitQuestionnaireAsync(new Questionnaire(), (result) => { calledBack = true; });

            serviceMock.ProceedSubmitResponses(ar);

            EnqueueConditional(() => calledBack);

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

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

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

            var repository = new QuestionnaireRepository(mockService.Object);

            IOperationResult<IEnumerable<QuestionnaireTemplate>> getResult = null;
            repository.GetQuestionnaireTemplatesAsync((r) => { getResult = r; });

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

            EnqueueTestComplete();
        }