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()); }
/// <summary> /// Adds the body of the main method to the visualizer class. /// </summary> private void AddVisualizerMainMethodBody( JavaFileBuilder builder, MethodQuestionTest methodTest, CodeQuestionSubmission submission) { string variableDeclaration = Question.ReturnType == "void" ? "" : $"{Question.ReturnType} returnValue = "; builder.AddLine($"{variableDeclaration}{Question.MethodName}({methodTest.ParameterValues});"); }
/// <summary> /// Adds a class to a java file to run in the visualizer, for the given test. /// </summary> protected override void AddVisualizerClass( JavaFileBuilder builder, CodeQuestionTest test, CodeQuestionSubmission submission) { var classTest = test as ProgramQuestionTest; if (test == null) { throw new ArgumentException("Invalid test type", nameof(test)); } builder.AddLines(submission.Contents); }
public void GenerateClassDefinition_GeneratesCorrectDefinition() { var javaClass = ExpectedJavaModel.GetFullJavaModel() .Single(c => c.ClassName == "RootObject"); var fileBuilder = new JavaFileBuilder(); var classDefGenerator = new JavaClassDefinitionGenerator(fileBuilder, javaClass); classDefGenerator.GenerateClassDefinition(); var result = fileBuilder.GetFileContents(); var expectedResult = c_correctDefinition.Replace("\r\n", "\n"); Assert.Equal(expectedResult, result); }
/// <summary> /// Returns the contents of the java file to run with the java visualizer, for the given test. /// </summary> private string GetVisualizerFileContents(CodeQuestionTest test, CodeQuestionSubmission submission) { JavaFileBuilder builder = new JavaFileBuilder(); if (Question.ImportedClasses != null) { builder.AddLines(Question.ImportedClasses.Select(importedClass => $"import {importedClass.ClassName};")); } builder.AddBlankLine(); AddVisualizerClass(builder, test, submission); return(builder.GetFileContents()); }
/// <summary> /// Adds a class to a java file to run in the visualizer, for the given test. /// </summary> protected override void AddVisualizerClass( JavaFileBuilder builder, CodeQuestionTest test, CodeQuestionSubmission submission) { var classTest = test as ClassQuestionTest; if (test == null) { throw new ArgumentException("Invalid test type", nameof(test)); } var templateWithSubmission = GetFileTemplateWithSubmission(submission); var regex = new Regex("public\\s+class"); var modifiedSubmission = regex.Replace(templateWithSubmission, "class"); builder.AddLines(modifiedSubmission); builder.AddBlankLine(); builder.AddLine("public class Runner"); builder.BeginScope("{"); if (classTest.ReturnType != "void") { builder.AddLine($"public static {classTest.ReturnType} runTest()"); builder.BeginScope("{"); builder.AddLines(classTest.MethodBody); builder.EndScope("}"); } builder.AddBlankLine(); builder.AddLine("public static void main(String[] args)"); builder.BeginScope("{"); if (classTest.ReturnType != "void") { builder.AddLine($"{classTest.ReturnType} returnVal = runTest();"); } else { builder.AddLines(classTest.MethodBody); } builder.EndScope("}"); builder.EndScope("}"); }
/// <summary> /// Returns a new generated question template based off of an existing question. /// The generated question is not saved unless and until it is submitted through /// CreateQuestionAsync. /// </summary> public async Task <Question> GenerateFromExistingQuestionAsync( string classroomName, int existingQuestionId) { var existingQuestion = await GetQuestionAsync(classroomName, existingQuestionId); if (existingQuestion.IsQuestionTemplate) { throw new InvalidOperationException( "Cannot generate question from existing generated question."); } if (existingQuestion.HasChoices) { throw new InvalidOperationException( "Cannot generate question from existing randomly selected question."); } var builder = new JavaFileBuilder(); builder.AddLine("public class QuestionGenerator"); builder.BeginScope("{"); builder.AddLine("public static Question generateQuestion(int seed)"); builder.BeginScope("{"); _questionGenerator.GenerateConstructorInvocation ( existingQuestion, builder ); builder.EndScope("}"); builder.EndScope("}"); return(new GeneratedQuestionTemplate() { Name = $"{existingQuestion.Name} (generated)", QuestionCategoryId = existingQuestion.QuestionCategoryId, ImportedClasses = new List <ImportedClass>() { new ImportedClass() { ClassName = "java.util.*" } }, GeneratorContents = builder.GetFileContents() }); }
/// <summary> /// Returns a mock java class definition generator. /// </summary> private static IJavaClassDefinitionGenerator GetMockJavaClassDefinitionGenerator( JavaFileBuilder builder, JavaClass javaClass) { var generator = new Mock <IJavaClassDefinitionGenerator>(); generator .Setup ( g => g.GenerateClassDefinition() ) .Callback ( () => builder.AddLine(javaClass.ClassName) ); return(generator.Object); }
/// <summary> /// Adds a class to a java file to run in the visualizer, for the given test. /// </summary> protected override void AddVisualizerClass( JavaFileBuilder builder, CodeQuestionTest test, CodeQuestionSubmission submission) { var methodTest = test as MethodQuestionTest; if (test == null) { throw new ArgumentException("Invalid test type", nameof(test)); } builder.AddLine("public class Exercise"); builder.BeginScope("{"); builder.AddLines(submission.Contents); builder.AddBlankLine(); builder.AddLine("public static void main(String[] args)"); builder.BeginScope("{"); AddVisualizerMainMethodBody(builder, methodTest, submission); builder.EndScope("}"); builder.EndScope("}"); }
public void GenerateConstructorInvocation_GeneratesCorrectInvocation() { var fileBuilder = new JavaFileBuilder(); var javaModel = ExpectedJavaModel.GetFullJavaModel(); var constructorInvocationGen = new JavaConstructorInvocationGenerator ( fileBuilder, javaModel ); constructorInvocationGen.GenerateConstructorInvocation ( GetRootObject(), "return ", ";" ); var result = fileBuilder.GetFileContents(); var expectedResult = c_correctInvocation.Replace("\r\n", "\n"); Assert.Equal(expectedResult, result); }
/// <summary> /// Returns a mock java constructor invocation generator. /// </summary> private static IJavaConstructorInvocationGenerator GetMockJavaConstructorInvocationGenerator( JavaFileBuilder builder, Question question) { var generator = new Mock <IJavaConstructorInvocationGenerator>(); generator .Setup ( g => g.GenerateConstructorInvocation ( question, "return ", ";" ) ) .Callback <object, string, string> ( (obj, prefix, suffix) => builder.AddLine("ConstructorInvocation") ); return(generator.Object); }
/// <summary> /// Adds a class to a java file to run in the visualizer, for the given test. /// </summary> protected abstract void AddVisualizerClass( JavaFileBuilder builder, CodeQuestionTest test, CodeQuestionSubmission submission);