From 15fb7d225ae16de10725b4d0e6e1afcb52e02cb9 Mon Sep 17 00:00:00 2001 From: Manfred Brands Date: Mon, 13 Jul 2020 20:40:03 +0800 Subject: [PATCH] #258: Deal with untyped Tasks --- .../EqualToIncompatibleTypesAnalyzerTests.cs | 21 +++++++++++++++++++ .../NullConstraintUsageAnalyzerTests.cs | 11 ++++++++++ src/nunit.analyzers.tests/TestUtility.cs | 9 ++++++++ src/nunit.analyzers/Helpers/AssertHelper.cs | 2 +- 4 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/nunit.analyzers.tests/EqualToIncompatibleTypes/EqualToIncompatibleTypesAnalyzerTests.cs b/src/nunit.analyzers.tests/EqualToIncompatibleTypes/EqualToIncompatibleTypesAnalyzerTests.cs index cda7ba6b..50689b26 100644 --- a/src/nunit.analyzers.tests/EqualToIncompatibleTypes/EqualToIncompatibleTypesAnalyzerTests.cs +++ b/src/nunit.analyzers.tests/EqualToIncompatibleTypes/EqualToIncompatibleTypesAnalyzerTests.cs @@ -809,5 +809,26 @@ public void NoDiagnosticWhenCombinedConstraintAndUseAllOperator() AnalyzerAssert.Valid(analyzer, testCode); } + + [Test] + public void NoDiagnosticWhenComparingTask() + { + var testCode = TestUtility.WrapInAsyncTestMethod(@" + Task wait = Task.CompletedTask; + Assert.That(await Task.WhenAny(wait).ConfigureAwait(false), Is.EqualTo(wait));"); + + AnalyzerAssert.Valid(analyzer, testCode); + } + + [Test] + public void NoDiagnosticWhenComparingTask2() + { + var testCode = TestUtility.WrapInTestMethod(@" + Task task1 = Task.CompletedTask; + Task task2 = Task.CompletedTask; + Assert.That(task1, Is.SameAs(task2));"); + + AnalyzerAssert.Valid(analyzer, testCode); + } } } diff --git a/src/nunit.analyzers.tests/NullConstraintUsage/NullConstraintUsageAnalyzerTests.cs b/src/nunit.analyzers.tests/NullConstraintUsage/NullConstraintUsageAnalyzerTests.cs index 16bf45f5..afc1869c 100644 --- a/src/nunit.analyzers.tests/NullConstraintUsage/NullConstraintUsageAnalyzerTests.cs +++ b/src/nunit.analyzers.tests/NullConstraintUsage/NullConstraintUsageAnalyzerTests.cs @@ -84,5 +84,16 @@ public void TestMethod() AnalyzerAssert.Valid(analyzer, testCode); } + + [TestCase("Is.Null")] + [TestCase("Is.Not.Null")] + public void ValidWhenActualIsTask(string constraint) + { + var testCode = TestUtility.WrapInTestMethod($@" + var task = Task.CompletedTask; + Assert.That(task, {constraint});"); + + AnalyzerAssert.Valid(analyzer, testCode); + } } } diff --git a/src/nunit.analyzers.tests/TestUtility.cs b/src/nunit.analyzers.tests/TestUtility.cs index 063a8f9d..75c7d691 100644 --- a/src/nunit.analyzers.tests/TestUtility.cs +++ b/src/nunit.analyzers.tests/TestUtility.cs @@ -39,5 +39,14 @@ public void TestMethod() {{{code} }}", additionalUsings); } + + internal static string WrapInAsyncTestMethod(string code, string additionalUsings = null) + { + return WrapMethodInClassNamespaceAndAddUsings($@" + [Test] + public async Task TestMethod() + {{{code} + }}", additionalUsings); + } } } diff --git a/src/nunit.analyzers/Helpers/AssertHelper.cs b/src/nunit.analyzers/Helpers/AssertHelper.cs index b39f46ee..1e7fe3c5 100644 --- a/src/nunit.analyzers/Helpers/AssertHelper.cs +++ b/src/nunit.analyzers/Helpers/AssertHelper.cs @@ -46,7 +46,7 @@ public static ITypeSymbol UnwrapActualType(ITypeSymbol actualType) if (actualType is INamedTypeSymbol namedType && namedType.DelegateInvokeMethod != null) actualType = namedType.DelegateInvokeMethod.ReturnType; - if (actualType.IsAwaitable(out var awaitReturnType)) + if (actualType.IsAwaitable(out var awaitReturnType) && awaitReturnType.SpecialType != SpecialType.System_Void) actualType = awaitReturnType; return actualType;