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); }
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); }
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); }
public ReplFiddleExecuteResponse ExecuteFiddle(ReplFiddleExecuteRequest request) { return(ExecuteFiddleAsync(request).Result); }
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); }
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); }