diff --git a/QsFmt.sln b/QsFmt.sln index 345a97b8f8..12e4a7d425 100644 --- a/QsFmt.sln +++ b/QsFmt.sln @@ -9,14 +9,9 @@ Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Formatter", "src\QsFmt\Form EndProject Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "App", "src\QsFmt\App\App.fsproj", "{68F54AEE-C852-4FFA-831D-5BA741BE893E}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{4399BDF1-685A-4373-8748-142C835A52D6}" - ProjectSection(SolutionItems) = preProject - README.md = src\QsFmt\README.md - EndProjectSection +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Formatter.Tests", "src\QsFmt\Formatter.Tests\Formatter.Tests.fsproj", "{FC9E2BEC-F15F-4818-B0E1-805EA554269E}" EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Formatter.Tests", "src\QsFmt\Formatter.Tests\Formatter.Tests.fsproj", "{FC9E2BEC-F15F-4818-B0E1-805EA554269E}" -EndProject -Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "App.Tests", "src\QsFmt\App.Tests\App.Tests.fsproj", "{E00FA726-F852-4D14-90F8-1B0E3E08D822}" +Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "App.Tests", "src\QsFmt\App.Tests\App.Tests.fsproj", "{E00FA726-F852-4D14-90F8-1B0E3E08D822}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/src/QsFmt/App.Tests/App.Tests.fsproj b/src/QsFmt/App.Tests/App.Tests.fsproj index 820c140fb5..363bcd250c 100644 --- a/src/QsFmt/App.Tests/App.Tests.fsproj +++ b/src/QsFmt/App.Tests/App.Tests.fsproj @@ -1,4 +1,4 @@ - + netcoreapp3.1 Microsoft.Quantum.QsFmt.App.Tests @@ -6,28 +6,162 @@ - + + Always + + + Always + - PreserveNewest + Always - PreserveNewest + Always - PreserveNewest + Always - PreserveNewest + Always - PreserveNewest + Always - PreserveNewest + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + Always + + + diff --git a/src/QsFmt/App.Tests/Example1.qs b/src/QsFmt/App.Tests/Example1.qs deleted file mode 100644 index 6ee71df468..0000000000 --- a/src/QsFmt/App.Tests/Example1.qs +++ /dev/null @@ -1 +0,0 @@ -namespace Example1 { function Bar() : Int { return 0; } } diff --git a/src/QsFmt/App.Tests/Example2.qs b/src/QsFmt/App.Tests/Example2.qs deleted file mode 100644 index cec365892c..0000000000 --- a/src/QsFmt/App.Tests/Example2.qs +++ /dev/null @@ -1 +0,0 @@ -namespace Example2 { function Bar() : Int { return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/SyntaxError.qs b/src/QsFmt/App.Tests/Examples/SyntaxError.qs new file mode 100644 index 0000000000..d2d37ea651 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/SyntaxError.qs @@ -0,0 +1 @@ +namespace Foo { invalid syntax; } diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/OldApplication/Driver.cs b/src/QsFmt/App.Tests/Examples/TestProjects/OldApplication/Driver.cs new file mode 100644 index 0000000000..dffbcc8788 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/OldApplication/Driver.cs @@ -0,0 +1,13 @@ +using Microsoft.Quantum.Simulation.Core; +using Microsoft.Quantum.Simulation.Simulators; + +namespace OldApplication +{ + class Driver + { + static void Main(string[] args) + { + + } + } +} diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/OldApplication/OldApplication.csproj b/src/QsFmt/App.Tests/Examples/TestProjects/OldApplication/OldApplication.csproj new file mode 100644 index 0000000000..c2c94b133c --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/OldApplication/OldApplication.csproj @@ -0,0 +1,14 @@ + + + + Exe + netcoreapp3.1 + x64 + + + + + + + + diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/OldApplication/Operation.qs b/src/QsFmt/App.Tests/Examples/TestProjects/OldApplication/Operation.qs new file mode 100644 index 0000000000..5f51e12592 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/OldApplication/Operation.qs @@ -0,0 +1,7 @@ +namespace OldApplication { + open Microsoft.Quantum.Canon; + open Microsoft.Quantum.Intrinsic; + + operation Operation () : Unit { + } +} diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/OldVersion/OldVersion.csproj b/src/QsFmt/App.Tests/Examples/TestProjects/OldVersion/OldVersion.csproj new file mode 100644 index 0000000000..ffac44e123 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/OldVersion/OldVersion.csproj @@ -0,0 +1,8 @@ + + + + Exe + netcoreapp3.1 + + + diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/OldVersion/Program.qs b/src/QsFmt/App.Tests/Examples/TestProjects/OldVersion/Program.qs new file mode 100644 index 0000000000..c22d3f4148 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/OldVersion/Program.qs @@ -0,0 +1,11 @@ +namespace Quantum.QSharpApplication1 { + + open Microsoft.Quantum.Canon; + open Microsoft.Quantum.Intrinsic; + + + @EntryPoint() + operation HelloQ () : Unit { + Message("Hello quantum world!"); + } +} diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/ReferenceLibrary/Library.qs b/src/QsFmt/App.Tests/Examples/TestProjects/ReferenceLibrary/Library.qs new file mode 100644 index 0000000000..650943fa09 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/ReferenceLibrary/Library.qs @@ -0,0 +1,10 @@ +namespace Quantum.ReferenceLibrary { + + open Microsoft.Quantum.Canon; + open Microsoft.Quantum.Intrinsic; + + + operation LibraryOperation () : Unit { + Message("Hello from the Reference Library!"); + } +} diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/ReferenceLibrary/ReferenceLibrary.csproj b/src/QsFmt/App.Tests/Examples/TestProjects/ReferenceLibrary/ReferenceLibrary.csproj new file mode 100644 index 0000000000..39db37413f --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/ReferenceLibrary/ReferenceLibrary.csproj @@ -0,0 +1,7 @@ + + + + netstandard2.1 + + + diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/Excluded1.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/Excluded1.qs new file mode 100644 index 0000000000..2239054759 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/Excluded1.qs @@ -0,0 +1 @@ +namespace TestTarget { function Excluded1() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/Included1.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/Included1.qs new file mode 100644 index 0000000000..9ea3b00a59 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/Included1.qs @@ -0,0 +1 @@ +namespace TestTarget { function Included1() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/Program.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/Program.qs new file mode 100644 index 0000000000..8e16620336 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/Program.qs @@ -0,0 +1,15 @@ +namespace Quantum.QSharpApplication1 { + + open Microsoft.Quantum.Canon; + open Microsoft.Quantum.Chemistry; + open Microsoft.Quantum.Intrinsic; + open Quantum.ReferenceLibrary; + + + @EntryPoint() + operation HelloQ () : Unit { + Message("Hello quantum world!"); + LibraryOperation(); + let x = HTerm([], []); + } +} diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/QSharpApplication1.csproj b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/QSharpApplication1.csproj new file mode 100644 index 0000000000..71a8f049d0 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/QSharpApplication1.csproj @@ -0,0 +1,24 @@ + + + + Exe + netcoreapp3.1 + + + + + + + + + Example1.qs + + + + + + + + + + diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/SubFolder1/Excluded2.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/SubFolder1/Excluded2.qs new file mode 100644 index 0000000000..6d39319e6f --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/SubFolder1/Excluded2.qs @@ -0,0 +1 @@ +namespace TestTarget { function Excluded2() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/SubFolder1/Included2.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/SubFolder1/Included2.qs new file mode 100644 index 0000000000..e43f0a6bb8 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/SubFolder1/Included2.qs @@ -0,0 +1 @@ +namespace TestTarget { function Included2() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/SubFolder1/SubSubFolder/Excluded4.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/SubFolder1/SubSubFolder/Excluded4.qs new file mode 100644 index 0000000000..25e12245a9 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/SubFolder1/SubSubFolder/Excluded4.qs @@ -0,0 +1 @@ +namespace TestTarget { function Excluded4() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/SubFolder1/SubSubFolder/Included4.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/SubFolder1/SubSubFolder/Included4.qs new file mode 100644 index 0000000000..f287e29711 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/SubFolder1/SubSubFolder/Included4.qs @@ -0,0 +1 @@ +namespace TestTarget { function Included4() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/SubFolder2/Excluded3.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/SubFolder2/Excluded3.qs new file mode 100644 index 0000000000..6c610f8de8 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/SubFolder2/Excluded3.qs @@ -0,0 +1 @@ +namespace TestTarget { function Excluded3() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/SubFolder2/Included3.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/SubFolder2/Included3.qs new file mode 100644 index 0000000000..0485b054ee --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleApplication/SubFolder2/Included3.qs @@ -0,0 +1 @@ +namespace TestTarget { function Included3() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/Excluded1.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/Excluded1.qs new file mode 100644 index 0000000000..2239054759 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/Excluded1.qs @@ -0,0 +1 @@ +namespace TestTarget { function Excluded1() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/Included1.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/Included1.qs new file mode 100644 index 0000000000..9ea3b00a59 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/Included1.qs @@ -0,0 +1 @@ +namespace TestTarget { function Included1() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/Library.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/Library.qs new file mode 100644 index 0000000000..a1c9db7d4c --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/Library.qs @@ -0,0 +1,14 @@ +namespace Quantum.QSharpLibrary1 { + + open Microsoft.Quantum.Canon; + open Microsoft.Quantum.Chemistry; + open Microsoft.Quantum.Intrinsic; + open Quantum.ReferenceLibrary; + + + operation HelloQ () : Unit { + Message("Hello quantum world!"); + LibraryOperation(); + let x = HTerm([], []); + } +} diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/QSharpLibrary1.csproj b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/QSharpLibrary1.csproj new file mode 100644 index 0000000000..2d69cbcb3e --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/QSharpLibrary1.csproj @@ -0,0 +1,23 @@ + + + + netstandard2.1 + + + + + + + + + Example1.qs + + + + + + + + + + diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/SubFolder1/Excluded2.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/SubFolder1/Excluded2.qs new file mode 100644 index 0000000000..6d39319e6f --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/SubFolder1/Excluded2.qs @@ -0,0 +1 @@ +namespace TestTarget { function Excluded2() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/SubFolder1/Included2.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/SubFolder1/Included2.qs new file mode 100644 index 0000000000..e43f0a6bb8 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/SubFolder1/Included2.qs @@ -0,0 +1 @@ +namespace TestTarget { function Included2() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/SubFolder1/SubSubFolder/Excluded4.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/SubFolder1/SubSubFolder/Excluded4.qs new file mode 100644 index 0000000000..25e12245a9 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/SubFolder1/SubSubFolder/Excluded4.qs @@ -0,0 +1 @@ +namespace TestTarget { function Excluded4() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/SubFolder1/SubSubFolder/Included4.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/SubFolder1/SubSubFolder/Included4.qs new file mode 100644 index 0000000000..f287e29711 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/SubFolder1/SubSubFolder/Included4.qs @@ -0,0 +1 @@ +namespace TestTarget { function Included4() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/SubFolder2/Excluded3.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/SubFolder2/Excluded3.qs new file mode 100644 index 0000000000..6c610f8de8 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/SubFolder2/Excluded3.qs @@ -0,0 +1 @@ +namespace TestTarget { function Excluded3() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/SubFolder2/Included3.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/SubFolder2/Included3.qs new file mode 100644 index 0000000000..0485b054ee --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleLibrary/SubFolder2/Included3.qs @@ -0,0 +1 @@ +namespace TestTarget { function Included3() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/Excluded1.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/Excluded1.qs new file mode 100644 index 0000000000..2239054759 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/Excluded1.qs @@ -0,0 +1 @@ +namespace TestTarget { function Excluded1() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/Included1.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/Included1.qs new file mode 100644 index 0000000000..9ea3b00a59 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/Included1.qs @@ -0,0 +1 @@ +namespace TestTarget { function Included1() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/QSharpTestProject1.csproj b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/QSharpTestProject1.csproj new file mode 100644 index 0000000000..7a478df8c6 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/QSharpTestProject1.csproj @@ -0,0 +1,32 @@ + + + + netcoreapp3.1 + false + + + + + + + + + Example1.qs + + + + + + + + + + + + + + + + + + diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/SubFolder1/Excluded2.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/SubFolder1/Excluded2.qs new file mode 100644 index 0000000000..6d39319e6f --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/SubFolder1/Excluded2.qs @@ -0,0 +1 @@ +namespace TestTarget { function Excluded2() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/SubFolder1/Included2.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/SubFolder1/Included2.qs new file mode 100644 index 0000000000..e43f0a6bb8 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/SubFolder1/Included2.qs @@ -0,0 +1 @@ +namespace TestTarget { function Included2() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/SubFolder1/SubSubFolder/Excluded4.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/SubFolder1/SubSubFolder/Excluded4.qs new file mode 100644 index 0000000000..25e12245a9 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/SubFolder1/SubSubFolder/Excluded4.qs @@ -0,0 +1 @@ +namespace TestTarget { function Excluded4() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/SubFolder1/SubSubFolder/Included4.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/SubFolder1/SubSubFolder/Included4.qs new file mode 100644 index 0000000000..f287e29711 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/SubFolder1/SubSubFolder/Included4.qs @@ -0,0 +1 @@ +namespace TestTarget { function Included4() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/SubFolder2/Excluded3.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/SubFolder2/Excluded3.qs new file mode 100644 index 0000000000..6c610f8de8 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/SubFolder2/Excluded3.qs @@ -0,0 +1 @@ +namespace TestTarget { function Excluded3() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/SubFolder2/Included3.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/SubFolder2/Included3.qs new file mode 100644 index 0000000000..0485b054ee --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/SubFolder2/Included3.qs @@ -0,0 +1 @@ +namespace TestTarget { function Included3() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/Tests.qs b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/Tests.qs new file mode 100644 index 0000000000..d9eba8a6db --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestProjects/SimpleTestProject/Tests.qs @@ -0,0 +1,20 @@ +namespace Quantum.QSharpTestProject1 { + + open Microsoft.Quantum.Canon; + open Microsoft.Quantum.Chemistry; + open Microsoft.Quantum.Diagnostics; + open Microsoft.Quantum.Intrinsic; + open Quantum.ReferenceLibrary; + + + @Test("QuantumSimulator") + operation AllocateQubit () : Unit { + + use q = Qubit(); + AssertMeasurement([PauliZ], [q], Zero, "Newly allocated qubit must be in |0> state."); + + Message("Test passed."); + LibraryOperation(); + let x = HTerm([], []); + } +} diff --git a/src/QsFmt/App.Tests/Examples/TestTarget/Excluded1.qs b/src/QsFmt/App.Tests/Examples/TestTarget/Excluded1.qs new file mode 100644 index 0000000000..70eff555a2 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestTarget/Excluded1.qs @@ -0,0 +1 @@ +namespace TestTarget { function Bar2() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestTarget/Excluded2.qs b/src/QsFmt/App.Tests/Examples/TestTarget/Excluded2.qs new file mode 100644 index 0000000000..1617c7ebf4 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestTarget/Excluded2.qs @@ -0,0 +1 @@ +namespace TestTarget { function Bar3() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestTarget/Included.qs b/src/QsFmt/App.Tests/Examples/TestTarget/Included.qs new file mode 100644 index 0000000000..52dc362af5 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestTarget/Included.qs @@ -0,0 +1 @@ +namespace TestTarget { function Bar1() : Int { for (i in 0..1) {} return 0; } } diff --git a/src/QsFmt/App.Tests/Examples/TestTarget/Program.qs b/src/QsFmt/App.Tests/Examples/TestTarget/Program.qs new file mode 100644 index 0000000000..c170a6c424 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestTarget/Program.qs @@ -0,0 +1 @@ +namespace TestTarget { @EntryPoint() operation Bar() : Unit { for (i in 0..1) {} } } diff --git a/src/QsFmt/App.Tests/Examples/TestTarget/TestTarget.csproj b/src/QsFmt/App.Tests/Examples/TestTarget/TestTarget.csproj new file mode 100644 index 0000000000..25a6851b49 --- /dev/null +++ b/src/QsFmt/App.Tests/Examples/TestTarget/TestTarget.csproj @@ -0,0 +1,13 @@ + + + + Exe + netcoreapp3.1 + + + + + + + + diff --git a/src/QsFmt/App.Tests/ProjectTests.fs b/src/QsFmt/App.Tests/ProjectTests.fs new file mode 100644 index 0000000000..d42d3678c4 --- /dev/null +++ b/src/QsFmt/App.Tests/ProjectTests.fs @@ -0,0 +1,84 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +module Microsoft.Quantum.QsFmt.App.ProjectTests + +open System.IO +open Microsoft.Quantum.QsFmt.App +open Xunit + +[] +let SimpleApplication () = + DesignTimeBuild.assemblyLoadContextSetup () + + let files, version = + DesignTimeBuild.getSourceFiles "Examples\TestProjects\SimpleApplication\QSharpApplication1.csproj" + + let files = files |> List.map Path.GetFullPath + + let expectedFiles = + [ + "Examples\TestProjects\SimpleApplication\Program.qs" + "Examples\TestProjects\SimpleApplication\Included1.qs" + "Examples\TestProjects\SimpleApplication\SubFolder1\Included2.qs" + "Examples\TestProjects\SimpleApplication\SubFolder2\Included3.qs" + "Examples\TestProjects\SimpleApplication\SubFolder1\SubSubFolder\Included4.qs" + "Examples\Example1.qs" + "Examples\Example2.qs" + ] + |> List.map Path.GetFullPath + + Assert.True(expectedFiles.Length = files.Length, "Didn't get the expected number of files.") + + for expected in expectedFiles do + Assert.True(List.contains expected files, sprintf "Expected but did not find file %s" expected) + +[] +let SimpleLibrary () = + DesignTimeBuild.assemblyLoadContextSetup () + + let files, version = DesignTimeBuild.getSourceFiles "Examples\TestProjects\SimpleLibrary\QSharpLibrary1.csproj" + let files = files |> List.map Path.GetFullPath + + let expectedFiles = + [ + "Examples\TestProjects\SimpleLibrary\Library.qs" + "Examples\TestProjects\SimpleLibrary\Included1.qs" + "Examples\TestProjects\SimpleLibrary\SubFolder1\Included2.qs" + "Examples\TestProjects\SimpleLibrary\SubFolder2\Included3.qs" + "Examples\TestProjects\SimpleLibrary\SubFolder1\SubSubFolder\Included4.qs" + "Examples\Example1.qs" + "Examples\Example2.qs" + ] + |> List.map Path.GetFullPath + + Assert.True(expectedFiles.Length = files.Length, "Didn't get the expected number of files.") + + for expected in expectedFiles do + Assert.True(List.contains expected files, sprintf "Expected but did not find file %s" expected) + +[] +let SimpleTestProject () = + DesignTimeBuild.assemblyLoadContextSetup () + + let files, version = + DesignTimeBuild.getSourceFiles "Examples\TestProjects\SimpleTestProject\QSharpTestProject1.csproj" + + let files = files |> List.map Path.GetFullPath + + let expectedFiles = + [ + "Examples\TestProjects\SimpleTestProject\Tests.qs" + "Examples\TestProjects\SimpleTestProject\Included1.qs" + "Examples\TestProjects\SimpleTestProject\SubFolder1\Included2.qs" + "Examples\TestProjects\SimpleTestProject\SubFolder2\Included3.qs" + "Examples\TestProjects\SimpleTestProject\SubFolder1\SubSubFolder\Included4.qs" + "Examples\Example1.qs" + "Examples\Example2.qs" + ] + |> List.map Path.GetFullPath + + Assert.True(expectedFiles.Length = files.Length, "Didn't get the expected number of files.") + + for expected in expectedFiles do + Assert.True(List.contains expected files, sprintf "Expected but did not find file %s" expected) diff --git a/src/QsFmt/App.Tests/SubExamples1/SubExample1.qs b/src/QsFmt/App.Tests/SubExamples1/SubExample1.qs deleted file mode 100644 index 97571b3efe..0000000000 --- a/src/QsFmt/App.Tests/SubExamples1/SubExample1.qs +++ /dev/null @@ -1 +0,0 @@ -namespace SubExample1 { function Bar() : Int { return 0; } } diff --git a/src/QsFmt/App.Tests/SubExamples1/SubExample2.qs b/src/QsFmt/App.Tests/SubExamples1/SubExample2.qs deleted file mode 100644 index bae61ebafb..0000000000 --- a/src/QsFmt/App.Tests/SubExamples1/SubExample2.qs +++ /dev/null @@ -1 +0,0 @@ -namespace SubExample2 { function Bar() : Int { return 0; } } diff --git a/src/QsFmt/App.Tests/SubExamples2/NestedExample2/NestedExample1.qs b/src/QsFmt/App.Tests/SubExamples2/NestedExample2/NestedExample1.qs deleted file mode 100644 index 319413d58b..0000000000 --- a/src/QsFmt/App.Tests/SubExamples2/NestedExample2/NestedExample1.qs +++ /dev/null @@ -1 +0,0 @@ -namespace NestedExample1 { function Bar() : Int { return 0; } } diff --git a/src/QsFmt/App.Tests/SubExamples2/NestedExample2/NestedExample2.qs b/src/QsFmt/App.Tests/SubExamples2/NestedExample2/NestedExample2.qs deleted file mode 100644 index b5cb88f176..0000000000 --- a/src/QsFmt/App.Tests/SubExamples2/NestedExample2/NestedExample2.qs +++ /dev/null @@ -1 +0,0 @@ -namespace NestedExample2 { function Bar() : Int { return 0; } } diff --git a/src/QsFmt/App.Tests/SubExamples2/SubExample3.qs b/src/QsFmt/App.Tests/SubExamples2/SubExample3.qs deleted file mode 100644 index 0d79aa7a2d..0000000000 --- a/src/QsFmt/App.Tests/SubExamples2/SubExample3.qs +++ /dev/null @@ -1 +0,0 @@ -namespace SubExample3 { function Bar() : Int { return 0; } } diff --git a/src/QsFmt/App.Tests/Tests.fs b/src/QsFmt/App.Tests/Tests.fs index afc7b51c99..142c170ac2 100644 --- a/src/QsFmt/App.Tests/Tests.fs +++ b/src/QsFmt/App.Tests/Tests.fs @@ -4,13 +4,13 @@ /// Tests for the command-line interface. module Microsoft.Quantum.QsFmt.App.Tests -open Microsoft.Quantum.QsFmt.App.Program open System open System.IO +open Microsoft.Quantum.QsFmt.App.Program open Xunit /// The result of running the application. -type Result = +type private Result = { /// The exit status code. Code: int @@ -22,7 +22,7 @@ type Result = Error: string } -type TestFile = +type private TestFile = { Path: string Original: string @@ -33,17 +33,17 @@ type TestFile = /// /// Ensures that the new line characters will conform to the standard of the environment's new line character. /// -let standardizeNewLines (s: string) = +let private standardizeNewLines (s: string) = s.Replace("\r", "").Replace("\n", Environment.NewLine) -let CleanResult = +let private CleanResult = { Code = 0 Out = "" Error = "" } -let makeTestFile (path: string) = +let private makeTestFile (path: string) = let name = path.[(path.LastIndexOf "\\") + 1..(path.LastIndexOf ".qs") - 1] { @@ -68,15 +68,15 @@ let makeTestFile (path: string) = |> standardizeNewLines } -let Example1 = makeTestFile "Examples\\Example1.qs" -let Example2 = makeTestFile "Examples\\Example2.qs" -let SubExample1 = makeTestFile "Examples\\SubExamples1\\SubExample1.qs" -let SubExample2 = makeTestFile "Examples\\SubExamples1\\SubExample2.qs" -let SubExample3 = makeTestFile "Examples\\SubExamples2\\SubExample3.qs" -let NestedExample1 = makeTestFile "Examples\\SubExamples2\\NestedExamples\\NestedExample1.qs" -let NestedExample2 = makeTestFile "Examples\\SubExamples2\\NestedExamples\\NestedExample2.qs" +let private Example1 = makeTestFile "Examples\\Example1.qs" +let private Example2 = makeTestFile "Examples\\Example2.qs" +let private SubExample1 = makeTestFile "Examples\\SubExamples1\\SubExample1.qs" +let private SubExample2 = makeTestFile "Examples\\SubExamples1\\SubExample2.qs" +let private SubExample3 = makeTestFile "Examples\\SubExamples2\\SubExample3.qs" +let private NestedExample1 = makeTestFile "Examples\\SubExamples2\\NestedExamples\\NestedExample1.qs" +let private NestedExample2 = makeTestFile "Examples\\SubExamples2\\NestedExamples\\NestedExample2.qs" -let StandardInputTest = +let private StandardInputTest = { Path = "-" Original = @@ -139,9 +139,9 @@ let private runWithFiles isUpdate files standardInput expectedOutput args = [] let ``Updates file`` () = - runWithFiles true [ Example1 ] "" CleanResult [| "update"; Example1.Path |] + runWithFiles true [ Example1 ] "" CleanResult [| "update"; "-i"; Example1.Path |] -[] +[] let ``Updates standard input`` () = Assert.Equal( { @@ -152,24 +152,23 @@ let ``Updates standard input`` () = run [| "update"; "-" |] StandardInputTest.Original ) -[] -[, Line 1, Character 16: mismatched input 'invalid' expecting {'function', 'internal', 'newtype', 'open', 'operation', '@', '}'} -")>] -let ``Shows syntax errors`` input errors = +[] +let ``Shows syntax errors`` () = Assert.Equal( { Code = 1 Out = "" - Error = errors |> standardizeNewLines + Error = + standardizeNewLines + "Examples\SyntaxError.qs, Line 1, Character 16: mismatched input 'invalid' expecting {'function', 'internal', 'newtype', 'open', 'operation', '@', '}'} +" }, - run [| "-" |] input + run [| "update"; "-i"; "Examples\\SyntaxError.qs" |] "" ) -[] -[] -let ``Shows file not found error`` path = - let result = run [| path |] "" +[] +let ``Shows file not found error`` () = + let result = run [| "update"; "-i"; "Examples\\NotFound.qs" |] "" Assert.Equal(3, result.Code) Assert.Empty result.Out Assert.NotEmpty result.Error @@ -178,27 +177,19 @@ let ``Shows file not found error`` path = let ``Input multiple files`` () = let files = [ Example1; Example2 ] - runWithFiles true files "" CleanResult [| "update"; Example1.Path; Example2.Path |] + runWithFiles true files "" CleanResult [| "update"; "-i"; Example1.Path; Example2.Path |] [] let ``Input directories`` () = let files = [ SubExample1; SubExample2; SubExample3 ] - runWithFiles true files "" CleanResult [| "update"; "Examples\\SubExamples1"; "Examples\\SubExamples2" |] + + runWithFiles true files "" CleanResult [| "update"; "-i"; "Examples\\SubExamples1"; "Examples\\SubExamples2" |] [] -let ``Input directories with files and stdin`` () = +let ``Input directories with files`` () = let files = [ Example1; SubExample1; SubExample2 ] - [| "update"; Example1.Path; "-"; "Examples\\SubExamples1" |] - |> runWithFiles - true - files - StandardInputTest.Original - { - Code = 0 - Out = StandardInputTest.Updated - Error = "" - } + runWithFiles true files "" CleanResult [| "update"; "-i"; Example1.Path; "Examples\\SubExamples1" |] [] let ``Input directories with recursive flag`` () = @@ -212,34 +203,26 @@ let ``Input directories with recursive flag`` () = NestedExample2 ] - [| - "update" - "-r" - Example1.Path - "-" - "Examples\\SubExamples1" - "Examples\\SubExamples2" - |] - |> runWithFiles - true - files - StandardInputTest.Original - { - Code = 0 - Out = StandardInputTest.Updated - Error = "" - } + let args = + [| + "update" + "-r" + "-i" + Example1.Path + "Examples\\SubExamples1" + "Examples\\SubExamples2" + |] + + runWithFiles true files "" CleanResult args [] let ``Process correct files while erroring on incorrect`` () = let files = [ Example1; Example2 ] try - let result = - run [| "update"; Example1.Path; "-"; "Examples\\NotFound.qs"; Example2.Path |] StandardInputTest.Original + let result = run [| "update"; "-i"; Example1.Path; "Examples\\NotFound.qs"; Example2.Path |] "" Assert.Equal(3, result.Code) - Assert.Equal(StandardInputTest.Updated, result.Out) Assert.NotEmpty(result.Error) for file in files do @@ -254,16 +237,9 @@ let ``Backup flag`` () = let files = [ Example1; SubExample3 ] try - let result = run [| "update"; "-b"; "-"; Example1.Path; "Examples\\SubExamples2" |] StandardInputTest.Original + let result = run [| "update"; "-b"; "-i"; Example1.Path; "Examples\\SubExamples2" |] "" - Assert.Equal( - { - Code = 0 - Out = StandardInputTest.Updated - Error = "" - }, - result - ) + Assert.Equal(CleanResult, result) for file in files do let backup = file.Path + "~" @@ -294,9 +270,100 @@ This input has already been processed: Examples\Example1.qs [| "update" + "-i" Example1.Path "Examples\\SubExamples1" SubExample1.Path Example1.Path |] |> runWithFiles true files "" outputResult + +[] +let ``Project file as input`` () = + + let makeTestFile (path: string) (index: int) = + { + Path = path + Original = File.ReadAllText path + Formatted = + index + |> sprintf + "namespace TestTarget { + function Bar%i() : Int { + for (i in 0..1) {} + return 0; + } +} +" + |> standardizeNewLines + Updated = + index + |> sprintf + "namespace TestTarget { function Bar%i() : Int { for i in 0..1 {} return 0; } } +" + |> standardizeNewLines + } + + let TestTargetProgram = + let path = "Examples\\TestTarget\\Program.qs" + + { + Path = path + Original = File.ReadAllText path + Formatted = + "namespace TestTarget { + @EntryPoint() + operation Bar() : Unit { + for (i in 0..1) {} + } +} +" + |> standardizeNewLines + Updated = + "namespace TestTarget { @EntryPoint() operation Bar() : Unit { for i in 0..1 {} } } +" + |> standardizeNewLines + } + + let TestTargetIncluded = makeTestFile "Examples\\TestTarget\\Included.qs" 1 + let TestTargetExcluded1 = makeTestFile "Examples\\TestTarget\\Excluded1.qs" 2 + let TestTargetExcluded2 = makeTestFile "Examples\\TestTarget\\Excluded2.qs" 3 + + + let files = [ TestTargetProgram; TestTargetIncluded ] + + [| "update"; "-p"; "Examples\\TestTarget\\TestTarget.csproj" |] + |> runWithFiles true files "" CleanResult + + let excluded1 = File.ReadAllText TestTargetExcluded1.Path + Assert.Equal(excluded1, TestTargetExcluded1.Original) + + let excluded2 = File.ReadAllText TestTargetExcluded2.Path + Assert.Equal(excluded2, TestTargetExcluded2.Original) + +[] +let ``Outdated version project file as input`` () = + Assert.Equal( + { + Code = 6 + Out = "" + Error = + standardizeNewLines + "Error: Qdk Version is out of date. Only Qdk version 0.16.2104.138035 or later is supported. +" + }, + run [| "update"; "-p"; "Examples\\TestProjects\\OldVersion\\OldVersion.csproj" |] "" + ) + +[] +let ``Outdated system project file as input`` () = + let project = "Examples\\TestProjects\\OldApplication\\OldApplication.csproj" + let act = Action(fun () -> run [| "update"; "-p"; project |] "" |> ignore) + let ex = Assert.Throws(act) + + Assert.Equal( + ex.Message, + sprintf + "The given project file, %s is not a Q# project file. Please ensure your project file uses the Microsoft.Quantum.Sdk." + project + ) diff --git a/src/QsFmt/App/App.fsproj b/src/QsFmt/App/App.fsproj index cafe963286..d3a15f89bf 100644 --- a/src/QsFmt/App/App.fsproj +++ b/src/QsFmt/App/App.fsproj @@ -7,6 +7,11 @@ + + + + + @@ -16,6 +21,10 @@ - + + + + + diff --git a/src/QsFmt/App/AssemblyInfo.fs b/src/QsFmt/App/AssemblyInfo.fs new file mode 100644 index 0000000000..8422068d78 --- /dev/null +++ b/src/QsFmt/App/AssemblyInfo.fs @@ -0,0 +1,6 @@ +module AssemblyInfo + +open System.Runtime.CompilerServices + +[] +do () diff --git a/src/QsFmt/App/CommandLineArguments.fs b/src/QsFmt/App/CommandLineArguments.fs new file mode 100644 index 0000000000..b7a216e56a --- /dev/null +++ b/src/QsFmt/App/CommandLineArguments.fs @@ -0,0 +1,186 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +module Microsoft.Quantum.QsFmt.App.Arguments + +open System +open System.IO +open CommandLine +open CommandLine.Text +open Microsoft.Quantum.QsFmt.App.DesignTimeBuild + +[