Skip to content

Commit cc2a0ad

Browse files
committed
Merge branch 'rubberduck-vba/next' into 5143_FalseNegative
2 parents 5583bcb + 3ebc6e4 commit cc2a0ad

File tree

2 files changed

+54
-81
lines changed

2 files changed

+54
-81
lines changed

Rubberduck.CodeAnalysis/Inspections/Concrete/VariableNotUsedInspection.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,23 @@ namespace Rubberduck.Inspections.Concrete
3939
/// </example>
4040
public sealed class VariableNotUsedInspection : InspectionBase
4141
{
42+
/// <summary>
43+
/// Inspection results for variables that are never referenced.
44+
/// </summary>
45+
/// <returns></returns>
4246
public VariableNotUsedInspection(RubberduckParserState state) : base(state) { }
4347

48+
/// <summary>
49+
/// VariableNotUsedInspection override of InspectionBase.DoGetInspectionResults()
50+
/// </summary>
51+
/// <returns>Enumerable IInspectionResults</returns>
4452
protected override IEnumerable<IInspectionResult> DoGetInspectionResults()
4553
{
4654
var declarations = State.DeclarationFinder.UserDeclarations(DeclarationType.Variable)
4755
.Where(declaration =>
4856
!declaration.IsWithEvents
4957
&& !declaration.IsIgnoringInspectionResultFor(AnnotationName)
50-
&& !declaration.References.Any());
58+
&& declaration.References.All(rf => rf.IsAssignment));
5159

5260
return declarations.Select(issue =>
5361
new DeclarationInspectionResult(this,

RubberduckTests/Inspections/VariableNotUsedInspectionTests.cs

Lines changed: 45 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -2,170 +2,135 @@
22
using System.Threading;
33
using NUnit.Framework;
44
using Rubberduck.Inspections.Concrete;
5+
using Rubberduck.Parsing.Inspections.Abstract;
6+
using Rubberduck.Parsing.VBA;
57
using RubberduckTests.Mocks;
68

79
namespace RubberduckTests.Inspections
810
{
911
[TestFixture]
10-
public class VariableNotUsedInspectionTests
12+
public class VariableNotUsedInspectionTests : InspectionTestsBase
1113
{
1214
[Test]
1315
[Category("Inspections")]
1416
public void VariableNotUsed_ReturnsResult()
1517
{
1618
const string inputCode =
17-
@"Sub Foo()
19+
@"Sub Foo()
1820
Dim var1 As String
1921
End Sub";
20-
21-
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out _);
22-
using (var state = MockParser.CreateAndParse(vbe.Object))
23-
{
24-
25-
var inspection = new VariableNotUsedInspection(state);
26-
var inspectionResults = inspection.GetInspectionResults(CancellationToken.None);
27-
28-
Assert.AreEqual(1, inspectionResults.Count());
29-
}
22+
Assert.AreEqual(1, InspectionResultsForStandardModule(inputCode).Count());
3023
}
3124

3225
[Test]
3326
[Category("Inspections")]
34-
public void VariableNotUsed_ReturnsResult_MultipleVariables()
27+
public void VariableNotUsed_MultipleVariables_ReturnsResult()
3528
{
3629
const string inputCode =
37-
@"Sub Foo()
30+
@"Sub Foo()
3831
Dim var1 As String
3932
Dim var2 As Date
4033
End Sub";
4134

42-
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out _);
43-
using (var state = MockParser.CreateAndParse(vbe.Object))
44-
{
45-
46-
var inspection = new VariableNotUsedInspection(state);
47-
var inspectionResults = inspection.GetInspectionResults(CancellationToken.None);
48-
49-
Assert.AreEqual(2, inspectionResults.Count());
50-
}
35+
Assert.AreEqual(2, InspectionResultsForStandardModule(inputCode).Count());
5136
}
5237

5338
[Test]
5439
[Category("Inspections")]
5540
public void VariableUsed_DoesNotReturnResult()
5641
{
5742
const string inputCode =
58-
@"Function Foo() As Boolean
59-
Dim var1 as String
43+
@"Sub Foo()
44+
Dim var1 As String
6045
var1 = ""test""
6146
6247
Goo var1
63-
End Function
48+
End Sub
6449
6550
Sub Goo(ByVal arg1 As String)
6651
End Sub";
6752

68-
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out _);
69-
using (var state = MockParser.CreateAndParse(vbe.Object))
70-
{
71-
72-
var inspection = new VariableNotUsedInspection(state);
73-
var inspectionResults = inspection.GetInspectionResults(CancellationToken.None);
74-
75-
Assert.AreEqual(0, inspectionResults.Count());
76-
}
53+
Assert.AreEqual(0, InspectionResultsForStandardModule(inputCode).Count());
7754
}
7855

7956
[Test]
8057
[Category("Inspections")]
81-
public void VariableNotUsed_ReturnsResult_MultipleVariables_SomeAssigned()
58+
public void VariableNotUsed_MultipleVariables_OneAssignedAndReferenced_ReturnsResult()
8259
{
8360
const string inputCode =
84-
@"Sub Foo()
85-
Dim var1 as Integer
61+
@"Sub Foo()
62+
Dim var1 As Integer
8663
var1 = 8
8764
88-
Dim var2 as String
65+
Dim var2 As String
8966
9067
Goo var1
9168
End Sub
9269
9370
Sub Goo(ByVal arg1 As Integer)
9471
End Sub";
9572

96-
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out _);
97-
using (var state = MockParser.CreateAndParse(vbe.Object))
98-
{
99-
100-
var inspection = new VariableNotUsedInspection(state);
101-
var inspectionResults = inspection.GetInspectionResults(CancellationToken.None);
102-
103-
Assert.AreEqual(1, inspectionResults.Count());
104-
}
73+
Assert.AreEqual(1, InspectionResultsForStandardModule(inputCode).Count());
10574
}
10675

10776
[Test]
10877
[Category("Inspections")]
10978
public void VariableNotUsed_Ignored_DoesNotReturnResult()
11079
{
11180
const string inputCode =
112-
@"Sub Foo()
81+
@"Sub Foo()
11382
'@Ignore VariableNotUsed
11483
Dim var1 As String
11584
End Sub";
11685

117-
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out _);
118-
using (var state = MockParser.CreateAndParse(vbe.Object))
119-
{
120-
121-
var inspection = new VariableNotUsedInspection(state);
122-
var inspectionResults = inspection.GetInspectionResults(CancellationToken.None);
123-
124-
Assert.IsFalse(inspectionResults.Any());
125-
}
86+
Assert.AreEqual(0, InspectionResultsForStandardModule(inputCode).Count());
12687
}
12788

12889
[Test]
12990
[Category("Inspections")]
130-
public void VariableNotUsed_DoesNotReturnsResult_UsedInNameStatement()
91+
public void VariableNotUsed_UsedInNameStatement_DoesNotReturnsResult()
13192
{
13293
const string inputCode =
133-
@"Sub Foo()
94+
@"Sub Foo()
13495
Dim var1 As String
13596
Name ""foo"" As var1
13697
End Sub";
13798

138-
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out _);
139-
using (var state = MockParser.CreateAndParse(vbe.Object))
140-
{
141-
142-
var inspection = new VariableNotUsedInspection(state);
143-
var inspectionResults = inspection.GetInspectionResults(CancellationToken.None);
144-
145-
Assert.IsFalse(inspectionResults.Any());
146-
}
99+
Assert.AreEqual(0, InspectionResultsForStandardModule(inputCode).Count());
147100
}
148101

102+
//https://github.com/rubberduck-vba/Rubberduck/issues/5088
149103
[Test]
150104
[Category("Inspections")]
151-
public void VariableUsed_DoesNotReturnResultIfAssigned()
105+
public void VariableNotUsed_AssignedButNeverReferenced_ReturnsResult()
152106
{
153107
const string inputCode =
154-
@"Function Foo() As Boolean
155-
Dim var1 as String
108+
@"Sub Foo()
109+
Dim var1 As String
156110
var1 = ""test""
157-
End Function";
111+
End Sub";
158112

159-
var vbe = MockVbeBuilder.BuildFromSingleStandardModule(inputCode, out _);
160-
using (var state = MockParser.CreateAndParse(vbe.Object))
161-
{
113+
Assert.AreEqual(1, InspectionResultsForStandardModule(inputCode).Count());
114+
}
162115

163-
var inspection = new VariableNotUsedInspection(state);
164-
var inspectionResults = inspection.GetInspectionResults(CancellationToken.None);
116+
[Test]
117+
[Category("Inspections")]
118+
public void VariableNotUsed_AssignedMultpleTimesButNeverReferenced_ReturnsResult()
119+
{
120+
const string inputCode =
121+
@"Public Sub Foo()
122+
Dim var2 As Long
123+
var2 = 4
124+
var2 = 7
125+
var2 = 8
126+
End Sub";
165127

166-
Assert.AreEqual(0, inspectionResults.Count());
167-
}
128+
Assert.AreEqual(1, InspectionResultsForStandardModule(inputCode).Count());
168129
}
169130

131+
protected override IInspection InspectionUnderTest(RubberduckParserState state)
132+
{
133+
return new VariableNotUsedInspection(state);
134+
}
170135
}
171136
}

0 commit comments

Comments
 (0)