Skip to content

Commit 0fec866

Browse files
committed
Rewrite tests for non-MEF style loading. Some tests failing even though the real scenario works
1 parent a7203e4 commit 0fec866

File tree

5 files changed

+79
-40
lines changed

5 files changed

+79
-40
lines changed

src/CodeFormatter/Program.cs

Lines changed: 32 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,36 @@ private static ImmutableArray<DiagnosticAnalyzer> LoadAnalyzersFromAssembly(stri
148148
}
149149
return newAnalyzers;
150150
}
151+
152+
// Expects a list of paths to files or directories of DLLs containing analyzers and adds them to the engine
153+
internal static ImmutableArray<DiagnosticAnalyzer> AddCustomAnalyzers(IFormattingEngine engine, ImmutableArray<string> analyzerList)
154+
{
155+
foreach (var analyzerPath in analyzerList)
156+
{
157+
if (File.Exists(analyzerPath))
158+
{
159+
var newAnalyzers = LoadAnalyzersFromAssembly(analyzerPath, true);
160+
engine.AddAnalyzers(newAnalyzers);
161+
return newAnalyzers;
162+
}
163+
else if (Directory.Exists(analyzerPath))
164+
{
165+
var DLLs = Directory.GetFiles(analyzerPath, "*.dll");
166+
foreach (var dll in DLLs)
167+
{
168+
// allows specifying a folder that contains analyzers as well as non-analyzer DLLs without throwing
169+
var newAnalyzers = LoadAnalyzersFromAssembly(dll, false);
170+
if (newAnalyzers.Count() > 0)
171+
{
172+
engine.AddAnalyzers(newAnalyzers);
173+
}
174+
return newAnalyzers;
175+
}
176+
}
177+
}
178+
179+
return ImmutableArray<DiagnosticAnalyzer>.Empty;
180+
}
151181

152182
private static async Task<int> RunAsync(CommandLineOptions options, CancellationToken cancellationToken)
153183
{
@@ -166,29 +196,9 @@ private static async Task<int> RunAsync(CommandLineOptions options, Cancellation
166196
engine.ApplyFixes = options.ApplyFixes;
167197
engine.LogOutputPath = options.LogOutputPath;
168198

169-
if (options.AnalyzerListFile != null && options.AnalyzerListText != null && options.AnalyzerListText.Count() > 0)
199+
if (options.TargetAnalyzers != null && options.TargetAnalyzerText != null && options.TargetAnalyzerText.Count() > 0)
170200
{
171-
foreach (var analyzerPath in options.AnalyzerListText)
172-
{
173-
if (File.Exists(analyzerPath))
174-
{
175-
var newAnalyzers = LoadAnalyzersFromAssembly(analyzerPath, true);
176-
engine.AddAnalyzers(newAnalyzers);
177-
}
178-
else if (Directory.Exists(analyzerPath))
179-
{
180-
var DLLs = Directory.GetFiles(analyzerPath, "*.dll");
181-
foreach (var dll in DLLs)
182-
{
183-
// allows specifying a folder that contains analyzers as well as non-analyzer DLLs without throwing
184-
var newAnalyzers = LoadAnalyzersFromAssembly(dll, false);
185-
if (newAnalyzers.Count() > 0)
186-
{
187-
engine.AddAnalyzers(newAnalyzers);
188-
}
189-
}
190-
}
191-
}
201+
AddCustomAnalyzers(engine, options.TargetAnalyzerText);
192202
}
193203

194204
// Analyzers will hydrate rule enabled/disabled settings

src/Microsoft.DotNet.CodeFormatting.Tests/FormattingEngineCreationTests.cs

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Collections.Immutable;
34
using System.IO;
45
using System.Linq;
56
using System.Reflection;
@@ -20,46 +21,61 @@ public class FormattingEngineCreationTests
2021
typeof(FormattingEngine).Assembly,
2122
typeof(OptimizeNamespaceImportsAnalyzer).Assembly
2223
};
23-
// TODO: fix hardcoded path
24-
private static string TestDLLDir = @"E:\src\codeformatter\src\Microsoft.DotNet.CodeFormatting.Tests\TestAnalyzers\";
25-
private static Assembly RoslynV100Analyzer = Assembly.LoadFile(TestDLLDir + "RoslynV100Analyzer.dll");
26-
private static Assembly RoslynV110Analyzer = Assembly.LoadFile(TestDLLDir + "RoslynV110Analyzer.dll");
27-
private static Assembly RoslynV111Analyzer = Assembly.LoadFile(TestDLLDir + "RoslynV111Analyzer.dll");
28-
private static Assembly RoslynV120Beta1Analyzer = Assembly.LoadFile(TestDLLDir + "RoslynV120Beta1Analyzer.dll");
24+
25+
private static string TestDLLDir = Path.Combine(Directory.GetCurrentDirectory(), "TestAnalyzers");
26+
private static string RoslynV100Analyzer = Path.Combine(TestDLLDir, "RoslynV100Analyzer.dll");
27+
private static string RoslynV110Analyzer = Path.Combine(TestDLLDir, "RoslynV110Analyzer.dll");
28+
private static string RoslynV111Analyzer = Path.Combine(TestDLLDir, "RoslynV111Analyzer.dll");
29+
private static string RoslynV120Beta1Analyzer = Path.Combine(TestDLLDir, "RoslynV120Beta1Analyzer.dll");
30+
private static string RoslynV120VBAnalyzer = Path.Combine(TestDLLDir, "RoslynV120VBAnalyzer.dll");
2931

3032
[Fact]
3133
public void AnalyzersBuiltAgainstRoslynV100()
3234
{
33-
IEnumerable<Assembly> roslynV1AnalyzerDLL = new Assembly[] { RoslynV100Analyzer };
35+
IFormattingEngine engine = FormattingEngine.Create(DefaultCompositionAssemblies);
3436
Assert.DoesNotThrow(() => {
35-
var assemblies = DefaultCompositionAssemblies.Concat(roslynV1AnalyzerDLL);
37+
var analyzers = Program.AddCustomAnalyzers(engine, ImmutableArray.Create(RoslynV100Analyzer));
38+
Assert.Equal(1, analyzers.Count());
3639
});
3740
}
3841

3942
[Fact]
4043
public void AnalyzersBuiltAgainstRoslynV110()
4144
{
42-
IEnumerable<Assembly> roslynV110AnalyzerDLL = new Assembly[] { RoslynV110Analyzer };
45+
IFormattingEngine engine = FormattingEngine.Create(DefaultCompositionAssemblies);
4346
Assert.DoesNotThrow(() => {
44-
var assemblies = DefaultCompositionAssemblies.Concat(roslynV110AnalyzerDLL);
47+
var analyzers = Program.AddCustomAnalyzers(engine, ImmutableArray.Create(RoslynV110Analyzer));
48+
Assert.Equal(1, analyzers.Count());
4549
});
4650
}
4751

4852
[Fact]
4953
public void AnalyzersBuiltAgainstRoslynV111()
5054
{
51-
IEnumerable<Assembly> roslynV111AnalyzerDLL = new Assembly[] { RoslynV111Analyzer };
55+
IFormattingEngine engine = FormattingEngine.Create(DefaultCompositionAssemblies);
5256
Assert.DoesNotThrow(() => {
53-
var assemblies = DefaultCompositionAssemblies.Concat(roslynV111AnalyzerDLL);
57+
var analyzers = Program.AddCustomAnalyzers(engine, ImmutableArray.Create(RoslynV111Analyzer));
58+
Assert.Equal(1, analyzers.Count());
5459
});
5560
}
5661

5762
[Fact]
5863
public void AnalyzersBuiltAgainstRoslynV120Beta1()
5964
{
60-
IEnumerable<Assembly> roslynV120Beta1AnalyzerDLL = new Assembly[] { RoslynV120Beta1Analyzer };
65+
IFormattingEngine engine = FormattingEngine.Create(DefaultCompositionAssemblies);
66+
Assert.DoesNotThrow(() => {
67+
var analyzers = Program.AddCustomAnalyzers(engine, ImmutableArray.Create(RoslynV120Beta1Analyzer));
68+
Assert.Equal(1, analyzers.Count());
69+
});
70+
}
71+
72+
[Fact]
73+
public void AnalyzersBuiltAgainstRoslynV120()
74+
{
75+
IFormattingEngine engine = FormattingEngine.Create(DefaultCompositionAssemblies);
6176
Assert.DoesNotThrow(() => {
62-
var assemblies = DefaultCompositionAssemblies.Concat(roslynV120Beta1AnalyzerDLL);
77+
var analyzers = Program.AddCustomAnalyzers(engine, ImmutableArray.Create(RoslynV120VBAnalyzer));
78+
Assert.Equal(1, analyzers.Count());
6379
});
6480
}
6581
}

src/Microsoft.DotNet.CodeFormatting.Tests/Microsoft.DotNet.CodeFormatting.Tests.csproj

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,10 +146,21 @@
146146
<Analyzer Include="..\packages\Microsoft.CodeAnalysis.Analyzers.1.1.0\analyzers\dotnet\cs\Microsoft.CodeAnalysis.CSharp.Analyzers.dll" />
147147
</ItemGroup>
148148
<ItemGroup>
149-
<Content Include="TestAnalyzers\RoslynV120Beta1Analyzer.dll" />
150-
<Content Include="TestAnalyzers\RoslynV111Analyzer.dll" />
151-
<Content Include="TestAnalyzers\RoslynV110Analyzer.dll" />
152-
<Content Include="TestAnalyzers\RoslynV100Analyzer.dll" />
149+
<Content Include="TestAnalyzers\RoslynV120Beta1Analyzer.dll">
150+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
151+
</Content>
152+
<Content Include="TestAnalyzers\RoslynV111Analyzer.dll">
153+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
154+
</Content>
155+
<Content Include="TestAnalyzers\RoslynV110Analyzer.dll">
156+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
157+
</Content>
158+
<Content Include="TestAnalyzers\RoslynV100Analyzer.dll">
159+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
160+
</Content>
161+
<Content Include="TestAnalyzers\RoslynV120VBAnalyzer.dll">
162+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
163+
</Content>
153164
</ItemGroup>
154165
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
155166
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
Binary file not shown.

src/Microsoft.DotNet.CodeFormatting/FormattingEngineImplementation.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -298,9 +298,11 @@ private async Task FormatWithAnalyzersCoreAsync(Workspace workspace, ProjectId p
298298
foreach (var analyzer in analyzers)
299299
{
300300
var diags = await _compilationWithAnalyzers.GetAnalyzerDiagnosticsAsync(ImmutableArray.Create(analyzer), cancellationToken);
301+
301302
if (Verbose || LogOutputPath != null)
302303
{
303304
var analyzerTelemetryInfo = await _compilationWithAnalyzers.GetAnalyzerTelemetryInfoAsync(analyzer, cancellationToken);
305+
FormatLogger.WriteLine("{0}\t{1}\t{2}\t{3}", project.Name, analyzer.ToString(), diags.Count(), analyzerTelemetryInfo.ExecutionTime);
304306
var resultPath = Path.ChangeExtension(LogOutputPath + resultFile, "json");
305307
LogDiagnostics(resultPath, diags);
306308
}

0 commit comments

Comments
 (0)