コード例 #1
0
        public async Task <ActionResult> Exercise(int chapter, int exercise)
        {
            var exerciseDetails = await rep.GetExerciseAsync(chapter, exercise);

            if (exerciseDetails == null)
            {
                throw new HttpException(404, "Not found");
            }
            ViewBag.ActiveTheme = await userServices.GetCodeMirrorThemeAsync();

            return(View(exerciseDetails));
        }
コード例 #2
0
        public async Task RunAssessmentsForExercise(ApplicationUser user, string code, int chapter, int exercise)
        {
            var      output = new StringBuilder();
            Exercise exerciseDetails;
            string   userCode;
            var      result = false;

            if (!user.ExercisePermitted(chapter, exercise))
            {
                WriteToConsole("You do not have permission to do this exercise\r\n");
                return;
            }
            if ((exerciseDetails = await rep.GetExerciseAsync(chapter, exercise)) == null)
            {
                WriteToConsole("Invalid exercise details\r\n");
                return;
            }
            if (!code.StartsWith(exerciseDetails.HiddenCodeHeader))
            {
                WriteToConsole("Something went wrong with the pre-prepared code header");
                throw new InvalidOperationException("Start of user's code does not match the hidden code header");
            }
            userCode = code.Substring(exerciseDetails.HiddenCodeHeader.Length + 1);

            try
            {
                var assessmentGroups = await rep.GetAssessmentGroupsForExerciseAsync(chapter, exercise);

                var assessmentRunner = new AssessmentRunner(codeRunner, code);
                assessmentRunner.ConsoleWrite += OnConsoleWrite;
                result = await assessmentRunner.RunAssessmentsAsync(assessmentGroups);

                assessmentRunner.ConsoleWrite -= OnConsoleWrite;
            }
            finally
            {
                var savedAssessment = new Submission
                {
                    UserId             = user.Id,
                    ChapterNo          = chapter,
                    ExerciseNo         = exercise,
                    SubmittedCode      = userCode,
                    Output             = output.ToString(),
                    Success            = result,
                    SubmissionDateTime = DateTimeOffset.UtcNow
                };
                await rep.InsertSubmissionAsync(savedAssessment);
            }

            void WriteToConsole(string message)
            {
                OnConsoleWrite(this, new ConsoleWriteEventArgs(message));
            }

            void OnConsoleWrite(object sender, ConsoleWriteEventArgs e)
            {
                output.Append(e.Message);
                ConsoleWrite?.Invoke(sender, e);
            }
        }