Skip to content

Commit 3de091b

Browse files
committed
Create registry wrapper to aid in testing
Implement wrapper Make unit tests on registry safe
1 parent 8d84a4e commit 3de091b

File tree

4 files changed

+68
-18
lines changed

4 files changed

+68
-18
lines changed

RetailCoder.VBE/Rubberduck.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,7 @@
501501
<Compile Include="UnitTesting\Stubs\Beep.cs" />
502502
<Compile Include="UnitTesting\IStub.cs" />
503503
<Compile Include="UnitTesting\StubBase.cs" />
504+
<Compile Include="VBERuntime\RegistryWrapper.cs" />
504505
<Compile Include="VBERuntime\IVBESettings.cs" />
505506
<Compile Include="VBERuntime\VBESettings.cs" />
506507
<Compile Include="VersionCheck\IVersionCheck.cs" />
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using Microsoft.Win32;
2+
3+
namespace Rubberduck.VBERuntime
4+
{
5+
public interface IRegistryWrapper
6+
{
7+
object GetValue(string keyName, string valueName, object defaultValue);
8+
void SetValue(string keyName, string valueName, object value, RegistryValueKind valueKind);
9+
}
10+
11+
public class RegistryWrapper : IRegistryWrapper
12+
{
13+
public object GetValue(string keyName, string valueName, object defaultValue)
14+
{
15+
return Registry.GetValue(keyName, valueName, defaultValue);
16+
}
17+
18+
public void SetValue(string keyName, string valueName, object value, RegistryValueKind valueKind)
19+
{
20+
Registry.SetValue(keyName, valueName, value, valueKind);
21+
}
22+
}
23+
}

RetailCoder.VBE/VBERuntime/VBESettings.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,11 @@ public enum DllVersion
1616
Vbe7
1717
}
1818

19+
private readonly IRegistryWrapper _registry;
1920
private readonly string _activeRegistryRootPath;
2021
private readonly string[] _registryRootPaths = {Vbe7SettingPath, Vbe6SettingPath};
2122

22-
public VBESettings(IVBE vbe)
23+
public VBESettings(IVBE vbe, IRegistryWrapper registry)
2324
{
2425
try
2526
{
@@ -43,6 +44,7 @@ public VBESettings(IVBE vbe)
4344
Version = DllVersion.Unknown;
4445
_activeRegistryRootPath = null;
4546
}
47+
_registry = registry;
4648
}
4749

4850
public DllVersion Version { get; }
@@ -80,14 +82,14 @@ private void WriteAllRegistryPaths(string keyName, bool value)
8082

8183
private bool? DWordToBooleanConverter(string path, string keyName)
8284
{
83-
return !(Registry.GetValue(path, keyName, DWordFalseValue) is int result)
85+
return !(_registry.GetValue(path, keyName, DWordFalseValue) is int result)
8486
? (bool?) null
8587
: Convert.ToBoolean(result);
8688
}
8789

8890
private void BooleanToDWordConverter(string path, string keyName, bool value)
8991
{
90-
Registry.SetValue(path, keyName, value ? DWordTrueValue : DWordFalseValue, RegistryValueKind.DWord);
92+
_registry.SetValue(path, keyName, value ? DWordTrueValue : DWordFalseValue, RegistryValueKind.DWord);
9193
}
9294
}
9395
}

RubberduckTests/VBE/VBESettingsTests.cs

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
using NUnit.Framework;
1+
using Microsoft.Win32;
2+
using Moq;
3+
using NUnit.Framework;
24
using Rubberduck.VBERuntime;
35
using RubberduckTests.Mocks;
46

@@ -7,13 +9,25 @@ namespace RubberduckTests.VBE
79
[TestFixture]
810
public class VBESettingsTests
911
{
12+
private const string Vbe7SettingPath = @"HKEY_CURRENT_USER\Software\Microsoft\VBA\7.0\Common";
13+
private const string Vbe6SettingPath = @"HKEY_CURRENT_USER\Software\Microsoft\VBA\6.0\Common";
14+
private const int DWordFalseValue = 0;
15+
private const int DWordTrueValue = 1;
16+
17+
private Mock<IRegistryWrapper> GetRegistryMock()
18+
{
19+
return new Mock<IRegistryWrapper>();
20+
}
21+
1022
[Category("VBE")]
1123
[Test]
1224
public void DllVersion_MustBe6()
1325
{
1426
var vbe = new MockVbeBuilder().Build();
27+
var registry = GetRegistryMock();
28+
1529
vbe.SetupGet(s => s.Version).Returns("6.00");
16-
var settings = new VBESettings(vbe.Object);
30+
var settings = new VBESettings(vbe.Object, registry.Object);
1731

1832
Assert.IsTrue(settings.Version == VBESettings.DllVersion.Vbe6);
1933
}
@@ -23,8 +37,10 @@ public void DllVersion_MustBe6()
2337
public void DllVersion_MustBe7()
2438
{
2539
var vbe = new MockVbeBuilder().Build();
40+
var registry = GetRegistryMock();
41+
2642
vbe.SetupGet(s => s.Version).Returns("7.00");
27-
var settings = new VBESettings(vbe.Object);
43+
var settings = new VBESettings(vbe.Object, registry.Object);
2844

2945
Assert.IsTrue(settings.Version == VBESettings.DllVersion.Vbe7);
3046
}
@@ -34,8 +50,10 @@ public void DllVersion_MustBe7()
3450
public void DllVersion_IsBogus()
3551
{
3652
var vbe = new MockVbeBuilder().Build();
53+
var registry = GetRegistryMock();
54+
3755
vbe.SetupGet(s => s.Version).Returns("foo");
38-
var settings = new VBESettings(vbe.Object);
56+
var settings = new VBESettings(vbe.Object, registry.Object);
3957

4058
Assert.IsTrue(settings.Version == VBESettings.DllVersion.Unknown);
4159
}
@@ -45,38 +63,44 @@ public void DllVersion_IsBogus()
4563
public void DllVersion_IsNull()
4664
{
4765
var vbe = new MockVbeBuilder().Build();
66+
var registry = GetRegistryMock();
67+
4868
vbe.SetupGet(s => s.Version).Returns((string)null);
49-
var settings = new VBESettings(vbe.Object);
69+
var settings = new VBESettings(vbe.Object, registry.Object);
5070

5171
Assert.IsTrue(settings.Version == VBESettings.DllVersion.Unknown);
5272
}
5373

5474
[Category("VBE")]
5575
[Test]
56-
public void CompileOnDemand_WriteRead()
76+
public void CompileOnDemand_Write_IsTrue()
5777
{
5878
var vbe = new MockVbeBuilder().Build();
79+
var registry = GetRegistryMock();
80+
5981
vbe.SetupGet(s => s.Version).Returns("7.00");
60-
var settings = new VBESettings(vbe.Object);
82+
registry.Setup(s => s.SetValue(Vbe7SettingPath, "CompileOnDemand", true, RegistryValueKind.DWord));
83+
registry.Setup(s => s.GetValue(Vbe7SettingPath, "CompileOnDemand", DWordFalseValue)).Returns(DWordTrueValue);
84+
85+
var settings = new VBESettings(vbe.Object, registry.Object);
6186

6287
settings.CompileOnDemand = true;
6388
Assert.IsTrue(settings.CompileOnDemand);
64-
65-
settings.CompileOnDemand = false;
66-
Assert.IsTrue(settings.CompileOnDemand == false);
6789
}
6890

6991
[Category("VBE")]
7092
[Test]
71-
public void BackGroundCompile_WriteRead()
93+
public void BackGroundCompile_Write_IsFalse()
7294
{
7395
var vbe = new MockVbeBuilder().Build();
74-
vbe.SetupGet(s => s.Version).Returns("7.00");
75-
var settings = new VBESettings(vbe.Object);
96+
var registry = GetRegistryMock();
7697

77-
settings.BackGroundCompile = true;
78-
Assert.IsTrue(settings.BackGroundCompile);
98+
vbe.SetupGet(s => s.Version).Returns("7.00");
99+
registry.Setup(s => s.SetValue(Vbe7SettingPath, "BackGroundCompile", false, RegistryValueKind.DWord));
100+
registry.Setup(s => s.GetValue(Vbe7SettingPath, "BackGroundCompile", DWordFalseValue)).Returns(DWordFalseValue);
79101

102+
var settings = new VBESettings(vbe.Object, registry.Object);
103+
80104
settings.BackGroundCompile = false;
81105
Assert.IsTrue(settings.BackGroundCompile == false);
82106
}

0 commit comments

Comments
 (0)