Skip to content

Commit 14c26dc

Browse files
committed
Update ImportCommand unit tests
Hid implementation behind `IFileHandler`. Removed superfluous `using` statements.
1 parent 597cdfd commit 14c26dc

File tree

5 files changed

+89
-31
lines changed

5 files changed

+89
-31
lines changed

Rubberduck.Core/UI/CodeExplorer/Commands/ImportCommand.cs

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,23 @@
77
using Rubberduck.UI.Command;
88
using Rubberduck.VBEditor.SafeComWrappers.Abstract;
99
using System.IO;
10-
using Antlr4.Runtime.Tree;
11-
using Rubberduck.Parsing.Annotations;
12-
using Rubberduck.Parsing.Grammar;
1310
using Rubberduck.Parsing.VBA.Parsing;
14-
1511
using Rubberduck.Parsing;
16-
using Antlr4.Runtime;
12+
using Rubberduck.Interaction.Input;
1713

1814
namespace Rubberduck.UI.CodeExplorer.Commands
1915
{
2016
public class ImportCommand : CommandBase, IDisposable
2117
{
2218
private readonly IVBE _vbe;
2319
private readonly IOpenFileDialog _openFileDialog;
20+
private readonly IFileHandler _fileHandler;
2421

25-
public ImportCommand(IVBE vbe, IOpenFileDialog openFileDialog) : base(LogManager.GetCurrentClassLogger())
22+
public ImportCommand(IVBE vbe, IOpenFileDialog openFileDialog, IFileHandler fileHandler) : base(LogManager.GetCurrentClassLogger())
2623
{
2724
_vbe = vbe;
2825
_openFileDialog = openFileDialog;
26+
_fileHandler = fileHandler;
2927

3028
_openFileDialog.AddExtension = true;
3129
_openFileDialog.AutoUpgradeEnabled = true;
@@ -92,25 +90,23 @@ protected override void OnExecute(object parameter)
9290
return;
9391
}
9492

93+
var uniqueFileCounter = 0;
9594
foreach (var filename in _openFileDialog.FileNames)
9695
{
97-
var extension = Path.GetExtension(filename);
98-
var tempFile = $"RubberduckTempImportFile{extension}";
99-
100-
var sourceText = string.Join(Environment.NewLine, File.ReadAllLines(filename));
96+
var sourceText = string.Join(Environment.NewLine, _fileHandler.ReadAllLines(filename));
10197
var tempHelper = (CodeExplorerItemViewModel)parameter;
10298
var newFolderName = (parameter is CodeExplorerCustomFolderViewModel) ? tempHelper.Name : tempHelper.GetSelectedDeclaration().CustomFolder;
10399
var startRule = VBACodeStringParser.Parse(sourceText, t => t.startRule());
104100
var updatedModuleText = FolderAnnotator.AddOrUpdateFolderName(startRule, newFolderName);
101+
var extension = Path.GetExtension(filename);
102+
var importPath = $"RubberduckTempImportFile{uniqueFileCounter++}{extension}";
105103
try
106104
{
107-
var sw = File.CreateText(tempFile);
108-
sw.Write(updatedModuleText);
109-
sw.Close();
105+
_fileHandler.WriteToFile(importPath, updatedModuleText);
110106

111107
using (var components = project.VBComponents)
112108
{
113-
components.Import(tempFile);
109+
components.Import(importPath);
114110
}
115111
}
116112
catch(Exception e)
@@ -119,9 +115,9 @@ protected override void OnExecute(object parameter)
119115
}
120116
finally
121117
{
122-
if (File.Exists(tempFile))
118+
if (_fileHandler.Exists(importPath))
123119
{
124-
File.Delete(tempFile);
120+
_fileHandler.Delete(importPath);
125121
}
126122
}
127123
}

Rubberduck.Core/UI/CodeExplorer/FolderAnnotator.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
using System;
2-
using System.Collections.Generic;
32
using System.Linq;
4-
using System.Text;
5-
using System.Threading.Tasks;
6-
73
using Antlr4.Runtime;
84
using Antlr4.Runtime.Tree;
95
using Rubberduck.Parsing;
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
using System.IO;
2+
3+
namespace Rubberduck.Interaction.Input
4+
{
5+
public interface IFileHandler
6+
{
7+
string[] ReadAllLines(string path);
8+
void WriteToFile(string path, string contents);
9+
string RewrittenFilePath();
10+
bool Exists(string path);
11+
void Delete(string path);
12+
}
13+
public class FileHandler : IFileHandler
14+
{
15+
public string[] ReadAllLines(string path)
16+
{
17+
return File.ReadAllLines(path);
18+
}
19+
20+
public void WriteToFile(string path, string contents)
21+
{
22+
var sw = File.CreateText(path);
23+
_updatedFilePath = path;
24+
sw.Write(contents);
25+
sw.Close();
26+
}
27+
28+
private string _updatedFilePath;
29+
public string RewrittenFilePath() => _updatedFilePath;
30+
31+
public bool Exists(string path)
32+
{
33+
return File.Exists(path);
34+
}
35+
36+
public void Delete(string path)
37+
{
38+
if (Exists(path))
39+
{
40+
File.Delete(path);
41+
}
42+
}
43+
}
44+
}

Rubberduck.Interaction/Rubberduck.Interaction.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
</ItemGroup>
4747
<ItemGroup>
4848
<Compile Include="Input\IDialogView.cs" />
49+
<Compile Include="Input\IFileHandler.cs" />
4950
<Compile Include="Input\IMessageBox.cs" />
5051
<Compile Include="Navigation\INavigateCommand.cs" />
5152
<Compile Include="Navigation\INavigateSelection.cs" />

RubberduckTests/CodeExplorer/CodeExplorerTests.cs

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -846,21 +846,25 @@ public void ImportModule()
846846
openFileDialog.Setup(o => o.ShowHelp);
847847
openFileDialog.Setup(o => o.Filter);
848848
openFileDialog.Setup(o => o.CheckFileExists);
849-
openFileDialog.Setup(o => o.FileNames).Returns(new[] { "C:\\Users\\Rubberduck\\Desktop\\StdModule1.bas" });
849+
const string standardModule = "C:\\Users\\Rubberduck\\Desktop\\StdModule1.bas";
850+
openFileDialog.Setup(o => o.FileNames).Returns(new[] { standardModule });
850851
openFileDialog.Setup(o => o.ShowDialog()).Returns(DialogResult.OK);
851852

852853
var projectRepository = new ProjectsRepository(vbe.Object);
853854
var messageBox = new Mock<IMessageBox>();
854855
var saveFileDialog = new Mock<ISaveFileDialog>();
855856

857+
var fileHandler = new Mock<Rubberduck.Interaction.Input.IFileHandler>();
858+
fileHandler.Setup(o => o.ReadAllLines(standardModule)).Returns(new[] { "Attribute VB_Name = \"Module1\"", "Public Sub Foo()", "End Sub" });
859+
856860
using (var state = new RubberduckParserState(vbe.Object, projectRepository, new DeclarationFinderFactory(), vbeEvents.Object))
857861
{
858862
var removeCommand = new RemoveCommand(saveFileDialog.Object, messageBox.Object, state.ProjectsProvider);
859863

860864
var uiDispatcher = new Mock<IUiDispatcher>();
861865
var vm = new CodeExplorerViewModel(new FolderHelper(state), state, removeCommand, _generalSettingsProvider.Object, _windowSettingsProvider.Object, uiDispatcher.Object, vbe.Object)
862866
{
863-
ImportCommand = new ImportCommand(vbe.Object, openFileDialog.Object)
867+
ImportCommand = new ImportCommand(vbe.Object, openFileDialog.Object, fileHandler.Object)
864868
};
865869

866870
var parser = MockParser.Create(vbe.Object, state, projectRepository);
@@ -870,7 +874,7 @@ public void ImportModule()
870874
vm.SelectedItem = vm.Projects.First();
871875
vm.ImportCommand.Execute(vm.SelectedItem);
872876

873-
components.Verify(c => c.Import("C:\\Users\\Rubberduck\\Desktop\\StdModule1.bas"), Times.Once);
877+
components.Verify(c => c.Import("RubberduckTempImportFile0.bas"), Times.Once);
874878
}
875879
}
876880

@@ -895,21 +899,28 @@ public void ImportMultipleModules()
895899
openFileDialog.Setup(o => o.ShowHelp);
896900
openFileDialog.Setup(o => o.Filter);
897901
openFileDialog.Setup(o => o.CheckFileExists);
898-
openFileDialog.Setup(o => o.FileNames).Returns(new[] { "C:\\Users\\Rubberduck\\Desktop\\StdModule1.bas", "C:\\Users\\Rubberduck\\Desktop\\ClsModule1.cls" });
902+
const string standardModule = "C:\\Users\\Rubberduck\\Desktop\\StdModule1.bas";
903+
const string classModule = "C:\\Users\\Rubberduck\\Desktop\\ClsModule1.cls";
904+
openFileDialog.Setup(o => o.FileNames).Returns(new[] { standardModule, classModule });
899905
openFileDialog.Setup(o => o.ShowDialog()).Returns(DialogResult.OK);
900906

901907
var projectRepository = new ProjectsRepository(vbe.Object);
902908
var messageBox = new Mock<IMessageBox>();
903909
var saveFileDialog = new Mock<ISaveFileDialog>();
904910

911+
var fileHandler = new Mock<Rubberduck.Interaction.Input.IFileHandler>();
912+
var returnedLines = new[] { "Attribute VB_Name = \"Module1\"", "Public Sub Foo()", "End Sub" };
913+
fileHandler.Setup(o => o.ReadAllLines(standardModule)).Returns(returnedLines);
914+
fileHandler.Setup(o => o.ReadAllLines(classModule)).Returns(returnedLines);
915+
905916
using (var state = new RubberduckParserState(vbe.Object, projectRepository, new DeclarationFinderFactory(), vbeEvents.Object))
906917
{
907918
var removeCommand = new RemoveCommand(saveFileDialog.Object, messageBox.Object, state.ProjectsProvider);
908919

909920
var uiDispatcher = new Mock<IUiDispatcher>();
910921
var vm = new CodeExplorerViewModel(new FolderHelper(state), state, removeCommand, _generalSettingsProvider.Object, _windowSettingsProvider.Object, uiDispatcher.Object, vbe.Object)
911922
{
912-
ImportCommand = new ImportCommand(vbe.Object, openFileDialog.Object)
923+
ImportCommand = new ImportCommand(vbe.Object, openFileDialog.Object, fileHandler.Object)
913924
};
914925

915926
var parser = MockParser.Create(vbe.Object, state, projectRepository);
@@ -919,8 +930,8 @@ public void ImportMultipleModules()
919930
vm.SelectedItem = vm.Projects.First();
920931
vm.ImportCommand.Execute(vm.SelectedItem);
921932

922-
components.Verify(c => c.Import("C:\\Users\\Rubberduck\\Desktop\\StdModule1.bas"), Times.Once);
923-
components.Verify(c => c.Import("C:\\Users\\Rubberduck\\Desktop\\ClsModule1.cls"), Times.Once);
933+
components.Verify(c => c.Import("RubberduckTempImportFile0.bas"), Times.Once);
934+
components.Verify(c => c.Import("RubberduckTempImportFile1.cls"), Times.Once);
924935
}
925936
}
926937

@@ -930,7 +941,7 @@ public void ImportModule_Cancel()
930941
{
931942
var builder = new MockVbeBuilder();
932943
var project = builder.ProjectBuilder("TestProject1", ProjectProtection.Unprotected)
933-
.AddComponent("Module1", ComponentType.StandardModule, "");
944+
.AddComponent("Module1", ComponentType.StandardModule, string.Empty);
934945

935946
var components = project.MockVBComponents;
936947

@@ -952,13 +963,17 @@ public void ImportModule_Cancel()
952963
var messageBox = new Mock<IMessageBox>();
953964
var saveFileDialog = new Mock<ISaveFileDialog>();
954965

966+
var fileHandler = new Mock<Rubberduck.Interaction.Input.IFileHandler>();
967+
955968
using (var state = new RubberduckParserState(vbe.Object, projectRepository, new DeclarationFinderFactory(), vbeEvents.Object))
956969
{
957970
var removeCommand = new RemoveCommand(saveFileDialog.Object, messageBox.Object, state.ProjectsProvider);
958971

959972
var uiDispatcher = new Mock<IUiDispatcher>();
960-
var vm = new CodeExplorerViewModel(new FolderHelper(state), state, removeCommand, _generalSettingsProvider.Object, _windowSettingsProvider.Object, uiDispatcher.Object, vbe.Object);
961-
vm.ImportCommand = new ImportCommand(vbe.Object, openFileDialog.Object);
973+
var vm = new CodeExplorerViewModel(new FolderHelper(state), state, removeCommand, _generalSettingsProvider.Object, _windowSettingsProvider.Object, uiDispatcher.Object, vbe.Object)
974+
{
975+
ImportCommand = new ImportCommand(vbe.Object, openFileDialog.Object, fileHandler.Object)
976+
};
962977

963978
var parser = MockParser.Create(vbe.Object, state, projectRepository);
964979
parser.Parse(new CancellationTokenSource());
@@ -967,12 +982,13 @@ public void ImportModule_Cancel()
967982
vm.SelectedItem = vm.Projects.First().Items.First().Items.First();
968983
vm.ImportCommand.Execute(vm.SelectedItem);
969984

970-
components.Verify(c => c.Import("C:\\Users\\Rubberduck\\Desktop\\StdModule1.bas"), Times.Never);
985+
components.Verify(c => c.Import("RubberduckTempImportFile0.bas"), Times.Never);
971986
}
972987
}
973988

974989
[Category("Code Explorer")]
975990
[Test]
991+
#region TestCases
976992
[TestCase("Bar",
977993
@"Attribute VB_Name = ""Module1""
978994
'@Folder(Bar)
@@ -986,6 +1002,8 @@ public void ImportModule_Cancel()
9861002
@"Attribute VB_Name = ""Module1""
9871003
'@Folder(Foo)
9881004
Dim foo As Range")]
1005+
#endregion
1006+
9891007
public void AnnotateFolder_EndsWithModuleVariableDeclaration(string updatedFolder, string expectedResult, string sourceText)
9901008
{
9911009
var startRule = Rubberduck.Parsing.VBA.Parsing.VBACodeStringParser.Parse(sourceText, t => t.startRule());
@@ -1070,6 +1088,7 @@ public void AnnotateFolder_FolderAnnotationExisted(string updatedFolder, string
10701088
}
10711089
[Category("Code Explorer")]
10721090
[Test]
1091+
#region TestCases
10731092
[TestCase("Bar",
10741093
@"Attribute VB_Name = ""Module1""
10751094
'@Folder(Bar)
@@ -1079,6 +1098,8 @@ Public Sub Foo()
10791098
@"Attribute VB_Name = ""Module1""
10801099
Public Sub Foo()
10811100
End Sub")]
1101+
#endregion
1102+
10821103
public void AnnotateFolder_FolderAnnotationAdded(string updatedFolder, string expectedResult, string sourceText)
10831104
{
10841105
var startRule = Rubberduck.Parsing.VBA.Parsing.VBACodeStringParser.Parse(sourceText, t => t.startRule());

0 commit comments

Comments
 (0)