public async Task GradeSubmissionAsync_AttemptsRemaining_UserQuestionDataUpdated( bool isInteractive) { var store = GetUserQuestionDataStore ( numAttempts: 1, numAttemptsRemaining: 1, interactive: isInteractive, cachedQuestionData: "Cached", seed: 12345 ); var status = CreateUserQuestionStatus(attemptsRemaining: true); var statusCalculator = GetMockQuestionStatusCalculator(store, status); var submission = CreateQuestionSubmission(assignmentQuestionId: 1); var resolvedQuestion = new MethodQuestion(); var resolverFactory = GetMockQuestionResolverFactory(store, resolvedQuestion); var serializer = GetMockJsonSerializer("Contents", submission); var graderFactory = GetMockQuestionGraderFactory ( resolvedQuestion, submission, new ScoredQuestionResult(result: null, score: 0.5) ); var questionSolver = GetQuestionSolver ( questionResolverFactory: resolverFactory, questionGraderFactory: graderFactory, questionStatusCalculator: statusCalculator, jsonSerializer: serializer ); await questionSolver.GradeSubmissionAsync ( store, submission, SubmissionDate ); var userQuestionData = store.GetUserQuestionData ( store.GetLoadedAssignmentQuestionIds()[0] ); var expectedLastSubmission = isInteractive ? "Contents" : null; Assert.Equal(1, userQuestionData.Submissions.Count); Assert.Equal(0.5, userQuestionData.Submissions[0].Score); Assert.Equal(SubmissionDate, userQuestionData.Submissions[0].DateSubmitted); Assert.Equal(12345, userQuestionData.Submissions[0].Seed); Assert.Equal("Cached", userQuestionData.Submissions[0].CachedQuestionData); Assert.Equal("Contents", userQuestionData.Submissions[0].SubmissionContents); Assert.Equal(2, userQuestionData.NumAttempts); Assert.Null(userQuestionData.Seed); Assert.Equal(expectedLastSubmission, userQuestionData.LastQuestionSubmission); }
public void GenerateConstructorInvocation_GeneratesCorrectInvocation() { var question = new MethodQuestion(); var fileBuilder = new JavaFileBuilder(); var questionGenerator = GetQuestionGenerator(question); questionGenerator.GenerateConstructorInvocation(question, fileBuilder); Assert.Equal("ConstructorInvocation\n", fileBuilder.GetFileContents()); }
public void GenerateConstructorInvocation_GeneratesCorrectInvocation() { var question = new MethodQuestion(); var fileBuilder = new JavaFileBuilder(); var questionGenerator = GetQuestionGenerator(question); questionGenerator.GenerateConstructorInvocation(question, fileBuilder); Assert.Equal("ConstructorInvocation\n", fileBuilder.GetFileContents()); }
public async Task GetQuestionInstanceAsync_NoGenerationError_ReturnsQuestionInstance() { var database = new TestDatabaseBuilder() .AddClassroom("Class1") .AddQuestionCategory("Class1", "Category1") .AddQuestion("Class1", "Category1", new GeneratedQuestionTemplate() { Name = "Question1" }) .Build(); var questionId = database.Context .Questions .First() .Id; var loaderFactory = GetMockQuestionLoaderFactory(); var generator = GetMockQuestionGenerator ( questionId, seed: 12345, error: false, result: "SerializedQuestion" ); var expectedResult = new MethodQuestion(); var jsonSerializer = GetMockJsonSerializer <Question> ( "SerializedQuestion", expectedResult ); var questionService = CreateQuestionService ( database.Context, questionLoaderFactory: loaderFactory.Object, questionGenerator: generator.Object, jsonSerializer: jsonSerializer.Object ); var result = await questionService.GetQuestionInstanceAsync ( "Class1", id : 1, seed : 12345 ); loaderFactory.Verify(LoadQuestionExpression); Assert.Equal(expectedResult, result.Question); Assert.Equal(12345, result.Seed); }
/// <summary> /// Verifies that the given method question was correctly duplicated. /// </summary> private void VerifyMethodQuestion( DatabaseContext dbContext, MethodQuestion oldQuestion, MethodQuestion newQuestion) { VerifyCodeQuestion(dbContext, oldQuestion, newQuestion); VerifyCollectionDuplicated ( dbContext, oldQuestion, newQuestion, q => q.Tests, t => t.Id, t => t.ParameterValues ); }
public async Task GradeSubmissionAsync_InteractiveAttemptsRemaining_ReturnsResultWithScore() { var store = GetUserQuestionDataStore ( numAttempts: 1, numAttemptsRemaining: 2, interactive: true ); var status = CreateUserQuestionStatus(attemptsRemaining: true); var statusCalculator = GetMockQuestionStatusCalculator(store, status); var submission = CreateQuestionSubmission(assignmentQuestionId: 1); var resolvedQuestion = new MethodQuestion(); var scoredQuestionResult = new ScoredQuestionResult(result: null, score: 0.5); var resolverFactory = GetMockQuestionResolverFactory(store, resolvedQuestion); var serializer = GetMockJsonSerializer("Contents", submission); var graderFactory = GetMockQuestionGraderFactory ( resolvedQuestion, submission, scoredQuestionResult ); var questionSolver = GetQuestionSolver ( questionResolverFactory: resolverFactory, questionGraderFactory: graderFactory, questionStatusCalculator: statusCalculator, jsonSerializer: serializer ); var result = await questionSolver.GradeSubmissionAsync ( store, submission, SubmissionDate ); Assert.Equal(scoredQuestionResult, result.ScoredQuestionResult); Assert.Null(result.SubmissionDate); }
public async Task GetQuestionToSolveAsync_SimplePropertiesCorrect() { var user = new User(); var store = GetUserQuestionDataStore ( assignmentQuestionId: 1, assignmentQuestionName: "Question 1", user: user ); var status = CreateUserQuestionStatus(); var statusCalculator = GetMockQuestionStatusCalculator(store, status); var resolvedQuestion = new MethodQuestion(); var assignmentProgressRetriever = GetMockAssignmentProgressRetriever(store); var resolverFactory = GetMockQuestionResolverFactory ( store, resolvedQuestion ); var questionSolver = GetQuestionSolver ( questionResolverFactory: resolverFactory, questionStatusCalculator: statusCalculator, assignmentProgressRetriever: assignmentProgressRetriever ); var result = await questionSolver.GetQuestionToSolveAsync ( store, assignmentQuestionId : 1 ); Assert.Equal(1, result.AssignmentQuestionId); Assert.Equal("Question 1", result.Name); Assert.Equal(resolvedQuestion, result.Question); Assert.Equal(user, result.User); Assert.Equal(status, result.Status); }
/// <summary> /// Creates a question loader for a method question. /// </summary> IQuestionResolver IQuestionResultVisitor <IQuestionResolver, UserQuestionData> .Visit( MethodQuestion question, UserQuestionData userQuestionData) { return(new DefaultQuestionResolver(userQuestionData)); }
/// <summary> /// Creates a question loader for a method question. /// </summary> IQuestionLoader IQuestionResultVisitor <IQuestionLoader> .Visit(MethodQuestion question) { return(new MethodQuestionLoader(_dbContext, question)); }
/// <summary> /// Creates a question updater for a method question. /// </summary> IQuestionUpdater IQuestionResultVisitor <IQuestionUpdater, IModelErrorCollection> .Visit( MethodQuestion question, IModelErrorCollection errors) { return(new MethodQuestionUpdater(_dbContext, question, errors)); }
/// <summary> /// Creates a question loader for a method question. /// </summary> IUserQuestionDataUpdater IQuestionResultVisitor <IUserQuestionDataUpdater> .Visit( MethodQuestion question) { return(_defaultUserQuestionDataUpdater); }
/// <summary> /// Creates a question duplicator for a method question. /// </summary> IQuestionDuplicator IQuestionResultVisitor <IQuestionDuplicator> .Visit(MethodQuestion question) { return(new MethodQuestionDuplicator(_dbContext, question)); }
/// <summary> /// Creates a question grader for a method question. /// </summary> IQuestionGrader IQuestionResultVisitor <IQuestionGrader> .Visit(MethodQuestion question) { return(new MethodQuestionGrader(question, _codeRunnerService)); }