Skip to content

Commit 88e6b60

Browse files
authored
[Microsoft.Android.Sdk.Analysis] Add Unit Tests for Code Analyzers (#9492)
Context: 715a36a Context: dotnet/roslyn-sdk#1175 Commit 715a36a added and updated code compilation analyzers and suppressors, but was not able to add *unit tests* for them. Add unit test infrastructure and unit tests for the `DNAA0001` and `DNAS0001` messages. TODO: enable the `DNAS0001Tests.IDE0002IsSuppressed()` test [once we figure out how to actually run it][0]. [0]: dotnet/roslyn-sdk#1175 (comment)
1 parent b07a0c9 commit 88e6b60

18 files changed

+681
-4
lines changed

.vscode/settings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
"bin/Test*/**/net472/*.dll",
44
],
55
"cmake.configureOnOpen": false,
6-
"dotnetCoreExplorer.searchpatterns": "bin/Test{Debug,Release}/**/net6.0/{Xamarin.Android.Build.Tests,MSBuildDeviceIntegration}.dll",
6+
"dotnetCoreExplorer.searchpatterns": "bin/Test{Debug}/**/net?.0/{Xamarin.Android.Build.Tests,MSBuildDeviceIntegration,Microsoft.Android.Sdk.Analysis.Tests}.dll",
77
}

.vscode/tasks.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,20 @@
9797
"$msCompile"
9898
]
9999
},
100+
{
101+
"label": "Build Microsoft.Android.Sdk.Analysis Tests",
102+
"type": "shell",
103+
"windows": { "command": "dotnet-local.cmd build src/Microsoft.Android.Sdk.Analysis/Tests/Microsoft.Android.Sdk.Analysis.Tests.csproj -c ${input:configuration}", },
104+
"linux": { "command": "./dotnet-local.sh build src/Microsoft.Android.Sdk.Analysis/Tests/Microsoft.Android.Sdk.Analysis.Tests.csproj -c ${input:configuration}",},
105+
"osx": { "command": "./dotnet-local.sh build src/Microsoft.Android.Sdk.Analysis/Tests/Microsoft.Android.Sdk.Analysis.Tests.csproj -c ${input:configuration}",},
106+
"group": {
107+
"kind": "build",
108+
"isDefault": true
109+
},
110+
"problemMatcher": [
111+
"$msCompile"
112+
]
113+
},
100114
{
101115
"label": "build-emulator-checkboottimes",
102116
"type": "shell",

Xamarin.Android.Build.Tasks.sln

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,14 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Android.Build.Bas
2525
EndProject
2626
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Xamarin.Android.Tools.AndroidSdk", "external\xamarin-android-tools\src\Xamarin.Android.Tools.AndroidSdk\Xamarin.Android.Tools.AndroidSdk.csproj", "{E34BCFA0-CAA4-412C-AA1C-75DB8D67D157}"
2727
EndProject
28-
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{4A5EE838-A906-4711-972E-E680B0AA68BD}"
29-
EndProject
3028
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Android.Sdk.Analysis", "src\Microsoft.Android.Sdk.Analysis\Microsoft.Android.Sdk.Analysis.csproj", "{0D00DD34-3E94-4166-9DEE-12355E4C98A0}"
3129
EndProject
30+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src/Microsoft.Android.Sdk.Analysis", "src\Microsoft.Android.Sdk.Analysis", "{51DC774F-F0E2-4D4E-B600-ECA986E6DDEF}"
31+
EndProject
32+
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{C94E2376-716E-4183-9845-AFF254C5ADB7}"
33+
EndProject
34+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Android.Sdk.Analysis.Tests", "src\Microsoft.Android.Sdk.Analysis\Tests\Microsoft.Android.Sdk.Analysis.Tests.csproj", "{B54CE553-1105-45BE-ABC2-2D8ABC4B1099}"
35+
EndProject
3236
Global
3337
GlobalSection(SharedMSBuildProjectFiles) = preSolution
3438
src\Xamarin.Android.NamingCustomAttributes\Xamarin.Android.NamingCustomAttributes.projitems*{3f1f2f50-af1a-4a5a-bedb-193372f068d7}*SharedItemsImports = 5
@@ -82,6 +86,10 @@ Global
8286
{0D00DD34-3E94-4166-9DEE-12355E4C98A0}.Debug|Any CPU.Build.0 = Debug|Any CPU
8387
{0D00DD34-3E94-4166-9DEE-12355E4C98A0}.Release|Any CPU.ActiveCfg = Release|Any CPU
8488
{0D00DD34-3E94-4166-9DEE-12355E4C98A0}.Release|Any CPU.Build.0 = Release|Any CPU
89+
{B54CE553-1105-45BE-ABC2-2D8ABC4B1099}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
90+
{B54CE553-1105-45BE-ABC2-2D8ABC4B1099}.Debug|Any CPU.Build.0 = Debug|Any CPU
91+
{B54CE553-1105-45BE-ABC2-2D8ABC4B1099}.Release|Any CPU.ActiveCfg = Release|Any CPU
92+
{B54CE553-1105-45BE-ABC2-2D8ABC4B1099}.Release|Any CPU.Build.0 = Release|Any CPU
8593
EndGlobalSection
8694
GlobalSection(SolutionProperties) = preSolution
8795
HideSolutionNode = FALSE
@@ -92,7 +100,8 @@ Global
92100
{DE40756E-57F6-4AF2-B155-55E3A88CCED8} = {385E71CC-BAE5-488B-805E-ACAE55F01DF5}
93101
{3DE17662-DCD6-4F49-AF06-D39AACC8649A} = {385E71CC-BAE5-488B-805E-ACAE55F01DF5}
94102
{E34BCFA0-CAA4-412C-AA1C-75DB8D67D157} = {385E71CC-BAE5-488B-805E-ACAE55F01DF5}
95-
{0D00DD34-3E94-4166-9DEE-12355E4C98A0} = {4A5EE838-A906-4711-972E-E680B0AA68BD}
103+
{0D00DD34-3E94-4166-9DEE-12355E4C98A0} = {51DC774F-F0E2-4D4E-B600-ECA986E6DDEF}
104+
{B54CE553-1105-45BE-ABC2-2D8ABC4B1099} = {51DC774F-F0E2-4D4E-B600-ECA986E6DDEF}
96105
EndGlobalSection
97106
GlobalSection(ExtensibilityGlobals) = postSolution
98107
SolutionGuid = {F32556C5-6FD4-4F1D-884A-DEDF2EE865F6}

build-tools/automation/azure-pipelines.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,14 @@ extends:
151151
displayName: prepare java.interop $(XA.Build.Configuration)
152152
continueOnError: false
153153

154+
- template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml@self
155+
parameters:
156+
command: test
157+
project: src/Microsoft.Android.Sdk.Analysis/Tests/Microsoft.Android.Sdk.Analysis.Tests.csproj
158+
arguments: -c $(XA.Build.Configuration)
159+
displayName: Test Microsoft.Android.Sdk.Analysis $(XA.Build.Configuration)
160+
continueOnError: false
161+
154162
- template: /build-tools/automation/yaml-templates/start-stop-emulator.yaml@self
155163

156164
- template: /build-tools/automation/yaml-templates/apk-instrumentation.yaml@self

build-tools/automation/yaml-templates/build-windows.yaml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,14 @@ stages:
8383
testAssembly: $(System.DefaultWorkingDirectory)\bin\Test$(XA.Build.Configuration)\$(DotNetStableTargetFramework)\Xamarin.Android.Build.Tests.dll
8484
dotNetTestExtraArgs: --filter "TestCategory = SmokeTests"
8585

86+
- template: /build-tools/automation/yaml-templates/run-dotnet-preview.yaml@self
87+
parameters:
88+
command: test
89+
project: src/Microsoft.Android.Sdk.Analysis/Tests/Microsoft.Android.Sdk.Analysis.Tests.csproj
90+
arguments: -c $(XA.Build.Configuration)
91+
displayName: Test Microsoft.Android.Sdk.Analysis $(XA.Build.Configuration)
92+
continueOnError: false
93+
8694
- task: BatchScript@1
8795
displayName: Test dotnet-local.cmd - create template
8896
inputs:

src/Microsoft.Android.Sdk.Analysis/Microsoft.Android.Sdk.Analysis.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
<PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" PrivateAssets="all" />
1515
<PackageReference Include="Microsoft.CodeAnalysis.Workspaces.Common" Version="4.11.0" PrivateAssets="all" />
1616
</ItemGroup>
17+
<ItemGroup>
18+
<Compile Remove="Tests/**" />
19+
</ItemGroup>
1720
<ItemGroup>
1821
<Compile Update="Properties\Resources.Designer.cs">
1922
<DesignTime>True</DesignTime>
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
2+
Microsoft Visual Studio Solution File, Format Version 12.00
3+
# Visual Studio Version 17
4+
VisualStudioVersion = 17.5.002.0
5+
MinimumVisualStudioVersion = 10.0.40219.1
6+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Android.Sdk.Analysis", "Microsoft.Android.Sdk.Analysis.csproj", "{17B5155B-2FDD-44C1-8B04-5962E4E495FF}"
7+
EndProject
8+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Android.Sdk.Analysis.Tests", "Tests\Microsoft.Android.Sdk.Analysis.Tests.csproj", "{D6D22CF6-38D3-40BB-BDF7-35AD52E3F4EB}"
9+
EndProject
10+
Global
11+
GlobalSection(SolutionConfigurationPlatforms) = preSolution
12+
Debug|Any CPU = Debug|Any CPU
13+
Release|Any CPU = Release|Any CPU
14+
EndGlobalSection
15+
GlobalSection(ProjectConfigurationPlatforms) = postSolution
16+
{17B5155B-2FDD-44C1-8B04-5962E4E495FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
17+
{17B5155B-2FDD-44C1-8B04-5962E4E495FF}.Debug|Any CPU.Build.0 = Debug|Any CPU
18+
{17B5155B-2FDD-44C1-8B04-5962E4E495FF}.Release|Any CPU.ActiveCfg = Release|Any CPU
19+
{17B5155B-2FDD-44C1-8B04-5962E4E495FF}.Release|Any CPU.Build.0 = Release|Any CPU
20+
{D6D22CF6-38D3-40BB-BDF7-35AD52E3F4EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
21+
{D6D22CF6-38D3-40BB-BDF7-35AD52E3F4EB}.Debug|Any CPU.Build.0 = Debug|Any CPU
22+
{D6D22CF6-38D3-40BB-BDF7-35AD52E3F4EB}.Release|Any CPU.ActiveCfg = Release|Any CPU
23+
{D6D22CF6-38D3-40BB-BDF7-35AD52E3F4EB}.Release|Any CPU.Build.0 = Release|Any CPU
24+
EndGlobalSection
25+
GlobalSection(SolutionProperties) = preSolution
26+
HideSolutionNode = FALSE
27+
EndGlobalSection
28+
GlobalSection(ExtensibilityGlobals) = postSolution
29+
SolutionGuid = {FD887DCA-0FA8-4A48-981F-18F7921C272F}
30+
EndGlobalSection
31+
EndGlobal
Lines changed: 178 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,178 @@
1+
using System;
2+
using NUnit.Framework;
3+
using System.Threading.Tasks;
4+
using Microsoft.CodeAnalysis.Testing;
5+
using VerifyCS = CSharpCodeFixVerifier <CustomApplicationAnalyzer, CustomApplicationCodeFixProvider>;
6+
7+
[TestFixture]
8+
public class DNAA0001Tests
9+
{
10+
[Test]
11+
public async Task DNAA0001DoesNotShow ()
12+
{
13+
var test = @"";
14+
await VerifyCS.VerifyAnalyzerAsync (test);
15+
}
16+
17+
[Test]
18+
[TestCase ("JniHandleOwnership")]
19+
[TestCase ("Android.Runtime.JniHandleOwnership")]
20+
public async Task DNAA0001DoesNotShowForExistingCode (string type)
21+
{
22+
var test = $@"
23+
using System;
24+
using Android.App;
25+
using Android.Runtime;
26+
namespace ConsoleApplication1
27+
{{
28+
public class Foo : Application
29+
{{
30+
public Foo(IntPtr javaReference, {type} transfer) : base(javaReference, transfer)
31+
{{
32+
}}
33+
}}
34+
}}
35+
namespace Android.Runtime {{
36+
public enum JniHandleOwnership {{
37+
None,
38+
}};
39+
}}
40+
namespace Android.App {{
41+
using Android.Runtime;
42+
public class Application {{
43+
public Application () {{}}
44+
protected Application (IntPtr handle, JniHandleOwnership transfer) {{
45+
}}
46+
}}
47+
}}
48+
";
49+
await VerifyCS.VerifyAnalyzerAsync (test);
50+
}
51+
52+
[Test]
53+
public async Task DNAA0001IsShownWhenUsingFullyQualifiedType ()
54+
{
55+
var brokenCode = @"
56+
using System;
57+
using System.Diagnostics;
58+
using Android.App;
59+
60+
namespace ConsoleApplication1
61+
{
62+
public class Foo : Application
63+
{
64+
}
65+
}
66+
namespace Android.Runtime {
67+
public enum JniHandleOwnership {
68+
None,
69+
};
70+
}
71+
namespace Android.App {
72+
public class Application {
73+
public Application () {}
74+
protected Application (IntPtr handle, Android.Runtime.JniHandleOwnership transfer)
75+
{
76+
}
77+
}
78+
}
79+
";
80+
var expected = VerifyCS.Diagnostic ().WithSpan (8, 15, 8, 18).WithArguments ("Foo");
81+
await VerifyCS.VerifyAnalyzerAsync (brokenCode, expected);
82+
}
83+
84+
[Test]
85+
public async Task DNAA0001IsShownWhen ()
86+
{
87+
var brokenCode = @"
88+
using System;
89+
using System.Diagnostics;
90+
using Android.App;
91+
92+
namespace ConsoleApplication1
93+
{
94+
public class Foo : Application
95+
{
96+
}
97+
}
98+
namespace Android.Runtime {
99+
public enum JniHandleOwnership {
100+
None,
101+
};
102+
}
103+
namespace Android.App {
104+
using Android.Runtime;
105+
public class Application {
106+
public Application () {}
107+
protected Application (IntPtr handle, JniHandleOwnership transfer)
108+
{
109+
}
110+
}
111+
}
112+
";
113+
var expected = VerifyCS.Diagnostic ().WithSpan (8, 15, 8, 18).WithArguments ("Foo");
114+
await VerifyCS.VerifyAnalyzerAsync (brokenCode, expected);
115+
}
116+
117+
[Test]
118+
public async Task DNAA0001IsFixed()
119+
{
120+
var brokenCode = @"
121+
using System;
122+
using Android.App;
123+
namespace ConsoleApplication1
124+
{
125+
public class Foo : Application
126+
{
127+
}
128+
}
129+
namespace Android.Runtime {
130+
public enum JniHandleOwnership {
131+
None,
132+
};
133+
}
134+
namespace Android.App {
135+
using Android.Runtime;
136+
public class Application {
137+
public Application () {}
138+
protected Application (IntPtr handle, JniHandleOwnership transfer)
139+
{
140+
}
141+
}
142+
}
143+
";
144+
145+
// DO NOT Change the format of the code below or the test will fail.
146+
// The generator does not respect existing code formatting.
147+
var expectedFixedCode = @"
148+
using System;
149+
using Android.App;
150+
namespace ConsoleApplication1
151+
{
152+
public class Foo : Application
153+
{
154+
public Foo(IntPtr javaReference, Android.Runtime.JniHandleOwnership transfer) : base(javaReference, transfer)
155+
{
156+
}
157+
}
158+
}
159+
namespace Android.Runtime {
160+
public enum JniHandleOwnership {
161+
None,
162+
};
163+
}
164+
namespace Android.App {
165+
using Android.Runtime;
166+
public class Application {
167+
public Application () {}
168+
protected Application (IntPtr handle, JniHandleOwnership transfer)
169+
{
170+
}
171+
}
172+
}
173+
";
174+
175+
var expected = VerifyCS.Diagnostic ("DNAA0001").WithSpan (6, 15, 6, 18).WithArguments ("Foo");
176+
await VerifyCS.VerifyCodeFixAsync (brokenCode, expected, expectedFixedCode);
177+
}
178+
}

0 commit comments

Comments
 (0)