From 4ded29daf68726ba1e62ea2ade26236fb9c6a779 Mon Sep 17 00:00:00 2001 From: Antonio Aversa Date: Tue, 30 Jan 2024 12:43:47 +0100 Subject: [PATCH 1/6] SyntaxNodeExtensions: increase GetBody coverage --- .../Extensions/SyntaxNodeExtensionsTest.cs | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/analyzers/tests/SonarAnalyzer.Test/Extensions/SyntaxNodeExtensionsTest.cs b/analyzers/tests/SonarAnalyzer.Test/Extensions/SyntaxNodeExtensionsTest.cs index e365f9368d2..57fb2f960f5 100644 --- a/analyzers/tests/SonarAnalyzer.Test/Extensions/SyntaxNodeExtensionsTest.cs +++ b/analyzers/tests/SonarAnalyzer.Test/Extensions/SyntaxNodeExtensionsTest.cs @@ -23,6 +23,7 @@ using FluentAssertions.Extensions; using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.CodeAnalysis.Operations; using Microsoft.CodeAnalysis.Text; using SonarAnalyzer.CFG.Roslyn; @@ -172,6 +173,40 @@ public void GetDeclarationTypeName_RecordStruct() => public void GetDeclarationTypeName_Struct() => ExtensionsCS.GetDeclarationTypeName(SyntaxFactory.StructDeclaration("MyStruct")).Should().Be("struct"); + [TestMethod] + public void GetBody_FieldDeclaration() + { + ExtensionsCS.GetBody(SyntaxFactory.FieldDeclaration(SyntaxFactory.VariableDeclaration(SyntaxFactory.ParseTypeName("int")))).Should().BeNull(); + } + + [TestMethod] + public void GetBody_PropertyDeclaration_SingleAccessor() + { + var code = "class AClass { int APropertyWithGetOnly { get => 42; } }"; + ExtensionsCS.GetBody(CSharpSyntaxTree.ParseText(code).Single()).Should().BeNull(); + } + + [TestMethod] + public void GetBody_PropertyDeclaration_MultipleAccessors() + { + var code = "class AClass { int APropertyWithGetOnly { get => 42; set { } } }"; + ExtensionsCS.GetBody(CSharpSyntaxTree.ParseText(code).Single()).Should().BeNull(); + } + + [TestMethod] + public void GetBody_AccessorDeclaration_ArrowExpression() + { + var code = "class AClass { int APropertyWithGetOnly { get => 42; } }"; + ExtensionsCS.GetBody(CSharpSyntaxTree.ParseText(code).Single()).Should().BeNull(); + } + + [TestMethod] + public void GetBody_AccessorDeclaration_BodyBlock() + { + var code = "class AClass { int APropertyWithGetOnly { set { } } }"; + ExtensionsCS.GetBody(CSharpSyntaxTree.ParseText(code).Single()).Should().NotBeNull(); + } + [TestMethod] public void CreateCfg_MethodDeclaration_ReturnsCfg_CS() { @@ -230,7 +265,7 @@ public void CreateCfg_FieldInitializerWithoutOperation_ReturnsCfg_CS() const string code = """ public class Sample { - private string field = null!; // null! itself doens't have operation, and we can still generate CFG for it from the equals clause + private string field = null!; // null! itself doesn't have operation, and we can still generate CFG for it from the equals clause } """; CreateCfgCS(code).Should().NotBeNull(); From 9ebc49dd4811f2156144047b88a36ed8c498e641 Mon Sep 17 00:00:00 2001 From: Antonio Aversa Date: Tue, 30 Jan 2024 13:16:40 +0100 Subject: [PATCH 2/6] Fix naming --- .../Extensions/SyntaxNodeExtensionsTest.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/analyzers/tests/SonarAnalyzer.Test/Extensions/SyntaxNodeExtensionsTest.cs b/analyzers/tests/SonarAnalyzer.Test/Extensions/SyntaxNodeExtensionsTest.cs index 57fb2f960f5..68e821dd4d4 100644 --- a/analyzers/tests/SonarAnalyzer.Test/Extensions/SyntaxNodeExtensionsTest.cs +++ b/analyzers/tests/SonarAnalyzer.Test/Extensions/SyntaxNodeExtensionsTest.cs @@ -182,28 +182,28 @@ public void GetBody_FieldDeclaration() [TestMethod] public void GetBody_PropertyDeclaration_SingleAccessor() { - var code = "class AClass { int APropertyWithGetOnly { get => 42; } }"; + var code = "class AClass { int AProperty { get => 42; } }"; ExtensionsCS.GetBody(CSharpSyntaxTree.ParseText(code).Single()).Should().BeNull(); } [TestMethod] public void GetBody_PropertyDeclaration_MultipleAccessors() { - var code = "class AClass { int APropertyWithGetOnly { get => 42; set { } } }"; + var code = "class AClass { int AProperty { get => 42; set { } } }"; ExtensionsCS.GetBody(CSharpSyntaxTree.ParseText(code).Single()).Should().BeNull(); } [TestMethod] public void GetBody_AccessorDeclaration_ArrowExpression() { - var code = "class AClass { int APropertyWithGetOnly { get => 42; } }"; + var code = "class AClass { int AProperty { get => 42; } }"; ExtensionsCS.GetBody(CSharpSyntaxTree.ParseText(code).Single()).Should().BeNull(); } [TestMethod] public void GetBody_AccessorDeclaration_BodyBlock() { - var code = "class AClass { int APropertyWithGetOnly { set { } } }"; + var code = "class AClass { int AProperty { set { } } }"; ExtensionsCS.GetBody(CSharpSyntaxTree.ParseText(code).Single()).Should().NotBeNull(); } From 827f6e0b0aae5034e4942b5deb36cfe9730c851f Mon Sep 17 00:00:00 2001 From: Antonio Aversa Date: Tue, 30 Jan 2024 13:23:08 +0100 Subject: [PATCH 3/6] Add missing UTs in local functions --- .../Extensions/SyntaxNodeExtensionsTest.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/analyzers/tests/SonarAnalyzer.Test/Extensions/SyntaxNodeExtensionsTest.cs b/analyzers/tests/SonarAnalyzer.Test/Extensions/SyntaxNodeExtensionsTest.cs index 68e821dd4d4..0079baad919 100644 --- a/analyzers/tests/SonarAnalyzer.Test/Extensions/SyntaxNodeExtensionsTest.cs +++ b/analyzers/tests/SonarAnalyzer.Test/Extensions/SyntaxNodeExtensionsTest.cs @@ -207,6 +207,20 @@ public void GetBody_AccessorDeclaration_BodyBlock() ExtensionsCS.GetBody(CSharpSyntaxTree.ParseText(code).Single()).Should().NotBeNull(); } + [TestMethod] + public void GetBody_LocalFunctionStatement_ArrowExpression() + { + var code = "class AClass { void AMethod() { int ALocalFunction() => 42; } }"; + ExtensionsCS.GetBody(CSharpSyntaxTree.ParseText(code).Single()).Should().BeNull(); + } + + [TestMethod] + public void GetBody_LocalFunctionStatement_BodyBlock() + { + var code = "class AClass { void AMethod() { int ALocalFunction() { return 42; } } }"; + ExtensionsCS.GetBody(CSharpSyntaxTree.ParseText(code).Single()).Should().NotBeNull(); + } + [TestMethod] public void CreateCfg_MethodDeclaration_ReturnsCfg_CS() { From edc5423a32dd4bafb5f6619a73f94c411e2789f7 Mon Sep 17 00:00:00 2001 From: Antonio Aversa Date: Tue, 30 Jan 2024 13:33:53 +0100 Subject: [PATCH 4/6] Code review 1 --- .../Extensions/SyntaxNodeExtensionsTest.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/analyzers/tests/SonarAnalyzer.Test/Extensions/SyntaxNodeExtensionsTest.cs b/analyzers/tests/SonarAnalyzer.Test/Extensions/SyntaxNodeExtensionsTest.cs index 0079baad919..64ec399c110 100644 --- a/analyzers/tests/SonarAnalyzer.Test/Extensions/SyntaxNodeExtensionsTest.cs +++ b/analyzers/tests/SonarAnalyzer.Test/Extensions/SyntaxNodeExtensionsTest.cs @@ -203,8 +203,8 @@ public void GetBody_AccessorDeclaration_ArrowExpression() [TestMethod] public void GetBody_AccessorDeclaration_BodyBlock() { - var code = "class AClass { int AProperty { set { } } }"; - ExtensionsCS.GetBody(CSharpSyntaxTree.ParseText(code).Single()).Should().NotBeNull(); + var code = "class AClass { int AProperty { set { var x1; var x2; var x3; } } }"; + ExtensionsCS.GetBody(CSharpSyntaxTree.ParseText(code).Single()).Statements.Should().HaveCount(3); } [TestMethod] @@ -217,8 +217,8 @@ public void GetBody_LocalFunctionStatement_ArrowExpression() [TestMethod] public void GetBody_LocalFunctionStatement_BodyBlock() { - var code = "class AClass { void AMethod() { int ALocalFunction() { return 42; } } }"; - ExtensionsCS.GetBody(CSharpSyntaxTree.ParseText(code).Single()).Should().NotBeNull(); + var code = "class AClass { void AMethod() { int ALocalFunction() { var x1; var x2; var x3; return 42; } } }"; + ExtensionsCS.GetBody(CSharpSyntaxTree.ParseText(code).Single()).Statements.Should().HaveCount(4); } [TestMethod] From 3d1f73aa28e6b49fc73c6330994e10e1aaadb9f2 Mon Sep 17 00:00:00 2001 From: Antonio Aversa Date: Tue, 30 Jan 2024 13:41:52 +0100 Subject: [PATCH 5/6] Code review 2 --- .../Extensions/SyntaxNodeExtensionsTest.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/analyzers/tests/SonarAnalyzer.Test/Extensions/SyntaxNodeExtensionsTest.cs b/analyzers/tests/SonarAnalyzer.Test/Extensions/SyntaxNodeExtensionsTest.cs index 64ec399c110..f5e92e6355f 100644 --- a/analyzers/tests/SonarAnalyzer.Test/Extensions/SyntaxNodeExtensionsTest.cs +++ b/analyzers/tests/SonarAnalyzer.Test/Extensions/SyntaxNodeExtensionsTest.cs @@ -204,7 +204,8 @@ public void GetBody_AccessorDeclaration_ArrowExpression() public void GetBody_AccessorDeclaration_BodyBlock() { var code = "class AClass { int AProperty { set { var x1; var x2; var x3; } } }"; - ExtensionsCS.GetBody(CSharpSyntaxTree.ParseText(code).Single()).Statements.Should().HaveCount(3); + ExtensionsCS.GetBody(CSharpSyntaxTree.ParseText(code).Single()) + .Should().BeOfType().Which.Statements.Should().HaveCount(3); } [TestMethod] @@ -218,7 +219,8 @@ public void GetBody_LocalFunctionStatement_ArrowExpression() public void GetBody_LocalFunctionStatement_BodyBlock() { var code = "class AClass { void AMethod() { int ALocalFunction() { var x1; var x2; var x3; return 42; } } }"; - ExtensionsCS.GetBody(CSharpSyntaxTree.ParseText(code).Single()).Statements.Should().HaveCount(4); + ExtensionsCS.GetBody(CSharpSyntaxTree.ParseText(code).Single()) + .Should().BeOfType().Which.Statements.Should().HaveCount(4); } [TestMethod] From 91a5f262e7788b4a1fd1adcde5be673f102261dc Mon Sep 17 00:00:00 2001 From: Antonio Aversa Date: Tue, 30 Jan 2024 14:10:11 +0100 Subject: [PATCH 6/6] Code review 3 --- .../SonarAnalyzer.Test/Extensions/SyntaxNodeExtensionsTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/analyzers/tests/SonarAnalyzer.Test/Extensions/SyntaxNodeExtensionsTest.cs b/analyzers/tests/SonarAnalyzer.Test/Extensions/SyntaxNodeExtensionsTest.cs index f5e92e6355f..df9553e1b1b 100644 --- a/analyzers/tests/SonarAnalyzer.Test/Extensions/SyntaxNodeExtensionsTest.cs +++ b/analyzers/tests/SonarAnalyzer.Test/Extensions/SyntaxNodeExtensionsTest.cs @@ -203,7 +203,7 @@ public void GetBody_AccessorDeclaration_ArrowExpression() [TestMethod] public void GetBody_AccessorDeclaration_BodyBlock() { - var code = "class AClass { int AProperty { set { var x1; var x2; var x3; } } }"; + var code = "class AClass { int AProperty { set { int i = 1; i++; i++; } } }"; ExtensionsCS.GetBody(CSharpSyntaxTree.ParseText(code).Single()) .Should().BeOfType().Which.Statements.Should().HaveCount(3); } @@ -218,7 +218,7 @@ public void GetBody_LocalFunctionStatement_ArrowExpression() [TestMethod] public void GetBody_LocalFunctionStatement_BodyBlock() { - var code = "class AClass { void AMethod() { int ALocalFunction() { var x1; var x2; var x3; return 42; } } }"; + var code = "class AClass { void AMethod() { int ALocalFunction(int i) { i++; i++; i++; return i; } } }"; ExtensionsCS.GetBody(CSharpSyntaxTree.ParseText(code).Single()) .Should().BeOfType().Which.Statements.Should().HaveCount(4); }