diff options
author | Tlakaelel Axayakatl Ceja <tlakaelel.ceja@microsoft.com> | 2020-12-03 22:28:31 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-03 22:28:31 +0300 |
commit | b24d0e663d5bf4772b0896e2bc3dab3391fae744 (patch) | |
tree | 10a6ddd24aef9c081ca0f87de879908b0931b49b /test/ILLink.RoslynAnalyzer.Tests | |
parent | 4ddaa381cb8b374ce07598250197dcfc728455c2 (diff) |
Roslyn analyzer improvements (#1622)
* Add supported diagnostics for when we use Url named argument
* Add support for Expected Warning
* Use single format for Resource file
* Dont execute test that used another diagnostic id that is not 2026
* Change formats in the linker for setters and getters to match C# format
* Use GetSignature in method instead of ToString()
Diffstat (limited to 'test/ILLink.RoslynAnalyzer.Tests')
-rw-r--r-- | test/ILLink.RoslynAnalyzer.Tests/AnalyzerTests.cs | 77 | ||||
-rw-r--r-- | test/ILLink.RoslynAnalyzer.Tests/LinkerTestCases.cs | 5 | ||||
-rw-r--r-- | test/ILLink.RoslynAnalyzer.Tests/TestCaseUtils.cs | 18 |
3 files changed, 93 insertions, 7 deletions
diff --git a/test/ILLink.RoslynAnalyzer.Tests/AnalyzerTests.cs b/test/ILLink.RoslynAnalyzer.Tests/AnalyzerTests.cs index 04d87a854..fc1ee182d 100644 --- a/test/ILLink.RoslynAnalyzer.Tests/AnalyzerTests.cs +++ b/test/ILLink.RoslynAnalyzer.Tests/AnalyzerTests.cs @@ -14,7 +14,7 @@ namespace ILLink.RoslynAnalyzer.Tests [Fact] public Task SimpleDiagnostic () { - var src = @" + var TestRequiresWithMessageOnlyOnMethod = @" using System.Diagnostics.CodeAnalysis; class C @@ -23,9 +23,80 @@ class C int M1() => 0; int M2() => M1(); }"; - return VerifyCS.VerifyAnalyzerAsync (src, + return VerifyCS.VerifyAnalyzerAsync (TestRequiresWithMessageOnlyOnMethod, // (8,17): warning IL2026: Calling 'System.Int32 C::M1()' which has `RequiresUnreferencedCodeAttribute` can break functionality when trimming application code. message. - VerifyCS.Diagnostic ().WithSpan (8, 17, 8, 21).WithArguments ("C.M1()", "message") + VerifyCS.Diagnostic ().WithSpan (8, 17, 8, 21).WithArguments ("C.M1()", "message", "") + ); + } + + [Fact] + public Task TestRequiresWithMessageAndUrlOnMethod () + { + var MessageAndUrlOnMethod = @" +using System.Diagnostics.CodeAnalysis; + +class C +{ + static void TestRequiresWithMessageAndUrlOnMethod () + { + RequiresWithMessageAndUrl (); + } + [RequiresUnreferencedCode (""Message for --RequiresWithMessageAndUrl--"", Url = ""https://helpurl"")] + static void RequiresWithMessageAndUrl () + { + } +}"; + return VerifyCS.VerifyAnalyzerAsync (MessageAndUrlOnMethod, + // (8,3): warning IL2026: Calling 'C.RequiresWithMessageAndUrl()' which has `RequiresUnreferencedCodeAttribute` can break functionality when trimming application code. Message for --RequiresWithMessageAndUrl--. + VerifyCS.Diagnostic ().WithSpan (8, 3, 8, 31).WithArguments ("C.RequiresWithMessageAndUrl()", "Message for --RequiresWithMessageAndUrl--", "https://helpurl") + ); + } + + [Fact] + public Task TestRequiresOnPropertyGetter () + { + var PropertyRequires = @" +using System.Diagnostics.CodeAnalysis; + +class C +{ + static void TestRequiresOnPropertyGetter () + { + _ = PropertyRequires; + } + + static int PropertyRequires { + [RequiresUnreferencedCode (""Message for --getter PropertyRequires--"")] + get { return 42; } + } +}"; + return VerifyCS.VerifyAnalyzerAsync (PropertyRequires, + // (8,7): warning IL2026: Calling 'C.PropertyRequires.get' which has `RequiresUnreferencedCodeAttribute` can break functionality when trimming application code. Message for --getter PropertyRequires--. + VerifyCS.Diagnostic ().WithSpan (8, 7, 8, 23).WithArguments ("C.PropertyRequires.get", "Message for --getter PropertyRequires--", "") + ); + } + + [Fact] + public Task TestRequiresOnPropertySetter () + { + var PropertyRequires = @" +using System.Diagnostics.CodeAnalysis; + +class C +{ + static void TestRequiresOnPropertySetter () + { + PropertyRequires = 0; + } + + static int PropertyRequires { + [RequiresUnreferencedCode (""Message for --setter PropertyRequires--"")] + set { } + } +}"; + return VerifyCS.VerifyAnalyzerAsync (PropertyRequires, + // (8,3): warning IL2026: Calling 'C.PropertyRequires.set' which has `RequiresUnreferencedCodeAttribute` can break functionality when trimming application code. Message for --setter PropertyRequires--. + VerifyCS.Diagnostic ().WithSpan (8, 3, 8, 19).WithArguments ("C.PropertyRequires.set", "Message for --setter PropertyRequires--", "") ); } } diff --git a/test/ILLink.RoslynAnalyzer.Tests/LinkerTestCases.cs b/test/ILLink.RoslynAnalyzer.Tests/LinkerTestCases.cs index fe21ab18d..e63d2c02f 100644 --- a/test/ILLink.RoslynAnalyzer.Tests/LinkerTestCases.cs +++ b/test/ILLink.RoslynAnalyzer.Tests/LinkerTestCases.cs @@ -21,12 +21,9 @@ namespace ILLink.RoslynAnalyzer.Tests { switch (m.Identifier.ValueText) { case "RequiresAndCallsOtherRequiresMethods": - case "TestRequiresWithMessageAndUrlOnMethod": - // Test failures because analyzer support is not complete - // Skip for now + case "MethodWithDuplicateRequiresAttribute": return; } - RunTest (m, attrs); } } diff --git a/test/ILLink.RoslynAnalyzer.Tests/TestCaseUtils.cs b/test/ILLink.RoslynAnalyzer.Tests/TestCaseUtils.cs index 8deb3f7d3..003823c02 100644 --- a/test/ILLink.RoslynAnalyzer.Tests/TestCaseUtils.cs +++ b/test/ILLink.RoslynAnalyzer.Tests/TestCaseUtils.cs @@ -11,6 +11,7 @@ using System.Runtime.CompilerServices; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; +using Mono.Linker.Tests.Cases.Expectations.Assertions; using Xunit; namespace ILLink.RoslynAnalyzer.Tests @@ -43,6 +44,7 @@ namespace ILLink.RoslynAnalyzer.Tests static bool IsWellKnown (AttributeSyntax attr) { switch (attr.Name.ToString ()) { + case "ExpectedWarning": case "LogContains": case "LogDoesNotContain": return true; @@ -60,6 +62,22 @@ namespace ILLink.RoslynAnalyzer.Tests .Select (d => d.GetMessage ()); foreach (var attr in attrs) { switch (attr.Name.ToString ()) { + case "ExpectedWarning": + var expectedMessageContains = attr.ArgumentList!.Arguments.Select (m => GetStringFromExpr (m.Expression)).ToList (); + if (!expectedMessageContains[0].StartsWith ("IL")) + break; + expectedMessageContains.RemoveAt (0); + Assert.True ( + filtered.Any (mc => { + foreach (var expectedMessage in expectedMessageContains) { + if (!mc.Contains (expectedMessage)) + return false; + } + return true; + }), + $"Expected to find warning containing:{string.Join (" ", expectedMessageContains.Select (m => "'" + m + "'"))}" + + $", but no such message was found.{ Environment.NewLine}In diagnostics: {string.Join (Environment.NewLine, filtered)}"); + break; case "LogContains": { var arg = Assert.Single (attr.ArgumentList!.Arguments); var text = GetStringFromExpr (arg.Expression); |