public async Task Events_published_by_child_kernel_are_visible_in_parent_kernel() { var subKernel = new CSharpKernel(); var compositeKernel = new CompositeKernel { subKernel }; var events = compositeKernel.KernelEvents.ToSubscribedList(); await subKernel.SendAsync(new SubmitCode("var x = 1;")); events .Select(e => e.GetType()) .Should() .ContainInOrder( typeof(KernelBusy), typeof(CodeSubmissionReceived), typeof(CompleteCodeSubmissionReceived), typeof(CommandHandled), typeof(KernelIdle)); }
public async Task Script_state_is_available_within_middleware_pipeline() { var variableCountBeforeEvaluation = 0; var variableCountAfterEvaluation = 0; using var kernel = new CSharpKernel(); kernel.Pipeline.AddMiddleware(async(command, context, next) => { var k = context.HandlingKernel as CSharpKernel; // variableCountBeforeEvaluation = k.ScriptState.Variables.Length; await next(command, context); variableCountAfterEvaluation = k.ScriptState.Variables.Length; }); await kernel.SendAsync(new SubmitCode("var x = 1;")); variableCountBeforeEvaluation.Should().Be(0); variableCountAfterEvaluation.Should().Be(1); }
private async Task <CompositeKernel> CreateKernel() { var csharpKernel = new CSharpKernel().UseNugetDirective(); await csharpKernel.SubmitCodeAsync(@$ " #r " "nuget:microsoft.sqltoolsservice,3.0.0-release.53" " "); // TODO: remove SQLKernel it is used to test current patch var kernel = new CompositeKernel { new SQLKernel(), csharpKernel, new KeyValueStoreKernel() }; kernel.DefaultKernelName = csharpKernel.Name; kernel.UseKernelClientConnection(new MsSqlKernelConnection()); kernel.UseNteractDataExplorer(); kernel.UseSandDanceExplorer(); return(kernel); }
public void RequestDiagnostics_can_be_split_into_separate_commands() { var markupCode = @" #!time$$ // language-specific code"; MarkupTestFile.GetLineAndColumn(markupCode, out var code, out var startLineOfCode, out var _column); var sourceText = SourceText.From(code); var command = new RequestDiagnostics(code); var commands = new CSharpKernel().UseDefaultMagicCommands().SubmissionParser.SplitSubmission(command); commands .Should() .ContainSingle <RequestDiagnostics>() .Which .Code .Should() .NotContain("#!time"); }
public async Task Deferred_commands_on_composite_kernel_are_execute_on_first_submission() { var deferredCommandExecuted = false; var subKernel = new CSharpKernel(); using var compositeKernel = new CompositeKernel { subKernel }; compositeKernel.DefaultKernelName = subKernel.Name; var deferred = new SubmitCode("placeholder") { Handler = (command, context) => { deferredCommandExecuted = true; return(Task.CompletedTask); } }; compositeKernel.DeferCommand(deferred); var events = compositeKernel.KernelEvents.ToSubscribedList(); await compositeKernel.SendAsync(new SubmitCode("var x = 1;", targetKernelName : subKernel.Name)); deferredCommandExecuted.Should().Be(true); events .Select(e => e.GetType()) .Should() .ContainInOrder( typeof(CodeSubmissionReceived), typeof(CompleteCodeSubmissionReceived), typeof(CommandSucceeded)); }
private static async Task DoDotnetInteractiveStuff(Action <string> log) { _Kernel = new CompositeKernel(); _Kernel.UseLog(); AddDispatcherCommand(_Kernel); CSharpKernel csharpKernel = RegisterCSharpKernel(); //_ = Task.Run(async () => //{ try { //Load WPF app assembly await csharpKernel.SendAsync(new SubmitCode(@$ "#r " "{typeof(Interactive).Assembly.Location}" " using {nameof(Snoop)}.{nameof(Snoop.Interactive)};")); //Add the WPF app as a variable that can be accessed //await csharpKernel.SetVariableAsync("App", Application.Current); //Start named pipe _Kernel.UseNamedPipeKernelServer(NamedPipeName, new DirectoryInfo(".")); log($"Started named pipe {NamedPipeName}"); }
public async Task Deferred_commands_on_composite_kernel_can_use_directives() { var deferredCommandExecuted = false; var subKernel = new CSharpKernel(); using var compositeKernel = new CompositeKernel { subKernel }; var customDirective = new Command("#!customDirective") { Handler = CommandHandler.Create(() => { deferredCommandExecuted = true; }) }; compositeKernel.AddDirective(customDirective); compositeKernel.DefaultKernelName = subKernel.Name; var deferred = new SubmitCode("#!customDirective"); compositeKernel.DeferCommand(deferred); var events = compositeKernel.KernelEvents.ToSubscribedList(); await compositeKernel.SendAsync(new SubmitCode("var x = 1;", targetKernelName : subKernel.Name)); deferredCommandExecuted.Should().Be(true); events .Select(e => e.GetType()) .Should() .ContainInOrder( typeof(CodeSubmissionReceived), typeof(CompleteCodeSubmissionReceived), typeof(CommandSucceeded)); }
public async Task Directive_handlers_are_in_invoked_the_order_in_which_they_occur_in_the_code_submission() { var kernel = new CSharpKernel(); var events = kernel.KernelEvents.ToSubscribedList(); kernel.AddDirective(new Command("#increment") { Handler = CommandHandler.Create(async(KernelInvocationContext context) => { await context.HandlingKernel.SubmitCodeAsync("i++;"); }) }); await kernel.SubmitCodeAsync(@" var i = 0; #increment i"); events.OfType <ReturnValueProduced>() .Single() .Value .Should() .Be(1); }
public async Task Directives_can_display_help(string kernelName) { var cSharpKernel = new CSharpKernel().UseDefaultMagicCommands(); using var compositeKernel = new CompositeKernel { cSharpKernel }; var command = new Command("#!hello") { new Option <bool>("--loudness") }; var kernel = compositeKernel.FindKernel(kernelName); kernel.AddDirective(command); using var events = compositeKernel.KernelEvents.ToSubscribedList(); await compositeKernel.SubmitCodeAsync("#!hello -h"); events.Should() .ContainSingle <StandardOutputValueProduced>() .Which .FormattedValues .Should() .ContainSingle(v => v.MimeType == PlainTextFormatter.MimeType) .Which .Value .Should() .ContainAll("Usage", "#!hello", "[options]", "--loudness"); events.Should() .NotContainErrors(); }
public async Task The_generated_source_code_can_be_displayed() { var kernel = new CSharpKernel() .UseNugetDirective(); await new DataFrameTypeGeneratorExtension().OnLoadAsync(kernel); await kernel.SubmitCodeAsync($@" #r ""{typeof(DataFrame).Assembly.Location}"" using Microsoft.Data.Analysis; "); await kernel.SetVariableAsync("frame", CreateDataFrame()); var result = await kernel.SubmitCodeAsync("#!linqify frame --show-code"); result.KernelEvents .ToSubscribedList() .Should() .NotContainErrors(); result.KernelEvents .ToSubscribedList() .Should() .ContainSingle <DisplayedValueProduced>() .Which .FormattedValues .Should() .ContainSingle() .Which .Value .Should() .ContainAll( "public class DataFrame_", "public System.String name => "); }
public void Child_kernels_are_disposed_when_CompositeKernel_is_disposed() { var csharpKernelWasDisposed = false; var fsharpKernelWasDisposed = false; var csharpKernel = new CSharpKernel(); csharpKernel.RegisterForDisposal(() => csharpKernelWasDisposed = true); var fsharpKernel = new FSharpKernel(); fsharpKernel.RegisterForDisposal(() => fsharpKernelWasDisposed = true); var compositeKernel = new CompositeKernel { csharpKernel, fsharpKernel }; compositeKernel.Dispose(); csharpKernelWasDisposed.Should().BeTrue(); fsharpKernelWasDisposed.Should().BeTrue(); }
private static async Task ConfigureJoystick(CSharpKernel csharpKernel) { await LoadAssemblyAndAddNamespace <LinuxJoystick>(csharpKernel); }
public static CSharpKernel UseWpf(this CSharpKernel kernel) { UseSolidColorBrushFormatter(); UseFrameworkElementFormatter(); return(kernel); }
private static async Task LoadAssemblyAndAddNamespace <T>(CSharpKernel csharpKernel) { await csharpKernel.SendAsync(new SubmitCode(@$ "#r " "{typeof(T).Assembly.Location}" " using {typeof(T).Namespace};")); }
public void ScriptState_is_not_null_prior_to_receiving_code_submissions() { using var kernel = new CSharpKernel(); kernel.ScriptState.Should().NotBeNull(); }
private static async Task AddNamespace(CSharpKernel csharpKernel, Type type) { await csharpKernel.SendAsync(new SubmitCode(@$ "using {type.Namespace};")); }
private static async Task ConfigureRover(CSharpKernel csharpKernel) { using var _ = Log.OnEnterAndExit(); await LoadAssemblyAndAddNamespace <RoverRobot>(csharpKernel); await LoadAssemblyAndAddNamespace <ResourceScanner>(csharpKernel); await AddNamespace(csharpKernel, typeof(ImageProcessing.ImageExtensions)); var roverBody = new RoverRobot(PiTop4Board.Instance.GetOrCreateExpansionPlate(), PiTop4Board.Instance.GetOrCreateCamera <StreamingCamera>(0), RoverRobotConfiguration.Default); var roverBrain = new RoverRobotStrategies(); var resourceScanner = new ResourceScanner(); roverBody.BlinkAllLights(); await csharpKernel.SetVariableAsync(nameof(roverBody), roverBody); await csharpKernel.SetVariableAsync(nameof(roverBrain), roverBrain); await csharpKernel.SetVariableAsync(nameof(resourceScanner), resourceScanner); var source = new CancellationTokenSource(); var robotLoop = Task.Run(() => { using var operation = Log.OnEnterAndExit("roverBrainLoop"); while (!source.IsCancellationRequested) { var localCancellationSource = new CancellationTokenSource(); if (!source.IsCancellationRequested && !localCancellationSource.IsCancellationRequested) { using var __ = operation.OnEnterAndExit("Perceive"); try { roverBrain.Perceive?.Invoke(roverBody, DateTime.Now, localCancellationSource.Token); } catch (Exception e) { __.Error(e); } } if (!source.IsCancellationRequested && !localCancellationSource.IsCancellationRequested) { var planResult = PlanningResult.NoPlan; using var ___ = operation.OnEnterAndExit("Plan"); try { planResult = roverBrain.Plan?.Invoke(roverBody, DateTime.Now, localCancellationSource.Token) ?? PlanningResult.NoPlan; } catch (Exception e) { ___.Error(e); planResult = PlanningResult.NoPlan; } if (!source.IsCancellationRequested && planResult != PlanningResult.NoPlan && !localCancellationSource.IsCancellationRequested) { using var ____ = operation.OnEnterAndExit("Act"); roverBrain.Act?.Invoke(roverBody, DateTime.Now, localCancellationSource.Token); } } } roverBody.MotionComponent.Stop(); }, source.Token); var reactLoop = Task.Run(() => { using var operation = Log.OnEnterAndExit("roverBrainReactLoop"); while (!source.IsCancellationRequested) { var localCancellationSource = new CancellationTokenSource(); if (!source.IsCancellationRequested && !localCancellationSource.IsCancellationRequested) { using var __ = operation.OnEnterAndExit("React"); try { roverBrain.React?.Invoke(roverBody, DateTime.Now, localCancellationSource.Token); } catch (Exception e) { __.Error(e); } } } roverBody.MotionComponent.Stop(); }, source.Token); csharpKernel.RegisterForDisposal(() => { source.Cancel(false); Task.WaitAll(new[] { robotLoop, reactLoop }, TimeSpan.FromSeconds(10)); roverBody.Dispose(); }); }
private static async Task ConfigureRover(CSharpKernel csharpKernel) { Microsoft.DotNet.Interactive.Formatting.Formatter.ListExpansionLimit = 42; using var _ = Log.OnEnterAndExit(); await LoadAssemblyAndAddNamespace <RoverRobot>(csharpKernel); await LoadAssemblyAndAddNamespace <ResourceScanner>(csharpKernel); await AddNamespace(csharpKernel, typeof(ImageProcessing.ImageExtensions)); var RoverBody = new RoverRobot(PiTop4Board.Instance.GetOrCreateExpansionPlate(), PiTop4Board.Instance.GetOrCreateCamera <StreamingCamera>(0), RoverRobotConfiguration.Default); var RoverBrain = new RoverRobotAgent(); var ResourceScanner = new ResourceScanner(); RoverBody.BlinkAllLights(); await csharpKernel.SetVariableAsync(nameof(RoverBody), RoverBody); await csharpKernel.SetVariableAsync(nameof(RoverBrain), RoverBrain); await csharpKernel.SetVariableAsync(nameof(ResourceScanner), ResourceScanner); var command = new Command("#!reset", "Reset RoverBody, RoverBrain and BrainState") { new Option <bool>("--body", description: "Resets the rover body"), new Option <bool>("--brain", description: "Resets the rover brain"), new Option <bool>("--state", description: "Resets the rover brain state"), new Option <bool>("--all", description: "Resets the entire rover"), }; command.Handler = CommandHandler.Create <bool, bool, bool, bool, KernelInvocationContext>(async(body, brain, state, all, context) => { if (body || brain || state || all) { var code = new StringBuilder(); var resetTarget = new List <string>(); if (brain || all) { code.AppendLine($"{nameof(RoverBrain)}.Reset();"); resetTarget.Add("brain"); } if (state || all) { code.AppendLine($"{nameof(RoverBrain)}.ClearState();"); resetTarget.Add("state"); } if (body || all) { code.AppendLine($"{nameof(RoverBody)}.Reset();"); resetTarget.Add("body"); } var value = context.Display($"Reset for {string.Join(", ", resetTarget)} in progress", PlainTextFormatter.MimeType); await csharpKernel.SendAsync(new SubmitCode(code.ToString())); value.Update($"Reset for {string.Join(", ", resetTarget)} done!"); } }); csharpKernel.AddDirective(command); var source = new CancellationTokenSource(); var robotLoop = Task.Run(() => { using var operation = Log.OnEnterAndExit("roverBrainLoop"); while (!source.IsCancellationRequested) { if (!source.IsCancellationRequested) { using var __ = operation.OnEnterAndExit("Perceive"); try { RoverBrain.Perceive(); } catch (Exception e) { __.Error(e); } } if (!source.IsCancellationRequested) { var planResult = PlanningResult.NoPlan; using var ___ = operation.OnEnterAndExit("Plan"); try { planResult = RoverBrain.Plan(); } catch (Exception e) { ___.Error(e); planResult = PlanningResult.NoPlan; } if (!source.IsCancellationRequested && planResult != PlanningResult.NoPlan) { using var ____ = operation.OnEnterAndExit("Act"); RoverBrain.Act(); } } } RoverBody.MotionComponent.Stop(); }, source.Token); var reactLoop = Task.Run(() => { using var operation = Log.OnEnterAndExit("roverBrainReactLoop"); while (!source.IsCancellationRequested) { if (!source.IsCancellationRequested) { using var __ = operation.OnEnterAndExit("React"); try { RoverBrain.React(); } catch (Exception e) { __.Error(e); } } } RoverBody.MotionComponent.Stop(); }, source.Token); csharpKernel.RegisterForDisposal(() => { source.Cancel(false); Task.WaitAll(new[] { robotLoop, reactLoop }, TimeSpan.FromSeconds(10)); RoverBody.Dispose(); }); }