Skip to content

Commit

Permalink
default output to .ipynb when redirected in --exit-after-run mode
Browse files Browse the repository at this point in the history
  • Loading branch information
jonsequitur committed Jul 1, 2022
1 parent d94b1ad commit 07cfd0d
Show file tree
Hide file tree
Showing 13 changed files with 577 additions and 141 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,16 @@
using Spectre.Console;
using Xunit;

namespace dotnet_repl.Tests.Notebooks;
namespace dotnet_repl.Tests.Automation;

public class NotebookAutomationTests : IDisposable
{
private readonly IAnsiConsole _ansiConsole;

private readonly CompositeDisposable _disposables = new();
private readonly StringWriter _writer;
private readonly string _directory = Path.GetDirectoryName(PathUtility.PathToCurrentSourceFile());
private readonly Parser _parser;
private readonly TestConsole console = new();

public NotebookAutomationTests()
{
Expand All @@ -25,20 +28,18 @@ public NotebookAutomationTests()
Interactive = InteractionSupport.Yes,
Out = new AnsiConsoleOutput(_writer = new StringWriter())
});

_parser = CommandLineParser.Create(_ansiConsole, registerForDisposal: d => _disposables.Add(d));

_disposables.Add(_writer);
}

public void Dispose() => _writer.Dispose();
public void Dispose() => _disposables.Dispose();

[Fact]
public async Task When_an_ipynb_is_run_and_no_error_is_produced_then_the_exit_code_is_0()
{
using var disposables = new CompositeDisposable();
var directory = Path.GetDirectoryName(PathUtility.PathToCurrentSourceFile());

var parser = CommandLineParser.Create(_ansiConsole, registerForDisposal: d => disposables.Add(d));

var console = new TestConsole();
var result = await parser.InvokeAsync($"--notebook \"{directory}/succeed.ipynb\" --exit-after-run", console);
var result = await _parser.InvokeAsync($"--notebook \"{_directory}/succeed.ipynb\" --exit-after-run", console);

var output = _writer.ToString();
console.Error.ToString().Should().BeEmpty();
Expand All @@ -49,17 +50,11 @@ public async Task When_an_ipynb_is_run_and_no_error_is_produced_then_the_exit_co
[Fact]
public async Task When_an_ipynb_is_run_and_an_error_is_produced_from_a_cell_then_the_exit_code_is_1()
{
using var disposables = new CompositeDisposable();
var directory = Path.GetDirectoryName(PathUtility.PathToCurrentSourceFile());

var parser = CommandLineParser.Create(_ansiConsole, registerForDisposal: d => disposables.Add(d));

var console = new TestConsole();
var result = await parser.InvokeAsync($"--notebook \"{directory}/fail.ipynb\" --exit-after-run", console);
var result = await _parser.InvokeAsync($"--notebook \"{_directory}/fail.ipynb\" --exit-after-run", console);

var output = _writer.ToString();
console.Error.ToString().Should().BeEmpty();
result.Should().Be(1);
output.Should().Contain("Oops!");
}
}
}
216 changes: 216 additions & 0 deletions src/dotnet-repl.Tests/Automation/VS Code outputs.ipynb
Original file line number Diff line number Diff line change
@@ -0,0 +1,216 @@
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"dotnet_interactive": {
"language": "csharp"
}
},
"source": [
"Console.Out.WriteLine(\"output\");"
],
"outputs": [
{
"output_type": "execute_result",
"data": {
"application/vnd.code.notebook.stdout": "output\r\n"
},
"execution_count": 1,
"metadata": {}
}
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"dotnet_interactive": {
"language": "csharp"
}
},
"source": [
"Console.Error.WriteLine(\"error\");"
],
"outputs": [
{
"output_type": "execute_result",
"data": {
"application/vnd.code.notebook.stderr": "error\r\n"
},
"execution_count": 1,
"metadata": {}
}
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"dotnet_interactive": {
"language": "csharp"
}
},
"source": [
"throw new Exception(\"oops!\");"
],
"outputs": [
{
"output_type": "error",
"ename": "Error",
"evalue": "{\n\t\"name\": \"Error\",\n\t\"message\": \"System.Exception: oops!\\r\\n at Submission#11.<<Initialize>>d__0.MoveNext()\\r\\n--- End of stack trace from previous location ---\\r\\n at Microsoft.CodeAnalysis.Scripting.ScriptExecutionState.RunSubmissionsAsync[TResult](ImmutableArray`1 precedingExecutors, Func`2 currentExecutor, StrongBox`1 exceptionHolderOpt, Func`2 catchExceptionOpt, CancellationToken cancellationToken)\"\n}",
"traceback": []
}
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"dotnet_interactive": {
"language": "csharp"
}
},
"source": [
"\"A return value\""
],
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "A return value"
},
"execution_count": 1,
"metadata": {}
}
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"dotnet_interactive": {
"language": "csharp"
}
},
"source": [
"\"An HTML display value\".Display(\"text/html\");"
],
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": "<div class=\"dni-plaintext\">An HTML display value</div>"
},
"execution_count": 1,
"metadata": {}
}
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"dotnet_interactive": {
"language": "csharp"
}
},
"source": [
"\"A plaintext display value\".Display(\"text/plain\");"
],
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "A plaintext display value"
},
"execution_count": 1,
"metadata": {}
}
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"dotnet_interactive": {
"language": "csharp"
}
},
"source": [
"\"A plaintext display value (in a multi-output cell)\".Display(\"text/plain\");\n",
"\"An HTML display value (in a multi-output cell)\".Display(\"text/html\");"
],
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": "A plaintext display value (in a multi-output cell)"
},
"execution_count": 1,
"metadata": {}
},
{
"output_type": "execute_result",
"data": {
"text/html": "<div class=\"dni-plaintext\">An HTML display value (in a multi-output cell)</div>"
},
"execution_count": 1,
"metadata": {}
}
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"dotnet_interactive": {
"language": "pwsh"
}
},
"source": [
"'A Powershell output' | Out-String"
],
"outputs": [
{
"output_type": "execute_result",
"data": {
"application/vnd.code.notebook.stdout": "A Powershell output\r\n\r\n"
},
"execution_count": 1,
"metadata": {}
}
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"dotnet_interactive": {
"language": "csharp"
}
},
"source": [
""
],
"outputs": []
}
],
"metadata": {
"kernelspec": {
"display_name": ".NET (C#)",
"language": "C#",
"name": ".net-csharp"
},
"language_info": {
"file_extension": ".cs",
"mimetype": "text/x-csharp",
"name": "C#",
"pygments_lexer": "csharp",
"version": "8.0"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
File renamed without changes.
4 changes: 2 additions & 2 deletions src/dotnet-repl.Tests/FormattingTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@ public class FormattingTests
{
public FormattingTests()
{
Repl.ResetFormattersToDefault();
Repl.UseDefaultSpectreFormatting();
}

[Fact]
public async Task Null_is_formatted_as_null()
{
using var kernel = Repl.CreateKernel(new("csharp"));
using var kernel = KernelBuilder.CreateKernel(new("csharp"));

var result = await kernel.SubmitCodeAsync("null");

Expand Down
4 changes: 2 additions & 2 deletions src/dotnet-repl.Tests/KernelChooserTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public class KernelChooserTests
[InlineData("#!csharp\n123\n#!fsharp\n#!help", "fsharp")]
public async Task Kernel_chooser_magic_commands_are_sticky(string submission, string expectedKernelName)
{
using var kernel = Repl.CreateKernel(new StartupOptions("csharp"));
using var kernel = KernelBuilder.CreateKernel(new StartupOptions("csharp"));

await kernel.SubmitCodeAsync(submission);

Expand All @@ -28,7 +28,7 @@ public async Task Kernel_chooser_magic_commands_are_sticky(string submission, st
[InlineData("#!value --name x\nsome text")]
public async Task Value_kernel_magic_command_is_not_sticky(string submission)
{
using var kernel = Repl.CreateKernel(new StartupOptions("csharp"));
using var kernel = KernelBuilder.CreateKernel(new StartupOptions("csharp"));

await kernel.SubmitCodeAsync(submission);

Expand Down
2 changes: 1 addition & 1 deletion src/dotnet-repl.Tests/ReplInteractionTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public abstract class ReplInteractionTests : IDisposable

protected ReplInteractionTests(ITestOutputHelper output)
{
Kernel = Repl.CreateKernel(new StartupOptions("csharp"));
Kernel = KernelBuilder.CreateKernel(new StartupOptions("csharp"));

AnsiConsole = Spectre.Console.AnsiConsole.Create(new AnsiConsoleSettings
{
Expand Down
4 changes: 2 additions & 2 deletions src/dotnet-repl.Tests/dotnet-repl.Tests.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,10 @@
</ItemGroup>

<ItemGroup>
<None Update="Notebooks\fail.ipynb">
<None Update="Automation\fail.ipynb">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Notebooks\succeed.ipynb">
<None Update="Automation\succeed.ipynb">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
Expand Down
Loading

0 comments on commit 07cfd0d

Please sign in to comment.