Skip to content

Commit aa01470

Browse files
committed
Add view model tests, inject file dialogs.
1 parent ecf8307 commit aa01470

13 files changed

+734
-66
lines changed

Rubberduck.Core/UI/AddRemoveReferences/AddRemoveReferencesPresenterFactory.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,18 +31,21 @@ public class AddRemoveReferencesPresenterFactory : IAddRemoveReferencesPresenter
3131
private readonly IConfigProvider<ReferenceSettings> _settings;
3232
private readonly IRegisteredLibraryFinderService _finder;
3333
private readonly IReferenceReconciler _reconciler;
34+
private readonly IFileSystemBrowserFactory _browser;
3435

3536
public AddRemoveReferencesPresenterFactory(IVBE vbe,
3637
RubberduckParserState state,
3738
IConfigProvider<ReferenceSettings> settingsProvider,
3839
IRegisteredLibraryFinderService finder,
39-
IReferenceReconciler reconciler)
40+
IReferenceReconciler reconciler,
41+
IFileSystemBrowserFactory browser)
4042
{
4143
_vbe = vbe;
4244
_state = state;
4345
_settings = settingsProvider;
4446
_finder = finder;
4547
_reconciler = reconciler;
48+
_browser = browser;
4649
}
4750

4851
public AddRemoveReferencesPresenter Create(ProjectDeclaration project)
@@ -106,7 +109,7 @@ public AddRemoveReferencesPresenter Create(ProjectDeclaration project)
106109
item.FullPath.Equals(proj.FullPath, StringComparison.OrdinalIgnoreCase))));
107110
}
108111

109-
return new AddRemoveReferencesPresenter(new AddRemoveReferencesDialog(new AddRemoveReferencesViewModel(model, _reconciler)));
112+
return new AddRemoveReferencesPresenter(new AddRemoveReferencesDialog(new AddRemoveReferencesViewModel(model, _reconciler, _browser)));
110113
}
111114

112115
private IEnumerable<ReferenceModel> GetUserProjectFolderModels(IReferenceSettings settings)

Rubberduck.Core/UI/AddRemoveReferences/AddRemoveReferencesViewModel.cs

Lines changed: 117 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,13 @@ static AddRemoveReferencesViewModel()
8282
private readonly ObservableCollection<ReferenceModel> _available;
8383
private readonly ObservableCollection<ReferenceModel> _project;
8484
private readonly IReferenceReconciler _reconciler;
85+
private readonly IFileSystemBrowserFactory _browser;
8586

86-
public AddRemoveReferencesViewModel(IAddRemoveReferencesModel model, IReferenceReconciler reconciler)
87+
public AddRemoveReferencesViewModel(IAddRemoveReferencesModel model, IReferenceReconciler reconciler, IFileSystemBrowserFactory browser)
8788
{
8889
Model = model;
8990
_reconciler = reconciler;
91+
_browser = browser;
9092

9193
_available = new ObservableCollection<ReferenceModel>(model.References
9294
.Where(reference => !reference.IsReferenced).OrderBy(reference => reference.Description));
@@ -110,25 +112,48 @@ public AddRemoveReferencesViewModel(IAddRemoveReferencesModel model, IReferenceR
110112
ApplyCommand = new DelegateCommand(LogManager.GetCurrentClassLogger(), ExecuteApplyCommand);
111113
}
112114

115+
/// <summary>
116+
/// The IAddRemoveReferencesModel for the view.
117+
/// </summary>
113118
public IAddRemoveReferencesModel Model { get; set; }
114119

120+
/// <summary>
121+
/// Hides the projects filter if the host does not support them. Statically set.
122+
/// </summary>
115123
public bool ProjectsVisible => HostHasProjects;
116124

125+
/// <summary>
126+
/// The number of built-in (locked) references of the project.
127+
/// </summary>
117128
public int BuiltInReferenceCount { get; }
118129

130+
/// <summary>
131+
/// Adds a reference to the project.
132+
/// </summary>
119133
public ICommand AddCommand { get; }
120134

135+
/// <summary>
136+
/// Removes a reference from the project and makes it "available".
137+
/// </summary>
121138
public ICommand RemoveCommand { get; }
139+
122140
/// <summary>
123-
/// Prompts user for a .tlb, .dll, or .ocx file, and attempts to append it to <see cref="ProjectReferences"/>.
141+
/// Prompts the user to browse for a reference.
124142
/// </summary>
125143
public ICommand BrowseCommand { get; }
126144

145+
/// <summary>
146+
/// Closes the dialog and indicates changes are to be saved.
147+
/// </summary>
127148
public CommandBase OkCommand { get; }
149+
150+
/// <summary>
151+
/// Closes the dialog and indicates changes are not to be saved.
152+
/// </summary>
128153
public CommandBase CancelCommand { get; }
129154

130155
/// <summary>
131-
/// Applies all changes to project references.
156+
/// Applies any changes without closing the dialog.
132157
/// </summary>
133158
public ICommand ApplyCommand { get; }
134159

@@ -142,10 +167,20 @@ public AddRemoveReferencesViewModel(IAddRemoveReferencesModel model, IReferenceR
142167
/// </summary>
143168
public ICommand MoveDownCommand { get; }
144169

170+
/// <summary>
171+
/// Pins the selected reference from the available list.
172+
/// </summary>
145173
public ICommand PinLibraryCommand { get; }
146174

175+
/// <summary>
176+
/// Pins the selected reference from the referenced list.
177+
/// </summary>
147178
public ICommand PinReferenceCommand { get; }
148179

180+
/// <summary>
181+
/// Delegate for AddCommand.
182+
/// </summary>
183+
/// <param name="parameter">Ignored</param>
149184
private void ExecuteAddCommand(object parameter)
150185
{
151186
if (SelectedLibrary == null)
@@ -158,8 +193,13 @@ private void ExecuteAddCommand(object parameter)
158193
EvaluateProjectDirty();
159194
ProjectReferences.Refresh();
160195
_available.Remove(SelectedLibrary);
196+
AvailableReferences.Refresh();
161197
}
162198

199+
/// <summary>
200+
/// Delegate for RemoveCommand.
201+
/// </summary>
202+
/// <param name="parameter">Ignored</param>
163203
private void ExecuteRemoveCommand(object parameter)
164204
{
165205
if (SelectedReference == null)
@@ -179,18 +219,21 @@ private void ExecuteRemoveCommand(object parameter)
179219

180220
EvaluateProjectDirty();
181221
ProjectReferences.Refresh();
222+
AvailableReferences.Refresh();
182223
}
183-
224+
225+
/// <summary>
226+
/// Delegate for BrowseCommand.
227+
/// </summary>
228+
/// <param name="parameter">Ignored</param>
184229
private void ExecuteBrowseCommand(object parameter)
185230
{
186-
using (var dialog = new OpenFileDialog
231+
using (var dialog = _browser.CreateOpenFileDialog())
187232
{
188-
Filter = string.Join("|", FileFilters),
189-
Title = RubberduckUI.References_BrowseCaption
190-
})
191-
{
192-
dialog.ShowDialog();
193-
if (string.IsNullOrEmpty(dialog.FileName))
233+
dialog.Filter = string.Join("|", FileFilters);
234+
dialog.Title = RubberduckUI.References_BrowseCaption;
235+
var result = dialog.ShowDialog();
236+
if (result != DialogResult.OK || string.IsNullOrEmpty(dialog.FileName))
194237
{
195238
return;
196239
}
@@ -221,6 +264,10 @@ private void ExecuteBrowseCommand(object parameter)
221264
}
222265
}
223266

267+
/// <summary>
268+
/// Delegate for ApplyCommand.
269+
/// </summary>
270+
/// <param name="parameter">Ignored</param>
224271
private void ExecuteApplyCommand(object parameter)
225272
{
226273
var changed = _reconciler.ReconcileReferences(Model, _available.ToList());
@@ -233,6 +280,10 @@ private void ExecuteApplyCommand(object parameter)
233280
ProjectReferences.Refresh();
234281
}
235282

283+
/// <summary>
284+
/// Delegate for MoveUpCommand.
285+
/// </summary>
286+
/// <param name="parameter">Ignored</param>
236287
private void ExecuteMoveUpCommand(object parameter)
237288
{
238289
if (SelectedReference == null || SelectedReference.IsBuiltIn || SelectedReference.Priority == 1)
@@ -253,6 +304,10 @@ private void ExecuteMoveUpCommand(object parameter)
253304
ProjectReferences.Refresh();
254305
}
255306

307+
/// <summary>
308+
/// Delegate for MoveDownCommand.
309+
/// </summary>
310+
/// <param name="parameter">Ignored</param>
256311
private void ExecuteMoveDownCommand(object parameter)
257312
{
258313
if (SelectedReference == null || SelectedReference.IsBuiltIn || SelectedReference.Priority == _project.Count)
@@ -273,6 +328,10 @@ private void ExecuteMoveDownCommand(object parameter)
273328
ProjectReferences.Refresh();
274329
}
275330

331+
/// <summary>
332+
/// Delegate for PinLibraryCommand.
333+
/// </summary>
334+
/// <param name="parameter">Ignored</param>
276335
private void ExecutePinLibraryCommand(object parameter)
277336
{
278337
if (SelectedLibrary == null)
@@ -283,16 +342,23 @@ private void ExecutePinLibraryCommand(object parameter)
283342
AvailableReferences.Refresh();
284343
}
285344

345+
/// <summary>
346+
/// Delegate for PinReferenceCommand.
347+
/// </summary>
348+
/// <param name="parameter">Ignored</param>
286349
private void ExecutePinReferenceCommand(object parameter)
287350
{
288-
if (SelectedReference == null || SelectedReference.IsBuiltIn)
351+
if (SelectedReference == null)
289352
{
290353
return;
291354
}
292355
SelectedReference.IsPinned = !SelectedReference.IsPinned;
293356
ProjectReferences.Refresh();
294357
}
295358

359+
/// <summary>
360+
/// Ordered collection of the project's currently selected references.
361+
/// </summary>
296362
public ICollectionView ProjectReferences
297363
{
298364
get
@@ -303,6 +369,9 @@ public ICollectionView ProjectReferences
303369
}
304370
}
305371

372+
/// <summary>
373+
/// Collection of references not currently selected for the project, filtered by the current filter.
374+
/// </summary>
306375
public ICollectionView AvailableReferences
307376
{
308377
get
@@ -314,16 +383,29 @@ public ICollectionView AvailableReferences
314383
}
315384

316385
private string _filter;
386+
387+
/// <summary>
388+
/// The currently selected filter. Should be a member of ReferenceFilter.
389+
/// </summary>
317390
public string SelectedFilter
318391
{
319392
get => _filter;
320393
set
321394
{
395+
if (!Enum.TryParse<ReferenceFilter>(value, out _))
396+
{
397+
return;
398+
}
322399
_filter = value;
323400
AvailableReferences.Refresh();
324401
}
325402
}
326403

404+
/// <summary>
405+
/// Applies selected filter and any search term to CollectionViewSource.
406+
/// </summary>
407+
/// <param name="reference">The ReferenceModel to test.</param>
408+
/// <returns>Returns true if the passed reference is included in the filtered result.</returns>
327409
private bool Filter(ReferenceModel reference)
328410
{
329411
var filtered = false;
@@ -353,6 +435,10 @@ private bool Filter(ReferenceModel reference)
353435
}
354436

355437
private string _search = string.Empty;
438+
439+
/// <summary>
440+
/// Search term for filtering AvailableReferences.
441+
/// </summary>
356442
public string Search
357443
{
358444
get => _search;
@@ -364,6 +450,10 @@ public string Search
364450
}
365451

366452
private ReferenceModel _selection;
453+
454+
/// <summary>
455+
/// The currently selected Reference in the focused list.
456+
/// </summary>
367457
public ReferenceModel CurrentSelection
368458
{
369459
get => _selection;
@@ -375,6 +465,10 @@ public ReferenceModel CurrentSelection
375465
}
376466

377467
private ReferenceModel _reference;
468+
469+
/// <summary>
470+
/// The currently selected Reference for the project.
471+
/// </summary>
378472
public ReferenceModel SelectedReference
379473
{
380474
get => _reference;
@@ -386,6 +480,10 @@ public ReferenceModel SelectedReference
386480
}
387481

388482
private ReferenceModel _library;
483+
484+
/// <summary>
485+
/// The currently selected available (not included in the project) Reference.
486+
/// </summary>
389487
public ReferenceModel SelectedLibrary
390488
{
391489
get => _library;
@@ -397,6 +495,10 @@ public ReferenceModel SelectedLibrary
397495
}
398496

399497
private bool _dirty;
498+
499+
/// <summary>
500+
/// Indicated whether any changes were made to the project's references.
501+
/// </summary>
400502
public bool IsProjectDirty
401503
{
402504
get => _dirty;
@@ -407,6 +509,9 @@ public bool IsProjectDirty
407509
}
408510
}
409511

512+
/// <summary>
513+
/// Tests to see if any changes have been made to the project and sets IsProjectDirty to the appropriate value.
514+
/// </summary>
410515
private void EvaluateProjectDirty()
411516
{
412517
var selected = _project.Select(reference => (reference.Priority, reference.ToReferenceInfo())).ToList();

Rubberduck.Core/UI/Command/ExportAllCommand.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ namespace Rubberduck.UI.Command
1111
public class ExportAllCommand : CommandBase
1212
{
1313
private readonly IVBE _vbe;
14-
private readonly IFolderBrowserFactory _factory;
14+
private readonly IFileSystemBrowserFactory _factory;
1515

16-
public ExportAllCommand(IVBE vbe, IFolderBrowserFactory folderBrowserFactory) : base(LogManager.GetCurrentClassLogger())
16+
public ExportAllCommand(IVBE vbe, IFileSystemBrowserFactory folderBrowserFactory) : base(LogManager.GetCurrentClassLogger())
1717
{
1818
_vbe = vbe;
1919
_factory = folderBrowserFactory;

Rubberduck.Core/UI/FileBrowserDialogFactory.cs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
namespace Rubberduck.UI
22
{
3-
public interface IFolderBrowserFactory
3+
public interface IFileSystemBrowserFactory
44
{
5+
IOpenFileDialog CreateOpenFileDialog();
6+
7+
ISaveFileDialog CreateSaveFileDialog();
8+
59
IFolderBrowser CreateFolderBrowser(string description);
610

711
IFolderBrowser CreateFolderBrowser(string description, bool showNewFolderButton);
@@ -10,7 +14,7 @@ IFolderBrowser CreateFolderBrowser(string description, bool showNewFolderButton,
1014
string rootFolder);
1115
}
1216

13-
public class DialogFactory : IFolderBrowserFactory
17+
public class DialogFactory : IFileSystemBrowserFactory
1418
{
1519
private readonly IEnvironmentProvider _environment;
1620
private readonly bool _oldSchool;
@@ -48,5 +52,15 @@ public IFolderBrowser CreateFolderBrowser(string description, bool showNewFolder
4852
? new ModernFolderBrowser(_environment, description, showNewFolderButton, rootFolder) as IFolderBrowser
4953
: new FolderBrowser(_environment, description, showNewFolderButton, rootFolder);
5054
}
55+
56+
public IOpenFileDialog CreateOpenFileDialog()
57+
{
58+
return new OpenFileDialog();
59+
}
60+
61+
public ISaveFileDialog CreateSaveFileDialog()
62+
{
63+
return new SaveFileDialog();
64+
}
5165
}
5266
}

0 commit comments

Comments
 (0)