コード例 #1
0
        public ActionResult ExerciseSubmission(ExerciseSubmissionViewModel viewModel)
        {
            bool isStatic = false; //we can call static method with instance

            if (string.IsNullOrEmpty(viewModel.Content) ||
                string.IsNullOrEmpty(viewModel.TypeName) ||
                string.IsNullOrEmpty(viewModel.MethodName))
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            var exercise = db.Exercises.FirstOrDefault(x => x.Id == viewModel.ExerciseId);

            if (exercise == null)
            {
                return(HttpNotFound());
            }

            var submission         = SaveSubmission(exercise, isStatic, viewModel);
            var taskFunctionResult = GetTaskFunction(isStatic, viewModel);

            if (taskFunctionResult.Exception == null)
            {
                var taskFunction = taskFunctionResult.TaskFunction;
                var testResults  = RunTests(exercise, taskFunction);
                submission = UpdateSubmission(submission, testResults);
            }
            else
            {
                submission = UpdateSubmission(submission, taskFunctionResult.Exception);
            }

            return(Json(Url.Action("Submission", "Home", new { Id = submission.Id }, Request.Url.Scheme)));
        }
コード例 #2
0
        private Submission SaveSubmission(Exercise exercise, bool isStatic, ExerciseSubmissionViewModel viewModel)
        {
            var currentStudent = db.Students.FirstOrDefault(x => x.User.UserName == User.Identity.Name);
            var submission     = new Submission
            {
                Exercise         = exercise,
                Created          = DateTime.Now,
                Student          = currentStudent,
                SubmittedContent = new SubmittedContent
                {
                    Content    = viewModel.Content,
                    IsStatic   = isStatic,
                    TypeName   = viewModel.TypeName,
                    MethodName = viewModel.MethodName
                }
            };

            db.Submissions.Add(submission);
            db.SaveChanges();

            return(submission);
        }
コード例 #3
0
        private (TaskFunction TaskFunction, Exception Exception) GetTaskFunction(bool isStatic, ExerciseSubmissionViewModel viewModel)
        {
            try
            {
                var creator   = new AssemblyCreator(viewModel.Content, new[] { typeof(ILogger) });
                var assembler = creator.CreateAssembly();
                var type      = assembler.GetType(viewModel.TypeName);
                if (type == null)
                {
                    throw new NotSupportedException($"Type {viewModel.TypeName} not found.");
                }

                var method = type.GetMethod(viewModel.MethodName);
                if (method == null)
                {
                    throw new NotSupportedException($"Method {viewModel.MethodName} not found.");
                }

                TaskFunction taskFunction;
                if (isStatic)
                {
                    taskFunction = (parameters) => method.Invoke(null, parameters);
                }
                else
                {
                    var instance = Activator.CreateInstance(type);
                    taskFunction = (parameters) => method.Invoke(instance, parameters);
                }


                return(taskFunction, null);
            }
            catch (Exception exception)
            {
                return(null, exception);
            }
        }