-
Notifications
You must be signed in to change notification settings - Fork 307
/
Copy pathTestDiscovery.cs
91 lines (80 loc) · 4.23 KB
/
TestDiscovery.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
using System.Collections.Generic;
using System.Linq;
using Rubberduck.Parsing;
using Rubberduck.Parsing.Annotations.Concrete;
using Rubberduck.Parsing.Symbols;
using Rubberduck.Parsing.VBA;
using Rubberduck.VBEditor;
using Rubberduck.VBEditor.Extensions;
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
namespace Rubberduck.UnitTesting
{
// FIXME make internal. Nobody outside of RD.UnitTesting needs this!
public static class TestDiscovery // todo: reimplement using state.DeclarationFinder
{
public static IEnumerable<TestMethod> GetAllTests(RubberduckParserState state)
{
return GetTestModuleProcedures(state)
.Where(item => IsTestMethod(state, item))
.Select(item => new TestMethod(item));
}
public static IEnumerable<TestMethod> GetTests(IVBE vbe, IVBComponent component, RubberduckParserState state)
{
if (component == null || component.IsWrappingNullReference)
{
return Enumerable.Empty<TestMethod>();
}
// apparently, sometimes it thinks the components are different but knows the modules are the same
// if the modules are the same, then the component is the same as far as we are concerned
return GetAllTests(state)
.Where(test => state.ProjectsProvider.Component(test.Declaration).HasEqualCodeModule(component));
}
public static bool IsTestMethod(RubberduckParserState state, Declaration item)
{
return !state.AllUserDeclarations.Any(d =>
d.DeclarationType == DeclarationType.Parameter && Equals(d.ParentScopeDeclaration, item)) &&
item.Annotations.Any(pta => pta.Annotation is TestMethodAnnotation);
}
public static IEnumerable<Declaration> FindModuleInitializeMethods(QualifiedModuleName module, RubberduckParserState state)
{
return GetTestModuleProcedures(state)
.Where(m =>
m.QualifiedName.QualifiedModuleName == module &&
m.Annotations.Any(pta => pta.Annotation is ModuleInitializeAnnotation));
}
public static IEnumerable<Declaration> FindModuleCleanupMethods(QualifiedModuleName module, RubberduckParserState state)
{
return GetTestModuleProcedures(state)
.Where(m =>
m.QualifiedName.QualifiedModuleName == module &&
m.Annotations.Any(pta => pta.Annotation is ModuleCleanupAnnotation));
}
public static IEnumerable<Declaration> FindTestInitializeMethods(QualifiedModuleName module, RubberduckParserState state)
{
return GetTestModuleProcedures(state)
.Where(m =>
m.QualifiedName.QualifiedModuleName == module &&
m.Annotations.Any(pta => pta.Annotation is TestInitializeAnnotation));
}
public static IEnumerable<Declaration> FindTestCleanupMethods(QualifiedModuleName module, RubberduckParserState state)
{
return GetTestModuleProcedures(state)
.Where(m =>
m.QualifiedName.QualifiedModuleName == module &&
m.Annotations.Any(pta => pta.Annotation is TestCleanupAnnotation));
}
private static IEnumerable<Declaration> GetTestModuleProcedures(RubberduckParserState state)
{
var procedures = state.AllUserDeclarations.Where(item => item.DeclarationType == DeclarationType.Procedure);
return procedures.Where(item =>
item.ParentDeclaration.DeclarationType == DeclarationType.ProceduralModule &&
item.ParentDeclaration.Annotations.Any(pta => pta.Annotation is TestModuleAnnotation));
}
public static IEnumerable<Declaration> GetTestModules(this RubberduckParserState state)
{
return state.AllUserDeclarations.Where(item =>
item.DeclarationType == DeclarationType.ProceduralModule &&
item.Annotations.Any(pta => pta.Annotation is TestModuleAnnotation));
}
}
}