/// <summary>
        /// Executes a code job to grade the question.
        /// </summary>
        protected override async Task <CodeJobResult> ExecuteJobAsync(CodeQuestionSubmission submission)
        {
            return(await CodeRunnerService.ExecuteClassJobAsync
                   (
                       new ClassJob()
            {
                ClassesToImport = Question.ImportedClasses
                                  ?.Select(importedClass => importedClass.ClassName)
                                  ?.ToList() ?? new List <string>(),

                ClassName = Question.ClassName,

                FileContents = GetFileTemplateWithSubmission(submission)
                               .Replace("%", "%%"),

                LineNumberOffset = -GetLineNumberOffset(),

                Tests = Question.Tests.Select
                        (
                    test => new ClassTest()
                {
                    TestName = GetCodeTestName(test),
                    ReturnType = test.ReturnType,
                    MethodBody = test.MethodBody
                }
                        ).ToList()
            }
                   ));
        }
        /// <summary>
        /// Executes a code job to grade the question.
        /// </summary>
        protected override async Task <CodeJobResult> ExecuteJobAsync(CodeQuestionSubmission submission)
        {
            return(await CodeRunnerService.ExecuteClassJobAsync
                   (
                       new ClassJob()
            {
                ClassesToImport = Question.ImportedClasses
                                  ?.Select(importedClass => importedClass.ClassName)
                                  ?.ToList() ?? new List <string>(),

                ClassName = Question.ProgramClassName,

                FileContents = submission.Contents.Replace("%", "%%"),

                LineNumberOffset = 0,

                Tests = Question.Tests.Select
                        (
                    (test, index) => new ClassTest()
                {
                    TestName = GetCodeTestName(test),
                    ReturnType = "void",
                    MethodBody = $"{Question.ProgramClassName}.main(new String[] {{{string.Join(",", GetCommandLineArgs(test, includeQuotes: true))}}});"
                }
                        ).ToList()
            }
                   ));
        }
        /// <summary>
        /// Executes a code job to grade the question.
        /// </summary>
        protected override async Task <CodeJobResult> ExecuteJobAsync(CodeQuestionSubmission submission)
        {
            return(await CodeRunnerService.ExecuteMethodJobAsync
                   (
                       new MethodJob()
            {
                ClassesToImport = Question.ImportedClasses
                                  ?.Select(importedClass => importedClass.ClassName)
                                  ?.ToList() ?? new List <string>(),

                MethodCode = submission.Contents.Replace("%", "%%"),

                Tests = Question.Tests.Select
                        (
                    test => new MethodTest()
                {
                    TestName = GetCodeTestName(test),
                    ParamValues = test.ParameterValues
                }
                        ).ToList()
            }
                   ));
        }