/// <summary>
 /// Creates a new mock question duplicator.
 /// </summary>
 private static CodeQuestionDuplicator<CodeQuestion> GetCodeQuestionDuplicator(
     TestDatabase database,
     CodeQuestion question)
 {
     return new Mock<CodeQuestionDuplicator<CodeQuestion>>(database.Context, question).Object;
 }
		/// <summary>
		/// Creates a new code question updater.
		/// </summary>
		private static CodeQuestionUpdater<CodeQuestion> GetCodeQuestionUpdater(
			TestDatabase database,
			CodeQuestion question,
			IModelErrorCollection errors)
		{
			return new Mock<CodeQuestionUpdater<CodeQuestion>>(database.Context, question, errors).Object;
		}
		/// <summary>
		/// Returns a code question grader. For a given question, the grader 
		/// returns a given simulated result for a given submission.
		/// </summary>
		public CodeQuestionGrader<CodeQuestion> GetCodeQuestionGrader(
			CodeQuestion question,
			CodeQuestionSubmission submission,
			CodeJobResult simulatedResult,
			IList<DefinitionError> definitionErrors = null)
		{
			var grader = new Mock<CodeQuestionGrader<CodeQuestion>>
			(
				question,
				null /*codeRunnerService*/
			);

			grader.CallBase = true;

			grader.Protected()
				.Setup<Task<CodeJobResult>>
				(
					"ExecuteJobAsync", 
					ItExpr.Is<CodeQuestionSubmission>(s => s == submission)
				).Returns(Task.FromResult(simulatedResult));

			grader.Protected()
				.Setup<string>("GetTestDescription", ItExpr.IsAny<CodeQuestionTest>())
				.Returns<CodeQuestionTest>(test => test.Name);

			if (definitionErrors != null)
			{
				grader.Protected()
					.Setup<IEnumerable<CodeQuestionError>>
					(
						"GetDefinitionErrors",
						ItExpr.Is<CodeQuestionSubmission>(s => s == submission),
						ItExpr.Is<CodeJobResult>(r => r == simulatedResult)
					).Returns(definitionErrors);
			}

			return grader.Object;
		}