Skip to content

Commit f673b7c

Browse files
Add support for using different editions of .NET in unit tests
1 parent a85ac05 commit f673b7c

File tree

10 files changed

+201
-93
lines changed

10 files changed

+201
-93
lines changed

ICSharpCode.Decompiler.Tests/Helpers/RoslynToolset.cs

Lines changed: 81 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,22 @@
1818

1919
using System;
2020
using System.Collections.Generic;
21+
using System.Diagnostics;
2122
using System.IO;
2223
using System.Linq;
2324
using System.Threading;
2425
using System.Threading.Tasks;
2526

26-
using ICSharpCode.Decompiler.Util;
27+
using ICSharpCode.Decompiler.Metadata;
2728

2829
using NuGet.Common;
2930
using NuGet.Packaging;
3031
using NuGet.Protocol;
3132
using NuGet.Protocol.Core.Types;
3233
using NuGet.Versioning;
3334

35+
using NUnit.Framework;
36+
3437
namespace ICSharpCode.Decompiler.Tests.Helpers
3538
{
3639
abstract class AbstractToolset
@@ -50,29 +53,45 @@ public AbstractToolset(string baseDir)
5053

5154
protected async Task FetchPackage(string packageName, string version, string sourcePath, string outputPath)
5255
{
56+
if (!Directory.Exists(Path.Combine(Roundtrip.RoundtripAssembly.TestDir, "nuget")))
57+
Assert.Fail("No nuget cache found!");
58+
5359
ILogger logger = NullLogger.Instance;
5460
CancellationToken cancellationToken = CancellationToken.None;
55-
using MemoryStream packageStream = new MemoryStream();
56-
57-
await resource.CopyNupkgToStreamAsync(
58-
packageName,
59-
NuGetVersion.Parse(version),
60-
packageStream,
61-
cache,
62-
logger,
63-
cancellationToken).ConfigureAwait(false);
64-
65-
using PackageArchiveReader packageReader = new PackageArchiveReader(packageStream);
66-
NuspecReader nuspecReader = await packageReader.GetNuspecReaderAsync(cancellationToken).ConfigureAwait(false);
67-
68-
var files = (await packageReader.GetFilesAsync(cancellationToken).ConfigureAwait(false)).ToArray();
69-
files = files.Where(f => f.StartsWith(sourcePath, StringComparison.OrdinalIgnoreCase)).ToArray();
70-
await packageReader.CopyFilesAsync(outputPath, files,
71-
(sourceFile, targetPath, fileStream) => {
72-
fileStream.CopyToFile(targetPath);
73-
return targetPath;
74-
},
75-
logger, cancellationToken).ConfigureAwait(false);
61+
string pathToPackage = Path.Combine(Roundtrip.RoundtripAssembly.TestDir, "nuget", $"{packageName}-{version}.nupkg");
62+
Stream packageStream;
63+
if (File.Exists(pathToPackage))
64+
{
65+
packageStream = File.OpenRead(pathToPackage);
66+
}
67+
else
68+
{
69+
packageStream = new MemoryStream();
70+
71+
await resource.CopyNupkgToStreamAsync(
72+
packageName,
73+
NuGetVersion.Parse(version),
74+
packageStream,
75+
cache,
76+
logger,
77+
cancellationToken).ConfigureAwait(false);
78+
79+
packageStream.Position = 0;
80+
}
81+
using (packageStream)
82+
{
83+
using PackageArchiveReader packageReader = new PackageArchiveReader(packageStream);
84+
NuspecReader nuspecReader = await packageReader.GetNuspecReaderAsync(cancellationToken).ConfigureAwait(false);
85+
86+
var files = (await packageReader.GetFilesAsync(cancellationToken).ConfigureAwait(false)).ToArray();
87+
files = files.Where(f => f.StartsWith(sourcePath, StringComparison.OrdinalIgnoreCase)).ToArray();
88+
await packageReader.CopyFilesAsync(outputPath, files,
89+
(sourceFile, targetPath, fileStream) => {
90+
fileStream.CopyToFile(targetPath);
91+
return targetPath;
92+
},
93+
logger, cancellationToken).ConfigureAwait(false);
94+
}
7695
}
7796
}
7897

@@ -145,4 +164,44 @@ public async Task Fetch()
145164

146165
public string GetVsWhere() => vswherePath;
147166
}
167+
168+
class RefAssembliesToolset : AbstractToolset
169+
{
170+
readonly Dictionary<string, string> installedFrameworks = new Dictionary<string, string> {
171+
{ "legacy", Path.Combine(Roundtrip.RoundtripAssembly.TestDir, "dotnet", "legacy") },
172+
{ "2.2.0", Path.Combine(Roundtrip.RoundtripAssembly.TestDir, "dotnet", "netcore-2.2") },
173+
};
174+
175+
public RefAssembliesToolset()
176+
: base(Path.Combine(AppContext.BaseDirectory, "netfx"))
177+
{
178+
}
179+
180+
public async Task Fetch(string version, string packageName = "Microsoft.NETCore.App.Ref", string sourcePath = "ref/net5.0")
181+
{
182+
string path = Path.Combine(baseDir, version, sourcePath);
183+
if (!Directory.Exists(path))
184+
{
185+
await FetchPackage(packageName, version, sourcePath, Path.Combine(baseDir, version)).ConfigureAwait(false);
186+
}
187+
188+
installedFrameworks.Add(RoslynToolset.SanitizeVersion(version), path);
189+
}
190+
191+
internal string GetPath(string targetFramework)
192+
{
193+
var (id, version) = UniversalAssemblyResolver.ParseTargetFramework(targetFramework);
194+
string path;
195+
if (id == TargetFrameworkIdentifier.NETFramework)
196+
{
197+
path = installedFrameworks["legacy"];
198+
}
199+
else
200+
{
201+
path = installedFrameworks[version.ToString(3)];
202+
}
203+
Debug.Assert(Path.Exists(path));
204+
return path;
205+
}
206+
}
148207
}

ICSharpCode.Decompiler.Tests/Helpers/Tester.VB.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,9 @@
1616
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
1717
// DEALINGS IN THE SOFTWARE.
1818
using System;
19-
using System.CodeDom.Compiler;
2019
using System.Collections.Generic;
21-
using System.Diagnostics;
2220
using System.IO;
2321
using System.Linq;
24-
using System.Text;
2522
using System.Text.RegularExpressions;
2623
using System.Threading.Tasks;
2724

@@ -49,27 +46,30 @@ public static async Task<CompilerResults> CompileVB(string sourceFileName, Compi
4946
CompilerResults results = new CompilerResults();
5047
results.PathToAssembly = outputFileName;
5148

52-
var (roslynVersion, languageVersion) = (flags & CompilerOptions.UseRoslynMask) switch {
53-
0 => ("legacy", "11"),
54-
CompilerOptions.UseRoslyn1_3_2 => ("1.3.2", "14"),
55-
CompilerOptions.UseRoslyn2_10_0 => ("2.10.0", "latest"),
56-
CompilerOptions.UseRoslyn3_11_0 => ("3.11.0", "latest"),
57-
_ => (roslynLatestVersion, flags.HasFlag(CompilerOptions.Preview) ? "preview" : "latest")
49+
bool targetNet40 = (flags & CompilerOptions.TargetNet40) != 0;
50+
51+
var (roslynVersion, languageVersion, targetFramework) = (flags & CompilerOptions.UseRoslynMask) switch {
52+
0 => ("legacy", "11", null),
53+
CompilerOptions.UseRoslyn1_3_2 => ("1.3.2", "14", null),
54+
CompilerOptions.UseRoslyn2_10_0 => ("2.10.0", "latest", targetNet40 ? null : ".NETCoreApp,Version=v2.2"),
55+
CompilerOptions.UseRoslyn3_11_0 => ("3.11.0", "latest", targetNet40 ? null : ".NETCoreApp,Version=v5.0"),
56+
_ => (roslynLatestVersion, flags.HasFlag(CompilerOptions.Preview) ? "preview" : "latest", targetNet40 ? null : ".NETCoreApp,Version=v10.0")
5857
};
5958

6059
var vbcPath = roslynToolset.GetVBCompiler(roslynVersion);
6160

6261
IEnumerable<string> references;
6362
string libPath;
64-
if ((flags & CompilerOptions.UseRoslynMask) != 0 && (flags & CompilerOptions.TargetNet40) == 0)
63+
if ((flags & CompilerOptions.UseRoslynMask) != 0 && targetFramework != null)
6564
{
65+
var coreRefAsmPath = RefAssembliesToolset.GetPath(targetFramework);
6666
references = coreDefaultReferences.Select(r => "-r:\"" + r + "\"");
6767
libPath = coreRefAsmPath;
6868
}
6969
else
7070
{
7171
references = defaultReferences.Select(r => "-r:\"" + r + "\"");
72-
libPath = RefAsmPath;
72+
libPath = RefAssembliesToolset.GetPath("legacy");
7373
}
7474
if (flags.HasFlag(CompilerOptions.ReferenceVisualBasic))
7575
{
@@ -121,7 +121,7 @@ public static async Task<CompilerResults> CompileVB(string sourceFileName, Compi
121121
var command = Cli.Wrap(vbcPath)
122122
.WithArguments($"{otherOptions}-libpath:\"{libPath}\" {string.Join(" ", references)} -out:\"{Path.GetFullPath(results.PathToAssembly)}\" {string.Join(" ", sourceFileNames.Select(fn => '"' + Path.GetFullPath(fn) + '"'))}")
123123
.WithValidation(CommandResultValidation.None);
124-
Console.WriteLine($"\"{command.TargetFilePath}\" {command.Arguments}");
124+
//Console.WriteLine($"\"{command.TargetFilePath}\" {command.Arguments}");
125125

126126
var result = await command.ExecuteBufferedAsync().ConfigureAwait(false);
127127

0 commit comments

Comments
 (0)