Skip to content

Commit

Permalink
Fix coverage for ArgumentDescriptor.cs
Browse files Browse the repository at this point in the history
  • Loading branch information
gregory-paidis-sonarsource authored and costin-zaharia-sonarsource committed May 14, 2024
1 parent d1e28bb commit e0d6cf2
Showing 1 changed file with 97 additions and 7 deletions.
104 changes: 97 additions & 7 deletions analyzers/tests/SonarAnalyzer.Test/Trackers/ArgumentTrackerTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/

using System.ComponentModel;
using Microsoft.CodeAnalysis.Text;
using SonarAnalyzer.Extensions;
using SonarAnalyzer.Helpers.Trackers;
Expand Down Expand Up @@ -1144,6 +1145,58 @@ public void M(System.Diagnostics.ProcessStartInfo processStartInfo)
result.Should().BeTrue();
}

[DataTestMethod]
[DataRow("""this[$$"TEMP"]""", true)]
[DataRow("""this[42, $$"TEMP"]""", false)]
[DataRow("""this[42, 43, $$"TEMP"]""", true)]
public void Indexer_ConditionalPosition(string expression, bool expectedResult)
{
var snippet = $$"""
public class Test
{
public int this[string key] => 0;
public int this[int a, string key] => 0;
public int this[int a, int b, string key] => 0;

public void M()
{
_ = {{expression}};
}
}
""";
var context = ArgumentContextCS(snippet);
var descriptor = ArgumentDescriptor.ElementAccess(
new KnownType("Test"),
x => x.Name == "key",
x => x is 0 or 2);
var result = MatchArgumentCS(context, descriptor);
result.Should().Be(expectedResult);
}

[DataTestMethod]
[DataRow("System.Int32", false)]
[DataRow("System.Collections.Generic.IDictionary", true)]
public void Indexer_WrongKnownType(string type, bool expectedResult)
{
var snippet = $$"""
public class Test
{
public void M(System.Diagnostics.ProcessStartInfo psi)
{
_ = psi.Environment?[key: $$"TEMP"];
}
}
""";
var context = ArgumentContextCS(snippet);
var descriptor = ArgumentDescriptor.ElementAccess(
new(type, "TKey", "TValue"),
"Environment",
x => x.Name == "key",
0);
var result = MatchArgumentCS(context, descriptor);
result.Should().Be(expectedResult);
}

#if NET

[TestMethod]
Expand Down Expand Up @@ -1205,7 +1258,7 @@ End Class
[DataRow("""[Designer(designerBaseTypeName: "designerBaseTypeName", $$designerTypeName: "designerTypeName")]""", "designerTypeName", 1)]
[DataRow("""[Designer($$"designerTypeName"$$, "designerBaseTypeName"), DesignerCategory("Form")]""", "designerTypeName", 0)]
[DataRow("""[DesignerCategory("Form"), Designer($$"designerTypeName"$$, "designerBaseTypeName")]""", "designerTypeName", 0)]
public void Attribute_Attribute_ConstructorParameters(string attribute, string parameterName, int descriptorPosition)
public void Attribute_ConstructorParameters(string attribute, string parameterName, int descriptorPosition)
{
var snippet = $$"""
using System.ComponentModel;
Expand All @@ -1225,6 +1278,43 @@ public void M()
result.Should().BeTrue();
}

[TestMethod]
public void Attribute_PropertySetter_WrongMethod()
{
var snippet = $$"""
[Designer($$designerTypeName = "hey")]
public class Test { }

public class Designer : System.Attribute
{
public string designerTypeName { get; set; }
}
""";
var context = ArgumentContextCS(snippet);

// This should call AttributeProperty, not AttributeArgument.
var descriptor = ArgumentDescriptor.AttributeArgument("Designer", "designerTypeName", 0);
var result = MatchArgumentCS(context, descriptor);
result.Should().BeFalse();
}

[TestMethod]
public void Attribute_ConstructorParameters_WrongMethod()
{
var snippet = $$"""
[Designer($$"value")]
public class Test { }

public class Designer(string designerTypeName) : System.Attribute { }
""";
var context = ArgumentContextCS(snippet);

// This should call AttributeArgument, no AttributeProperty.
var descriptor = ArgumentDescriptor.AttributeProperty("Designer", "designerTypeName");
var result = MatchArgumentCS(context, descriptor);
result.Should().BeFalse();
}

[DataTestMethod]
[DataRow("""<Designer($$"designerTypeName")>""", "designerTypeName", 0)]
[DataRow("""<DesignerAttribute($$"designerTypeName")>""", "designerTypeName", 0)]
Expand Down Expand Up @@ -1328,6 +1418,12 @@ End Sub
End Class
""";

private static ArgumentContext ArgumentContextCS(string snippet) =>
ArgumentContext(snippet, TestHelper.CompileCS, typeof(CS.ArgumentSyntax), typeof(CS.AttributeArgumentSyntax));

private static ArgumentContext ArgumentContextVB(string snippet) =>
ArgumentContext(snippet, TestHelper.CompileVB, typeof(VB.ArgumentSyntax));

private static ArgumentContext ArgumentContext(string snippet,
Func<string, MetadataReference[], (SyntaxTree Tree, SemanticModel Model)> compile, params Type[] descriptorNodeTypes)
{
Expand All @@ -1345,12 +1441,6 @@ End Class
return new(node, model);
}

private static ArgumentContext ArgumentContextCS(string snippet) =>
ArgumentContext(snippet, TestHelper.CompileCS, typeof(CS.ArgumentSyntax), typeof(CS.AttributeArgumentSyntax));

private static ArgumentContext ArgumentContextVB(string snippet) =>
ArgumentContext(snippet, TestHelper.CompileVB, typeof(VB.ArgumentSyntax));

private static bool MatchArgumentCS(ArgumentContext context, ArgumentDescriptor descriptor) =>
MatchArgument<CSharpArgumentTracker, Microsoft.CodeAnalysis.CSharp.SyntaxKind>(context, descriptor);

Expand Down

0 comments on commit e0d6cf2

Please sign in to comment.