Skip to content

Commit f0ebc26

Browse files
committed
Add an overload for ISelectionService.TrySetActiveSelection taking a QMN and a selection
1 parent c66ac4c commit f0ebc26

File tree

3 files changed

+140
-7
lines changed

3 files changed

+140
-7
lines changed

Rubberduck.VBEEditor/Utility/ISelectionService.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ public interface ISelectionService
88
ICollection<QualifiedModuleName> OpenModules();
99
Selection? Selection(QualifiedModuleName module);
1010
bool TryActivate(QualifiedModuleName module);
11+
bool TrySetActiveSelection(QualifiedModuleName module, Selection selection);
1112
bool TrySetActiveSelection(QualifiedSelection selection);
1213
bool TrySetSelection(QualifiedModuleName module, Selection selection);
1314
bool TrySetSelection(QualifiedSelection selection);

Rubberduck.VBEEditor/Utility/SelectionService.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,16 +90,16 @@ public bool TryActivate(QualifiedModuleName module)
9090
}
9191
}
9292

93-
public bool TrySetActiveSelection(QualifiedSelection selection)
93+
public bool TrySetActiveSelection(QualifiedModuleName module, Selection selection)
9494
{
9595
var activeCodePane = _vbe.ActiveCodePane;
9696

97-
if (!TryActivate(selection.QualifiedName))
97+
if (!TryActivate(module))
9898
{
9999
return false;
100100
}
101101

102-
if (!TrySetSelection(selection))
102+
if (!TrySetSelection(module, selection))
103103
{
104104
TryActivate(activeCodePane.QualifiedModuleName);
105105
return false;
@@ -108,6 +108,11 @@ public bool TrySetActiveSelection(QualifiedSelection selection)
108108
return true;
109109
}
110110

111+
public bool TrySetActiveSelection(QualifiedSelection selection)
112+
{
113+
return TrySetActiveSelection(selection.QualifiedName, selection.Selection);
114+
}
115+
111116
public bool TrySetSelection(QualifiedModuleName module, Selection selection)
112117
{
113118
try

RubberduckTests/VBEditor/Utility/SelectionServiceTests.cs

Lines changed: 131 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ public void VbeThrowsExceptionOnActivation_TryActiveDoesNotChangeTheActiveModule
201201
}
202202

203203
[Test]
204-
public void ComponentExists_TrySetActiveSelectionSetsActiveSelectionAndReturnsTrue()
204+
public void ComponentExists_TrySetActiveSelectionSetsActiveSelectionAndReturnsTrue_QualifiedSelection()
205205
{
206206
var vbe = MockVbeBuilder.BuildFromStdModules(new[]
207207
{
@@ -232,7 +232,7 @@ public void ComponentExists_TrySetActiveSelectionSetsActiveSelectionAndReturnsTr
232232
}
233233

234234
[Test]
235-
public void ComponentDoesNotExist_TrySetActiveSelectionDoesNotChangeTheActiveSelectionAndReturnsFalse()
235+
public void ComponentDoesNotExist_TrySetActiveSelectionDoesNotChangeTheActiveSelectionAndReturnsFalse_QualifiedSelection()
236236
{
237237
var vbe = MockVbeBuilder.BuildFromStdModules(new[]
238238
{
@@ -263,7 +263,7 @@ public void ComponentDoesNotExist_TrySetActiveSelectionDoesNotChangeTheActiveSel
263263
}
264264

265265
[Test]
266-
public void VbeThrowsExceptionOnComponentActivation_TrySetActiveSelectionDoesNotChangeTheActiveSelectionAndReturnsFalse()
266+
public void VbeThrowsExceptionOnComponentActivation_TrySetActiveSelectionDoesNotChangeTheActiveSelectionAndReturnsFalse_QualifiedSelection()
267267
{
268268
var vbeMock = MockVbeBuilder.BuildFromStdModules(new[]
269269
{
@@ -297,7 +297,7 @@ public void VbeThrowsExceptionOnComponentActivation_TrySetActiveSelectionDoesNot
297297
}
298298

299299
[Test]
300-
public void SomeCodePaneOpen_ThrowsExceptionOnSelectionChange_TrySetActiveSelectionDoesNotChangeTheActiveCodePaneAndReturnsFalse()
300+
public void SomeCodePaneOpen_ThrowsExceptionOnSelectionChange_TrySetActiveSelectionDoesNotChangeTheActiveCodePaneAndReturnsFalse_QualifiedSelection()
301301
{
302302
var vbeBuilder = new MockVbeBuilder();
303303
var activeSelection = new Selection(2, 1);
@@ -331,6 +331,133 @@ public void SomeCodePaneOpen_ThrowsExceptionOnSelectionChange_TrySetActiveSelect
331331
Assert.AreEqual(activeSelection, actualSelection); ;
332332
}
333333

334+
[Test]
335+
public void ComponentExists_TrySetActiveSelectionSetsActiveSelectionAndReturnsTrue_QualifiedModuleNameAndSelection()
336+
{
337+
var vbe = MockVbeBuilder.BuildFromStdModules(new[]
338+
{
339+
("activeModule", $"{Environment.NewLine}{Environment.NewLine}{Environment.NewLine}"),
340+
("otherModule", $"{Environment.NewLine}{Environment.NewLine}{Environment.NewLine}")
341+
}).Object;
342+
var activeCodePane = vbe.VBProjects.Single().VBComponents.Single(comp => comp.Name.Equals("activeModule")).CodeModule.CodePane;
343+
var activeSelection = new Selection(2, 1);
344+
activeCodePane.Selection = activeSelection;
345+
vbe.ActiveCodePane = activeCodePane;
346+
var projectsProvider = new ProjectsRepository(vbe);
347+
projectsProvider.Refresh();
348+
var selectionService = new SelectionService(vbe, projectsProvider);
349+
350+
var otherModule = vbe.VBProjects.Single().VBComponents.Single(comp => comp.Name.Equals("otherModule")).QualifiedModuleName;
351+
var newSelection = new Selection(3, 1);
352+
353+
var success = selectionService.TrySetActiveSelection(otherModule, newSelection);
354+
355+
var expectedActiveModule = otherModule;
356+
var actualActiveModule = vbe.ActiveCodePane.QualifiedModuleName;
357+
var actualSelection = vbe.ActiveCodePane.Selection;
358+
359+
Assert.IsTrue(success);
360+
Assert.AreEqual(expectedActiveModule, actualActiveModule);
361+
Assert.AreEqual(newSelection, actualSelection);
362+
}
363+
364+
[Test]
365+
public void ComponentDoesNotExist_TrySetActiveSelectionDoesNotChangeTheActiveSelectionAndReturnsFalse_QualifiedModuleNameAndSelection()
366+
{
367+
var vbe = MockVbeBuilder.BuildFromStdModules(new[]
368+
{
369+
("activeModule", $"{Environment.NewLine}{Environment.NewLine}{Environment.NewLine}"),
370+
("otherModule", $"{Environment.NewLine}{Environment.NewLine}{Environment.NewLine}")
371+
}).Object;
372+
var activeCodePane = vbe.VBProjects.Single().VBComponents.Single(comp => comp.Name.Equals("activeModule")).CodeModule.CodePane;
373+
var activeSelection = new Selection(2, 1);
374+
activeCodePane.Selection = activeSelection;
375+
vbe.ActiveCodePane = activeCodePane;
376+
var projectsProvider = new ProjectsRepository(vbe);
377+
projectsProvider.Refresh();
378+
var selectionService = new SelectionService(vbe, projectsProvider);
379+
380+
var nonExistentModule = new QualifiedModuleName("test", string.Empty, "nonExistentModule");
381+
var newSelection = new Selection(3, 1);
382+
383+
var success = selectionService.TrySetActiveSelection(nonExistentModule, newSelection);
384+
385+
var expectedActiveModule = activeCodePane.QualifiedModuleName;
386+
var actualActiveModule = vbe.ActiveCodePane.QualifiedModuleName;
387+
var actualSelection = vbe.ActiveCodePane.Selection;
388+
389+
Assert.IsFalse(success);
390+
Assert.AreEqual(expectedActiveModule, actualActiveModule);
391+
Assert.AreEqual(activeSelection, actualSelection);
392+
}
393+
394+
[Test]
395+
public void VbeThrowsExceptionOnComponentActivation_TrySetActiveSelectionDoesNotChangeTheActiveSelectionAndReturnsFalse_QualifiedModuleNameAndSelection()
396+
{
397+
var vbeMock = MockVbeBuilder.BuildFromStdModules(new[]
398+
{
399+
("activeModule", $"{Environment.NewLine}{Environment.NewLine}{Environment.NewLine}"),
400+
("otherModule", $"{Environment.NewLine}{Environment.NewLine}{Environment.NewLine}")
401+
});
402+
var vbe = vbeMock.Object;
403+
var activeCodePane = vbe.VBProjects.Single().VBComponents.Single(comp => comp.Name.Equals("activeModule")).CodeModule.CodePane;
404+
var activeSelection = new Selection(2, 1);
405+
activeCodePane.Selection = activeSelection;
406+
vbe.ActiveCodePane = activeCodePane;
407+
var projectsProvider = new ProjectsRepository(vbe);
408+
projectsProvider.Refresh();
409+
var selectionService = new SelectionService(vbe, projectsProvider);
410+
411+
var otherCodePane = vbe.VBProjects.Single().VBComponents.Single(comp => comp.Name.Equals("otherModule")).CodeModule.CodePane;
412+
var otherModule = otherCodePane.QualifiedModuleName;
413+
var newSelection = new Selection(3, 1);
414+
vbeMock.SetupSet(m => m.ActiveCodePane = otherCodePane).Callback(() => throw new COMException());
415+
416+
var success = selectionService.TrySetActiveSelection(otherModule, newSelection);
417+
418+
var expectedActiveModule = activeCodePane.QualifiedModuleName;
419+
var actualActiveModule = vbe.ActiveCodePane.QualifiedModuleName;
420+
var actualSelection = vbe.ActiveCodePane.Selection;
421+
422+
Assert.IsFalse(success);
423+
Assert.AreEqual(expectedActiveModule, actualActiveModule);
424+
Assert.AreEqual(activeSelection, actualSelection);
425+
}
426+
427+
[Test]
428+
public void SomeCodePaneOpen_ThrowsExceptionOnSelectionChange_TrySetActiveSelectionDoesNotChangeTheActiveCodePaneAndReturnsFalse_QualifiedModuleNameAndSelection()
429+
{
430+
var vbeBuilder = new MockVbeBuilder();
431+
var activeSelection = new Selection(2, 1);
432+
var projectBuilder = vbeBuilder.ProjectBuilder("test", ProjectProtection.Unprotected)
433+
.AddComponent("activeModule", ComponentType.StandardModule, $"{Environment.NewLine}{Environment.NewLine}{Environment.NewLine}", activeSelection)
434+
.AddComponent("otherModule", ComponentType.StandardModule, $"{Environment.NewLine}{Environment.NewLine}{Environment.NewLine}");
435+
436+
var vbe = projectBuilder.AddProjectToVbeBuilder().Build().Object;
437+
var activeCodePane = vbe.VBProjects.Single().VBComponents.Single(comp => comp.Name.Equals("activeModule")).CodeModule.CodePane;
438+
vbe.ActiveCodePane = activeCodePane;
439+
var projectsProvider = new ProjectsRepository(vbe);
440+
projectsProvider.Refresh();
441+
var selectionService = new SelectionService(vbe, projectsProvider);
442+
443+
var otherCodeModuleMock = projectBuilder.MockCodeModules.Single(mock => mock.Object.Name.Equals("otherModule"));
444+
var otherPaneMock = new Mock<ICodePane>();
445+
otherPaneMock.SetupSet(m => m.Selection = It.IsAny<Selection>()).Callback(() => throw new COMException());
446+
otherCodeModuleMock.SetupGet(m => m.CodePane).Returns(otherPaneMock.Object);
447+
var otherModule = otherCodeModuleMock.Object.QualifiedModuleName;
448+
var newSelection = new Selection(3, 1);
449+
450+
var success = selectionService.TrySetActiveSelection(otherModule, newSelection);
451+
452+
var expectedActiveModule = activeCodePane.QualifiedModuleName;
453+
var actualActiveModule = vbe.ActiveCodePane.QualifiedModuleName;
454+
var actualSelection = vbe.ActiveCodePane.Selection;
455+
456+
Assert.IsFalse(success);
457+
Assert.AreEqual(expectedActiveModule, actualActiveModule);
458+
Assert.AreEqual(activeSelection, actualSelection); ;
459+
}
460+
334461
[Test]
335462
public void ComponentExists_TrySetSelectionSetsSelectionOfModuleAndReturnsTrue()
336463
{

0 commit comments

Comments
 (0)