|
| 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