public void When_command_type_registered_then_kernel_registers_envelope_type_for_serialization(bool withHandler) { KernelCommandEnvelope.RegisterDefaults(); using var kernel = new FakeKernel(); if (withHandler) { kernel.RegisterCommandHandler <CustomCommandTypes.FirstSubmission.MyCommand>( (_, _) => Task.CompletedTask); } else { kernel.RegisterCommandType <CustomCommandTypes.FirstSubmission.MyCommand>(); } var originalCommand = new CustomCommandTypes.FirstSubmission.MyCommand("xyzzy"); string envelopeJson = KernelCommandEnvelope.Serialize(originalCommand); var roundTrippedCommandEnvelope = KernelCommandEnvelope.Deserialize(envelopeJson); roundTrippedCommandEnvelope .Command .Should() .BeOfType <CustomCommandTypes.FirstSubmission.MyCommand>() .Which .Info .Should() .Be(originalCommand.Info); }
public void When_command_type_reregistered_with_changed_type_command_then_kernel_registers_updated_envelope_type_for_serialization(bool withHandler) { // Notebook authors should be able to develop their custom commands experimentally and progressively, // so we don't want any "you have to restart your kernel now" situations just because you already // called RegisterCommandHandler once for a particular command type. KernelCommandEnvelope.RegisterDefaults(); using var kernel = new FakeKernel(); if (withHandler) { kernel.RegisterCommandHandler <CustomCommandTypes.FirstSubmission.MyCommand>( (_, _) => Task.CompletedTask); kernel.RegisterCommandHandler <CustomCommandTypes.SecondSubmission.MyCommand>( (_, _) => Task.CompletedTask); } else { kernel.RegisterCommandType <CustomCommandTypes.FirstSubmission.MyCommand>(); kernel.RegisterCommandType <CustomCommandTypes.SecondSubmission.MyCommand>(); } var originalCommand = new CustomCommandTypes.SecondSubmission.MyCommand("xyzzy", 42); string envelopeJson = KernelCommandEnvelope.Serialize(originalCommand); var roundTrippedCommandEnvelope = KernelCommandEnvelope.Deserialize(envelopeJson); roundTrippedCommandEnvelope .Command .Should() .BeOfType <CustomCommandTypes.SecondSubmission.MyCommand>() .Which .Info .Should() .Be(originalCommand.Info); roundTrippedCommandEnvelope .Command .As <CustomCommandTypes.SecondSubmission.MyCommand>() .AdditionalProperty .Should() .Be(originalCommand.AdditionalProperty); }
public async Task Kernel_info_returns_the_list_of_dynamic_kernel_commands() { using var kernel = new FakeKernel(); kernel.RegisterCommandHandler <RequestHoverText>((_, _) => Task.CompletedTask); kernel.RegisterCommandHandler <RequestDiagnostics>((_, _) => Task.CompletedTask); kernel.RegisterCommandHandler <CustomCommandTypes.FirstSubmission.MyCommand>((_, _) => Task.CompletedTask); var result = await kernel.SendAsync(new RequestKernelInfo()); var events = result.KernelEvents.ToSubscribedList(); events.Should() .ContainSingle <KernelInfoProduced>() .Which .KernelInfo .SupportedKernelCommands .Select(c => c.Name) .Should() .Contain( nameof(RequestHoverText), nameof(RequestDiagnostics), nameof(CustomCommandTypes.FirstSubmission.MyCommand)); }
protected async Task <CompositeKernel> CreateKernel(LessonMode mode, HttpClient?httpClient = null) { var vscodeKernel = new FakeKernel("vscode"); vscodeKernel.RegisterCommandHandler <SendEditableCode>((_, _) => Task.CompletedTask); var kernel = new CompositeKernel { new CSharpKernel().UseNugetDirective().UseKernelHelpers(), vscodeKernel }; Lesson.Mode = mode; await Main.OnLoadAsync(kernel, httpClient); return(kernel); }