Skip to content

Commit 9e68b4d

Browse files
committed
Make individual empty subfolder names illegal in move (to) folder dialogs
1 parent 8252f74 commit 9e68b4d

File tree

7 files changed

+84
-14
lines changed

7 files changed

+84
-14
lines changed

Rubberduck.Core/UI/Refactorings/MoveFolder/MoveMultipleFoldersViewModel.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,11 +68,19 @@ private void ValidateFolder()
6868

6969
if (string.IsNullOrEmpty(NewFolder))
7070
{
71-
errors.Add(RubberduckUI.MoveFolders_EmptyName);
71+
errors.Add(RubberduckUI.MoveFolders_EmptyFolderName);
7272
}
73-
else if (NewFolder.Any(char.IsControl))
73+
else
7474
{
75-
errors.Add(RubberduckUI.MoveFolders_ControlCharacter);
75+
if (NewFolder.Any(char.IsControl))
76+
{
77+
errors.Add(RubberduckUI.MoveFolders_ControlCharacter);
78+
}
79+
80+
if (NewFolder.Split(FolderExtensions.FolderDelimiter).Any(string.IsNullOrEmpty))
81+
{
82+
errors.Add(RubberduckUI.MoveFolders_EmptySubfolderName);
83+
}
7684
}
7785

7886
if (errors.Any())

Rubberduck.Core/UI/Refactorings/MoveToFolder/MoveMultipleToFolderViewModel.cs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System.Collections.Generic;
22
using System.Globalization;
33
using System.Linq;
4+
using Rubberduck.JunkDrawer.Extensions;
45
using Rubberduck.Parsing.Symbols;
56
using Rubberduck.Resources;
67
using Rubberduck.Refactorings.MoveToFolder;
@@ -52,14 +53,22 @@ public string NewFolder
5253
private void ValidateFolder()
5354
{
5455
var errors = new List<string>();
55-
56+
5657
if (string.IsNullOrEmpty(NewFolder))
5758
{
58-
errors.Add(RubberduckUI.MoveFolders_EmptyName);
59+
errors.Add(RubberduckUI.MoveFolders_EmptyFolderName);
5960
}
60-
else if (NewFolder.Any(char.IsControl))
61+
else
6162
{
62-
errors.Add(RubberduckUI.MoveFolders_ControlCharacter);
63+
if (NewFolder.Any(char.IsControl))
64+
{
65+
errors.Add(RubberduckUI.MoveFolders_ControlCharacter);
66+
}
67+
68+
if (NewFolder.Split(FolderExtensions.FolderDelimiter).Any(string.IsNullOrEmpty))
69+
{
70+
errors.Add(RubberduckUI.MoveFolders_EmptySubfolderName);
71+
}
6372
}
6473

6574
if (errors.Any())

Rubberduck.Resources/RubberduckUI.Designer.cs

Lines changed: 11 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Rubberduck.Resources/RubberduckUI.de.resx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1697,10 +1697,13 @@ Wollen Sie fortfahren?</value>
16971697
<value>Mehrere Ordner mit demselben Namenfolders werden verschoben. Dies verschmilzt sie.
16981698
Wollen Sie fortfahren?</value>
16991699
</data>
1700-
<data name="MoveFolders_EmptyName" xml:space="preserve">
1700+
<data name="MoveFolders_EmptyFolderName" xml:space="preserve">
17011701
<value>Ordnernamen dürfen nicht leer sein.</value>
17021702
</data>
17031703
<data name="MoveFolders_ControlCharacter" xml:space="preserve">
17041704
<value>Ordnernamen dürfen keine Kontrollzeichen wie etwa Zeilenumbrüche enthalten.</value>
17051705
</data>
1706+
<data name="MoveFolders_EmptySubfolderName" xml:space="preserve">
1707+
<value>Die Namen individueller Unterordner dürfen nicht leer sein.</value>
1708+
</data>
17061709
</root>

Rubberduck.Resources/RubberduckUI.resx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1914,10 +1914,13 @@ Do you want to proceed?</value>
19141914
Do you want to proceed?</value>
19151915

19161916
</data>
1917-
<data name="MoveFolders_EmptyName" xml:space="preserve">
1917+
<data name="MoveFolders_EmptyFolderName" xml:space="preserve">
19181918
<value>A folder name cannot be empty.</value>
19191919
</data>
19201920
<data name="MoveFolders_ControlCharacter" xml:space="preserve">
19211921
<value>Folder names cannot contain control characters like e.g. new lines.</value>
19221922
</data>
1923+
<data name="MoveFolders_EmptySubfolderName" xml:space="preserve">
1924+
<value>The names of individual subfolders cannot be empty.</value>
1925+
</data>
19231926
</root>

RubberduckTests/Refactoring/MoveFolders/MoveMultipleFoldersViewModelTests.cs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,14 +91,33 @@ public void TargetFolderWithControlCharacter_Error(string folderName)
9191

9292
[Test]
9393
[Category("Refactorings")]
94-
public void NonEmptyTargetFolderWithoutControlCharacter_NoError()
94+
[TestCase(".SomeFolder.SomeOtherFolder")]
95+
[TestCase("SomeFolder..SomeOtherFolder")]
96+
[TestCase("SomeFolder.SomeOtherFolder.")]
97+
public void TargetFolderWithEmptyIndividualFolder_Error(string folderName)
9598
{
9699
using (var state = MockParser.CreateAndParse(TestVbe()))
97100
{
98101
var model = TestModel(new List<string> { "FooBar.Foo.Barr" }, state.DeclarationFinder);
99102
var viewModel = TestViewModel(model, state, null);
100103

101-
viewModel.NewFolder = ";oehaha .adaiafa.a@#$^%&#@$&%%$%^$.ad3.1010101. . . . rqrq";
104+
viewModel.NewFolder = folderName;
105+
106+
Assert.IsTrue(viewModel.HasErrors);
107+
Assert.IsFalse(viewModel.IsValidFolder);
108+
}
109+
}
110+
111+
[Test]
112+
[Category("Refactorings")]
113+
public void TargetFolderWithoutEmptyPartsOrControlCharacter_NoError()
114+
{
115+
using (var state = MockParser.CreateAndParse(TestVbe()))
116+
{
117+
var model = TestModel(new List<string> { "FooBar.Foo.Barr" }, state.DeclarationFinder);
118+
var viewModel = TestViewModel(model, state, null);
119+
120+
viewModel.NewFolder = ";oehaha .adaiafa.a@#$^%&#@$&%%$%^$.ad3.1010101. ## . @.{ ]. rqrq";
102121

103122
Assert.IsFalse(viewModel.HasErrors);
104123
Assert.IsTrue(viewModel.IsValidFolder);

RubberduckTests/Refactoring/MoveToFolder/MoveMultipleToFolderViewModelTests.cs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,25 @@ public void TargetFolderWithControlCharacter_Error(string folderName)
8282
}
8383
}
8484

85+
[Test]
86+
[Category("Refactorings")]
87+
[TestCase(".SomeFolder.SomeOtherFolder")]
88+
[TestCase("SomeFolder..SomeOtherFolder")]
89+
[TestCase("SomeFolder.SomeOtherFolder.")]
90+
public void TargetFolderWithEmptyIndividualFolder_Error(string folderName)
91+
{
92+
using (var state = MockParser.CreateAndParse(TestVbe()))
93+
{
94+
var model = TestModel("FooBar.Foo", state.DeclarationFinder);
95+
var viewModel = TestViewModel(model);
96+
97+
viewModel.NewFolder = folderName;
98+
99+
Assert.IsTrue(viewModel.HasErrors);
100+
Assert.IsFalse(viewModel.IsValidFolder);
101+
}
102+
}
103+
85104
[Test]
86105
[Category("Refactorings")]
87106
public void NonEmptyTargetFolderWithoutControlCharacter_NoError()
@@ -91,7 +110,7 @@ public void NonEmptyTargetFolderWithoutControlCharacter_NoError()
91110
var model = TestModel("FooBar.Foo" , state.DeclarationFinder);
92111
var viewModel = TestViewModel(model);
93112

94-
viewModel.NewFolder = ";oehaha .adaiafa.a@#$^%&#@$&%%$%^$.ad3.1010101. . . . rqrq";
113+
viewModel.NewFolder = ";oehaha .adaiafa.a@#$^%&#@$&%%$%^$.ad3.1010101. ## . @.{ ]. rqrq";
95114

96115
Assert.IsFalse(viewModel.HasErrors);
97116
Assert.IsTrue(viewModel.IsValidFolder);

0 commit comments

Comments
 (0)