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});");
        }
Exemplo n.º 3
0
        /// <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("}");
        }
Exemplo n.º 7
0
        /// <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);