diff --git a/ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj b/ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj index bc4fc10f9..ec0a1508a 100644 --- a/ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj +++ b/ICSharpCode.Decompiler.Tests/ICSharpCode.Decompiler.Tests.csproj @@ -63,6 +63,8 @@ + + @@ -166,6 +168,7 @@ + diff --git a/ICSharpCode.Decompiler.Tests/TestCases/VBPretty/Async.cs b/ICSharpCode.Decompiler.Tests/TestCases/VBPretty/Async.cs new file mode 100644 index 000000000..be22cc581 --- /dev/null +++ b/ICSharpCode.Decompiler.Tests/TestCases/VBPretty/Async.cs @@ -0,0 +1,45 @@ +using System; +using System.Threading.Tasks; +using System.IO; + +namespace EquivalentCSharpConsoleApp +{ + static class Program + { + public static void Main(string[] args) + { + var task = new Task(ProcessDataAsync); + task.Start(); + task.Wait(); + Console.ReadLine(); + } + + public async static void ProcessDataAsync() + { + Task task = HandleFileAsync("C:\\enable1.txt"); + Console.WriteLine("Please wait, processing"); + int result = await task; + Console.WriteLine("Count: " + result.ToString()); + } + + public async static Task HandleFileAsync(string file) + { + Console.WriteLine("HandleFile enter"); + int count = 0; + using (StreamReader reader = new StreamReader(file)) + { + string value = await reader.ReadToEndAsync(); + count += value.Length; + for (var i = 0; i <= 10000; i += 1) + { + var x = value.GetHashCode(); + if (x == 0) + count -= 1; + } + } + + Console.WriteLine("HandleFile exit"); + return count; + } + } +} \ No newline at end of file diff --git a/ICSharpCode.Decompiler.Tests/TestCases/VBPretty/Async.vb b/ICSharpCode.Decompiler.Tests/TestCases/VBPretty/Async.vb new file mode 100644 index 000000000..9f16b85c4 --- /dev/null +++ b/ICSharpCode.Decompiler.Tests/TestCases/VBPretty/Async.vb @@ -0,0 +1,47 @@ +Imports System +Imports System.IO + +Module Program + ' Sample taken verbatim from https://www.dotnetperls.com/async-vbnet + Sub Main(args As String()) + Dim task = New Task(AddressOf ProcessDataAsync) + ' Start and wait for task to end. + task.Start() + task.Wait() + Console.ReadLine() + End Sub + + Async Sub ProcessDataAsync() + ' Create a task Of Integer. + ' ... Use HandleFileAsync method with a large file. + Dim task As Task(Of Integer) = HandleFileAsync("C:\enable1.txt") + ' This statement runs while HandleFileAsync executes. + Console.WriteLine("Please wait, processing") + ' Use await to wait for task to complete. + Dim result As Integer = Await task + Console.WriteLine("Count: " + result.ToString()) + End Sub + + Async Function HandleFileAsync(ByVal file As String) As Task(Of Integer) + Console.WriteLine("HandleFile enter") + + ' Open the file. + Dim count As Integer = 0 + Using reader As StreamReader = New StreamReader(file) + Dim value As String = Await reader.ReadToEndAsync() + count += value.Length + + ' Do a slow computation on the file. + For i = 0 To 10000 Step 1 + Dim x = value.GetHashCode() + If x = 0 Then + count -= 1 + End If + + Next + End Using + + Console.WriteLine("HandleFile exit") + Return count + End Function +End Module diff --git a/ICSharpCode.Decompiler.Tests/VBPrettyTestRunner.cs b/ICSharpCode.Decompiler.Tests/VBPrettyTestRunner.cs new file mode 100644 index 000000000..0368f6f6e --- /dev/null +++ b/ICSharpCode.Decompiler.Tests/VBPrettyTestRunner.cs @@ -0,0 +1,80 @@ +// Copyright (c) AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.IO; +using System.Linq; +using System.Runtime.CompilerServices; +using ICSharpCode.Decompiler.Tests.Helpers; +using NUnit.Framework; + +namespace ICSharpCode.Decompiler.Tests +{ + [TestFixture, Parallelizable(ParallelScope.All)] + public class VBPrettyTestRunner + { + static readonly string TestCasePath = DecompilerTestBase.TestCasePath + "/ILPretty"; + + [Test] + public void AllFilesHaveTests() + { + var testNames = typeof(ILPrettyTestRunner).GetMethods() + .Where(m => m.GetCustomAttributes(typeof(TestAttribute), false).Any()) + .Select(m => m.Name) + .ToArray(); + foreach (var file in new DirectoryInfo(TestCasePath).EnumerateFiles()) { + if (file.Extension.Equals(".vb", StringComparison.OrdinalIgnoreCase)) { + var testName = file.Name.Split('.')[0]; + Assert.Contains(testName, testNames); + Assert.IsTrue(File.Exists(Path.Combine(TestCasePath, testName + ".cs"))); + } + } + } + + static readonly VBCompilerOptions[] defaultOptions = +{ + VBCompilerOptions.None, + VBCompilerOptions.Optimize, + VBCompilerOptions.UseRoslyn, + VBCompilerOptions.Optimize | VBCompilerOptions.UseRoslyn, + }; + + static readonly VBCompilerOptions[] roslynOnlyOptions = +{ + VBCompilerOptions.UseRoslyn, + VBCompilerOptions.Optimize | VBCompilerOptions.UseRoslyn, + }; + + [Test, Ignore("Implement VB async/await")] + public void Async([ValueSource("defaultOptions")] VBCompilerOptions options) + { + Run(options: options); + } + + void Run([CallerMemberName] string testName = null, VBCompilerOptions options = VBCompilerOptions.UseDebug, DecompilerSettings settings = null) + { + var vbFile = Path.Combine(TestCasePath, testName + ".vb"); + var csFile = Path.Combine(TestCasePath, testName + ".cs"); + + var executable = Tester.CompileVB(vbFile, options); + var decompiled = Tester.DecompileCSharp(executable.PathToAssembly, settings); + + CodeAssert.FilesAreEqual(csFile, decompiled); + } + } +}