Skip to content

Commit 4b4951a

Browse files
committed
implemented mock builders
1 parent c976b25 commit 4b4951a

File tree

6 files changed

+288
-33
lines changed

6 files changed

+288
-33
lines changed

RubberduckTests/Mocks/MockFactory.cs

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -58,30 +58,17 @@ internal static Mock<VBE> CreateVbeMock(MockWindowsCollection windows)
5858
{
5959
var vbe = new Mock<VBE>();
6060
windows.VBE = vbe.Object;
61-
vbe.Setup(v => v.Windows).Returns(windows);
61+
vbe.Setup(m => m.Windows).Returns(windows);
62+
vbe.SetupProperty(m => m.ActiveCodePane);
63+
vbe.SetupProperty(m => m.ActiveVBProject);
64+
vbe.SetupGet(m => m.SelectedVBComponent).Returns(() => vbe.Object.ActiveCodePane.CodeModule.Parent);
65+
vbe.SetupGet(m => m.ActiveWindow).Returns(() => vbe.Object.ActiveCodePane.Window);
6266

6367
//setting up a main window lets the native window functions fun
6468
var mainWindow = new Mock<Window>();
65-
mainWindow.Setup(w => w.HWnd).Returns(0);
69+
mainWindow.Setup(m => m.HWnd).Returns(0);
6670

67-
vbe.SetupGet(v => v.MainWindow).Returns(mainWindow.Object);
68-
69-
return vbe;
70-
}
71-
72-
/// <summary>
73-
/// Creates a new <see cref="Mock{VBE}"/> with the <see cref="VBE.Windows"/> and <see cref="VBE.VBProjects"/> properties setup.
74-
/// </summary>
75-
/// <param name="windows">
76-
/// A <see cref="MockWindowsCollection"/> is expected.
77-
/// Other objects implementing the<see cref="Windows"/> interface could cause issues.
78-
/// </param>
79-
/// <param name="projects"><see cref="VBProjects"/> collecction.</param>
80-
/// <returns></returns>
81-
internal static Mock<VBE> CreateVbeMock(MockWindowsCollection windows, VBProjects projects)
82-
{
83-
var vbe = CreateVbeMock(windows);
84-
vbe.SetupGet(v => v.VBProjects).Returns(projects);
71+
vbe.SetupGet(m => m.MainWindow).Returns(mainWindow.Object);
8572

8673
return vbe;
8774
}
@@ -116,7 +103,7 @@ internal static Mock<CodePane> CreateCodePaneMock(Mock<VBE> vbe, string name)
116103
/// </summary>
117104
/// <param name="code">A block of VBA code.</param>
118105
/// <returns></returns>
119-
internal static Mock<CodeModule> CreateCodeModuleMock(string code)
106+
private static Mock<CodeModule> CreateCodeModuleMock(string code)
120107
{
121108
var lines = code.Split(new[] {Environment.NewLine}, StringSplitOptions.None).ToList();
122109

Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
using System;
2+
using System.Collections;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using Microsoft.Vbe.Interop;
6+
using Moq;
7+
8+
namespace RubberduckTests.Mocks
9+
{
10+
public class MockProjectBuilder
11+
{
12+
private readonly Func<VBE> _getVbe;
13+
private readonly Mock<VBProject> _project;
14+
private readonly Mock<VBComponents> _vbComponents;
15+
private readonly Mock<References> _vbReferences;
16+
17+
private readonly List<Mock<VBComponent>> _components = new List<Mock<VBComponent>>();
18+
private readonly List<Mock<Reference>> _references = new List<Mock<Reference>>();
19+
20+
public MockProjectBuilder(string name, vbext_ProjectProtection protection, Func<VBE> getVbe)
21+
{
22+
_getVbe = getVbe;
23+
24+
_project = CreateProjectMock(name, protection);
25+
26+
_vbComponents = CreateComponentsMock();
27+
_project.SetupGet(m => m.VBComponents).Returns(_vbComponents.Object);
28+
29+
_vbReferences = CreateReferencesMock();
30+
_project.SetupGet(m => m.References).Returns(_vbReferences.Object);
31+
}
32+
33+
public MockProjectBuilder AddComponent(string name, vbext_ComponentType type, string content)
34+
{
35+
var component = CreateComponentMock(name, type, content);
36+
_components.Add(component);
37+
38+
return this;
39+
}
40+
41+
public MockProjectBuilder AddReference(string name, string filePath)
42+
{
43+
_references.Add(CreateReferenceMock(name, filePath));
44+
return this;
45+
}
46+
47+
public Mock<VBProject> Build()
48+
{
49+
return _project;
50+
}
51+
52+
private Mock<VBProject> CreateProjectMock(string name, vbext_ProjectProtection protection)
53+
{
54+
var result = new Mock<VBProject>();
55+
56+
result.SetupProperty(m => m.Name, name);
57+
result.SetupGet(m => m.Protection).Returns(() => protection);
58+
result.SetupGet(m => m.VBE).Returns(_getVbe);
59+
60+
return result;
61+
}
62+
63+
private Mock<VBComponents> CreateComponentsMock()
64+
{
65+
var result = new Mock<VBComponents>();
66+
67+
result.SetupGet(m => m.Parent).Returns(() => _project.Object);
68+
result.SetupGet(m => m.VBE).Returns(_getVbe);
69+
70+
result.Setup(c => c.GetEnumerator()).Returns(() => _components.GetEnumerator());
71+
result.As<IEnumerable>().Setup(c => c.GetEnumerator()).Returns(() => _components.GetEnumerator());
72+
73+
result.Setup(m => m.Item(It.IsAny<int>())).Returns<int>(index => _components[index].Object);
74+
result.Setup(m => m.Item(It.IsAny<string>())).Returns<string>(name => _components.Single(item => item.Object.Name == name).Object);
75+
76+
return result;
77+
}
78+
79+
private Mock<References> CreateReferencesMock()
80+
{
81+
var result = new Mock<References>();
82+
83+
result.SetupGet(m => m.Parent).Returns(() => _project.Object);
84+
result.SetupGet(m => m.VBE).Returns(_getVbe);
85+
86+
result.Setup(m => m.GetEnumerator()).Returns(() => _references.GetEnumerator());
87+
result.As<IEnumerable>().Setup(m => m.GetEnumerator()).Returns(() => _references.GetEnumerator());
88+
89+
result.Setup(m => m.Item(It.IsAny<int>())).Returns<int>(index => _references[index].Object);
90+
91+
return result;
92+
}
93+
94+
private Mock<Reference> CreateReferenceMock(string name, string filePath)
95+
{
96+
var result = new Mock<Reference>();
97+
98+
result.SetupGet(m => m.VBE).Returns(_getVbe);
99+
result.SetupGet(m => m.Collection).Returns(() => _vbReferences.Object);
100+
101+
result.SetupGet(m => m.Name).Returns(() => name);
102+
result.SetupGet(m => m.FullPath).Returns(() => filePath);
103+
104+
return result;
105+
}
106+
107+
private Mock<VBComponent> CreateComponentMock(string name, vbext_ComponentType type, string content)
108+
{
109+
var result = new Mock<VBComponent>();
110+
111+
result.SetupGet(m => m.VBE).Returns(_getVbe);
112+
result.SetupGet(m => m.Collection).Returns(() => _vbComponents.Object);
113+
result.SetupGet(m => m.Type).Returns(() => type);
114+
result.SetupProperty(m => m.Name, name);
115+
116+
var module = CreateCodeModuleMock(name, content);
117+
result.SetupGet(m => m.CodeModule).Returns(() => module.Object);
118+
119+
result.Setup(m => m.Activate());
120+
121+
return result;
122+
}
123+
124+
private Mock<CodeModule> CreateCodeModuleMock(string name, string content)
125+
{
126+
var codePane = CreateCodePaneMock(name);
127+
codePane.SetupGet(m => m.VBE).Returns(_getVbe);
128+
129+
var result = CreateCodeModuleMock(content);
130+
result.SetupGet(m => m.VBE).Returns(_getVbe);
131+
result.SetupGet(m => m.CodePane).Returns(() => codePane.Object);
132+
133+
codePane.SetupGet(m => m.CodeModule).Returns(() => result.Object);
134+
return result;
135+
}
136+
137+
private Mock<CodeModule> CreateCodeModuleMock(string content)
138+
{
139+
var lines = content.Split(new[] { Environment.NewLine }, StringSplitOptions.None).ToList();
140+
141+
var codeModule = new Mock<CodeModule>();
142+
codeModule.SetupGet(c => c.CountOfLines).Returns(() => lines.Count);
143+
144+
// ReSharper disable once UseIndexedProperty
145+
codeModule.Setup(m => m.get_Lines(It.IsAny<int>(), It.IsAny<int>()))
146+
.Returns<int, int>((start, count) => String.Join(Environment.NewLine, lines.Skip(start - 1).Take(count)));
147+
148+
codeModule.Setup(m => m.ReplaceLine(It.IsAny<int>(), It.IsAny<string>()))
149+
.Callback<int, string>((index, str) => lines[index - 1] = str);
150+
151+
codeModule.Setup(m => m.DeleteLines(It.IsAny<int>(), It.IsAny<int>()))
152+
.Callback<int, int>((index, count) => lines.RemoveRange(index - 1, count));
153+
154+
codeModule.Setup(m => m.InsertLines(It.IsAny<int>(), It.IsAny<string>()))
155+
.Callback<int, string>((index, newLine) => lines.Insert(index - 1, newLine));
156+
157+
return codeModule;
158+
}
159+
160+
private Mock<CodePane> CreateCodePaneMock(string name)
161+
{
162+
var windows = _getVbe().Windows as MockWindowsCollection;
163+
if (windows == null)
164+
{
165+
throw new InvalidOperationException("VBE.Windows collection must be a MockWindowsCollection object.");
166+
}
167+
168+
var codePane = new Mock<CodePane>();
169+
var window = windows.CreateWindow(name);
170+
windows.Add(window);
171+
172+
codePane.Setup(p => p.SetSelection(It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>(), It.IsAny<int>()));
173+
codePane.Setup(p => p.Show());
174+
175+
codePane.SetupGet(p => p.VBE).Returns(_getVbe);
176+
codePane.SetupGet(p => p.Window).Returns(() => window);
177+
178+
return codePane;
179+
}
180+
}
181+
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
using System.Collections;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using Microsoft.Vbe.Interop;
5+
using Moq;
6+
7+
namespace RubberduckTests.Mocks
8+
{
9+
public class MockVbeBuilder
10+
{
11+
private readonly Mock<VBE> _vbe;
12+
13+
private Mock<VBProjects> _vbProjects;
14+
private readonly ICollection<VBProject> _projects = new List<VBProject>();
15+
16+
private Mock<CodePanes> _vbCodePanes;
17+
private readonly ICollection<CodePane> _codePanes = new List<CodePane>();
18+
19+
public MockVbeBuilder()
20+
{
21+
_vbe = CreateVbeMock();
22+
}
23+
24+
public MockVbeBuilder AddProject(Mock<VBProject> project)
25+
{
26+
project.SetupGet(m => m.VBE).Returns(_vbe.Object);
27+
_projects.Add(project.Object);
28+
29+
foreach (var component in _projects.SelectMany(vbProject => vbProject.VBComponents.Cast<VBComponent>()))
30+
{
31+
_codePanes.Add(component.CodeModule.CodePane);
32+
}
33+
34+
return this;
35+
}
36+
37+
public MockProjectBuilder ProjectBuilder(string name, vbext_ProjectProtection protection)
38+
{
39+
var result = new MockProjectBuilder(name, protection, () => _vbe.Object);
40+
return result;
41+
}
42+
43+
public Mock<VBE> Build()
44+
{
45+
return _vbe;
46+
}
47+
48+
private Mock<VBE> CreateVbeMock()
49+
{
50+
var vbe = new Mock<VBE>();
51+
var windows = new MockWindowsCollection {VBE = vbe.Object};
52+
vbe.Setup(m => m.Windows).Returns(windows);
53+
vbe.SetupProperty(m => m.ActiveCodePane);
54+
vbe.SetupProperty(m => m.ActiveVBProject);
55+
56+
vbe.SetupGet(m => m.SelectedVBComponent).Returns(() => vbe.Object.ActiveCodePane.CodeModule.Parent);
57+
vbe.SetupGet(m => m.ActiveWindow).Returns(() => vbe.Object.ActiveCodePane.Window);
58+
59+
var mainWindow = new Mock<Window>();
60+
mainWindow.Setup(m => m.HWnd).Returns(0);
61+
62+
vbe.SetupGet(m => m.MainWindow).Returns(mainWindow.Object);
63+
64+
_vbProjects = CreateProjectsMock();
65+
_vbe.SetupGet(m => m.VBProjects).Returns(() => _vbProjects.Object);
66+
67+
_vbCodePanes = CreateCodePanesMock();
68+
_vbe.SetupGet(m => m.CodePanes).Returns(() => _vbCodePanes.Object);
69+
70+
return vbe;
71+
}
72+
73+
private Mock<VBProjects> CreateProjectsMock()
74+
{
75+
var result = new Mock<VBProjects>();
76+
result.Setup(m => m.GetEnumerator()).Returns(_projects.GetEnumerator());
77+
result.As<IEnumerable>().Setup(m => m.GetEnumerator()).Returns(_projects.GetEnumerator());
78+
result.Setup(m => m.Item(It.IsAny<int>())).Returns<int>(value => _projects.ElementAt(value));
79+
80+
return result;
81+
}
82+
83+
private Mock<CodePanes> CreateCodePanesMock()
84+
{
85+
var result = new Mock<CodePanes>();
86+
result.Setup(m => m.GetEnumerator()).Returns(_codePanes.GetEnumerator());
87+
result.As<IEnumerable>().Setup(m => m.GetEnumerator()).Returns(_codePanes.GetEnumerator());
88+
result.Setup(m => m.Item(It.IsAny<int>())).Returns<int>(value => _codePanes.ElementAt(value));
89+
90+
return result;
91+
}
92+
}
93+
}

RubberduckTests/Mocks/MockWindowsCollection.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ internal MockWindowsCollection()
2020
:this(new List<Window>{MockFactory.CreateWindowMock().Object})
2121
{ }
2222

23-
internal MockWindowsCollection(IList<Window> windows)
23+
internal MockWindowsCollection(ICollection<Window> windows)
2424
{
2525
_windows = windows;
2626
}
2727

28-
private readonly IList<Window> _windows;
28+
private readonly ICollection<Window> _windows;
2929

3030
[SuppressMessage("ReSharper", "InconsistentNaming")]
3131
[SuppressMessage("ReSharper", "RedundantAssignment")]
@@ -97,7 +97,7 @@ public Window Item(object index)
9797
{
9898
if (index is ValueType)
9999
{
100-
return _windows[(int) index];
100+
return _windows.ElementAt((int) index);
101101
}
102102

103103
return _windows.FirstOrDefault(window => window.Caption == index.ToString());

RubberduckTests/RubberduckTests.csproj

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -150,10 +150,6 @@
150150
<HintPath>..\packages\Ninject.3.2.2.0\lib\net45-full\Ninject.dll</HintPath>
151151
<Private>True</Private>
152152
</Reference>
153-
<Reference Include="NLog, Version=3.2.1.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
154-
<HintPath>..\packages\NLog.3.2.1\lib\net45\NLog.dll</HintPath>
155-
<Private>True</Private>
156-
</Reference>
157153
<Reference Include="Office, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c">
158154
<SpecificVersion>False</SpecificVersion>
159155
<EmbedInteropTypes>True</EmbedInteropTypes>
@@ -181,8 +177,10 @@
181177
</Otherwise>
182178
</Choose>
183179
<ItemGroup>
180+
<Compile Include="Mocks\MockProjectBuilder.cs" />
184181
<Compile Include="Mocks\MockFactory.cs" />
185182
<Compile Include="Mocks\MockWindowsCollection.cs" />
183+
<Compile Include="Mocks\MockVbeBuilder.cs" />
186184
<Compile Include="VbeTestBase.cs" />
187185
<Compile Include="Refactoring\RemoveParametersTests.cs" />
188186
<Compile Include="Refactoring\RenameTests.cs" />

RubberduckTests/VbeTestBase.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,6 @@ public abstract class VbeTestBase
1717
public void Initialize()
1818
{
1919
_ide = MockFactory.CreateVbeMock();
20-
_ide.SetupProperty(m => m.ActiveCodePane);
21-
_ide.SetupProperty(m => m.ActiveVBProject);
22-
_ide.SetupGet(m => m.SelectedVBComponent).Returns(() => _ide.Object.ActiveCodePane.CodeModule.Parent);
23-
_ide.SetupGet(m => m.ActiveWindow).Returns(() => _ide.Object.ActiveCodePane.Window);
2420

2521
_projects = new List<VBProject>();
2622
var projects = MockFactory.CreateProjectsMock(_projects);
@@ -42,7 +38,7 @@ protected QualifiedSelection GetQualifiedSelection(Selection selection)
4238
_ide.Object.ActiveVBProject = _ide.Object.VBProjects.Item(0);
4339
_ide.Object.ActiveCodePane = _ide.Object.ActiveVBProject.VBComponents.Item(0).CodeModule.CodePane;
4440
}
45-
return GetQualifiedSelection(selection, _ide.Object.ActiveCodePane.CodeModule.Parent);
41+
return new QualifiedSelection(new QualifiedModuleName(_ide.Object.ActiveCodePane.CodeModule.Parent), selection);
4642
}
4743

4844
protected QualifiedSelection GetQualifiedSelection(Selection selection, VBComponent component)

0 commit comments

Comments
 (0)