From 7ea506e485485a025eb79f24135a7fc9ef1fd73a Mon Sep 17 00:00:00 2001 From: Bettina Heim Date: Tue, 21 Apr 2020 21:45:17 -0700 Subject: [PATCH 1/3] adding an execution test --- .gitignore | 1 + Simulation.sln | 22 ++++++++ src/Simulation/Simulators.Tests/CoreTests.cs | 54 ++++++++++++------- .../TestProjects/QsharpExe/Main.qs | 16 ++++++ .../TestProjects/QsharpExe/QsharpExe.csproj | 40 ++++++++++++++ ...osoft.Quantum.Simulation.Simulators.csproj | 24 ++++++++- 6 files changed, 137 insertions(+), 20 deletions(-) create mode 100644 src/Simulation/Simulators.Tests/TestProjects/QsharpExe/Main.qs create mode 100644 src/Simulation/Simulators.Tests/TestProjects/QsharpExe/QsharpExe.csproj diff --git a/.gitignore b/.gitignore index 9f77ea53d20..7cffa506f2b 100644 --- a/.gitignore +++ b/.gitignore @@ -329,3 +329,4 @@ ASALocalRun/ # MFractors (Xamarin productivity tool) working folder .mfractor/ +/src/Simulation/Simulators.Tests/TestProjects/QsharpExe/built diff --git a/Simulation.sln b/Simulation.sln index ce58ef86a2b..c5a58260186 100644 --- a/Simulation.sln +++ b/Simulation.sln @@ -35,6 +35,10 @@ Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Tests.RoslynWrapper", "src\ EndProject Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Microsoft.Quantum.CsharpGeneration", "src\Simulation\CsharpGeneration\Microsoft.Quantum.CsharpGeneration.fsproj", "{B96E97F4-2DC8-45AC-ADF5-861D0D3073FC}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TestProjects", "TestProjects", "{09C842CB-930C-4C7D-AD5F-E30DE4A55820}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "QsharpExe", "src\Simulation\Simulators.Tests\TestProjects\QsharpExe\QsharpExe.csproj", "{2F5796A7-4AF8-4B78-928A-0A3A80752F9D}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -239,6 +243,22 @@ Global {B96E97F4-2DC8-45AC-ADF5-861D0D3073FC}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU {B96E97F4-2DC8-45AC-ADF5-861D0D3073FC}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU {B96E97F4-2DC8-45AC-ADF5-861D0D3073FC}.RelWithDebInfo|x64.Build.0 = Release|Any CPU + {2F5796A7-4AF8-4B78-928A-0A3A80752F9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2F5796A7-4AF8-4B78-928A-0A3A80752F9D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2F5796A7-4AF8-4B78-928A-0A3A80752F9D}.Debug|x64.ActiveCfg = Debug|Any CPU + {2F5796A7-4AF8-4B78-928A-0A3A80752F9D}.Debug|x64.Build.0 = Debug|Any CPU + {2F5796A7-4AF8-4B78-928A-0A3A80752F9D}.MinSizeRel|Any CPU.ActiveCfg = Debug|Any CPU + {2F5796A7-4AF8-4B78-928A-0A3A80752F9D}.MinSizeRel|Any CPU.Build.0 = Debug|Any CPU + {2F5796A7-4AF8-4B78-928A-0A3A80752F9D}.MinSizeRel|x64.ActiveCfg = Debug|Any CPU + {2F5796A7-4AF8-4B78-928A-0A3A80752F9D}.MinSizeRel|x64.Build.0 = Debug|Any CPU + {2F5796A7-4AF8-4B78-928A-0A3A80752F9D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2F5796A7-4AF8-4B78-928A-0A3A80752F9D}.Release|Any CPU.Build.0 = Release|Any CPU + {2F5796A7-4AF8-4B78-928A-0A3A80752F9D}.Release|x64.ActiveCfg = Release|Any CPU + {2F5796A7-4AF8-4B78-928A-0A3A80752F9D}.Release|x64.Build.0 = Release|Any CPU + {2F5796A7-4AF8-4B78-928A-0A3A80752F9D}.RelWithDebInfo|Any CPU.ActiveCfg = Release|Any CPU + {2F5796A7-4AF8-4B78-928A-0A3A80752F9D}.RelWithDebInfo|Any CPU.Build.0 = Release|Any CPU + {2F5796A7-4AF8-4B78-928A-0A3A80752F9D}.RelWithDebInfo|x64.ActiveCfg = Release|Any CPU + {2F5796A7-4AF8-4B78-928A-0A3A80752F9D}.RelWithDebInfo|x64.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -256,6 +276,8 @@ Global {618FBF9D-4EF3-435D-9728-81C726236668} = {A567C185-A429-418B-AFDE-6F1785BA4A77} {48206BD6-48DD-4442-A395-3A6594E4C9C6} = {A567C185-A429-418B-AFDE-6F1785BA4A77} {B96E97F4-2DC8-45AC-ADF5-861D0D3073FC} = {A567C185-A429-418B-AFDE-6F1785BA4A77} + {09C842CB-930C-4C7D-AD5F-E30DE4A55820} = {34D419E9-CCF1-4E48-9FA4-3AD4B86BEEB4} + {2F5796A7-4AF8-4B78-928A-0A3A80752F9D} = {09C842CB-930C-4C7D-AD5F-E30DE4A55820} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {929C0464-86D8-4F70-8835-0A5EAF930821} diff --git a/src/Simulation/Simulators.Tests/CoreTests.cs b/src/Simulation/Simulators.Tests/CoreTests.cs index 15e45c68ccc..9ecd4c38982 100644 --- a/src/Simulation/Simulators.Tests/CoreTests.cs +++ b/src/Simulation/Simulators.Tests/CoreTests.cs @@ -1,9 +1,12 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +using System; using System.Collections.Generic; using System.IO; - +using System.Reflection; +using System.Text; +using Microsoft.Quantum.QsCompiler; using Microsoft.Quantum.Simulation.Common; using Microsoft.Quantum.Simulation.Core; using Microsoft.Quantum.Simulation.Simulators.QCTraceSimulators; @@ -14,8 +17,6 @@ namespace Microsoft.Quantum.Simulation.Simulators.Tests { - using Helper = Microsoft.Quantum.Simulation.Simulators.Tests.OperationsTestHelper; - public class CoreTests { private readonly ITestOutputHelper output; @@ -25,10 +26,27 @@ public CoreTests(ITestOutputHelper output) this.output = output; } + [Fact] + public void BasicExecution() + { + var asmPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); + var exe = Path.Combine(asmPath, "TestExe", "QsharpExe.exe"); + + ProcessRunner.Run(exe, "", out StringBuilder output, out var _, out int exitCode, out Exception ex); + Assert.Null(ex); + Assert.Equal(1, exitCode); + Assert.Contains("NotImplementedException", output.ToString()); + + ProcessRunner.Run(exe, "--simulator QuantumSimulator", out output, out StringBuilder error, out exitCode, out ex); + Assert.Null(ex); + Assert.Equal(0, exitCode); + Assert.Empty(error.ToString().Trim()); + } + [Fact] public void Borrowing() { - Helper.RunWithMultipleSimulators((s) => + OperationsTestHelper.RunWithMultipleSimulators((s) => { var tracker = new StartTracker(s); @@ -44,18 +62,18 @@ public void Borrowing() BorrowingTest.Run(s).Wait(); - var tracer = Helper.GetTracer<(long, Qubit)>(s); + var tracer = Tests.OperationsTestHelper.GetTracer<(long, Qubit)>(s); - var testOne = new System.Action((callsCount, variant, info) => + var testOne = new System.Action((int callsCount, OperationFunctor variant, (int, Qubit) info) => { var (available, q) = info; Assert.Equal(callsCount, tracer.Log.GetNumberOfCalls(variant, (available, q))); }); - var testOneBody = new System.Action((callsCount, info) => testOne(callsCount, OperationFunctor.Body, info)); - var testOneAdjoint = new System.Action((callsCount, info) => testOne(callsCount, OperationFunctor.Adjoint, info)); - var testOneCtrl = new System.Action((callsCount, info) => testOne(callsCount, OperationFunctor.Controlled, info)); - var testOneCtrlAdj = new System.Action((callsCount, info) => testOne(callsCount, OperationFunctor.ControlledAdjoint, info)); + var testOneBody = new System.Action((int callsCount, (int, Qubit) info) => testOne(callsCount, OperationFunctor.Body, info)); + var testOneAdjoint = new System.Action((int callsCount, (int, Qubit) info) => testOne(callsCount, OperationFunctor.Adjoint, info)); + var testOneCtrl = new System.Action((int callsCount, (int, Qubit) info) => testOne(callsCount, OperationFunctor.Controlled, info)); + var testOneCtrlAdj = new System.Action((int callsCount, (int, Qubit) info) => testOne(callsCount, OperationFunctor.ControlledAdjoint, info)); testOneBody(6, (0, q5)); testOneBody(6, (0, q6)); @@ -180,7 +198,7 @@ void RunOne(IOperationFactory s) Assert.False(File.Exists("()")); } - Helper.RunWithMultipleSimulators((s) => RunOne(s as IOperationFactory)); + Tests.OperationsTestHelper.RunWithMultipleSimulators((s) => RunOne(s as IOperationFactory)); RunOne(new QCTraceSimulator()); RunOne(new ResourcesEstimator()); RunOne(new QuantumSimulator()); @@ -215,7 +233,7 @@ void RunOne(IOperationFactory s) } } - Helper.RunWithMultipleSimulators((s) => RunOne(s as IOperationFactory)); + Tests.OperationsTestHelper.RunWithMultipleSimulators((s) => RunOne(s as IOperationFactory)); RunOne(new QCTraceSimulator()); RunOne(new ResourcesEstimator()); } @@ -223,9 +241,9 @@ void RunOne(IOperationFactory s) [Fact] public void ZeroQubits() { - Helper.RunWithMultipleSimulators((s) => + Tests.OperationsTestHelper.RunWithMultipleSimulators((s) => { - var tracer = Helper.GetTracer(s); + var tracer = Tests.OperationsTestHelper.GetTracer(s); ZeroQubitsTest.Run(s).Wait(); @@ -236,7 +254,7 @@ public void ZeroQubits() [Fact] public void InterpolatedStrings() { - Helper.RunWithMultipleSimulators((s) => + Tests.OperationsTestHelper.RunWithMultipleSimulators((s) => { Circuits.InterpolatedStringTest.Run(s).Wait(); // Throws if it doesn't succeed }); @@ -245,7 +263,7 @@ public void InterpolatedStrings() [Fact] public void RandomOperation() { - Helper.RunWithMultipleSimulators((s) => + Tests.OperationsTestHelper.RunWithMultipleSimulators((s) => { Circuits.RandomOperationTest.Run(s).Wait(); // Throws if it doesn't succeed }); @@ -254,7 +272,7 @@ public void RandomOperation() [Fact] public void BigInts() { - Helper.RunWithMultipleSimulators((s) => + Tests.OperationsTestHelper.RunWithMultipleSimulators((s) => { Circuits.BigIntTest.Run(s).Wait(); // Throws if it doesn't succeed }); @@ -282,6 +300,6 @@ public void CatchFail() [Fact] public void InternalCallables() => - Helper.RunWithMultipleSimulators(s => Circuits.InternalCallablesTest.Run(s).Wait()); + Tests.OperationsTestHelper.RunWithMultipleSimulators(s => Circuits.InternalCallablesTest.Run(s).Wait()); } } diff --git a/src/Simulation/Simulators.Tests/TestProjects/QsharpExe/Main.qs b/src/Simulation/Simulators.Tests/TestProjects/QsharpExe/Main.qs new file mode 100644 index 00000000000..41a087bad12 --- /dev/null +++ b/src/Simulation/Simulators.Tests/TestProjects/QsharpExe/Main.qs @@ -0,0 +1,16 @@ +namespace QsharpExe { + + open Microsoft.Quantum.Intrinsic; + + @EntryPoint() + operation Main () : Result { + using (q = Qubit()) { + H(q); + let res = M(q); + if (res == One) { + X(q); + } + return res; + } + } +} diff --git a/src/Simulation/Simulators.Tests/TestProjects/QsharpExe/QsharpExe.csproj b/src/Simulation/Simulators.Tests/TestProjects/QsharpExe/QsharpExe.csproj new file mode 100644 index 00000000000..e9aba2e94e6 --- /dev/null +++ b/src/Simulation/Simulators.Tests/TestProjects/QsharpExe/QsharpExe.csproj @@ -0,0 +1,40 @@ + + + + Exe + netcoreapp3.1 + + false + false + ToffoliSimulator + + + + + + + + + + + + + + + + + <_ExeDir>$(MSBuildThisFileDirectory)built + + + + + + + + <_ExeFiles Include="$(OutputPath)*" /> + + + + + + diff --git a/src/Simulation/Simulators.Tests/Tests.Microsoft.Quantum.Simulation.Simulators.csproj b/src/Simulation/Simulators.Tests/Tests.Microsoft.Quantum.Simulation.Simulators.csproj index b489a310a22..ca807f596ba 100644 --- a/src/Simulation/Simulators.Tests/Tests.Microsoft.Quantum.Simulation.Simulators.csproj +++ b/src/Simulation/Simulators.Tests/Tests.Microsoft.Quantum.Simulation.Simulators.csproj @@ -11,9 +11,18 @@ false + + + + + + - + + + false + @@ -24,7 +33,18 @@ - + + + + + <_ExeDir>$(MSBuildThisFileDirectory)TestProjects\QsharpExe\built\ + + + <_ExeFiles Include="$(_ExeDir)*" /> + + + + From 358a4f36e79edcb61aacefadecb35d5db145d0a3 Mon Sep 17 00:00:00 2001 From: Bettina Heim Date: Tue, 21 Apr 2020 21:47:57 -0700 Subject: [PATCH 2/3] minor thing --- src/Simulation/Simulators.Tests/CoreTests.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Simulation/Simulators.Tests/CoreTests.cs b/src/Simulation/Simulators.Tests/CoreTests.cs index 9ecd4c38982..e2d7a204aa9 100644 --- a/src/Simulation/Simulators.Tests/CoreTests.cs +++ b/src/Simulation/Simulators.Tests/CoreTests.cs @@ -62,7 +62,7 @@ public void Borrowing() BorrowingTest.Run(s).Wait(); - var tracer = Tests.OperationsTestHelper.GetTracer<(long, Qubit)>(s); + var tracer = OperationsTestHelper.GetTracer<(long, Qubit)>(s); var testOne = new System.Action((int callsCount, OperationFunctor variant, (int, Qubit) info) => { @@ -198,7 +198,7 @@ void RunOne(IOperationFactory s) Assert.False(File.Exists("()")); } - Tests.OperationsTestHelper.RunWithMultipleSimulators((s) => RunOne(s as IOperationFactory)); + OperationsTestHelper.RunWithMultipleSimulators((s) => RunOne(s as IOperationFactory)); RunOne(new QCTraceSimulator()); RunOne(new ResourcesEstimator()); RunOne(new QuantumSimulator()); @@ -233,7 +233,7 @@ void RunOne(IOperationFactory s) } } - Tests.OperationsTestHelper.RunWithMultipleSimulators((s) => RunOne(s as IOperationFactory)); + OperationsTestHelper.RunWithMultipleSimulators((s) => RunOne(s as IOperationFactory)); RunOne(new QCTraceSimulator()); RunOne(new ResourcesEstimator()); } @@ -241,9 +241,9 @@ void RunOne(IOperationFactory s) [Fact] public void ZeroQubits() { - Tests.OperationsTestHelper.RunWithMultipleSimulators((s) => + OperationsTestHelper.RunWithMultipleSimulators((s) => { - var tracer = Tests.OperationsTestHelper.GetTracer(s); + var tracer = OperationsTestHelper.GetTracer(s); ZeroQubitsTest.Run(s).Wait(); @@ -254,7 +254,7 @@ public void ZeroQubits() [Fact] public void InterpolatedStrings() { - Tests.OperationsTestHelper.RunWithMultipleSimulators((s) => + OperationsTestHelper.RunWithMultipleSimulators((s) => { Circuits.InterpolatedStringTest.Run(s).Wait(); // Throws if it doesn't succeed }); @@ -263,7 +263,7 @@ public void InterpolatedStrings() [Fact] public void RandomOperation() { - Tests.OperationsTestHelper.RunWithMultipleSimulators((s) => + OperationsTestHelper.RunWithMultipleSimulators((s) => { Circuits.RandomOperationTest.Run(s).Wait(); // Throws if it doesn't succeed }); @@ -272,7 +272,7 @@ public void RandomOperation() [Fact] public void BigInts() { - Tests.OperationsTestHelper.RunWithMultipleSimulators((s) => + OperationsTestHelper.RunWithMultipleSimulators((s) => { Circuits.BigIntTest.Run(s).Wait(); // Throws if it doesn't succeed }); @@ -300,6 +300,6 @@ public void CatchFail() [Fact] public void InternalCallables() => - Tests.OperationsTestHelper.RunWithMultipleSimulators(s => Circuits.InternalCallablesTest.Run(s).Wait()); + OperationsTestHelper.RunWithMultipleSimulators(s => Circuits.InternalCallablesTest.Run(s).Wait()); } } From d25da9f50175918f7ac92fe496fc5a5097124d85 Mon Sep 17 00:00:00 2001 From: Bettina Heim Date: Wed, 22 Apr 2020 14:06:39 -0700 Subject: [PATCH 3/3] review comments --- src/Simulation/Simulators.Tests/CoreTests.cs | 16 ++++++++-------- .../TestProjects/QsharpExe/QsharpExe.csproj | 2 +- ...icrosoft.Quantum.Simulation.Simulators.csproj | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Simulation/Simulators.Tests/CoreTests.cs b/src/Simulation/Simulators.Tests/CoreTests.cs index e2d7a204aa9..ba2c9e9e5fa 100644 --- a/src/Simulation/Simulators.Tests/CoreTests.cs +++ b/src/Simulation/Simulators.Tests/CoreTests.cs @@ -32,12 +32,12 @@ public void BasicExecution() var asmPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); var exe = Path.Combine(asmPath, "TestExe", "QsharpExe.exe"); - ProcessRunner.Run(exe, "", out StringBuilder output, out var _, out int exitCode, out Exception ex); + ProcessRunner.Run(exe, "", out var _, out StringBuilder error, out int exitCode, out Exception ex); Assert.Null(ex); Assert.Equal(1, exitCode); - Assert.Contains("NotImplementedException", output.ToString()); + Assert.Contains("NotImplementedException", error.ToString()); - ProcessRunner.Run(exe, "--simulator QuantumSimulator", out output, out StringBuilder error, out exitCode, out ex); + ProcessRunner.Run(exe, "--simulator QuantumSimulator", out var _, out error, out exitCode, out ex); Assert.Null(ex); Assert.Equal(0, exitCode); Assert.Empty(error.ToString().Trim()); @@ -64,16 +64,16 @@ public void Borrowing() var tracer = OperationsTestHelper.GetTracer<(long, Qubit)>(s); - var testOne = new System.Action((int callsCount, OperationFunctor variant, (int, Qubit) info) => + var testOne = new Action((int callsCount, OperationFunctor variant, (int, Qubit) info) => { var (available, q) = info; Assert.Equal(callsCount, tracer.Log.GetNumberOfCalls(variant, (available, q))); }); - var testOneBody = new System.Action((int callsCount, (int, Qubit) info) => testOne(callsCount, OperationFunctor.Body, info)); - var testOneAdjoint = new System.Action((int callsCount, (int, Qubit) info) => testOne(callsCount, OperationFunctor.Adjoint, info)); - var testOneCtrl = new System.Action((int callsCount, (int, Qubit) info) => testOne(callsCount, OperationFunctor.Controlled, info)); - var testOneCtrlAdj = new System.Action((int callsCount, (int, Qubit) info) => testOne(callsCount, OperationFunctor.ControlledAdjoint, info)); + var testOneBody = new Action((callsCount, info) => testOne(callsCount, OperationFunctor.Body, info)); + var testOneAdjoint = new Action((callsCount, info) => testOne(callsCount, OperationFunctor.Adjoint, info)); + var testOneCtrl = new Action((callsCount, info) => testOne(callsCount, OperationFunctor.Controlled, info)); + var testOneCtrlAdj = new Action((callsCount, info) => testOne(callsCount, OperationFunctor.ControlledAdjoint, info)); testOneBody(6, (0, q5)); testOneBody(6, (0, q6)); diff --git a/src/Simulation/Simulators.Tests/TestProjects/QsharpExe/QsharpExe.csproj b/src/Simulation/Simulators.Tests/TestProjects/QsharpExe/QsharpExe.csproj index e9aba2e94e6..25e28abe68d 100644 --- a/src/Simulation/Simulators.Tests/TestProjects/QsharpExe/QsharpExe.csproj +++ b/src/Simulation/Simulators.Tests/TestProjects/QsharpExe/QsharpExe.csproj @@ -33,7 +33,7 @@ <_ExeFiles Include="$(OutputPath)*" /> - + diff --git a/src/Simulation/Simulators.Tests/Tests.Microsoft.Quantum.Simulation.Simulators.csproj b/src/Simulation/Simulators.Tests/Tests.Microsoft.Quantum.Simulation.Simulators.csproj index ca807f596ba..6e8583c9975 100644 --- a/src/Simulation/Simulators.Tests/Tests.Microsoft.Quantum.Simulation.Simulators.csproj +++ b/src/Simulation/Simulators.Tests/Tests.Microsoft.Quantum.Simulation.Simulators.csproj @@ -43,7 +43,7 @@ <_ExeFiles Include="$(_ExeDir)*" /> - +