Skip to content

Commit 1c6438a

Browse files
authored
Merge pull request #1996 from Hosch250/tests
Get test for ImplicitActiveSheetReference inspection working
2 parents 8fc93ec + 5b18e37 commit 1c6438a

File tree

8 files changed

+1085
-28
lines changed

8 files changed

+1085
-28
lines changed

RetailCoder.VBE/API/ParserState.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ public void Initialize(VBE vbe)
6969
Func<IVBAPreprocessor> preprocessorFactory = () => new VBAPreprocessor(double.Parse(vbe.Version, CultureInfo.InvariantCulture));
7070
_attributeParser = new AttributeParser(new ModuleExporter(), preprocessorFactory);
7171
_parser = new RubberduckParser(_state, _attributeParser, preprocessorFactory,
72-
new List<ICustomDeclarationLoader> { new DebugDeclarations(_state), new FormEventDeclarations(_state) });
72+
new List<ICustomDeclarationLoader> { new DebugDeclarations(_state), new FormEventDeclarations(_state), new AliasDeclarations(_state) });
7373
}
7474

7575
/// <summary>

Rubberduck.Parsing/Symbols/AliasDeclarations.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ private IReadOnlyList<Declaration> AddAliasDeclarations()
5656
item => item.IdentifierName == "Interaction" && item.Scope == "VBE7.DLL;VBA.Interaction");
5757

5858
var stringsModule = _state.AllDeclarations.SingleOrDefault(
59-
item => item.IdentifierName == "Interaction" && item.Scope == "VBE7.DLL;VBA.Interaction");
59+
item => item.IdentifierName == "Strings" && item.Scope == "VBE7.DLL;VBA.Strings");
6060

6161
// all these modules are all part of the same project--only need to check one
6262
if (conversionModule == null)
Lines changed: 97 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
using System.Linq;
1+
using System.Collections.Generic;
2+
using System.Linq;
23
using System.Threading;
34
using Microsoft.Vbe.Interop;
45
using Microsoft.VisualStudio.TestTools.UnitTesting;
56
using Moq;
67
using Rubberduck.Inspections;
78
using Rubberduck.Parsing;
9+
using Rubberduck.Parsing.Annotations;
810
using Rubberduck.Parsing.Symbols;
911
using Rubberduck.Parsing.VBA;
1012
using Rubberduck.VBEditor;
@@ -16,7 +18,7 @@ namespace RubberduckTests.Inspections
1618
[TestClass]
1719
public class ImplicitActiveSheetReferenceInspectionTests
1820
{
19-
[TestMethod, Ignore] // doesn't pick up the reference to "Range".
21+
[TestMethod] // doesn't pick up the reference to "Range".
2022
[TestCategory("Inspections")]
2123
public void ReportsRange()
2224
{
@@ -29,12 +31,9 @@ End Sub
2931

3032
//Arrange
3133
var builder = new MockVbeBuilder();
32-
var project = builder.ProjectBuilder("TestProject1", vbext_ProjectProtection.vbext_pp_none)
34+
var project = builder.ProjectBuilder("TestProject1", "TestProject1", vbext_ProjectProtection.vbext_pp_none)
3335
.AddComponent("Class1", vbext_ComponentType.vbext_ct_ClassModule, inputCode)
34-
.AddReference("Excel", string.Empty, true)
35-
36-
// Apparently, the COM loader can't find it when it isn't actually loaded...
37-
//.AddReference("VBA", "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\\VBA7.1\\VBE7.DLL", true)
36+
.AddReference("Excel", "C:\\Program Files\\Microsoft Office\\Root\\Office 16\\EXCEL.EXE", true)
3837
.Build();
3938
var vbe = builder.AddProject(project).Build();
4039

@@ -43,33 +42,106 @@ End Sub
4342

4443
var parser = MockParser.Create(vbe.Object, new RubberduckParserState(vbe.Object, new Mock<ISinks>().Object));
4544

45+
GetExcelRangeDeclarations().ForEach(d => parser.State.AddDeclaration(d));
46+
47+
parser.Parse(new CancellationTokenSource());
48+
if (parser.State.Status >= ParserState.Error) { Assert.Inconclusive("Parser Error"); }
49+
50+
var inspection = new ImplicitActiveSheetReferenceInspection(vbe.Object, parser.State);
51+
var inspectionResults = inspection.GetInspectionResults();
52+
53+
Assert.AreEqual(1, inspectionResults.Count());
54+
}
55+
56+
[TestMethod]
57+
[TestCategory("Inspections")]
58+
public void InspectionType()
59+
{
60+
var builder = new MockVbeBuilder();
61+
var project = builder.ProjectBuilder("TestProject1", "TestProject1", vbext_ProjectProtection.vbext_pp_none)
62+
.AddComponent("Class1", vbext_ComponentType.vbext_ct_ClassModule, string.Empty)
63+
.AddReference("Excel", "C:\\Program Files\\Microsoft Office\\Root\\Office 16\\EXCEL.EXE", true)
64+
.Build();
65+
var vbe = builder.AddProject(project).Build();
66+
67+
var inspection = new ImplicitActiveSheetReferenceInspection(vbe.Object, null);
68+
Assert.AreEqual(CodeInspectionType.MaintainabilityAndReadabilityIssues, inspection.InspectionType);
69+
}
70+
71+
[TestMethod]
72+
[TestCategory("Inspections")]
73+
public void InspectionName()
74+
{
75+
var builder = new MockVbeBuilder();
76+
var project = builder.ProjectBuilder("TestProject1", "TestProject1", vbext_ProjectProtection.vbext_pp_none)
77+
.AddComponent("Class1", vbext_ComponentType.vbext_ct_ClassModule, string.Empty)
78+
.AddReference("Excel", "C:\\Program Files\\Microsoft Office\\Root\\Office 16\\EXCEL.EXE", true)
79+
.Build();
80+
var vbe = builder.AddProject(project).Build();
81+
82+
const string inspectionName = "ImplicitActiveSheetReferenceInspection";
83+
var inspection = new ImplicitActiveSheetReferenceInspection(vbe.Object, null);
84+
85+
Assert.AreEqual(inspectionName, inspection.Name);
86+
}
87+
88+
private List<Declaration> GetExcelRangeDeclarations()
89+
{
4690
var excelDeclaration = new ProjectDeclaration(new QualifiedMemberName(new QualifiedModuleName("Excel",
4791
"C:\\Program Files\\Microsoft Office\\Root\\Office 16\\EXCEL.EXE", "Excel"), "Excel"), "Excel", true);
4892

49-
var listColumnDeclaration = new ClassModuleDeclaration(new QualifiedMemberName(
93+
var globalDeclaration = new ClassModuleDeclaration(new QualifiedMemberName(
5094
new QualifiedModuleName("Excel",
51-
"C:\\Program Files\\Microsoft Office\\Root\\Office 16\\EXCEL.EXE", "ListColumn"),
52-
"ListColumn"), excelDeclaration, "ListColumn", true, null, null);
95+
"C:\\Program Files\\Microsoft Office\\Root\\Office 16\\EXCEL.EXE", "_Global"),
96+
"_Global"), excelDeclaration, "_Global", true, null, null);
5397

54-
var rangeDeclaration =
55-
new Declaration(
56-
new QualifiedMemberName(
57-
new QualifiedModuleName("Excel",
58-
"C:\\Program Files\\Microsoft Office\\Root\\Office 16\\EXCEL.EXE", "ListColumn"), "Range"),
59-
listColumnDeclaration, "EXCEL.EXE;Excel.ListColumn", "Range", null, false, false, Accessibility.Global,
60-
(DeclarationType)3712, false, null, true, null, new Attributes());
98+
var globalCoClassDeclarationAttributes = new Attributes();
99+
globalCoClassDeclarationAttributes.AddPredeclaredIdTypeAttribute();
100+
globalCoClassDeclarationAttributes.AddGlobalClassAttribute();
61101

62-
parser.State.AddDeclaration(excelDeclaration);
63-
parser.State.AddDeclaration(listColumnDeclaration);
64-
parser.State.AddDeclaration(rangeDeclaration);
102+
var globalCoClassDeclaration = new ClassModuleDeclaration(new QualifiedMemberName(
103+
new QualifiedModuleName("Excel",
104+
"C:\\Program Files\\Microsoft Office\\Root\\Office 16\\EXCEL.EXE", "Global"),
105+
"Global"), excelDeclaration, "Global", true, null, globalCoClassDeclarationAttributes);
65106

66-
parser.Parse(new CancellationTokenSource());
67-
if (parser.State.Status >= ParserState.Error) { Assert.Inconclusive("Parser Error"); }
107+
globalDeclaration.AddSubtype(globalCoClassDeclaration);
108+
globalCoClassDeclaration.AddSupertype(globalDeclaration);
109+
globalCoClassDeclaration.AddSupertype("_Global");
68110

69-
var inspection = new ImplicitActiveSheetReferenceInspection(vbe.Object, parser.State);
70-
var inspectionResults = inspection.GetInspectionResults();
111+
var rangeClassModuleDeclaration = new ClassModuleDeclaration(new QualifiedMemberName(
112+
new QualifiedModuleName("Excel",
113+
"C:\\Program Files\\Microsoft Office\\Root\\Office 16\\EXCEL.EXE", "Range"),
114+
"Range"), excelDeclaration, "Range", true, new List<IAnnotation>(), new Attributes());
71115

72-
Assert.AreEqual(1, inspectionResults.Count());
116+
var rangeDeclaration = new PropertyGetDeclaration(new QualifiedMemberName(
117+
new QualifiedModuleName("Excel",
118+
"C:\\Program Files\\Microsoft Office\\Root\\Office 16\\EXCEL.EXE", "_Global"), "Range"),
119+
globalDeclaration, globalDeclaration, "Range", null, null, Accessibility.Global, null, Selection.Home,
120+
false, true, new List<IAnnotation>(), new Attributes());
121+
122+
var firstParamDeclaration = new ParameterDeclaration(new QualifiedMemberName(
123+
new QualifiedModuleName("Excel",
124+
"C:\\Program Files\\Microsoft Office\\Root\\Office 16\\EXCEL.EXE", "_Global"),
125+
"Cell1"), rangeDeclaration, "Variant", null, null, false, false);
126+
127+
var secondParamDeclaration = new ParameterDeclaration(new QualifiedMemberName(
128+
new QualifiedModuleName("Excel",
129+
"C:\\Program Files\\Microsoft Office\\Root\\Office 16\\EXCEL.EXE", "_Global"),
130+
"Cell2"), rangeDeclaration, "Variant", null, null, true, false);
131+
132+
rangeDeclaration.AddParameter(firstParamDeclaration);
133+
rangeDeclaration.AddParameter(secondParamDeclaration);
134+
135+
return new List<Declaration>
136+
{
137+
excelDeclaration,
138+
globalDeclaration,
139+
globalCoClassDeclaration,
140+
rangeClassModuleDeclaration,
141+
rangeDeclaration,
142+
firstParamDeclaration,
143+
secondParamDeclaration,
144+
};
73145
}
74146
}
75147
}
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
using System.Linq;
2+
using System.Threading;
3+
using Microsoft.Vbe.Interop;
4+
using Microsoft.VisualStudio.TestTools.UnitTesting;
5+
using Moq;
6+
using Rubberduck.Inspections;
7+
using Rubberduck.Parsing;
8+
using Rubberduck.Parsing.VBA;
9+
using Rubberduck.VBEditor.Extensions;
10+
using Rubberduck.VBEditor.VBEHost;
11+
using RubberduckTests.Mocks;
12+
13+
namespace RubberduckTests.Inspections
14+
{
15+
[TestClass]
16+
public class UnassignedVariableUsageInspectionTests
17+
{
18+
[TestMethod]
19+
[TestCategory("Inspections")]
20+
public void UnassignedVariableUsage_ReturnsResult()
21+
{
22+
const string inputCode =
23+
@"Sub Foo()
24+
Dim b As Boolean
25+
Dim bb As Boolean
26+
bb = b
27+
End Sub";
28+
29+
//Arrange
30+
var builder = new MockVbeBuilder();
31+
var project = builder.ProjectBuilder("VBAProject", vbext_ProjectProtection.vbext_pp_none)
32+
.AddComponent("MyClass", vbext_ComponentType.vbext_ct_ClassModule, inputCode)
33+
.Build();
34+
var vbe = builder.AddProject(project).Build();
35+
36+
var mockHost = new Mock<IHostApplication>();
37+
mockHost.SetupAllProperties();
38+
var parser = MockParser.Create(vbe.Object, new RubberduckParserState(vbe.Object, new Mock<ISinks>().Object));
39+
40+
parser.Parse(new CancellationTokenSource());
41+
if (parser.State.Status >= ParserState.Error) { Assert.Inconclusive("Parser Error"); }
42+
43+
var inspection = new UnassignedVariableUsageInspection(parser.State);
44+
var inspectionResults = inspection.GetInspectionResults();
45+
46+
Assert.AreEqual(1, inspectionResults.Count());
47+
}
48+
49+
[TestMethod]
50+
[TestCategory("Inspections")]
51+
public void UnassignedVariableUsage_DoesNotReturnResult()
52+
{
53+
const string inputCode =
54+
@"Sub Foo()
55+
Dim b As Boolean
56+
Dim bb As Boolean
57+
b = True
58+
bb = b
59+
End Sub";
60+
61+
//Arrange
62+
var builder = new MockVbeBuilder();
63+
var project = builder.ProjectBuilder("VBAProject", vbext_ProjectProtection.vbext_pp_none)
64+
.AddComponent("MyClass", vbext_ComponentType.vbext_ct_ClassModule, inputCode)
65+
.Build();
66+
var vbe = builder.AddProject(project).Build();
67+
68+
var mockHost = new Mock<IHostApplication>();
69+
mockHost.SetupAllProperties();
70+
var parser = MockParser.Create(vbe.Object, new RubberduckParserState(vbe.Object, new Mock<ISinks>().Object));
71+
72+
parser.Parse(new CancellationTokenSource());
73+
if (parser.State.Status >= ParserState.Error) { Assert.Inconclusive("Parser Error"); }
74+
75+
var inspection = new UnassignedVariableUsageInspection(parser.State);
76+
var inspectionResults = inspection.GetInspectionResults();
77+
78+
Assert.IsFalse(inspectionResults.Any());
79+
}
80+
81+
[TestMethod]
82+
[TestCategory("Inspections")]
83+
public void UnassignedVariableUsage_QuickFixWorks()
84+
{
85+
const string inputCode =
86+
@"Sub Foo()
87+
Dim b As Boolean
88+
Dim bb As Boolean
89+
bb = b
90+
End Sub";
91+
92+
const string expectedCode =
93+
@"Sub Foo()
94+
Dim b As Boolean
95+
Dim bb As Boolean
96+
TODOTODO = TODO
97+
End Sub";
98+
99+
//Arrange
100+
var builder = new MockVbeBuilder();
101+
VBComponent component;
102+
var vbe = builder.BuildFromSingleStandardModule(inputCode, out component);
103+
var project = vbe.Object.VBProjects.Item(0);
104+
var module = project.VBComponents.Item(0).CodeModule;
105+
var mockHost = new Mock<IHostApplication>();
106+
mockHost.SetupAllProperties();
107+
var parser = MockParser.Create(vbe.Object, new RubberduckParserState(vbe.Object, new Mock<ISinks>().Object));
108+
109+
parser.Parse(new CancellationTokenSource());
110+
if (parser.State.Status >= ParserState.Error) { Assert.Inconclusive("Parser Error"); }
111+
112+
var inspection = new UnassignedVariableUsageInspection(parser.State);
113+
var inspectionResults = inspection.GetInspectionResults();
114+
115+
inspectionResults.First().QuickFixes.First().Fix();
116+
117+
Assert.AreEqual(expectedCode, module.Lines());
118+
}
119+
120+
[TestMethod]
121+
[TestCategory("Inspections")]
122+
public void InspectionType()
123+
{
124+
var inspection = new UnassignedVariableUsageInspection(null);
125+
Assert.AreEqual(CodeInspectionType.CodeQualityIssues, inspection.InspectionType);
126+
}
127+
128+
[TestMethod]
129+
[TestCategory("Inspections")]
130+
public void InspectionName()
131+
{
132+
const string inspectionName = "UnassignedVariableUsageInspection";
133+
var inspection = new UnassignedVariableUsageInspection(null);
134+
135+
Assert.AreEqual(inspectionName, inspection.Name);
136+
}
137+
}
138+
}

0 commit comments

Comments
 (0)