Files

159 lines
5.4 KiB
C#

using Microsoft.CodeAnalysis.CSharp.Testing;
using Microsoft.CodeAnalysis.Testing;
using StevanFreeborn.AsyncSyncFlagAnalyzer.CodeFixes;
using VerifyCS = Microsoft.CodeAnalysis.CSharp.Testing.CSharpCodeFixVerifier<
StevanFreeborn.AsyncSyncFlagAnalyzer.SyncParameterAnalyzer,
StevanFreeborn.AsyncSyncFlagAnalyzer.CodeFixes.SyncParameterCodeFixProvider,
Microsoft.CodeAnalysis.Testing.DefaultVerifier>;
namespace StevanFreeborn.AsyncSyncFlagAnalyzer.Tests;
public class SyncParameterAnalyzerTests
{
[Fact]
public async Task WhenSyncIsPassedCorrectly_ItShouldNotReportDiagnostic()
{
var testData = await LoadTestDataAsync("WhenSyncIsPassedCorrectly");
await VerifyCS.VerifyAnalyzerAsync(testData);
}
[Fact]
public async Task WhenSyncIsPassedPositionally_ItShouldNotReportDiagnostic()
{
var testData = await LoadTestDataAsync("WhenSyncIsPassedPositionally");
await VerifyCS.VerifyAnalyzerAsync(testData);
}
[Fact]
public async Task WhenSyncIsPassedAsNamed_ItShouldNotReportDiagnostic()
{
var testData = await LoadTestDataAsync("WhenSyncIsPassedAsNamed");
await VerifyCS.VerifyAnalyzerAsync(testData);
}
[Fact]
public async Task WhenSyncIsOmitted_ItShouldReportDiagnosticAndApplyCodeFix()
{
var expectedDiagnostic = VerifyCS.Diagnostic("SYNC001")
.WithLocation(0)
.WithArguments("GetFrobCoreAsync", "sync", "GetCoreAsync");
var testData = await LoadTestDataAsync("WhenSyncIsOmitted");
var fixedData = await LoadTestDataAsync("WhenSyncIsOmitted_Fixed");
await VerifyCS.VerifyCodeFixAsync(testData, expectedDiagnostic, fixedData);
}
[Fact]
public async Task WhenSyncIsHardcodedFalse_ItShouldReportDiagnostic()
{
var expectedDiagnostic = VerifyCS.Diagnostic("SYNC001")
.WithLocation(0)
.WithArguments("GetFrobCoreAsync", "sync", "GetCoreAsync");
var testData = await LoadTestDataAsync("WhenSyncIsHardcodedFalse");
await VerifyCS.VerifyAnalyzerAsync(testData, expectedDiagnostic);
}
[Fact]
public async Task WhenSyncIsHardcodedFalse_ItShouldApplyCodeFix()
{
var expectedDiagnostic = VerifyCS.Diagnostic("SYNC001")
.WithLocation(0)
.WithArguments("GetFrobCoreAsync", "sync", "GetCoreAsync");
var testData = await LoadTestDataAsync("WhenSyncIsHardcodedFalse");
var fixedData = await LoadTestDataAsync("WhenSyncIsHardcodedFalse_Fixed");
await VerifyCS.VerifyCodeFixAsync(testData, expectedDiagnostic, fixedData);
}
[Fact]
public async Task WhenSyncIsPassedAsNamedHardcoded_ItShouldReplaceNamedArgument()
{
var expectedDiagnostic = VerifyCS.Diagnostic("SYNC001")
.WithLocation(0)
.WithArguments("GetFrobCoreAsync", "sync", "GetCoreAsync");
var testData = await LoadTestDataAsync("WhenSyncIsPassedAsNamedHardcoded");
var fixedData = await LoadTestDataAsync("WhenSyncIsPassedAsNamedHardcoded_Fixed");
await VerifyCS.VerifyCodeFixAsync(testData, expectedDiagnostic, fixedData);
}
[Fact]
public async Task WhenOuterMethodHasNoSyncParam_ItShouldNotReportDiagnostic()
{
var testData = await LoadTestDataAsync("WhenOuterMethodHasNoSyncParam");
await VerifyCS.VerifyAnalyzerAsync(testData);
}
[Fact]
public async Task WhenTargetHasNoSyncParam_ItShouldNotReportDiagnostic()
{
var testData = await LoadTestDataAsync("WhenTargetHasNoSyncParam");
await VerifyCS.VerifyAnalyzerAsync(testData);
}
[Fact]
public async Task WhenSyncIsOmitted_CustomName_ItShouldReportDiagnosticAndApplyCodeFix()
{
var expectedDiagnostic = VerifyCS.Diagnostic("SYNC001")
.WithLocation(0)
.WithArguments("GetFrobCoreAsync", "runSynchronously", "GetMoreDataAsync");
var testData = await LoadTestDataAsync("WhenSyncIsOmitted_CustomName");
var fixedData = await LoadTestDataAsync("WhenSyncIsOmitted_CustomName_Fixed");
var test = new CSharpCodeFixTest<SyncParameterAnalyzer, SyncParameterCodeFixProvider, DefaultVerifier>
{
TestCode = testData,
FixedCode = fixedData
};
test.TestState.AnalyzerConfigFiles.Add(("/.editorconfig", """
root = true
[*.cs]
dotnet_diagnostic.SYNC001.additional_sync_names = runSynchronously
"""));
test.ExpectedDiagnostics.Add(expectedDiagnostic);
await test.RunAsync();
}
[Fact]
public async Task WhenSyncIsOmitted_MultipleAwaits_OnlyOneShouldReportDiagnostic()
{
var expectedDiagnostic = VerifyCS.Diagnostic("SYNC001")
.WithLocation(0)
.WithArguments("GetFrobCoreAsync", "sync", "GetMoreDataAsync");
var testData = await LoadTestDataAsync("WhenSyncIsOmitted_MultipleAwaits");
var fixedData = await LoadTestDataAsync("WhenSyncIsOmitted_MultipleAwaits_Fixed");
await VerifyCS.VerifyCodeFixAsync(testData, expectedDiagnostic, fixedData);
}
[Fact]
public async Task WhenSyncIsNotLastTargetParameter_ItShouldReportDiagnosticAndApplyCodeFix()
{
var expectedDiagnostic = VerifyCS.Diagnostic("SYNC001")
.WithLocation(0)
.WithArguments("GetFrobCoreAsync", "sync", "GetDataAsync");
var testData = await LoadTestDataAsync("WhenSyncIsNotLastTargetParameter");
var fixedData = await LoadTestDataAsync("WhenSyncIsNotLastTargetParameter_Fixed");
await VerifyCS.VerifyCodeFixAsync(testData, expectedDiagnostic, fixedData);
}
private static async Task<string> LoadTestDataAsync(string name)
{
var path = Path.Combine(AppContext.BaseDirectory, "TestData", $"{name}.cs");
var text = await File.ReadAllTextAsync(path);
return text;
}
}