Skip to content

Commit afcb565

Browse files
committed
Test covering #2737 (fix is already in) - Closes #2737
1 parent 923d97d commit afcb565

File tree

3 files changed

+74
-2
lines changed

3 files changed

+74
-2
lines changed

Rubberduck.Parsing/Symbols/DeclarationFinder.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,8 +136,8 @@ public DeclarationFinder(IReadOnlyList<Declaration> declarations, IEnumerable<IA
136136
});
137137

138138
_membersByImplementsContext = new Lazy<ConcurrentDictionary<VBAParser.ImplementsStmtContext, Declaration[]>>(() =>
139-
new ConcurrentDictionary<VBAParser.ImplementsStmtContext, Declaration[]>(
140-
implementableMembers.ToDictionary(item => item.Context, item => item.Members)), true);
139+
new ConcurrentDictionary<VBAParser.ImplementsStmtContext, Declaration[]>(
140+
implementableMembers.ToDictionary(item => item.Context, item => item.Members)), true);
141141

142142
_nonBaseAsType = new Lazy<List<Declaration>>(() =>
143143
_declarations.AllValues().Where(d =>

RubberduckTests/RubberduckTests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@
203203
<Compile Include="SourceControl\UnsyncedCommitsViewModelTests.cs" />
204204
<Compile Include="StringExtensionsTests.cs" />
205205
<Compile Include="Properties\AssemblyInfo.cs" />
206+
<Compile Include="Symbols\DeclarationFinderTests.cs" />
206207
<Compile Include="TodoExplorer\TodoExplorerTests.cs" />
207208
<Compile Include="UnitTesting\AssertTests.cs" />
208209
<Compile Include="UnitTesting\EngineTests.cs" />
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
using System;
2+
using Microsoft.VisualStudio.TestTools.UnitTesting;
3+
using Rubberduck.Parsing.Symbols;
4+
using Rubberduck.Parsing.VBA;
5+
using Rubberduck.Parsing.Grammar;
6+
using Rubberduck.VBEditor;
7+
using System.Collections.Generic;
8+
using System.Linq;
9+
using Antlr4.Runtime;
10+
11+
namespace RubberduckTests.Symbols
12+
{
13+
[TestClass]
14+
public class DeclarationFinderTests
15+
{
16+
[TestCategory("Resolver")]
17+
[TestMethod]
18+
public void DeclarationFinderCanCopeWithMultipleModulesImplementingTheSameInterface()
19+
{
20+
var project = GetTestProject("testProject");
21+
var interf = GetTestClassModule(project, "interface");
22+
var member = GetTestFunction(interf, "testMember", Accessibility.Public);
23+
var implementingClass1 = GetTestClassModule(project, "implementingClass1");
24+
var implementingClass2 = GetTestClassModule(project, "implementingClass2");
25+
var implementsContext1 = new VBAParser.ImplementsStmtContext(null, 0);
26+
var implementsContext2 = new VBAParser.ImplementsStmtContext(null, 0);
27+
AddReference(interf, implementingClass1, implementsContext1);
28+
AddReference(interf, implementingClass1, implementsContext2);
29+
var declarations = new List<Declaration> {interf, member, implementingClass1, implementingClass2};
30+
31+
DeclarationFinder finder = new DeclarationFinder(declarations, new List<Rubberduck.Parsing.Annotations.IAnnotation>(), new List<UnboundMemberDeclaration>());
32+
var interfaceDeclarations = finder.FindAllInterfaceMembers().ToList();
33+
34+
Assert.AreEqual(1, interfaceDeclarations.Count());
35+
}
36+
37+
private static ClassModuleDeclaration GetTestClassModule(Declaration projectDeclatation, string name, bool isExposed = false)
38+
{
39+
var qualifiedClassModuleMemberName = new QualifiedMemberName(StubQualifiedModuleName(name), name);
40+
var classModuleAttributes = new Rubberduck.Parsing.VBA.Attributes();
41+
if (isExposed)
42+
{
43+
classModuleAttributes.AddExposedClassAttribute();
44+
}
45+
return new ClassModuleDeclaration(qualifiedClassModuleMemberName, projectDeclatation, name, false, null, classModuleAttributes);
46+
}
47+
48+
private static ProjectDeclaration GetTestProject(string name)
49+
{
50+
var qualifiedProjectName = new QualifiedMemberName(StubQualifiedModuleName("proj"), name);
51+
return new ProjectDeclaration(qualifiedProjectName, name, false, null);
52+
}
53+
54+
private static QualifiedModuleName StubQualifiedModuleName(string name)
55+
{
56+
return new QualifiedModuleName("dummy", "dummy", name);
57+
}
58+
59+
private static FunctionDeclaration GetTestFunction(Declaration moduleDeclatation, string name, Accessibility functionAccessibility)
60+
{
61+
var qualifiedFunctionMemberName = new QualifiedMemberName(moduleDeclatation.QualifiedName.QualifiedModuleName, name);
62+
return new FunctionDeclaration(qualifiedFunctionMemberName, moduleDeclatation, moduleDeclatation, "test", null, "test", functionAccessibility, null, Selection.Home, false, false, null, null);
63+
}
64+
65+
private static void AddReference(Declaration toDeclaration, Declaration fromModuleDeclaration, ParserRuleContext context = null)
66+
{
67+
toDeclaration.AddReference(toDeclaration.QualifiedName.QualifiedModuleName, fromModuleDeclaration, fromModuleDeclaration, context, toDeclaration.IdentifierName, toDeclaration, Selection.Home, new List<Rubberduck.Parsing.Annotations.IAnnotation>());
68+
}
69+
70+
}
71+
}

0 commit comments

Comments
 (0)