예제 #1
0
        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));
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
0
        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));
        }
예제 #6
0
        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));
        }
예제 #8
0
        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);
        }
예제 #9
0
        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 => ");
        }
예제 #11
0
        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();
        }
예제 #12
0
 private static async Task ConfigureJoystick(CSharpKernel csharpKernel)
 {
     await LoadAssemblyAndAddNamespace <LinuxJoystick>(csharpKernel);
 }
예제 #13
0
 public static CSharpKernel UseWpf(this CSharpKernel kernel)
 {
     UseSolidColorBrushFormatter();
     UseFrameworkElementFormatter();
     return(kernel);
 }
예제 #14
0
        private static async Task LoadAssemblyAndAddNamespace <T>(CSharpKernel csharpKernel)
        {
            await csharpKernel.SendAsync(new SubmitCode(@$ "#r " "{typeof(T).Assembly.Location}" "
using {typeof(T).Namespace};"));
        }
예제 #15
0
        public void ScriptState_is_not_null_prior_to_receiving_code_submissions()
        {
            using var kernel = new CSharpKernel();

            kernel.ScriptState.Should().NotBeNull();
        }
예제 #16
0
 private static async Task AddNamespace(CSharpKernel csharpKernel, Type type)
 {
     await csharpKernel.SendAsync(new SubmitCode(@$ "using {type.Namespace};"));
 }
예제 #17
0
        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();
            });
        }
예제 #18
0
        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();
            });
        }