public void TestPackages() { var engine = Init(); var snippets = engine.Snippets as Snippets; var pkgMagic = new PackageMagic(snippets.GlobalReferences); var channel = new MockChannel(); var response = pkgMagic.Execute("", channel); var result = response.Output as string[]; PrintResult(response, channel); Assert.AreEqual(ExecuteStatus.Ok, response.Status); Assert.AreEqual(0, channel.msgs.Count); Assert.IsNotNull(result); Assert.AreEqual(1, result.Length); // Try compiling TrotterEstimateEnergy, it should fail due to the lack // of chemistry package. response = engine.ExecuteMundane(SNIPPETS.TrotterEstimateEnergy, channel); PrintResult(response, channel); Assert.AreEqual(ExecuteStatus.Error, response.Status); response = pkgMagic.Execute("microsoft.quantum.chemistry", channel); result = response.Output as string[]; PrintResult(response, channel); Assert.AreEqual(ExecuteStatus.Ok, response.Status); Assert.AreEqual(0, channel.msgs.Count); Assert.IsNotNull(result); Assert.AreEqual(2, result.Length); // Now it should compile: AssertCompile(engine, SNIPPETS.TrotterEstimateEnergy, "TrotterEstimateEnergy"); }
public async Task ReportWarnings() { var engine = await Init(); { var channel = new MockChannel(); var response = await engine.ExecuteMundane(SNIPPETS.ThreeWarnings, channel); PrintResult(response, channel); response.AssertIsOk(); Assert.AreEqual(3, channel.msgs.Count); Assert.AreEqual(0, channel.errors.Count); Assert.AreEqual("ThreeWarnings", new ListToTextResultEncoder().Encode(response.Output)?.Data ); } { var channel = new MockChannel(); var response = await engine.ExecuteMundane(SNIPPETS.OneWarning, channel); PrintResult(response, channel); response.AssertIsOk(); Assert.AreEqual(1, channel.msgs.Count); Assert.AreEqual(0, channel.errors.Count); Assert.AreEqual("OneWarning", new ListToTextResultEncoder().Encode(response.Output)?.Data ); } }
public async Task TestDebugMagicCancel() { var engine = Init(); await AssertCompile(engine, SNIPPETS.SimpleDebugOperation, "SimpleDebugOperation"); var configSource = new ConfigurationSource(skipLoading: true); var debugMagic = new DebugMagic(engine.SymbolsResolver, configSource, engine.ShellRouter, engine.ShellServer, null); // Start a debug session var channel = new MockChannel(); var cts = new CancellationTokenSource(); var debugTask = debugMagic.RunAsync("SimpleDebugOperation", channel, cts.Token); // Cancel the session cts.Cancel(); // Ensure that the task throws an exception Assert.ThrowsException <AggregateException>(() => debugTask.Wait()); // Ensure that expected messages were sent Assert.AreEqual("iqsharp_debug_sessionstart", channel.iopubMessages[0].Header.MessageType); Assert.AreEqual("iqsharp_debug_sessionend", channel.iopubMessages[1].Header.MessageType); Assert.IsTrue(channel.msgs[0].Contains("Starting debug session")); Assert.IsTrue(channel.msgs[1].Contains("Finished debug session")); }
public static async Task <string?> AssertNoisySimulate(IQSharpEngine engine, string snippetName, NoiseModel?noiseModel, params string[] messages) { await engine.Initialized; var configSource = new ConfigurationSource(skipLoading: true); var noiseModelSource = new NoiseModelSource(); if (noiseModel != null) { noiseModelSource.NoiseModel = noiseModel; } var simMagic = new SimulateNoiseMagic( engine, resolver: engine.SymbolsResolver !, configurationSource: configSource, logger: new UnitTestLogger <SimulateNoiseMagic>(), noiseModelSource: noiseModelSource ); var channel = new MockChannel(); var response = await simMagic.Execute(snippetName, channel); PrintResult(response, channel); response.AssertIsOk(); CollectionAssert.AreEqual(messages.Select(ChannelWithNewLines.Format).ToArray(), channel.msgs.ToArray()); return(response.Output?.ToString()); }
public void TestWorkspace() { var engine = Init("Workspace.Chemistry"); var snippets = engine.Snippets as Snippets; var wsMagic = new WorkspaceMagic(snippets.Workspace); var pkgMagic = new PackageMagic(snippets.GlobalReferences); var channel = new MockChannel(); var result = new string[0]; // Check the workspace, it should be in error state: var response = wsMagic.Execute("reload", channel); PrintResult(response, channel); Assert.AreEqual(ExecuteStatus.Error, response.Status); response = wsMagic.Execute("", channel); PrintResult(response, channel); Assert.AreEqual(ExecuteStatus.Error, response.Status); // Try compiling a snippet that depends on a workspace that depends on the chemistry package: response = engine.ExecuteMundane(SNIPPETS.DependsOnChemistryWorkspace, channel); PrintResult(response, channel); Assert.AreEqual(ExecuteStatus.Error, response.Status); Assert.AreEqual(0, channel.msgs.Count); // Add dependencies: response = pkgMagic.Execute("microsoft.quantum.chemistry", channel); PrintResult(response, channel); Assert.AreEqual(ExecuteStatus.Ok, response.Status); response = pkgMagic.Execute("microsoft.quantum.research", channel); PrintResult(response, channel); Assert.AreEqual(ExecuteStatus.Ok, response.Status); // Reload workspace: response = wsMagic.Execute("reload", channel); PrintResult(response, channel); Assert.AreEqual(ExecuteStatus.Ok, response.Status); response = wsMagic.Execute("", channel); result = response.Output as string[]; PrintResult(response, channel); Assert.AreEqual(ExecuteStatus.Ok, response.Status); Assert.AreEqual(3, result.Length); // Now compilation must work: AssertCompile(engine, SNIPPETS.DependsOnChemistryWorkspace, "DependsOnChemistryWorkspace"); // Check an invalid command response = wsMagic.Execute("foo", channel); PrintResult(response, channel); Assert.AreEqual(ExecuteStatus.Error, response.Status); // Check that everything still works: response = wsMagic.Execute("", channel); PrintResult(response, channel); Assert.AreEqual(ExecuteStatus.Ok, response.Status); }
public void Estimate() { var engine = Init(); var channel = new MockChannel(); // Compile it: AssertCompile(engine, SNIPPETS.HelloQ, "HelloQ"); // Try running again: AssertEstimate(engine, "HelloQ"); }
public static async Task <string?> AssertCompile(IQSharpEngine engine, string source, params string[] expectedOps) { var channel = new MockChannel(); var response = await engine.ExecuteMundane(source, channel); PrintResult(response, channel); Assert.AreEqual(ExecuteStatus.Ok, response.Status); CollectionAssert.AreEquivalent(expectedOps, response.Output as string[]); return(response.Output?.ToString()); }
public async Task NoisySimulateWithTrivialOperation() { var engine = await Init(); var channel = new MockChannel(); // Compile it: await AssertCompile(engine, SNIPPETS.HelloQ, "HelloQ"); // Try running again: await AssertNoisySimulate(engine, "HelloQ", noiseModel : null, "Hello from quantum world!"); }
public async Task ReportErrors() { var engine = await Init(); var channel = new MockChannel(); var response = await engine.ExecuteMundane(SNIPPETS.TwoErrors, channel); PrintResult(response, channel); Assert.AreEqual(ExecuteStatus.Error, response.Status); Assert.AreEqual(0, channel.msgs.Count); Assert.AreEqual(2, channel.errors.Count); }
public static string AssertSimulate(IQSharpEngine engine, string snippetName, params string[] messages) { var simMagic = new SimulateMagic(engine.SymbolsResolver); var channel = new MockChannel(); var response = simMagic.Execute(snippetName, channel); PrintResult(response, channel); Assert.AreEqual(ExecuteStatus.Ok, response.Status); CollectionAssert.AreEqual(messages.Select(ChannelWithNewLines.Format).ToArray(), channel.msgs.ToArray()); return(response.Output?.ToString()); }
public async Task Estimate() { var engine = await Init(); var channel = new MockChannel(); // Compile it: await AssertCompile(engine, SNIPPETS.HelloQ, "HelloQ"); // Try running again: await AssertEstimate(engine, "HelloQ"); }
public async Task NoisySimulateWithTwoQubitOperation() { var engine = await Init(); var channel = new MockChannel(); // Compile it: await AssertCompile(engine, SNIPPETS.SimpleDebugOperation, "SimpleDebugOperation"); // Try running again: // Note that noiseModel: null sets the noise model to be ideal. await AssertNoisySimulate(engine, "SimpleDebugOperation", noiseModel : null); }
public async Task NoisySimulateWithFailIfOne() { var engine = await Init(); var channel = new MockChannel(); // Compile it: await AssertCompile(engine, SNIPPETS.FailIfOne, "FailIfOne"); // Try running again: // Note that noiseModel: null sets the noise model to be ideal. await AssertNoisySimulate(engine, "FailIfOne", noiseModel : null); }
public async Task TestProjectMagic() { var engine = Init(); var snippets = engine.Snippets as Snippets; var projectMagic = new ProjectMagic(snippets.Workspace); var channel = new MockChannel(); var response = await projectMagic.Execute("../Workspace.ProjectReferences/Workspace.ProjectReferences.csproj", channel); Assert.AreEqual(ExecuteStatus.Ok, response.Status); var loadedProjectFiles = response.Output as string[]; Assert.AreEqual(3, loadedProjectFiles.Length); }
private async Task AssertTrace(string name, ExecutionPath expectedPath, int expectedDepth) { var engine = await Init("Workspace.ExecutionPathTracer"); var snippets = engine.Snippets as Snippets; Assert.IsNotNull(snippets); Assert.IsNotNull(engine.SymbolsResolver); var configSource = new ConfigurationSource(skipLoading: true); var wsMagic = new WorkspaceMagic(snippets !.Workspace, new UnitTestLogger <WorkspaceMagic>()); var pkgMagic = new PackageMagic(snippets.GlobalReferences, new UnitTestLogger <PackageMagic>()); var traceMagic = new TraceMagic(engine.SymbolsResolver !, configSource, new UnitTestLogger <TraceMagic>()); var channel = new MockChannel(); // Add dependencies: var response = await pkgMagic.Execute("mock.standard", channel); PrintResult(response, channel); response.AssertIsOk(); // Reload workspace: response = await wsMagic.Execute("reload", channel); PrintResult(response, channel); response.AssertIsOk(); response = await traceMagic.Execute(name, channel); PrintResult(response, channel); response.AssertIsOk(); var message = channel.iopubMessages.ElementAtOrDefault(0); Assert.IsNotNull(message); Assert.AreEqual("render_execution_path", message.Header.MessageType); var content = message.Content as ExecutionPathVisualizerContent; Assert.IsNotNull(content); Assert.AreEqual(expectedDepth, content?.RenderDepth); var path = content?.ExecutionPath.ToObject <ExecutionPath>(); Assert.IsNotNull(path); Assert.AreEqual(expectedPath.ToJson(), path !.ToJson()); }
public static async Task <string?> AssertSimulate(IQSharpEngine engine, string snippetName, params string[] messages) { await engine.Initialized; var configSource = new ConfigurationSource(skipLoading: true); var simMagic = new SimulateMagic(engine.SymbolsResolver !, configSource, new UnitTestLogger <SimulateMagic>()); var channel = new MockChannel(); var response = await simMagic.Execute(snippetName, channel); PrintResult(response, channel); Assert.AreEqual(ExecuteStatus.Ok, response.Status); CollectionAssert.AreEqual(messages.Select(ChannelWithNewLines.Format).ToArray(), channel.msgs.ToArray()); return(response.Output?.ToString()); }
public void TestInvalidPackages() { var engine = Init(); var snippets = engine.Snippets as Snippets; var pkgMagic = new PackageMagic(snippets.GlobalReferences); var channel = new MockChannel(); var response = pkgMagic.Execute("microsoft.quantum", channel); var result = response.Output as string[]; PrintResult(response, channel); Assert.AreEqual(ExecuteStatus.Error, response.Status); Assert.AreEqual(1, channel.errors.Count); Assert.IsTrue(channel.errors[0].StartsWith("Unable to find package 'microsoft.quantum'")); Assert.IsNull(result); }
public static void PrintResult(ExecutionResult result, MockChannel channel) { Console.WriteLine("Result:"); Console.WriteLine(JsonConvert.SerializeObject(result)); Console.WriteLine("Errors:"); foreach (var m in channel.errors) { Console.WriteLine($" {m}"); } Console.WriteLine("Messages:"); foreach (var m in channel.msgs) { Console.WriteLine($" {m}"); } }
public static string AssertEstimate(IQSharpEngine engine, string snippetName, params string[] messages) { var channel = new MockChannel(); var estimateMagic = new EstimateMagic(engine.SymbolsResolver); var response = estimateMagic.Execute(snippetName, channel); var result = response.Output as Dictionary <string, double>; PrintResult(response, channel); Assert.AreEqual(ExecuteStatus.Ok, response.Status); Assert.IsNotNull(result); Assert.AreEqual(8, result.Count); CollectionAssert.Contains(result.Keys, "T"); CollectionAssert.Contains(result.Keys, "CNOT"); CollectionAssert.AreEqual(messages.Select(ChannelWithNewLines.Format).ToArray(), channel.msgs.ToArray()); return(response.Output?.ToString()); }
public async Task TestProjectMagic() { var engine = await Init(); var snippets = engine.Snippets as Snippets; Assert.IsNotNull(snippets); var projectMagic = new ProjectMagic(snippets !.Workspace, new UnitTestLogger <ProjectMagic>()); var channel = new MockChannel(); var response = await projectMagic.Execute("../Workspace.ProjectReferences/Workspace.ProjectReferences.csproj", channel); response.AssertIsOk(); var loadedProjectFiles = response.Output as string[]; Assert.AreEqual(3, loadedProjectFiles?.Length); }
public void Toffoli() { var engine = Init(); var channel = new MockChannel(); // Compile it: AssertCompile(engine, SNIPPETS.HelloQ, "HelloQ"); // Run with toffoli simulator: var toffoliMagic = new ToffoliMagic(engine.SymbolsResolver); var response = toffoliMagic.Execute("HelloQ", channel); var result = response.Output as Dictionary <string, double>; PrintResult(response, channel); Assert.AreEqual(ExecuteStatus.Ok, response.Status); Assert.AreEqual(1, channel.msgs.Count); Assert.AreEqual(ChannelWithNewLines.Format("Hello from quantum world!"), channel.msgs[0]); }
public void TestWho() { var snippets = Startup.Create <Snippets>("Workspace"); snippets.Compile(SNIPPETS.HelloQ); var whoMagic = new WhoMagic(snippets); var channel = new MockChannel(); // Check the workspace, it should be in error state: var response = whoMagic.Execute("", channel); var result = response.Output as string[]; PrintResult(response, channel); Assert.AreEqual(ExecuteStatus.Ok, response.Status); Assert.AreEqual(5, result.Length); Assert.AreEqual("HelloQ", result[0]); Assert.AreEqual("Tests.qss.NoOp", result[4]); }
public async Task TestDebugMagicCancel() { var engine = await Init(); // Since Init guarantees that engine services have started, we // assert non-nullness here. Assert.IsNotNull(engine.SymbolsResolver); await AssertCompile(engine, SNIPPETS.SimpleDebugOperation, "SimpleDebugOperation"); var configSource = new ConfigurationSource(skipLoading: true); // We asserted that SymbolsResolver is not null above, and can use // the null-forgiving operator here as a result. var debugMagic = new DebugMagic(engine.SymbolsResolver !, configSource, engine.ShellRouter, engine.ShellServer, null); // Start a debug session var channel = new MockChannel(); var cts = new CancellationTokenSource(); var debugTask = debugMagic.RunAsync("SimpleDebugOperation", channel, cts.Token); // Cancel the session cts.Cancel(); // Ensure that the task throws an exception Assert.ThrowsException <AggregateException>(() => debugTask.Wait()); // Ensure that expected messages were sent try { Assert.AreEqual("iqsharp_debug_sessionstart", channel.iopubMessages[0].Header.MessageType); Assert.AreEqual("iqsharp_debug_sessionend", channel.iopubMessages[1].Header.MessageType); } catch (AssertFailedException ex) { await Console.Error.WriteLineAsync( "IOPub messages sent by %debug were incorrect.\nReceived messages:\n" + SessionAsString(channel.iopubMessages) ); throw ex; } Assert.IsTrue(channel.msgs[0].Contains("Starting debug session")); Assert.IsTrue(channel.msgs[1].Contains("Finished debug session")); }
public async Task TestPackages() { var engine = await Init(); var snippets = engine.Snippets as Snippets; Assert.IsNotNull(snippets); var pkgMagic = new PackageMagic(snippets !.GlobalReferences, new UnitTestLogger <PackageMagic>()); var references = ((References)pkgMagic.References); var packageCount = references.AutoLoadPackages.Count; var channel = new MockChannel(); var response = await pkgMagic.Execute("", channel); var result = response.Output as string[]; PrintResult(response, channel); response.AssertIsOk(); Assert.AreEqual(0, channel.msgs.Count); Assert.AreEqual(packageCount, result?.Length); Assert.AreEqual("Microsoft.Quantum.Standard::0.0.0", result?[0]); Assert.AreEqual("Microsoft.Quantum.Standard.Visualization::0.0.0", result?[1]); // Try compiling TrotterEstimateEnergy, it should fail due to the lack // of chemistry package. response = await engine.ExecuteMundane(SNIPPETS.UseJordanWignerEncodingData, channel); PrintResult(response, channel); Assert.AreEqual(ExecuteStatus.Error, response.Status); response = await pkgMagic.Execute("mock.chemistry", channel); result = response.Output as string[]; PrintResult(response, channel); response.AssertIsOk(); Assert.AreEqual(0, channel.msgs.Count); Assert.IsNotNull(result); Assert.AreEqual(packageCount + 1, result?.Length); // Now it should compile: await AssertCompile(engine, SNIPPETS.UseJordanWignerEncodingData, "UseJordanWignerEncodingData"); }
public static async Task <string> AssertEstimate(IQSharpEngine engine, string snippetName, params string[] messages) { var channel = new MockChannel(); var estimateMagic = new EstimateMagic(engine.SymbolsResolver); var response = await estimateMagic.Execute(snippetName, channel); var result = response.Output as DataTable; PrintResult(response, channel); Assert.AreEqual(ExecuteStatus.Ok, response.Status); Assert.IsNotNull(result); Assert.AreEqual(8, result.Rows.Count); var keys = result.Rows.Cast <DataRow>().Select(row => row.ItemArray[0]).ToList(); CollectionAssert.Contains(keys, "T"); CollectionAssert.Contains(keys, "CNOT"); CollectionAssert.AreEqual(messages.Select(ChannelWithNewLines.Format).ToArray(), channel.msgs.ToArray()); return(response.Output?.ToString()); }
public async Task TestWho() { var snippets = Startup.Create <Snippets>("Workspace"); await snippets.Workspace.Initialization; snippets.Compile(SNIPPETS.HelloQ); var whoMagic = new WhoMagic(snippets, new UnitTestLogger <WhoMagic>()); var channel = new MockChannel(); // Check the workspace, it should be in error state: var response = await whoMagic.Execute("", channel); var result = response.Output as string[]; PrintResult(response, channel); response.AssertIsOk(); Assert.AreEqual(6, result?.Length); Assert.AreEqual("HelloQ", result?[0]); Assert.AreEqual("Tests.qss.NoOp", result?[4]); }
public void CompileAndSimulate() { var engine = Init(); var simMagic = new SimulateMagic(engine.SymbolsResolver); var channel = new MockChannel(); // Try running without compiling it, fails: var response = simMagic.Execute("_snippet_.HelloQ", channel); PrintResult(response, channel); Assert.AreEqual(ExecuteStatus.Error, response.Status); Assert.AreEqual(0, channel.msgs.Count); Assert.AreEqual(1, channel.errors.Count); Assert.AreEqual(ChannelWithNewLines.Format($"Invalid operation name: _snippet_.HelloQ"), channel.errors[0]); // Compile it: AssertCompile(engine, SNIPPETS.HelloQ, "HelloQ"); // Try running again: AssertSimulate(engine, "HelloQ", "Hello from quantum world!"); }
public async Task Toffoli() { var engine = await Init(); var channel = new MockChannel(); Assert.IsNotNull(engine.SymbolsResolver); // Compile it: await AssertCompile(engine, SNIPPETS.HelloQ, "HelloQ"); // Run with toffoli simulator: var toffoliMagic = new ToffoliMagic(engine.SymbolsResolver !, new UnitTestLogger <ToffoliMagic>()); var response = await toffoliMagic.Execute("HelloQ", channel); var result = response.Output as Dictionary <string, double>; PrintResult(response, channel); response.AssertIsOk(); Assert.AreEqual(1, channel.msgs.Count); Assert.AreEqual(ChannelWithNewLines.Format("Hello from quantum world!"), channel.msgs[0]); }
public async Task CompileAndSimulate() { var engine = await Init(); Assert.IsNotNull(engine.SymbolsResolver); var configSource = new ConfigurationSource(skipLoading: true); var simMagic = new SimulateMagic(engine.SymbolsResolver !, configSource, new PerformanceMonitor(), new UnitTestLogger <SimulateMagic>()); var channel = new MockChannel(); // Try running without compiling it, fails: var response = await simMagic.Execute("_snippet_.HelloQ", channel); PrintResult(response, channel); Assert.AreEqual(ExecuteStatus.Error, response.Status); Assert.AreEqual(0, channel.msgs.Count); Assert.AreEqual(1, channel.errors.Count); Assert.AreEqual(ChannelWithNewLines.Format($"Invalid operation name: _snippet_.HelloQ"), channel.errors[0]); // Compile it: await AssertCompile(engine, SNIPPETS.HelloQ, "HelloQ"); // Try running again: await AssertSimulate(engine, "HelloQ", "Hello from quantum world!"); }
public void ReportWarnings() { var engine = Init(); { var channel = new MockChannel(); var response = engine.ExecuteMundane(SNIPPETS.ThreeWarnings, channel); PrintResult(response, channel); Assert.AreEqual(ExecuteStatus.Ok, response.Status); Assert.AreEqual(3, channel.msgs.Count); Assert.AreEqual(0, channel.errors.Count); Assert.AreEqual("ThreeWarnings", new ListToTextResultEncoder().Encode(response.Output).Value.Data); } { var channel = new MockChannel(); var response = engine.ExecuteMundane(SNIPPETS.OneWarning, channel); PrintResult(response, channel); Assert.AreEqual(ExecuteStatus.Ok, response.Status); Assert.AreEqual(1, channel.msgs.Count); Assert.AreEqual(0, channel.errors.Count); Assert.AreEqual("OneWarning", new ListToTextResultEncoder().Encode(response.Output).Value.Data); } }