public async Task GradeSubmissionAsync_WrongOverloadSignature_Error() { var question = GetClassQuestion(overloadedMethods: true); var submission = new CodeQuestionSubmission() { Contents = "Submission" }; var classJobResult = GetClassJobResult(success: false, overloadedMethods: true); classJobResult.ClassDefinition.Methods[0].ParameterTypes[0] = "String"; var codeRunnerService = GetCodeRunnerService(classJobResult); var grader = new ClassQuestionGrader(question, codeRunnerService); var result = await grader.GradeSubmissionAsync(submission); var codeQuestionResult = (CodeQuestionResult)result.Result; var methodOverloadDefinitionError = codeQuestionResult.Errors .Cast <MethodDefinitionError>() .Single(); Assert.Equal(0.0, result.Score); Assert.Equal("ExpectedClass", methodOverloadDefinitionError.ClassName); Assert.Equal("requiredOverloadedMethod", methodOverloadDefinitionError.ExpectedMethodName); Assert.True(methodOverloadDefinitionError.ExpectedPublic); Assert.False(methodOverloadDefinitionError.ExpectedStatic); Assert.Equal("int", methodOverloadDefinitionError.ExpectedParamTypes); Assert.Equal("boolean", methodOverloadDefinitionError.ExpectedReturnType); }
public async Task GradeSubmissionAsync_CorrectSubmission_CorrectScore( bool constructor, bool useGenerics, bool overloadedMethods) { var question = GetClassQuestion ( constructor: constructor, useGenerics: useGenerics, overloadedMethods: overloadedMethods ); var classJobResult = GetClassJobResult ( success: true, constructor: constructor, useGenerics: useGenerics, overloadedMethods: overloadedMethods ); var submission = new CodeQuestionSubmission() { Contents = "Submission" }; var codeRunnerService = GetCodeRunnerService(classJobResult); var grader = new ClassQuestionGrader(question, codeRunnerService); var result = await grader.GradeSubmissionAsync(submission); var codeQuestionResult = (CodeQuestionResult)result.Result; Assert.Equal(1.0, result.Score); Assert.Empty(codeQuestionResult.Errors); }
public async Task GradeSubmissionAsync_WrongParameterTypes_Error() { var question = GetClassQuestion(); var submission = new CodeQuestionSubmission() { Contents = "Submission" }; var classJobResult = GetClassJobResult(success: false); classJobResult.ClassDefinition.Methods[0].ParameterTypes[1] = "double"; var codeRunnerService = GetCodeRunnerService(classJobResult); var grader = new ClassQuestionGrader(question, codeRunnerService); var result = await grader.GradeSubmissionAsync(submission); var codeQuestionResult = (CodeQuestionResult)result.Result; var methodDefinitionError = codeQuestionResult.Errors .Cast <MethodDefinitionError>() .Single(); Assert.Equal(0.0, result.Score); Assert.Equal("requiredMethod", methodDefinitionError.ExpectedMethodName); Assert.Equal("int, int", methodDefinitionError.ExpectedParamTypes); }
public async Task GradeSubmissionAsync_TooManyOverloads_Error() { var question = GetClassQuestion(overloadedMethods: true); var submission = new CodeQuestionSubmission() { Contents = "Submission" }; question.RequiredMethods.RemoveAt(0); var classJobResult = GetClassJobResult(success: false, overloadedMethods: true); var codeRunnerService = GetCodeRunnerService(classJobResult); var grader = new ClassQuestionGrader(question, codeRunnerService); var result = await grader.GradeSubmissionAsync(submission); var codeQuestionResult = (CodeQuestionResult)result.Result; var methodOverloadCountError = codeQuestionResult.Errors .Cast <MethodCountError>() .Single(); Assert.Equal(0.0, result.Score); Assert.Equal("ExpectedClass", methodOverloadCountError.ClassName); Assert.Equal("requiredOverloadedMethod", methodOverloadCountError.ExpectedMethodName); Assert.Equal(1, methodOverloadCountError.ExpectedCount); Assert.False(methodOverloadCountError.ExpectedStatic); }
public async Task GradeSubmissionAsync_PermittedPublicFields_Success() { var question = GetClassQuestion(allowPublicFields: true); var submission = new CodeQuestionSubmission() { Contents = "Submission" }; var classJobResult = GetClassJobResult(success: true); classJobResult.ClassDefinition.Fields = new List <FieldDefinition>() { new FieldDefinition() { Name = "field1", IsPublic = true, Type = "String" }, new FieldDefinition() { Name = "field2", IsPublic = false, Type = "String" } }; var codeRunnerService = GetCodeRunnerService(classJobResult); var grader = new ClassQuestionGrader(question, codeRunnerService); var result = await grader.GradeSubmissionAsync(submission); var codeQuestionResult = (CodeQuestionResult)result.Result; Assert.Equal(1.0, result.Score); Assert.Empty(codeQuestionResult.Errors); }
public async Task GradeSubmissionAsync_UnexpectedStaticMethod_Error() { var question = GetClassQuestion(); var submission = new CodeQuestionSubmission() { Contents = "Submission" }; var classJobResult = GetClassJobResult(success: false); classJobResult.ClassDefinition.Methods[0].IsStatic = true; var codeRunnerService = GetCodeRunnerService(classJobResult); var grader = new ClassQuestionGrader(question, codeRunnerService); var result = await grader.GradeSubmissionAsync(submission); var codeQuestionResult = (CodeQuestionResult)result.Result; var methodDefinitionError = codeQuestionResult.Errors .Cast <MethodDefinitionError>() .Single(); Assert.Equal(0.0, result.Score); Assert.Equal("requiredMethod", methodDefinitionError.ExpectedMethodName); Assert.False(methodDefinitionError.ExpectedStatic); }
public async Task GradeSubmissionAsync_WrongReturnType_Error() { var question = GetClassQuestion(); var submission = new CodeQuestionSubmission() { Contents = "Submission" }; var classJobResult = GetClassJobResult(success: false); classJobResult.ClassDefinition.Methods[0].ReturnType = "boolean"; var codeRunnerService = GetCodeRunnerService(classJobResult); var grader = new ClassQuestionGrader(question, codeRunnerService); var result = await grader.GradeSubmissionAsync(submission); var codeQuestionResult = (CodeQuestionResult)result.Result; var methodReturnTypeError = codeQuestionResult.Errors .Cast <MethodReturnTypeError>() .Single(); Assert.Equal(0.0, result.Score); Assert.Equal("requiredMethod", methodReturnTypeError.MethodName); Assert.Equal("String", methodReturnTypeError.ExpectedReturnType); Assert.Equal("boolean", methodReturnTypeError.ActualReturnType); }
public async Task GradeSubmissionAsync_ClassJobHasCorrectClassName() { var question = GetClassQuestion(); var classJobResult = GetClassJobResult(success: true); var submission = new CodeQuestionSubmission() { Contents = "Submission" }; var codeRunnerService = GetCodeRunnerService ( classJobResult, job => job.ClassName == "ExpectedClass" ); var grader = new ClassQuestionGrader(question, codeRunnerService); var result = await grader.GradeSubmissionAsync(submission); Assert.Equal(1.0, result.Score); }
public async Task GradeSubmissionAsync_ClassJobHasImportedClasses() { var question = GetClassQuestion(); var classJobResult = GetClassJobResult(success: true); var submission = new CodeQuestionSubmission() { Contents = "Submission" }; var codeRunnerService = GetCodeRunnerService ( classJobResult, job => job.ClassesToImport.Count == 1 && job.ClassesToImport[0] == "package.classToImport" ); var grader = new ClassQuestionGrader(question, codeRunnerService); var result = await grader.GradeSubmissionAsync(submission); Assert.Equal(1.0, result.Score); }
public async Task GradeSubmissionAsync_CorrectSubmission_ValidTestDescription() { var question = GetClassQuestion(); var classJobResult = GetClassJobResult(success: true); var submission = new CodeQuestionSubmission() { Contents = "Submission" }; var codeRunnerService = GetCodeRunnerService(classJobResult); var grader = new ClassQuestionGrader(question, codeRunnerService); var result = await grader.GradeSubmissionAsync(submission); var codeQuestionResult = (CodeQuestionResult)result.Result; var testResult = codeQuestionResult.TestResults.Single(); Assert.Equal("Description", testResult.Description); }
public async Task GradeSubmissionAsync_ClassJobHasTests() { var question = GetClassQuestion(); var classJobResult = GetClassJobResult(success: true); var submission = new CodeQuestionSubmission() { Contents = "Submission %" }; var codeRunnerService = GetCodeRunnerService ( classJobResult, job => job.Tests.Count == 1 && job.Tests[0].TestName == "test1" && job.Tests[0].MethodBody == "Method Body" && job.Tests[0].ReturnType == "String" ); var grader = new ClassQuestionGrader(question, codeRunnerService); var result = await grader.GradeSubmissionAsync(submission); Assert.Equal(1.0, result.Score); }
public async Task GradeSubmissionAsync_ForbiddenPublicFields_Error() { var question = GetClassQuestion(allowPublicFields: false); var submission = new CodeQuestionSubmission() { Contents = "Submission" }; var classJobResult = GetClassJobResult(success: false); classJobResult.ClassDefinition.Fields = new List <FieldDefinition>() { new FieldDefinition() { Name = "field1", IsPublic = true, Type = "String" }, new FieldDefinition() { Name = "field2", IsPublic = false, Type = "String" } }; var codeRunnerService = GetCodeRunnerService(classJobResult); var grader = new ClassQuestionGrader(question, codeRunnerService); var result = await grader.GradeSubmissionAsync(submission); var codeQuestionResult = (CodeQuestionResult)result.Result; var fieldVisibilityError = codeQuestionResult.Errors .Cast <FieldVisibilityError>() .Single(); Assert.Equal(0.0, result.Score); Assert.Equal("ExpectedClass", fieldVisibilityError.ClassName); }
public async Task GradeSubmissionAsync_MissingExpectedClass_Error() { var question = GetClassQuestion(); var submission = new CodeQuestionSubmission() { Contents = "Submission" }; var classJobResult = GetClassJobResult(success: false); classJobResult.TestsCompilationResult = null; classJobResult.ClassDefinition = null; classJobResult.ClassCompilationResult = new CompilationResult() { Success = false, Errors = Collections.CreateList ( new CompileError() { Message = "class ExpectedClass should be declared in ExpectedClass.java" } ) }; var codeRunnerService = GetCodeRunnerService(classJobResult); var grader = new ClassQuestionGrader(question, codeRunnerService); var result = await grader.GradeSubmissionAsync(submission); var codeQuestionResult = (CodeQuestionResult)result.Result; var missingRequiredClassError = codeQuestionResult.Errors .Cast <MissingRequiredClassError>() .Single(); Assert.Equal(0.0, result.Score); Assert.Equal("ExpectedClass", missingRequiredClassError.RequiredClassName); }
public async Task GradeSubmissionAsync_ClassJobHasCorrectFileContents() { var question = GetClassQuestion(); var classJobResult = GetClassJobResult(success: true); var submission = new CodeQuestionSubmission() { Contents = "Submission %" }; var codeRunnerService = GetCodeRunnerService ( classJobResult, job => job.FileContents == "class InternalClass\n" + "{\n" + "}\n" + "\n" + "Submission %%" ); var grader = new ClassQuestionGrader(question, codeRunnerService); var result = await grader.GradeSubmissionAsync(submission); Assert.Equal(1.0, result.Score); }
public async Task GradeSubmissionAsync_WrongOverloadSignature_Error() { var question = GetClassQuestion(overloadedMethods: true); var submission = new CodeQuestionSubmission() { Contents = "Submission" }; var classJobResult = GetClassJobResult(success: false, overloadedMethods: true); classJobResult.ClassDefinition.Methods[0].ParameterTypes[0] = "String"; var codeRunnerService = GetCodeRunnerService(classJobResult); var grader = new ClassQuestionGrader(question, codeRunnerService); var result = await grader.GradeSubmissionAsync(submission); var codeQuestionResult = (CodeQuestionResult)result.Result; var methodOverloadDefinitionError = codeQuestionResult.Errors .Cast<MethodOverloadDefinitionError>() .Single(); Assert.Equal(0.0, result.Score); Assert.Equal("ExpectedClass", methodOverloadDefinitionError.ClassName); Assert.Equal("requiredOverloadedMethod", methodOverloadDefinitionError.ExpectedMethodName); Assert.True(methodOverloadDefinitionError.ExpectedPublic); Assert.False(methodOverloadDefinitionError.ExpectedStatic); Assert.Equal("int", methodOverloadDefinitionError.ExpectedParamTypes); Assert.Equal("boolean", methodOverloadDefinitionError.ExpectedReturnType); }
public async Task GradeSubmissionAsync_CorrectSubmission_ValidTestDescription() { var question = GetClassQuestion(); var classJobResult = GetClassJobResult(success: true); var submission = new CodeQuestionSubmission() { Contents = "Submission" }; var codeRunnerService = GetCodeRunnerService(classJobResult); var grader = new ClassQuestionGrader(question, codeRunnerService); var result = await grader.GradeSubmissionAsync(submission); var codeQuestionResult = (CodeQuestionResult)result.Result; var testResult = codeQuestionResult.TestResults.Single(); Assert.Equal(1.0, result.Score); Assert.Equal(0, codeQuestionResult.Errors.Count); Assert.Equal("Description", testResult.Description); }
public async Task GradeSubmissionAsync_WrongParameterTypes_Error() { var question = GetClassQuestion(); var submission = new CodeQuestionSubmission() { Contents = "Submission" }; var classJobResult = GetClassJobResult(success: false); classJobResult.ClassDefinition.Methods[0].ParameterTypes[1] = "double"; var codeRunnerService = GetCodeRunnerService(classJobResult); var grader = new ClassQuestionGrader(question, codeRunnerService); var result = await grader.GradeSubmissionAsync(submission); var codeQuestionResult = (CodeQuestionResult)result.Result; var methodParameterTypesError = codeQuestionResult.Errors .Cast<MethodParameterTypesError>() .Single(); Assert.Equal(0.0, result.Score); Assert.Equal("requiredMethod", methodParameterTypesError.MethodName); Assert.Equal(2, methodParameterTypesError.ExpectedParamTypes.Count); Assert.Equal("int", methodParameterTypesError.ExpectedParamTypes[0]); Assert.Equal("int", methodParameterTypesError.ExpectedParamTypes[1]); Assert.Equal("int", methodParameterTypesError.ActualParamTypes[0]); Assert.Equal("double", methodParameterTypesError.ActualParamTypes[1]); }
public async Task GradeSubmissionAsync_WrongOverloadCount_Error() { var question = GetClassQuestion(overloadedMethods: true); var submission = new CodeQuestionSubmission() { Contents = "Submission" }; var classJobResult = GetClassJobResult(success: false, overloadedMethods: true); classJobResult.ClassDefinition.Methods.RemoveAt(0); var codeRunnerService = GetCodeRunnerService(classJobResult); var grader = new ClassQuestionGrader(question, codeRunnerService); var result = await grader.GradeSubmissionAsync(submission); var codeQuestionResult = (CodeQuestionResult)result.Result; var methodOverloadCountError = codeQuestionResult.Errors .Cast<MethodOverloadCountError>() .Single(); Assert.Equal(0.0, result.Score); Assert.Equal("ExpectedClass", methodOverloadCountError.ClassName); Assert.Equal("requiredOverloadedMethod", methodOverloadCountError.ExpectedMethodName); Assert.Equal(2, methodOverloadCountError.ExpectedOverloadCount); Assert.False(methodOverloadCountError.ExpectedStatic); }
public async Task GradeSubmissionAsync_WrongReturnType_Error() { var question = GetClassQuestion(); var submission = new CodeQuestionSubmission() { Contents = "Submission" }; var classJobResult = GetClassJobResult(success: false); classJobResult.ClassDefinition.Methods[0].ReturnType = "boolean"; var codeRunnerService = GetCodeRunnerService(classJobResult); var grader = new ClassQuestionGrader(question, codeRunnerService); var result = await grader.GradeSubmissionAsync(submission); var codeQuestionResult = (CodeQuestionResult)result.Result; var methodReturnTypeError = codeQuestionResult.Errors .Cast<MethodReturnTypeError>() .Single(); Assert.Equal(0.0, result.Score); Assert.Equal("requiredMethod", methodReturnTypeError.MethodName); Assert.Equal("String", methodReturnTypeError.ExpectedReturnType); Assert.Equal("boolean", methodReturnTypeError.ActualReturnType); }
public async Task GradeSubmissionAsync_UnexpectedStaticMethod_Error() { var question = GetClassQuestion(); var submission = new CodeQuestionSubmission() { Contents = "Submission" }; var classJobResult = GetClassJobResult(success: false); classJobResult.ClassDefinition.Methods[0].IsStatic = true; var codeRunnerService = GetCodeRunnerService(classJobResult); var grader = new ClassQuestionGrader(question, codeRunnerService); var result = await grader.GradeSubmissionAsync(submission); var codeQuestionResult = (CodeQuestionResult)result.Result; var methodStaticError = codeQuestionResult.Errors .Cast<MethodStaticError>() .Single(); Assert.Equal(0.0, result.Score); Assert.Equal("requiredMethod", methodStaticError.MethodName); Assert.False(methodStaticError.ExpectedStatic); }
public async Task GradeSubmissionAsync_MissingExpectedClass_Error() { var question = GetClassQuestion(); var submission = new CodeQuestionSubmission() { Contents = "Submission" }; var classJobResult = GetClassJobResult(success: false); classJobResult.TestsCompilationResult = null; classJobResult.ClassDefinition = null; classJobResult.ClassCompilationResult = new CompilationResult() { Success = false, Errors = Collections.CreateList ( new CompileError() { Message = "class ExpectedClass should be declared in ExpectedClass.java" } ) }; var codeRunnerService = GetCodeRunnerService(classJobResult); var grader = new ClassQuestionGrader(question, codeRunnerService); var result = await grader.GradeSubmissionAsync(submission); var codeQuestionResult = (CodeQuestionResult)result.Result; var missingRequiredClassError = codeQuestionResult.Errors .Cast<MissingRequiredClassError>() .Single(); Assert.Equal(0.0, result.Score); Assert.Equal("ExpectedClass", missingRequiredClassError.RequiredClassName); }
public async Task GradeSubmissionAsync_PermittedPublicFields_Success() { var question = GetClassQuestion(allowPublicFields: true); var submission = new CodeQuestionSubmission() { Contents = "Submission" }; var classJobResult = GetClassJobResult(success: true); classJobResult.ClassDefinition.Fields = new List<FieldDefinition>() { new FieldDefinition() { Name = "field1", IsPublic = true, Type = "String" }, new FieldDefinition() { Name = "field2", IsPublic = false, Type = "String" } }; var codeRunnerService = GetCodeRunnerService(classJobResult); var grader = new ClassQuestionGrader(question, codeRunnerService); var result = await grader.GradeSubmissionAsync(submission); var codeQuestionResult = (CodeQuestionResult)result.Result; Assert.Equal(1.0, result.Score); Assert.Equal(0, codeQuestionResult.Errors.Count); }
public async Task GradeSubmissionAsync_ForbiddenPublicFields_Error() { var question = GetClassQuestion(allowPublicFields: false); var submission = new CodeQuestionSubmission() { Contents = "Submission" }; var classJobResult = GetClassJobResult(success: false); classJobResult.ClassDefinition.Fields = new List<FieldDefinition>() { new FieldDefinition() { Name = "field1", IsPublic = true, Type = "String" }, new FieldDefinition() { Name = "field2", IsPublic = false, Type = "String" } }; var codeRunnerService = GetCodeRunnerService(classJobResult); var grader = new ClassQuestionGrader(question, codeRunnerService); var result = await grader.GradeSubmissionAsync(submission); var codeQuestionResult = (CodeQuestionResult)result.Result; var fieldVisibilityError = codeQuestionResult.Errors .Cast<FieldVisibilityError>() .Single(); Assert.Equal(0.0, result.Score); Assert.Equal("ExpectedClass", fieldVisibilityError.ClassName); }