Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/linker.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTlakaelel Axayakatl Ceja <tlakaelel.ceja@microsoft.com>2020-12-03 22:28:31 +0300
committerGitHub <noreply@github.com>2020-12-03 22:28:31 +0300
commitb24d0e663d5bf4772b0896e2bc3dab3391fae744 (patch)
tree10a6ddd24aef9c081ca0f87de879908b0931b49b /test/ILLink.RoslynAnalyzer.Tests
parent4ddaa381cb8b374ce07598250197dcfc728455c2 (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.cs77
-rw-r--r--test/ILLink.RoslynAnalyzer.Tests/LinkerTestCases.cs5
-rw-r--r--test/ILLink.RoslynAnalyzer.Tests/TestCaseUtils.cs18
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);