Skip to content

Commit 0dae613

Browse files
authored
Merge pull request #4239 from MDoerner/FixLoadingSerializedDeclarationsFromNonStandardPath
Fix loading serialized declarations from non standard path
2 parents 938fef8 + 44e8298 commit 0dae613

15 files changed

+79
-218
lines changed

Rubberduck.Parsing/ComReflection/ReferencedDeclarationsCollector.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,9 @@ public bool SerializedVersionExists
101101

102102
public List<Declaration> LoadDeclarationsFromXml()
103103
{
104-
var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Rubberduck", "Declarations");
105-
var file = Path.Combine(path, string.Format("{0}.{1}.{2}", _referenceName, _referenceMajor, _referenceMinor) + ".xml");
104+
var path = _serializedDeclarationsPath;
105+
var filename = $"{_referenceName}.{_referenceMajor}.{_referenceMinor}.xml";
106+
var file = Path.Combine(path, filename);
106107
var reader = new XmlPersistableDeclarations();
107108
var deserialized = reader.Load(file);
108109

RubberduckTests/Inspections/ApplicationWorksheetFunctionInspectionTests.cs

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,7 @@ private static RubberduckParserState ArrangeParserAndParse(string inputCode)
2121

2222
var vbe = builder.AddProject(project).Build();
2323

24-
var parser = MockParser.Create(vbe.Object);
25-
26-
parser.State.AddTestLibrary("Excel.1.8.xml");
27-
28-
parser.Parse(new CancellationTokenSource());
29-
if (parser.State.Status >= ParserState.Error)
30-
{
31-
Assert.Inconclusive("Parser Error");
32-
}
33-
34-
return parser.State;
24+
return MockParser.CreateAndParse(vbe.Object); ;
3525
}
3626

3727
[Test]

RubberduckTests/Inspections/HostSpecificExpressionInspectionTests.cs

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using NUnit.Framework;
44
using Moq;
55
using Rubberduck.Inspections.Concrete;
6-
using Rubberduck.Parsing.VBA;
76
using Rubberduck.VBEditor.SafeComWrappers;
87
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
98
using RubberduckTests.Mocks;
@@ -26,24 +25,15 @@ End Sub
2625
var project = builder.ProjectBuilder("TestProject", ProjectProtection.Unprotected)
2726
.AddComponent("Module1", ComponentType.StandardModule, code)
2827
.AddReference("VBA", MockVbeBuilder.LibraryPathVBA, 4, 2, true)
29-
.AddReference("Excel", MockVbeBuilder.LibraryPathMsExcel, 1, 7, true)
28+
.AddReference("Excel", MockVbeBuilder.LibraryPathMsExcel, 1, 8, true)
3029
.Build();
3130
var vbe = builder.AddProject(project).Build();
3231
var mockHost = new Mock<IHostApplication>();
3332
mockHost.SetupGet(m => m.ApplicationName).Returns("Excel");
3433
vbe.Setup(m => m.HostApplication()).Returns(() => mockHost.Object);
3534

36-
var parser = MockParser.Create(vbe.Object);
37-
using (var state = parser.State)
35+
using (var state = MockParser.CreateAndParse(vbe.Object))
3836
{
39-
state.AddTestLibrary("VBA.4.2.xml");
40-
state.AddTestLibrary("Excel.1.8.xml");
41-
parser.Parse(new CancellationTokenSource());
42-
if (state.Status >= ParserState.Error)
43-
{
44-
Assert.Inconclusive("Parser Error");
45-
}
46-
4737
var inspection = new HostSpecificExpressionInspection(state);
4838
var inspectionResults = inspection.GetInspectionResults(CancellationToken.None);
4939

RubberduckTests/Inspections/ImplicitActiveSheetReferenceInspectionTests.cs

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,6 @@ End Sub
3232
var parser = MockParser.Create(vbe.Object);
3333
using (var state = parser.State)
3434
{
35-
state.AddTestLibrary("Excel.1.8.xml");
36-
3735
parser.Parse(new CancellationTokenSource());
3836
if (state.Status >= ParserState.Error)
3937
{
@@ -67,17 +65,8 @@ End Sub
6765
.Build();
6866
var vbe = builder.AddProject(project).Build();
6967

70-
var parser = MockParser.Create(vbe.Object);
71-
using (var state = parser.State)
68+
using (var state = MockParser.CreateAndParse(vbe.Object))
7269
{
73-
state.AddTestLibrary("Excel.1.8.xml");
74-
75-
parser.Parse(new CancellationTokenSource());
76-
if (state.Status >= ParserState.Error)
77-
{
78-
Assert.Inconclusive("Parser Error");
79-
}
80-
8170
var inspection = new ImplicitActiveSheetReferenceInspection(state);
8271
var inspectionResults = inspection.GetInspectionResults(CancellationToken.None);
8372

RubberduckTests/Inspections/ImplicitActiveWorkbookReferenceInspectionTests.cs

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,8 @@ Dim sheet As Worksheet
2929
.Build();
3030
var vbe = builder.AddProject(project).Build();
3131

32-
var parser = MockParser.Create(vbe.Object);
33-
using (var state = parser.State)
32+
using (var state = MockParser.CreateAndParse(vbe.Object))
3433
{
35-
state.AddTestLibrary("Excel.1.8.xml");
36-
37-
parser.Parse(new CancellationTokenSource());
38-
if (state.Status >= ParserState.Error)
39-
{
40-
Assert.Inconclusive("Parser Error");
41-
}
42-
4334
var inspection = new ImplicitActiveWorkbookReferenceInspection(state);
4435
var inspectionResults = inspection.GetInspectionResults(CancellationToken.None);
4536

@@ -67,17 +58,9 @@ Dim sheet As Worksheet
6758
.Build();
6859
var vbe = builder.AddProject(project).Build();
6960

70-
var parser = MockParser.Create(vbe.Object);
71-
using (var state = parser.State)
72-
{
73-
state.AddTestLibrary("Excel.1.8.xml");
74-
75-
parser.Parse(new CancellationTokenSource());
76-
if (state.Status >= ParserState.Error)
77-
{
78-
Assert.Inconclusive("Parser Error");
79-
}
8061

62+
using (var state = MockParser.CreateAndParse(vbe.Object))
63+
{
8164
var inspection = new ImplicitActiveWorkbookReferenceInspection(state);
8265
var inspectionResults = inspection.GetInspectionResults(CancellationToken.None);
8366

RubberduckTests/Inspections/MemberNotOnInterfaceInspectionTests.cs

Lines changed: 6 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,7 @@ private static RubberduckParserState ArrangeParserAndParse(string inputCode, str
2626

2727
var vbe = builder.AddProject(project).Build();
2828

29-
var parser = MockParser.Create(vbe.Object);
30-
31-
parser.State.AddTestLibrary(library.Equals("Scripting") ? "Scripting.1.0.xml" : "Excel.1.8.xml");
32-
33-
parser.Parse(new CancellationTokenSource());
34-
if (parser.State.Status >= ParserState.Error)
35-
{
36-
Assert.Inconclusive("Parser Error");
37-
}
38-
39-
return parser.State;
29+
return MockParser.CreateAndParse(vbe.Object);
4030
}
4131

4232
[Test]
@@ -345,28 +335,16 @@ Dim foo As UserForm
345335
346336
End Sub
347337
";
348-
var mockVbe = new MockVbeBuilder();
349-
var projectBuilder = mockVbe.ProjectBuilder("testproject", ProjectProtection.Unprotected);
338+
var vbeBuilder = new MockVbeBuilder();
339+
var projectBuilder = vbeBuilder.ProjectBuilder("testproject", ProjectProtection.Unprotected);
350340
projectBuilder.MockUserFormBuilder("UserForm1", userForm1Code).AddFormToProjectBuilder()
351341
.AddComponent("ReferencingModule", ComponentType.StandardModule, analyzedCode)
352-
//.AddReference("Excel", MockVbeBuilder.LibraryPathMsExcel)
353342
.AddReference("MSForms", MockVbeBuilder.LibraryPathMsForms, 2, 0);
354343

355-
mockVbe.AddProject(projectBuilder.Build());
356-
357-
358-
var parser = MockParser.Create(mockVbe.Build().Object);
359-
360-
//parser.State.AddTestLibrary("Excel.1.8.xml");
361-
parser.State.AddTestLibrary("MSForms.2.0.xml");
362-
363-
parser.Parse(new CancellationTokenSource());
364-
if (parser.State.Status >= ParserState.Error)
365-
{
366-
Assert.Inconclusive("Parser Error");
367-
}
344+
vbeBuilder.AddProject(projectBuilder.Build());
345+
var vbe = vbeBuilder.Build();
368346

369-
using (var state = parser.State)
347+
using (var state = MockParser.CreateAndParse(vbe.Object))
370348
{
371349
var inspection = new MemberNotOnInterfaceInspection(state);
372350
var inspectionResults = inspection.GetInspectionResults(CancellationToken.None);

RubberduckTests/Inspections/ObjectVariableNotSetInspectionTests.cs

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System;
12
using System.Linq;
23
using System.Threading;
34
using NUnit.Framework;
@@ -8,7 +9,6 @@
89
namespace RubberduckTests.Inspections
910
{
1011
[TestFixture]
11-
//[DeploymentItem(@"TestFiles\")]
1212
public class ObjectVariableNotSetInspectionTests
1313
{
1414
[Test]
@@ -468,22 +468,25 @@ public void InspectionName()
468468
private void AssertInputCodeYieldsExpectedInspectionResultCount(string inputCode, int expected, params string[] testLibraries)
469469
{
470470
var builder = new MockVbeBuilder();
471-
var project = builder.ProjectBuilder("TestProject1", "TestProject1", ProjectProtection.Unprotected)
472-
.AddComponent("Module1", ComponentType.StandardModule, inputCode)
473-
.AddReference("VBA", MockVbeBuilder.LibraryPathVBA, 4, 2, true)
474-
.AddReference("Excel", MockVbeBuilder.LibraryPathMsExcel, 1, 8, true)
475-
.Build();
476-
var vbe = builder.AddProject(project).Build();
471+
var projectBuilder = builder.ProjectBuilder("TestProject1", "TestProject1", ProjectProtection.Unprotected)
472+
.AddComponent("Module1", ComponentType.StandardModule, inputCode);
477473

478-
using(var coordinator = MockParser.Create(vbe.Object))
474+
foreach (var testLibrary in testLibraries)
479475
{
480-
foreach (var testLibrary in testLibraries)
481-
{
482-
coordinator.State.AddTestLibrary(testLibrary);
483-
}
484-
coordinator.Parse(new CancellationTokenSource());
476+
var libraryDescriptionComponents = testLibrary.Split('.');
477+
var libraryName = libraryDescriptionComponents[0];
478+
var libraryPath = MockVbeBuilder.LibraryPaths[libraryName];
479+
int majorVersion = Int32.Parse(libraryDescriptionComponents[1]);
480+
int minorVersion = Int32.Parse(libraryDescriptionComponents[2]);
481+
projectBuilder.AddReference(libraryName, libraryPath, majorVersion, minorVersion, true);
482+
}
485483

486-
var inspection = new ObjectVariableNotSetInspection(coordinator.State);
484+
var project = projectBuilder.Build();
485+
var vbe = builder.AddProject(project).Build();
486+
487+
using (var state = MockParser.CreateAndParse(vbe.Object))
488+
{
489+
var inspection = new ObjectVariableNotSetInspection(state);
487490
var inspectionResults = inspection.GetInspectionResults(CancellationToken.None);
488491

489492
Assert.AreEqual(expected, inspectionResults.Count());

RubberduckTests/Inspections/SheetAccessedUsingStringInspectionTests.cs

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -177,16 +177,7 @@ private static RubberduckParserState ArrangeParserAndParse(string inputCode)
177177

178178
var vbe = builder.AddProject(referencedProject).AddProject(project).Build();
179179

180-
var parser = MockParser.Create(vbe.Object);
181-
parser.State.AddTestLibrary("Excel.1.8.xml");
182-
parser.Parse(new CancellationTokenSource());
183-
184-
if (parser.State.Status >= ParserState.Error)
185-
{
186-
Assert.Inconclusive("Parser Error");
187-
}
188-
189-
return parser.State;
180+
return MockParser.CreateAndParse(vbe.Object);
190181
}
191182

192183
private static Mock<IProperty> CreateVBComponentPropertyMock(string propertyName, string propertyValue)

RubberduckTests/Mocks/MockParser.cs

Lines changed: 2 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -113,56 +113,23 @@ public static ParseCoordinator Create(IVBE vbe, RubberduckParserState state, IAt
113113
parserStateManager,
114114
true);
115115
}
116-
117-
public static RubberduckParserState CreateAndParse(IVBE vbe, IInspectionListener listener, IEnumerable<string> testLibraries = null)
118-
{
119-
var parser = CreateWithLibraries(vbe, testLibraries: testLibraries);
120-
parser.Parse(new CancellationTokenSource());
121-
if (parser.State.Status >= ParserState.Error)
122-
{ Assert.Inconclusive("Parser Error"); }
123-
124-
return parser.State;
125-
}
126116

127-
public static RubberduckParserState CreateAndParse(IVBE vbe, string serializedDeclarationsPath = null, IEnumerable<string> testLibraries = null)
117+
public static RubberduckParserState CreateAndParse(IVBE vbe, string serializedDeclarationsPath = null)
128118
{
129-
var parser = CreateWithLibraries(vbe, serializedDeclarationsPath, testLibraries);
119+
var parser = Create(vbe, serializedDeclarationsPath);
130120
parser.Parse(new CancellationTokenSource());
131121
if (parser.State.Status >= ParserState.Error) { Assert.Inconclusive("Parser Error"); }
132122

133123
return parser.State;
134124
}
135125

136-
private static ParseCoordinator CreateWithLibraries(IVBE vbe, string serializedDeclarationsPath = null, IEnumerable<string> testLibraries = null)
137-
{
138-
var parser = Create(vbe, serializedDeclarationsPath);
139-
if (testLibraries != null)
140-
{
141-
foreach (var lib in testLibraries)
142-
{
143-
parser.State.AddTestLibrary(lib);
144-
}
145-
}
146-
return parser;
147-
}
148-
149126
private static readonly HashSet<DeclarationType> ProceduralTypes =
150127
new HashSet<DeclarationType>(new[]
151128
{
152129
DeclarationType.Procedure, DeclarationType.Function, DeclarationType.PropertyGet,
153130
DeclarationType.PropertyLet, DeclarationType.PropertySet
154131
});
155132

156-
public static void AddTestLibrary(this RubberduckParserState state, string serialized)
157-
{
158-
var reader = new XmlPersistableDeclarations();
159-
var basePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
160-
basePath = Directory.GetParent(basePath).Parent.FullName;
161-
var path = Path.Combine(basePath, "Testfiles\\Resolver", serialized);
162-
var deserialized = reader.Load(path);
163-
AddTestLibrary(state, deserialized);
164-
}
165-
166133
// ReSharper disable once UnusedMember.Global; used by RubberduckWeb to load serialized declarations.
167134
public static void AddTestLibrary(this RubberduckParserState state, Stream stream)
168135
{

RubberduckTests/Mocks/MockVbeBuilder.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,22 @@ public class MockVbeBuilder
3535
public static readonly string LibraryPathAdoDb = @"C:\Program Files\Common Files\System\ado\msado15.dll";
3636
public static readonly string LibraryPathAdoRecordset = @"C:\Program Files\Common Files\System\ado\msador15.dll";
3737

38+
public static readonly Dictionary<string, string> LibraryPaths = new Dictionary<string, string>
39+
{
40+
["VBA"] = LibraryPathVBA,
41+
["Excel"] = LibraryPathMsExcel,
42+
["Office"] = LibraryPathMsOffice,
43+
["stdole"] = LibraryPathStdOle,
44+
["MSForms"] = LibraryPathMsForms,
45+
["VBIDE"] = LibraryPathVBIDE,
46+
["Scripting"] = LibraryPathScripting,
47+
["VBScript_RegExp_55"] = LibraryPathRegex,
48+
["MSXML2"] = LibraryPathMsXml,
49+
["SHDocVw"] = LibraryPathShDoc,
50+
["ADODB"] = LibraryPathAdoDb,
51+
["ADOR"] = LibraryPathAdoRecordset
52+
};
53+
3854
//private Mock<IWindows> _vbWindows;
3955
private readonly Windows _windows = new Windows();
4056

0 commit comments

Comments
 (0)