コード例 #1
0
        public void ExecuteFiddle_When_valid_code_entry_Then_returns_expected_output()
        {
            var runner = new RoslynReplFiddleRunner();

            string code = "Console.WriteLine(\"Hello World\");";

            var request = new ReplFiddleExecuteRequest()
            {
                PreviousCodeBlocks = GetDefaultCodeBlocks(),
                CodeBlock          = code
            };

            var response = runner.ExecuteFiddle(request);

            Assert.AreEqual("Hello World", response.ConsoleOutput);
        }
コード例 #2
0
        public void AddAndExecuteCodeEntryAsync_When_second_valid_code_entry_Then_returns_output_only_for_second_entry()
        {
            var runner = new RoslynReplFiddleRunner();

            string code = "Console.WriteLine(\"Hello World\");" +
                          "Console.WriteLine(\"  \");";

            var codeBlocks = GetDefaultCodeBlocks();

            codeBlocks.Add(code);

            var request = new ReplFiddleExecuteRequest()
            {
                PreviousCodeBlocks = codeBlocks,
                CodeBlock          = "Console.WriteLine(\"Hello Universe\");"
            };

            var response = runner.ExecuteFiddle(request);

            Assert.AreEqual("Hello Universe", response.ConsoleOutput);
        }
コード例 #3
0
        public async Task <ReplFiddleExecuteResponse> AddAndExecuteCodeEntryAsync(string codeBlock)
        {
            var replFiddleExecuteRequest = new ReplFiddleExecuteRequest
            {
                PreviousCodeBlocks      = _codeBlocks,
                CodeBlock               = codeBlock,
                IsDebugEnabled          = _isDebugEnabled,
                LastConsoleOutputLength = _lastConsoleOutputLength
            };


            var response = await _replFiddleRunner.ExecuteFiddleAsync(replFiddleExecuteRequest);



            if (String.IsNullOrEmpty(response.ExceptionErrorMessage))
            {
                _lastConsoleOutputLength = response.LastConsoleOutputLength;
                _codeBlocks.Add(codeBlock);
            }

            return(response);
        }
コード例 #4
0
 public ReplFiddleExecuteResponse ExecuteFiddle(ReplFiddleExecuteRequest request)
 {
     return(ExecuteFiddleAsync(request).Result);
 }
コード例 #5
0
        public async Task <ReplFiddleExecuteResponse> ExecuteFiddleAsync(ReplFiddleExecuteRequest request)
        {
            var response = new ReplFiddleExecuteResponse();

            string previousCode = String.Join(Environment.NewLine, request.PreviousCodeBlocks);
            var    code         = previousCode + Environment.NewLine + request.CodeBlock;

            //Execute all code
            var apiRequest = new FiddleExecuteRequest()
            {
                Compiler    = Compiler.Roslyn,
                Language    = Language.CSharp,
                ProjectType = ProjectType.Script,
                CodeBlock   = code
            };

            DotNetFiddleApiClient apiCLient = new DotNetFiddleApiClient();
            var apiResponse = await apiCLient.ExecuteFiddleAsync(apiRequest);

            string apiError = null;

            if (apiResponse.StatusCode != System.Net.HttpStatusCode.OK)
            {
                response.ExceptionErrorMessage = "There was an error calling .NET Fiddle API.";

                //Send error to errorlog or
                apiError += "Failed to execute API request. Here is an answer from API" + Environment.NewLine;
                apiError += "Response Code: " + apiResponse.StatusCode + Environment.NewLine;
                apiError += "Response Body: " + apiResponse.Content + Environment.NewLine;
            }
            else
            {
                if (apiResponse.Data.HasErrors || apiResponse.Data.HasCompilationErrors)
                {
                    response.ExceptionErrorMessage = apiResponse.Data.ConsoleOutput;
                }
                else
                {
                    var consoleOutput          = apiResponse.Data.ConsoleOutput;
                    var codeEntryConsoleOutput = consoleOutput.Substring(request.LastConsoleOutputLength); //Account for line break
                    response.LastConsoleOutputLength = consoleOutput.Length;

                    //Remove line break and other white spaces if in the beginning.  Since DNF trims output.
                    //Can fix it more later if it becomes an issue
                    response.ConsoleOutput = codeEntryConsoleOutput.TrimStart();
                }
            }


            //If worked, compare output to previous output.  Only show new lines, changes from last output


            if (request.IsDebugEnabled)
            {
                response.DebugInfo = "Input: " + code
                                     + Environment.NewLine + Environment.NewLine
                                     + "Output: "
                                     + Environment.NewLine + Environment.NewLine
                                     + JsonConvert.SerializeObject(apiResponse);

                if (apiError != null)
                {
                    response.DebugInfo += Environment.NewLine + Environment.NewLine
                                          + "API Error: " + Environment.NewLine
                                          + apiError;
                }
            }

            return(response);
        }
コード例 #6
0
        public async Task <ReplFiddleExecuteResponse> ExecuteFiddleAsync(ReplFiddleExecuteRequest request)
        {
            var response = new ReplFiddleExecuteResponse();

            _scriptState = null;

            List <string> codeBlocks = new List <string>();

            codeBlocks.AddRange(request.PreviousCodeBlocks);
            codeBlocks.Add(request.CodeBlock);


            for (int i = 0; i < codeBlocks.Count; i++)
            {
                bool       isLastCodeEntry  = i == codeBlocks.Count - 1;
                TextWriter oldConsoleOutput = null;
                TextWriter newConsoleOutput = null;

                if (isLastCodeEntry)
                {
                    lock (_lockLastEntryExecution)
                    {
                        oldConsoleOutput = Console.Out;
                        newConsoleOutput = new StringWriter();
                        Console.SetOut(newConsoleOutput);

                        try
                        {
                            try
                            {
                                response.ReturnValue = RunCodeEntry(codeBlocks[i]).Result;
                            }
                            catch (Exception ex)
                            {
                                //User inner exception because async method throws AggregateException
                                response.ExceptionErrorMessage = ex.InnerException.Message;
                            }


                            string consoleOutputText = newConsoleOutput.ToString();

                            if (!String.IsNullOrEmpty(consoleOutputText))
                            {
                                response.ConsoleOutput = consoleOutputText.Trim();
                            }
                        }
                        finally
                        {
                            Console.SetOut(oldConsoleOutput);
                        }
                    }
                }
                else
                {
                    try
                    {
                        //The return values for all but last code entry are not used
                        string someReturnValue = await RunCodeEntry(codeBlocks[i]);
                    }
                    catch (Exception e)
                    {
                        Debug.WriteLine(e.Message);
                    }
                }
            }

            if (request.IsDebugEnabled)
            {
                response.DebugInfo = "Input: " + request.CodeBlock
                                     + Environment.NewLine + Environment.NewLine
                                     + "Output: "
                                     + Environment.NewLine + Environment.NewLine
                                     + JsonConvert.SerializeObject(response);
            }

            return(response);
        }