Skip to content

Commit 5346f62

Browse files
committed
Wrap Environment to support testing, add trys.
1 parent 03aaf15 commit 5346f62

File tree

6 files changed

+73
-24
lines changed

6 files changed

+73
-24
lines changed

RetailCoder.VBE/Rubberduck.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,7 @@
467467
<Compile Include="UI\CodeExplorer\Commands\AddClassModuleCommand.cs" />
468468
<Compile Include="UI\CodeExplorer\Commands\AddStdModuleCommand.cs" />
469469
<Compile Include="UI\CodeExplorer\Commands\AddTestModuleCommand.cs" />
470+
<Compile Include="UI\EnvironmentProvider.cs" />
470471
<Compile Include="UI\ModernFolderBrowser.cs" />
471472
<Compile Include="VersionCheck\IVersionCheck.cs" />
472473
<Compile Include="UI\Command\MenuItems\CommandBars\AppCommandBarBase.cs" />
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using System;
2+
3+
namespace Rubberduck.UI
4+
{
5+
public interface IEnvironmentProvider
6+
{
7+
string GetFolderPath(Environment.SpecialFolder folder);
8+
// ReSharper disable once InconsistentNaming
9+
OperatingSystem OSVersion { get; }
10+
}
11+
12+
//Wrapper to enable unit testing of folder dialogs.
13+
public class EnvironmentProvider : IEnvironmentProvider
14+
{
15+
public string GetFolderPath(Environment.SpecialFolder folder)
16+
{
17+
return Environment.GetFolderPath(folder);
18+
}
19+
20+
public OperatingSystem OSVersion { get { return Environment.OSVersion; } }
21+
}
22+
}
Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using System;
2-
3-
namespace Rubberduck.UI
1+
namespace Rubberduck.UI
42
{
53
public interface IFolderBrowserFactory
64
{
@@ -14,27 +12,41 @@ IFolderBrowser CreateFolderBrowser(string description, bool showNewFolderButton,
1412

1513
public class DialogFactory : IFolderBrowserFactory
1614
{
17-
private static readonly bool OldSchool = Environment.OSVersion.Version.Major < 6;
15+
private readonly IEnvironmentProvider _environment;
16+
private readonly bool _oldSchool;
17+
18+
public DialogFactory(IEnvironmentProvider environment)
19+
{
20+
_environment = environment;
21+
try
22+
{
23+
_oldSchool = _environment.OSVersion.Version.Major < 6;
24+
}
25+
catch
26+
{
27+
// ignored - fall back to "safe" dialog version.
28+
}
29+
}
1830

1931
public IFolderBrowser CreateFolderBrowser(string description)
2032
{
21-
return !OldSchool
22-
? new ModernFolderBrowser(description) as IFolderBrowser
23-
: new FolderBrowser(description);
33+
return !_oldSchool
34+
? new ModernFolderBrowser(_environment, description) as IFolderBrowser
35+
: new FolderBrowser(_environment, description);
2436
}
2537

2638
public IFolderBrowser CreateFolderBrowser(string description, bool showNewFolderButton)
2739
{
28-
return !OldSchool
29-
? new ModernFolderBrowser(description, showNewFolderButton) as IFolderBrowser
30-
: new FolderBrowser(description, showNewFolderButton);
40+
return !_oldSchool
41+
? new ModernFolderBrowser(_environment, description, showNewFolderButton) as IFolderBrowser
42+
: new FolderBrowser(_environment, description, showNewFolderButton);
3143
}
3244

3345
public IFolderBrowser CreateFolderBrowser(string description, bool showNewFolderButton, string rootFolder)
3446
{
35-
return !OldSchool
36-
? new ModernFolderBrowser(description, showNewFolderButton, rootFolder) as IFolderBrowser
37-
: new FolderBrowser(description, showNewFolderButton, rootFolder);
47+
return !_oldSchool
48+
? new ModernFolderBrowser(_environment, description, showNewFolderButton, rootFolder) as IFolderBrowser
49+
: new FolderBrowser(_environment, description, showNewFolderButton, rootFolder);
3850
}
3951
}
4052
}

RetailCoder.VBE/UI/FolderBrowser.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,11 @@ public interface IFolderBrowser : IDisposable
1515
public class FolderBrowser : IFolderBrowser
1616
{
1717
private readonly FolderBrowserDialog _dialog;
18+
private readonly IEnvironmentProvider _environment;
1819

19-
public FolderBrowser(string description, bool showNewFolderButton, string rootFolder)
20+
public FolderBrowser(IEnvironmentProvider environment, string description, bool showNewFolderButton, string rootFolder)
2021
{
22+
_environment = environment;
2123
_dialog = new FolderBrowserDialog
2224
{
2325
Description = description,
@@ -26,12 +28,12 @@ public FolderBrowser(string description, bool showNewFolderButton, string rootFo
2628
};
2729
}
2830

29-
public FolderBrowser(string description, bool showNewFolderButton)
30-
: this(description, showNewFolderButton, Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments))
31+
public FolderBrowser(IEnvironmentProvider environment, string description, bool showNewFolderButton)
32+
: this(environment, description, showNewFolderButton, environment.GetFolderPath(Environment.SpecialFolder.MyDocuments))
3133
{ }
3234

33-
public FolderBrowser(string description)
34-
: this(description, true)
35+
public FolderBrowser(IEnvironmentProvider environment, string description)
36+
: this(environment, description, true)
3537
{ }
3638

3739
public string Description

RetailCoder.VBE/UI/ModernFolderBrowser.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,12 @@ public class ModernFolderBrowser : IFolderBrowser
3333

3434
private readonly System.Windows.Forms.OpenFileDialog _dialog;
3535
private readonly object _newDialog;
36+
private readonly IEnvironmentProvider _environment;
3637

3738
// ReSharper disable once UnusedParameter.Local - new folder button suppression isn't supported in this dialog.
38-
public ModernFolderBrowser(string description, bool showNewFolderButton, string rootFolder)
39+
public ModernFolderBrowser(IEnvironmentProvider environment, string description, bool showNewFolderButton, string rootFolder)
3940
{
41+
_environment = environment;
4042
_root = rootFolder;
4143
_dialog = new System.Windows.Forms.OpenFileDialog
4244
{
@@ -55,11 +57,11 @@ public ModernFolderBrowser(string description, bool showNewFolderButton, string
5557
IFileDialogSetOptions.Invoke(_newDialog, new object[] { options });
5658
}
5759

58-
public ModernFolderBrowser(string description, bool showNewFolderButton)
59-
: this(description, showNewFolderButton, Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments))
60+
public ModernFolderBrowser(IEnvironmentProvider environment, string description, bool showNewFolderButton)
61+
: this(environment, description, showNewFolderButton, environment.GetFolderPath(Environment.SpecialFolder.MyDocuments))
6062
{ }
6163

62-
public ModernFolderBrowser(string description) : this(description, true) { }
64+
public ModernFolderBrowser(IEnvironmentProvider environment, string description) : this(environment, description, true) { }
6365

6466
public string Description
6567
{

RetailCoder.VBE/UI/SourceControl/SourceControlViewViewModel.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ public sealed class SourceControlViewViewModel : ViewModelBase, IDisposable
3838
private readonly IFolderBrowserFactory _folderBrowserFactory;
3939
private readonly IConfigProvider<SourceControlSettings> _configService;
4040
private readonly IMessageBox _messageBox;
41+
private readonly IEnvironmentProvider _environment;
4142
private readonly FileSystemWatcher _fileSystemWatcher;
4243
private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
4344
private static readonly IEnumerable<string> VbFileExtensions = new[] { "cls", "bas", "frm" };
@@ -51,7 +52,8 @@ public SourceControlViewViewModel(
5152
IFolderBrowserFactory folderBrowserFactory,
5253
IConfigProvider<SourceControlSettings> configService,
5354
IEnumerable<IControlView> views,
54-
IMessageBox messageBox)
55+
IMessageBox messageBox,
56+
IEnvironmentProvider environment)
5557
{
5658
_vbe = vbe;
5759
_state = state;
@@ -63,6 +65,7 @@ public SourceControlViewViewModel(
6365
_configService = configService;
6466
_config = _configService.Create();
6567
_messageBox = messageBox;
68+
_environment = environment;
6669

6770
_initRepoCommand = new DelegateCommand(LogManager.GetCurrentClassLogger(), _ => InitRepo(), _ => _vbe.VBProjects.Count != 0);
6871
_openRepoCommand = new DelegateCommand(LogManager.GetCurrentClassLogger(), _ => OpenRepo(), _ => _vbe.VBProjects.Count != 0);
@@ -947,7 +950,14 @@ private string GetDefaultRepoFolderOrDefault()
947950
var folder = settings.DefaultRepositoryLocation;
948951
if (string.IsNullOrEmpty(folder))
949952
{
950-
folder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
953+
try
954+
{
955+
folder = _environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
956+
}
957+
catch
958+
{
959+
// ignored - empty is fine if the environment call fails.
960+
}
951961
}
952962
return folder;
953963
}

0 commit comments

Comments
 (0)