/// <summary>
        /// Returns a code runner service that responds with the
        /// given result, when called with the given job.
        /// </summary>
        public ICodeRunnerService GetCodeRunnerService(
            ClassJobResult expectedClassJobResult,
            Expression <Func <ClassJob, bool> > expectedClassJob = null)
        {
            if (expectedClassJob == null)
            {
                expectedClassJob = job => true;
            }

            var codeRunnerService = new Mock <ICodeRunnerService>();

            codeRunnerService
            .Setup(crs => crs.ExecuteClassJobAsync(It.Is(expectedClassJob)))
            .ReturnsAsync(expectedClassJobResult);

            return(codeRunnerService.Object);
        }
        /// <summary>
        /// Returns a mock code runner service.
        /// </summary>
        private Mock <ICodeRunnerService> GetMockCodeRunnerService(
            ClassJobResult jobResult = null)
        {
            jobResult = jobResult ?? GetSuccessfulClassJobResult();

            var codeRunnerService = new Mock <ICodeRunnerService>();

            codeRunnerService
            .Setup
            (
                crs => crs.ExecuteClassJobAsync
                (
                    It.IsAny <ClassJob>()
                )
            ).ReturnsAsync(jobResult);

            return(codeRunnerService);
        }
        public async Task GenerateQuestionAsync_GeneratorCompilationError_ReturnsError()
        {
            var question       = GetGeneratedQuestionTemplate();
            var classJobResult = new ClassJobResult()
            {
                ClassCompilationResult = new CompilationResult()
                {
                    Success = false,
                    Errors  = Collections.CreateList
                              (
                        new CompileError()
                    {
                        FullError = "Error1"
                    },
                        new CompileError()
                    {
                        FullError = "Error2"
                    }
                              )
                }
            };

            var questionGenerator = GetQuestionGenerator
                                    (
                question,
                GetMockCodeRunnerService(classJobResult).Object
                                    );

            var result = await questionGenerator.GenerateQuestionAsync
                         (
                question,
                1                 /*seed*/
                         );

            Assert.NotNull(result.Error);
            Assert.Contains("Error1", result.Error);
            Assert.Contains("Error2", result.Error);
            Assert.Null(result.SerializedQuestion);
        }