public IViewComponentResult Invoke(PreAssignment assignment)
        {
            switch (assignment.PreAssignmentReport.Type)
            {
            case HumanErrorProject.Data.Models.PreAssignmentReport.PreAssignmentReportTypes.Pending:
                return(View("PreAssignmentPendingReport", assignment));

            case HumanErrorProject.Data.Models.PreAssignmentReport.PreAssignmentReportTypes.Success:
                return(View("PreAssignmentSuccessReport", assignment));

            case HumanErrorProject.Data.Models.PreAssignmentReport.PreAssignmentReportTypes.NoFileFailure:
                return(View("PreAssignmentNoFileFailureReport", assignment));

            case HumanErrorProject.Data.Models.PreAssignmentReport.PreAssignmentReportTypes.CompileFailure:
                return(View("PreAssignmentCompileFailureReport", assignment));

            case HumanErrorProject.Data.Models.PreAssignmentReport.PreAssignmentReportTypes.BuildFailure:
                return(View("PreAssignmentBuildFailureReport", assignment));

            case HumanErrorProject.Data.Models.PreAssignmentReport.PreAssignmentReportTypes.NoClassFailure:
                return(View("PreAssignmentNoClassFailureReport", assignment));

            case HumanErrorProject.Data.Models.PreAssignmentReport.PreAssignmentReportTypes.MissingMethodsFailure:
                return(View("PreAssignmentMissingMethodsFailureReport", assignment));

            case HumanErrorProject.Data.Models.PreAssignmentReport.PreAssignmentReportTypes.FailTestsFailure:
                return(View("PreAssignmentFailTestsFailureReport", assignment));

            case HumanErrorProject.Data.Models.PreAssignmentReport.PreAssignmentReportTypes.BadTestFolder:
                return(View("PreAssignmentBadTestFolderReport", assignment));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
        public async Task <IActionResult> OnGetAsync()
        {
            Assignment = await PreAssignments.FindAsync(Id);

            if (Assignment == null)
            {
                return(NotFound());
            }

            Context.Entry(Assignment).Reference(x => x.Solution).Query()
            .Include(x => x.MethodDeclarations).Load();
            Context.Entry(Assignment).Reference(x => x.CourseClass).Load();
            Context.Entry(Assignment).Reference(x => x.TestProject).Query()
            .Include(x => x.UnitTests).Load();


            Context.Entry(Assignment).Reference(x => x.PreAssignmentReport).Load();

            switch (Assignment.PreAssignmentReport.Type)
            {
            case PreAssignmentReport.PreAssignmentReportTypes.FailTestsFailure:
                Context.Entry((PreAssignmentFailTestsFailureReport)Assignment.PreAssignmentReport)
                .Collection(x => x.FailUnitTests).Load();
                break;

            case PreAssignmentReport.PreAssignmentReportTypes.MissingMethodsFailure:
                Context.Entry((PreAssignmentMissingMethodsFailureReport)Assignment.PreAssignmentReport)
                .Collection(x => x.MissingMethodDeclarations).Load();
                break;
            }

            return(Page());
        }
Пример #3
0
 private void LogException(Exception exception, PreAssignment assignment)
 {
     Logger.Log($"Class: '{assignment.CourseClass.Name}'\r\n" +
                $"Assignment: '{assignment.Name}'\r\n" +
                $"Timestamp: {DateTime.Now}\r\n" +
                $"Engine Message - \r\n{exception.Message}\r\n");
 }
Пример #4
0
 private async Task RunImplementation(PreAssignment assignment)
 {
     using (var handler = new DirectoryHandler(
                Path.Combine(Options.RootDirectory, GetUniqueFolderName(Options.RootDirectory))))
     {
         await Runner.RunPreAssignment(assignment, handler);
     }
 }
Пример #5
0
 public async Task RunPreAssignment(PreAssignment assignment)
 {
     try
     {
         await RunImplementation(assignment);
     }
     catch (Exception exception)
     {
         LogException(exception, assignment);
     }
 }
        public async Task <IActionResult> OnGetAsync()
        {
            Assignment = await PreAssignments.FindAsync(Id);

            if (Assignment == null)
            {
                return(NotFound());
            }

            return(Page());
        }
Пример #7
0
 public async Task Generate(PreAssignment assignment, DirectoryHandler handler)
 {
     try
     {
         await GenerateImplementation(assignment, handler);
     }
     catch (EngineAssignmentExceptionData exceptionReport)
     {
         assignment.PreAssignmentReport = exceptionReport.Report;
         await PreAssignmentRepository.Update(assignment);
     }
 }
Пример #8
0
        public async Task Delete(PreAssignment preAssignment)
        {
            var testProjectId = preAssignment.TestProjectId;
            var solutionId    = preAssignment.AssignmentSolutionId;
            var reportId      = preAssignment.PreAssignmentReportId;

            Context.PreAssignments.Remove(preAssignment);
            await Context.SaveChangesAsync();

            await Delete(await Context.TestProjects.FindAsync(testProjectId));
            await Delete(await Context.AssignmentSolutions.FindAsync(solutionId));
            await Delete(await Context.PreAssignmentReports.FindAsync(reportId));
        }
Пример #9
0
 public AbstractSyntaxTreeNode GetClassAbstractSyntaxTreeNode(PreAssignment assignment,
                                                              AbstractSyntaxTreeNode root)
 {
     try
     {
         return(AbstractSyntaxTreeClassExtractor.Extract(root, assignment.Solution.Name));
     }
     catch (EngineReportExceptionData)
     {
         throw new EngineAssignmentExceptionData()
               {
                   Report = new PreAssignmentNoClassFailureReport()
               };
     }
 }
        public async Task <IActionResult> OnPostAsync()
        {
            Assignment = await PreAssignments.FindAsync(Id);

            if (Assignment == null)
            {
                return(NotFound());
            }

            var courseId = Assignment.CourseClassId;

            await DeleteHelper.Delete(Assignment);

            return(RedirectToPage("/CourseClasses/Details", new { id = courseId }));
        }
Пример #11
0
        public async Task GenerateImplementation(PreAssignment assignment, DirectoryHandler handler)
        {
            var solutionRoot = EngineFileUtilities.ExtractZip(handler.Directory, "Solution",
                                                              assignment.Solution.Files);
            var solution      = AbstractSyntaxTreeGenerator.CreateFromFile(handler, Path.Combine(solutionRoot, assignment.Filename));
            var solutionClass = GetClassAbstractSyntaxTreeNode(assignment, solution);

            ValidateMethodDeclarations(assignment, solutionClass);

            var unitTests = await UnitTestGenerator.GenerateResults(assignment, handler, solutionRoot);

            assignment.TestProject.UnitTests = unitTests;
            assignment.PreAssignmentReport   = new PreAssignmentSucessReport();
            await PreAssignmentRepository.Update(assignment);
        }
Пример #12
0
        public async Task <ICollection <UnitTest> > GenerateResults(PreAssignment assignment, DirectoryHandler handler, string root)
        {
            using (var testHandler = new DirectoryHandler(GetTestDirectory(handler.Directory)))
            {
                var testProject = new TestProjectObj(testHandler.Directory, assignment.TestProject);

                if (!Directory.Exists(testProject.TestFolder))
                {
                    throw new EngineAssignmentExceptionData()
                          {
                              Report = new PreAssignmentBadTestFolderReport()
                          }
                }
                ;

                testProject.MoveFilesToProject(root);

                var preprocessorArguments = GetPreprocessorArguments(assignment.Solution.MethodDeclarations);

                var process = new EngineProcess(GetEngineProcessData(testHandler.Directory,
                                                                     testProject, preprocessorArguments));

                var exitCode = process.Run();

                if (exitCode == 0)
                {
                    process.Stop();
                    return(GetUnitTestResults(ResultsFile(testHandler.Directory)));
                }

                EngineAssignmentExceptionData exception;

                using (var reader = process.StandardError)
                {
                    exception = new EngineAssignmentExceptionData()
                    {
                        Report = new PreAssignmentBuildFailureReport()
                        {
                            Report = reader.ReadToEnd(),
                        }
                    };
                }
                process.Stop();
                throw exception;
            }
        }
        public async Task <IActionResult> OnPostAsync()
        {
            Assignment = await PreAssignments.FindAsync(Id);

            if (Assignment == null)
            {
                return(NotFound());
            }

            Context.Entry(Assignment).Reference(x => x.PreAssignmentReport).Load();

            if (Assignment.PreAssignmentReport.Type == PreAssignmentReport.PreAssignmentReportTypes.Success)
            {
                Context.Entry(Assignment).Reference(x => x.Solution).Query()
                .Include(x => x.MethodDeclarations).Load();
                Context.Entry(Assignment).Reference(x => x.CourseClass).Query().Load();
                Context.Entry(Assignment).Reference(x => x.TestProject).Query()
                .Include(x => x.UnitTests).Load();

                var assignment = new Assignment()
                {
                    CourseClass = Assignment.CourseClass,
                    Filename    = Assignment.Filename,
                    Name        = Assignment.Name,
                    Solution    = Assignment.Solution,
                    TestProject = Assignment.TestProject,
                };
                Assignments.Add(assignment);
                PreAssignments.Remove(Assignment);
                await Context.SaveChangesAsync();

                return(RedirectToPage("/Assignments/Details", new { assignment.Id }));
            }
            else
            {
                Assignment.PreAssignmentReport = new PreAssignmentPendingReport();
                PreAssignments.Update(Assignment);
                await Context.SaveChangesAsync();

                BackgroundJob.Enqueue(() => EngineService.RunPreAssignment(Id));
            }

            return(RedirectToPage(new { Id }));
        }
Пример #14
0
            public Task <ICollection <UnitTest> > GenerateResults(PreAssignment assignment, DirectoryHandler hander, string root)
            {
                switch (Type)
                {
                case PreAssignmentReport.PreAssignmentReportTypes.BuildFailure:
                    throw new EngineAssignmentExceptionData()
                          {
                              Report = new PreAssignmentBuildFailureReport()
                          };

                case PreAssignmentReport.PreAssignmentReportTypes.FailTestsFailure:
                    throw new EngineAssignmentExceptionData()
                          {
                              Report = new PreAssignmentFailTestsFailureReport()
                          };
                }

                return(Task.FromResult <ICollection <UnitTest> >(assignment.Solution.MethodDeclarations.Select(m => new UnitTest()).ToList()));
            }
Пример #15
0
        public void Init()
        {
            Root    = Path.Combine(Directory.GetCurrentDirectory(), nameof(AssignmentGeneratorTests));
            Handler = new DirectoryHandler(Root);
            PreAssignmentRepository = new MockRepository <PreAssignment, int>();

            Assignment = new PreAssignment()
            {
                PreAssignmentReport = new PreAssignmentPendingReport(),
                Filename            = MockSnapshots.GetCalculatorFile(),
                Solution            = new AssignmentSolution()
                {
                    Id    = 1,
                    Name  = MockSnapshots.GetCalculatorClassName(),
                    Files = MockSnapshots.GetCalculatorSolutionFiles(),
                    MethodDeclarations = MockSnapshots.GetCalculatorMethodDeclaration().ToList(),
                },
                AssignmentSolutionId = 1,
                TestProject          = new TestProject()
                {
                    Files           = MockSnapshots.GetCalculatorTestProjectFiles(),
                    TestFolder      = MockSnapshots.GetCalculatorTestProjectFolder(),
                    TestDllFile     = MockSnapshots.GetCalculatorTestProjectDll(),
                    TestProjectFile = MockSnapshots.GetCalculatorTestProjectFile()
                }
            };

            PreAssignmentRepository.Add(Assignment);
            AbstractSyntaxTreeGenerator       = new MockAbstractSyntaxTreeGenerator();
            AbstractSyntaxTreeClassExtractor  = new MockAbstractSyntaxTreeClassExtractor();
            AbstractSyntaxTreeMethodExtractor = new MockAbstractSyntaxTreeMethodExtractor();
            UnitTestGenerator = new MockUnitTestGenerator();

            Generator = new AssignmentGenerator(PreAssignmentRepository,
                                                AbstractSyntaxTreeGenerator,
                                                AbstractSyntaxTreeClassExtractor,
                                                AbstractSyntaxTreeMethodExtractor,
                                                UnitTestGenerator
                                                );
        }
Пример #16
0
        public void ValidateMethodDeclarations(PreAssignment assignment, AbstractSyntaxTreeNode root)
        {
            var undeclaredMethods = new List <MethodDeclaration>();

            foreach (var method in assignment.Solution.MethodDeclarations)
            {
                var methodNode = AbstractSyntaxTreeMethodExtractor.ExtractOrDefault(root, method);
                if (methodNode == null)
                {
                    undeclaredMethods.Add(method);
                }
            }

            if (undeclaredMethods.Any())
            {
                throw new EngineAssignmentExceptionData()
                      {
                          Report = new PreAssignmentMissingMethodsFailureReport()
                          {
                              MissingMethodDeclarations = undeclaredMethods
                          }
                      };
            }
        }
Пример #17
0
 public async Task RunPreAssignment(PreAssignment assignment, DirectoryHandler directory)
 {
     await AssignmentGenerator.Generate(assignment, directory);
 }
 public Task Generate(PreAssignment assignment, DirectoryHandler handler)
 {
     return(Task.CompletedTask);
 }
Пример #19
0
 public Task <ICollection <UnitTest> > GenerateResults(PreAssignment assignment, DirectoryHandler handler, string root)
 {
     throw new System.NotImplementedException();
 }