Skip to content

Commit d61cb22

Browse files
committed
Added tests for ClassModuleDeclaration and refactored.
1 parent 1af1af0 commit d61cb22

File tree

2 files changed

+370
-11
lines changed

2 files changed

+370
-11
lines changed

Rubberduck.Parsing/Symbols/ClassModuleDeclaration.cs

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ public static IEnumerable<Declaration> GetSupertypes(Declaration type)
5353
{
5454
return new List<Declaration>();
5555
}
56-
return ((ClassModuleDeclaration)type).Supertypes;
56+
var classType = type as ClassModuleDeclaration;
57+
return classType != null ? classType.Supertypes : new List<Declaration>();
5758
}
5859

5960

@@ -115,16 +116,7 @@ public bool IsGlobalClassModule
115116

116117
private bool IsGlobalFromSubtypes()
117118
{
118-
var isGlobal = false;
119-
foreach (var type in Subtypes)
120-
{
121-
if (type is ClassModuleDeclaration && ((ClassModuleDeclaration)type).IsGlobalClassModule)
122-
{
123-
isGlobal = true;
124-
break;
125-
}
126-
}
127-
return isGlobal;
119+
return Subtypes.Any(subtype => (subtype is ClassModuleDeclaration && ((ClassModuleDeclaration)subtype).IsGlobalClassModule));
128120
}
129121

130122

Lines changed: 367 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,367 @@
1+
using System;
2+
using Microsoft.VisualStudio.TestTools.UnitTesting;
3+
using System.Linq;
4+
using Rubberduck.Parsing.Symbols;
5+
using Rubberduck.VBEditor;
6+
using Rubberduck.Parsing.VBA;
7+
8+
namespace RubberduckTests.Symbols
9+
{
10+
[TestClass]
11+
public class ClassModuleDeclarationTests
12+
{
13+
[TestMethod]
14+
public void HasDeclarationTypeClassModule()
15+
{
16+
var projectDeclaration = GetTestProject("testProject");
17+
var classModule = GetTestClassModule(projectDeclaration, "testClass", false, null);
18+
19+
Assert.IsTrue(classModule.DeclarationType.HasFlag(DeclarationType.ClassModule));
20+
}
21+
22+
private static ProjectDeclaration GetTestProject(string name)
23+
{
24+
var qualifiedProjectName = new QualifiedMemberName(StubQualifiedModuleName(), name);
25+
return new ProjectDeclaration(qualifiedProjectName, name, false);
26+
}
27+
28+
private static QualifiedModuleName StubQualifiedModuleName()
29+
{
30+
return new QualifiedModuleName("dummy", "dummy", "dummy");
31+
}
32+
33+
private static ClassModuleDeclaration GetTestClassModule(Declaration projectDeclatation, string name, bool isBuiltIn, Attributes attributes, bool hasDefaultInstanceVariable = false)
34+
{
35+
var qualifiedClassModuleMemberName = new QualifiedMemberName(StubQualifiedModuleName(), name);
36+
return new ClassModuleDeclaration(qualifiedClassModuleMemberName, projectDeclatation, name, isBuiltIn, null, attributes, hasDefaultInstanceVariable);
37+
}
38+
39+
40+
[TestMethod]
41+
public void ByDefaultSubtypesIsEmpty()
42+
{
43+
var projectDeclaration = GetTestProject("testProject");
44+
var classModule = GetTestClassModule(projectDeclaration, "testClass", false, null);
45+
46+
Assert.IsFalse(classModule.Subtypes.Any());
47+
}
48+
49+
50+
[TestMethod]
51+
public void AddSubtypeAddsClassToSubtypes()
52+
{
53+
var projectDeclaration = GetTestProject("testProject");
54+
var classModule = GetTestClassModule(projectDeclaration, "testClass", false, null);
55+
var subtype = GetTestClassModule(projectDeclaration, "testSubtype", false, null);
56+
classModule.AddSubtype(subtype);
57+
58+
Assert.IsTrue(classModule.Subtypes.First().Equals(subtype));
59+
}
60+
61+
62+
[TestMethod]
63+
public void ByDefaultSupertypesIsEmpty()
64+
{
65+
var projectDeclaration = GetTestProject("testProject");
66+
var classModule = GetTestClassModule(projectDeclaration, "testClass", false, null);
67+
68+
Assert.IsFalse(classModule.Supertypes.Any());
69+
}
70+
71+
72+
[TestMethod]
73+
public void AddSupertypeForDeclarationsAddsClassToSupertypes()
74+
{
75+
var projectDeclaration = GetTestProject("testProject");
76+
var classModule = GetTestClassModule(projectDeclaration, "testClass", false, null);
77+
var supertype = GetTestClassModule(projectDeclaration, "testSupertype", false, null);
78+
classModule.AddSupertype(supertype);
79+
80+
Assert.IsTrue(classModule.Supertypes.First().Equals(supertype));
81+
}
82+
83+
84+
[TestMethod]
85+
public void ByDefaultSupertypeNamesIsEmpty()
86+
{
87+
var projectDeclaration = GetTestProject("testProject");
88+
var classModule = GetTestClassModule(projectDeclaration, "testClass", false, null);
89+
90+
Assert.IsFalse(classModule.SupertypeNames.Any());
91+
}
92+
93+
94+
[TestMethod]
95+
public void AddSupertypeForStringsAddsTypenameToSupertypeNames()
96+
{
97+
var projectDeclaration = GetTestProject("testProject");
98+
var classModule = GetTestClassModule(projectDeclaration, "testClass", false, null);
99+
var supertypeName = "testSupertypeName";
100+
classModule.AddSupertype(supertypeName);
101+
102+
Assert.IsTrue(classModule.SupertypeNames.First().Equals(supertypeName));
103+
}
104+
105+
106+
[TestMethod]
107+
public void AddSupertypeForDeclarationsHasNoEffectOnSupertypeNames()
108+
{
109+
var projectDeclaration = GetTestProject("testProject");
110+
var classModule = GetTestClassModule(projectDeclaration, "testClass", false, null);
111+
var supertype = GetTestClassModule(projectDeclaration, "testSupertype", false, null);
112+
classModule.AddSupertype(supertype);
113+
114+
Assert.IsFalse(classModule.SupertypeNames.Any());
115+
}
116+
117+
118+
[TestMethod]
119+
public void AddSupertypeForStringsHasNoEffectsOnSupertypes()
120+
{
121+
var projectDeclaration = GetTestProject("testProject");
122+
var classModule = GetTestClassModule(projectDeclaration, "testClass", false, null);
123+
var supertypeName = "testSupertypeName";
124+
classModule.AddSupertype(supertypeName);
125+
126+
Assert.IsFalse(classModule.Supertypes.Any());
127+
}
128+
129+
130+
[TestMethod]
131+
public void GetSupertypesReturnsAnEmptyEnumerableForProceduralModules()
132+
{
133+
var projectDeclaration = GetTestProject("testProject");
134+
var proceduralModule = GetTestProceduralModule(projectDeclaration, "testModule");
135+
136+
Assert.IsFalse(ClassModuleDeclaration.GetSupertypes(proceduralModule).Any());
137+
}
138+
139+
private static ProceduralModuleDeclaration GetTestProceduralModule(Declaration projectDeclatation, string name)
140+
{
141+
var qualifiedClassModuleMemberName = new QualifiedMemberName(StubQualifiedModuleName(), name);
142+
return new ProceduralModuleDeclaration(qualifiedClassModuleMemberName, projectDeclatation, name, false, null, null);
143+
}
144+
145+
146+
[TestMethod]
147+
public void GetSupertypesReturnsTheSupertypesOfAClassModule()
148+
{
149+
var projectDeclaration = GetTestProject("testProject");
150+
var supertype = GetTestClassModule(projectDeclaration, "testSupertype", false, null);
151+
var classModule = GetTestClassModule(projectDeclaration, "testClass", false, null);
152+
classModule.AddSupertype(supertype);
153+
154+
Assert.AreEqual(supertype, ClassModuleDeclaration.GetSupertypes(classModule).First());
155+
}
156+
157+
158+
[TestMethod]
159+
public void GetSupertypesReturnsAnEmptyEnumerableForDeclarationsWithDeclarationTypeClassModuleWhichAreNoClassModuleDeclarations()
160+
{
161+
var projectDeclaration = GetTestProject("testProject");
162+
var fakeClassModule = GetTestFakeClassModule(projectDeclaration, "testFakeClass");
163+
164+
Assert.IsFalse(ClassModuleDeclaration.GetSupertypes(fakeClassModule).Any());
165+
}
166+
167+
private static Declaration GetTestFakeClassModule(Declaration parentDeclatation, string name)
168+
{
169+
var qualifiedVariableMemberName = new QualifiedMemberName(StubQualifiedModuleName(), name);
170+
return new Declaration(qualifiedVariableMemberName, parentDeclatation, "dummy", "test", "test", false, false, Accessibility.Public, DeclarationType.ClassModule, null, Selection.Home, false, null);
171+
}
172+
173+
174+
175+
[TestMethod]
176+
public void ByDefaultDefaultMemberIsNull()
177+
{
178+
var projectDeclaration = GetTestProject("testProject");
179+
var classModule = GetTestClassModule(projectDeclaration, "testClass", false, null);
180+
181+
Assert.IsNull(classModule.DefaultMember);
182+
}
183+
184+
185+
[TestMethod]
186+
public void ByDefaultClassModulesNotBuiltInAreNotExposed()
187+
{
188+
var projectDeclaration = GetTestProject("testProject");
189+
var classModule = GetTestClassModule(projectDeclaration, "testClass", false, null);
190+
191+
Assert.IsFalse(classModule.IsExposed);
192+
}
193+
194+
195+
// TODO: Find out if there's info about "being exposed" in type libraries.
196+
// We take the conservative approach of treating all type library modules as exposed.
197+
[TestMethod]
198+
public void BuiltInClassesAreExposed()
199+
{
200+
var projectDeclaration = GetTestProject("testProject");
201+
var classModule = GetTestClassModule(projectDeclaration, "testClass", true, null);
202+
203+
Assert.IsTrue(classModule.IsExposed);
204+
}
205+
206+
207+
[TestMethod]
208+
public void ClassModulesWithTheExposedAttributeAreExposed()
209+
{
210+
var projectDeclaration = GetTestProject("testProject");
211+
var classAttributes = new Attributes();
212+
classAttributes.AddExposedClassAttribute();
213+
var classModule = GetTestClassModule(projectDeclaration, "testClass", false, classAttributes);
214+
215+
Assert.IsTrue(classModule.IsExposed);
216+
}
217+
218+
219+
[TestMethod]
220+
public void ByDefaultClassModulesAreNotGlobalClasses()
221+
{
222+
var projectDeclaration = GetTestProject("testProject");
223+
var classModule = GetTestClassModule(projectDeclaration, "testClass", false, null);
224+
225+
Assert.IsFalse(classModule.IsGlobalClassModule);
226+
}
227+
228+
229+
[TestMethod]
230+
public void ClassModulesWithTheGlobalNamespaceAttributeAreGlobalClasses()
231+
{
232+
var projectDeclaration = GetTestProject("testProject");
233+
var classAttributes = new Attributes();
234+
classAttributes.AddGlobalClassAttribute();
235+
var classModule = GetTestClassModule(projectDeclaration, "testClass", false, classAttributes);
236+
237+
Assert.IsTrue(classModule.IsGlobalClassModule);
238+
}
239+
240+
241+
[TestMethod]
242+
public void ClassModulesWithASubtypeBelowInTheHiearchyThatIsAGlobalClassAndThatHasBeenAddedBeforeCallingIsGlobalClassTheFirstTimeIsAGlobalClass()
243+
{
244+
var projectDeclaration = GetTestProject("testProject");
245+
var classAttributes = new Attributes();
246+
classAttributes.AddGlobalClassAttribute();
247+
var subsubtype = GetTestClassModule(projectDeclaration, "testSubSubtype", false, classAttributes);
248+
var subtype = GetTestClassModule(projectDeclaration, "testSubtype", false, null);
249+
subtype.AddSubtype(subsubtype);
250+
var classModule = GetTestClassModule(projectDeclaration, "testClass", false, null);
251+
classModule.AddSubtype(subtype);
252+
253+
Assert.IsTrue(classModule.IsGlobalClassModule);
254+
}
255+
256+
257+
[TestMethod]
258+
public void ClassModulesDoNotBecomeAGlobalClassIfASubtypeBelowInTheHiearchyIsAddedThatIsAGlobalClassAfterIsAGlobalClassHasAlreadyBeenCalled()
259+
{
260+
var projectDeclaration = GetTestProject("testProject");
261+
var classAttributes = new Attributes();
262+
classAttributes.AddGlobalClassAttribute();
263+
var subsubtype = GetTestClassModule(projectDeclaration, "testSubSubtype", false, classAttributes);
264+
var subtype = GetTestClassModule(projectDeclaration, "testSubtype", false, null);
265+
subtype.AddSubtype(subsubtype);
266+
var classModule = GetTestClassModule(projectDeclaration, "testClass", false, null);
267+
var dummy = classModule.IsGlobalClassModule;
268+
classModule.AddSubtype(subtype);
269+
270+
Assert.IsFalse(classModule.IsGlobalClassModule);
271+
}
272+
273+
274+
[TestMethod]
275+
public void ClassModulesDoNotBecomeAGlobalClassIfBelowInTheHierarchyASubtypeIsAddedThatIsAGlobalClassAfterIsAGlobalClassHasAlreadyBeenCalled()
276+
{
277+
var projectDeclaration = GetTestProject("testProject");
278+
var classAttributes = new Attributes();
279+
classAttributes.AddGlobalClassAttribute();
280+
var subsubtype = GetTestClassModule(projectDeclaration, "testSubSubtype", false, classAttributes);
281+
var subtype = GetTestClassModule(projectDeclaration, "testSubtype", false, null);
282+
var classModule = GetTestClassModule(projectDeclaration, "testClass", false, null);
283+
classModule.AddSubtype(subtype);
284+
var dummy = classModule.IsGlobalClassModule;
285+
subtype.AddSubtype(subsubtype);
286+
287+
Assert.IsFalse(classModule.IsGlobalClassModule);
288+
}
289+
290+
291+
[TestMethod]
292+
public void ByDefaultClassModulesDoNotHaveAPredeclaredID()
293+
{
294+
var projectDeclaration = GetTestProject("testProject");
295+
var classModule = GetTestClassModule(projectDeclaration, "testClass", false, null);
296+
297+
Assert.IsFalse(classModule.HasPredeclaredId);
298+
}
299+
300+
301+
[TestMethod]
302+
public void ClassModulesHaveAPredeclaredIDIfStatedInTheConstructorThatTheyHaveADefaultInstanceVariable()
303+
{
304+
var projectDeclaration = GetTestProject("testProject");
305+
var classModule = GetTestClassModule(projectDeclaration, "testClass", false, null, true);
306+
307+
Assert.IsTrue(classModule.HasPredeclaredId);
308+
}
309+
310+
311+
[TestMethod]
312+
public void ClassModulesWithThePredeclaredIDAttributeHaveAPredeclaredID()
313+
{
314+
var projectDeclaration = GetTestProject("testProject");
315+
var classAttributes = new Attributes();
316+
classAttributes.AddPredeclaredIdTypeAttribute();
317+
var classModule = GetTestClassModule(projectDeclaration, "testClass", false, classAttributes);
318+
319+
Assert.IsTrue(classModule.HasPredeclaredId);
320+
}
321+
322+
323+
[TestMethod]
324+
public void ByDefaultClassModulesDoNotHaveADefaultInstanceVariable()
325+
{
326+
var projectDeclaration = GetTestProject("testProject");
327+
var classModule = GetTestClassModule(projectDeclaration, "testClass", false, null);
328+
329+
Assert.IsFalse(classModule.HasDefaultInstanceVariable);
330+
}
331+
332+
333+
[TestMethod]
334+
public void ClassModulesThatAreGlobalClassesHaveADefaultInstanceVariable()
335+
{
336+
var projectDeclaration = GetTestProject("testProject");
337+
var classAttributes = new Attributes();
338+
classAttributes.AddGlobalClassAttribute();
339+
var classModule = GetTestClassModule(projectDeclaration, "testClass", false, classAttributes);
340+
341+
Assert.IsTrue(classModule.HasDefaultInstanceVariable);
342+
}
343+
344+
345+
[TestMethod]
346+
public void ClassModulesWithThePredeclaredIDAttributeHaveADefaultInstanceVariable()
347+
{
348+
var projectDeclaration = GetTestProject("testProject");
349+
var classAttributes = new Attributes();
350+
classAttributes.AddPredeclaredIdTypeAttribute();
351+
var classModule = GetTestClassModule(projectDeclaration, "testClass", false, classAttributes);
352+
353+
Assert.IsTrue(classModule.HasDefaultInstanceVariable);
354+
}
355+
356+
357+
[TestMethod]
358+
public void ClassModulesHaveADefaultInstanceVariableIfThisIsStated()
359+
{
360+
var projectDeclaration = GetTestProject("testProject");
361+
var classModule = GetTestClassModule(projectDeclaration, "testClass", false, null, true);
362+
363+
Assert.IsTrue(classModule.HasDefaultInstanceVariable);
364+
}
365+
366+
}
367+
}

0 commit comments

Comments
 (0)