1
+ using System ;
2
+ using System . Collections . Generic ;
3
+ using System . Linq ;
4
+ using NUnit . Framework ;
5
+ using Rubberduck . Parsing . Rewriter ;
6
+ using Rubberduck . Parsing . Symbols ;
7
+ using Rubberduck . Parsing . VBA ;
8
+ using Rubberduck . Refactorings ;
9
+ using Rubberduck . Refactorings . ChangeFolder ;
10
+ using Rubberduck . Refactorings . MoveToFolder ;
11
+ using Rubberduck . VBEditor . SafeComWrappers ;
12
+
13
+ namespace RubberduckTests . Refactoring . ChangeFolder
14
+ {
15
+ [ TestFixture ]
16
+ public class ChangeFolderRefactoringActionTests : RefactoringActionTestBase < ChangeFolderModel >
17
+ {
18
+ [ Test ]
19
+ [ Category ( "Refactorings" ) ]
20
+ public void ChangeFolderRefactoringAction_TopLevelFolder ( )
21
+ {
22
+ const string code = @"
23
+ '@Folder(""MyOldFolder"")
24
+ Public Sub Foo()
25
+ End Sub
26
+ " ;
27
+ const string expectedCode = @"
28
+ '@Folder ""MyNewFolder.MySubFolder""
29
+ Public Sub Foo()
30
+ End Sub
31
+ " ;
32
+ Func < RubberduckParserState , ChangeFolderModel > modelBuilder = ( state ) =>
33
+ {
34
+ var module = state . DeclarationFinder
35
+ . UserDeclarations ( DeclarationType . ProceduralModule )
36
+ . Single ( ) as ModuleDeclaration ;
37
+ return new ChangeFolderModel ( "MyOldFolder" , new List < ModuleDeclaration > { module } , "MyNewFolder.MySubFolder" ) ;
38
+ } ;
39
+
40
+ var refactoredCode = RefactoredCode ( code , modelBuilder ) ;
41
+
42
+ Assert . AreEqual ( expectedCode , refactoredCode ) ;
43
+ }
44
+
45
+ [ Test ]
46
+ [ Category ( "Refactorings" ) ]
47
+ public void ChangeFolderRefactoringAction_SubFolder ( )
48
+ {
49
+ const string code = @"
50
+ '@Folder(""MyOldFolder.MyOldSubFolder.SubSub"")
51
+ Public Sub Foo()
52
+ End Sub
53
+ " ;
54
+ const string expectedCode = @"
55
+ '@Folder ""MyNewFolder""
56
+ Public Sub Foo()
57
+ End Sub
58
+ " ;
59
+ Func < RubberduckParserState , ChangeFolderModel > modelBuilder = ( state ) =>
60
+ {
61
+ var module = state . DeclarationFinder
62
+ . UserDeclarations ( DeclarationType . ProceduralModule )
63
+ . Single ( ) as ModuleDeclaration ;
64
+ return new ChangeFolderModel ( "MyOldFolder.MyOldSubFolder.SubSub" , new List < ModuleDeclaration > { module } , "MyNewFolder" ) ;
65
+ } ;
66
+
67
+ var refactoredCode = RefactoredCode ( code , modelBuilder ) ;
68
+
69
+ Assert . AreEqual ( expectedCode , refactoredCode ) ;
70
+ }
71
+
72
+ [ Test ]
73
+ [ Category ( "Refactorings" ) ]
74
+ public void ChangeFolderRefactoringAction_PreservesSubFolderStructure ( )
75
+ {
76
+ const string code = @"
77
+ '@Folder(""MyOldFolder.MyOldSubFolder.SubSub.Sub"")
78
+ Public Sub Foo()
79
+ End Sub
80
+ " ;
81
+ const string expectedCode = @"
82
+ '@Folder ""MyNewFolder.MySubFolder.SubSub.Sub""
83
+ Public Sub Foo()
84
+ End Sub
85
+ " ;
86
+ Func < RubberduckParserState , ChangeFolderModel > modelBuilder = ( state ) =>
87
+ {
88
+ var module = state . DeclarationFinder
89
+ . UserDeclarations ( DeclarationType . ProceduralModule )
90
+ . Single ( ) as ModuleDeclaration ;
91
+ return new ChangeFolderModel ( "MyOldFolder.MyOldSubFolder" , new List < ModuleDeclaration > { module } , "MyNewFolder.MySubFolder" ) ;
92
+ } ;
93
+
94
+ var refactoredCode = RefactoredCode ( code , modelBuilder ) ;
95
+
96
+ Assert . AreEqual ( expectedCode , refactoredCode ) ;
97
+ }
98
+
99
+ [ Test ]
100
+ [ Category ( "Refactorings" ) ]
101
+ public void ChangeFolderRefactoringAction_NotInFolder_DoesNothing ( )
102
+ {
103
+ const string code = @"
104
+ '@Folder(""MyOldFolder.MyOldSubFolder.SubSub.Sub"")
105
+ Public Sub Foo()
106
+ End Sub
107
+ " ;
108
+ const string expectedCode = code ;
109
+
110
+ Func < RubberduckParserState , ChangeFolderModel > modelBuilder = ( state ) =>
111
+ {
112
+ var module = state . DeclarationFinder
113
+ . UserDeclarations ( DeclarationType . ProceduralModule )
114
+ . Single ( ) as ModuleDeclaration ;
115
+ return new ChangeFolderModel ( "NotMyOldFolder.MyOldSubFolder" , new List < ModuleDeclaration > { module } , "MyNewFolder.MySubFolder" ) ;
116
+ } ;
117
+
118
+ var refactoredCode = RefactoredCode ( code , modelBuilder ) ;
119
+
120
+ Assert . AreEqual ( expectedCode , refactoredCode ) ;
121
+ }
122
+
123
+ [ Test ]
124
+ [ Category ( "Refactorings" ) ]
125
+ public void ChangeFolderRefactoringAction_ChangesExactlyTheSpecifiedModules ( )
126
+ {
127
+ const string code1 = @"
128
+ '@Folder(""MyOldFolder.MyOldSubfolder.SubSub"")
129
+ Public Sub Foo()
130
+ End Sub
131
+ " ;
132
+ const string code2 = @"
133
+ '@Folder(""MyOldFolder.MyOldSubfolder"")
134
+ Public Sub Foo()
135
+ End Sub
136
+ " ;
137
+ const string code3 = @"
138
+ '@Folder(""MyOtherFolder.MyOldSubfolder"")
139
+ Public Sub Foo()
140
+ End Sub
141
+ " ;
142
+ const string code4 = @"
143
+ '@Folder(""MyOtherFolder.MyOtherSubfolder"")
144
+ Public Sub Foo()
145
+ End Sub
146
+ " ;
147
+ const string code5 = @"
148
+ Public Sub Foo()
149
+ End Sub
150
+ " ;
151
+ const string expectedCode1 = @"
152
+ '@Folder ""MyNewFolder.SubSub""
153
+ Public Sub Foo()
154
+ End Sub
155
+ " ;
156
+ const string expectedCode2 = @"
157
+ '@Folder ""MyNewFolder""
158
+ Public Sub Foo()
159
+ End Sub
160
+ " ;
161
+ const string expectedCode3 = code3 ;
162
+ const string expectedCode4 = code4 ;
163
+ const string expectedCode5 = code5 ;
164
+ Func < RubberduckParserState , ChangeFolderModel > modelBuilder = ( state ) =>
165
+ {
166
+ var modules = state . DeclarationFinder
167
+ . UserDeclarations ( DeclarationType . Module )
168
+ . OfType < ModuleDeclaration > ( )
169
+ . ToList ( ) ;
170
+
171
+ var module1 = modules . Single ( module => module . IdentifierName . Equals ( "SubSubFolderModule" ) ) ;
172
+ var module2 = modules . Single ( module => module . IdentifierName . Equals ( "SubFolderModuleIncluded" ) ) ;
173
+ const string originalFolder = "MyOldFolder.MyOldSubfolder" ;
174
+
175
+ return new ChangeFolderModel ( originalFolder , new List < ModuleDeclaration > { module1 , module2 } , "MyNewFolder" ) ;
176
+ } ;
177
+
178
+ var refactoredCode = RefactoredCode (
179
+ modelBuilder ,
180
+ ( "SubSubFolderModule" , code1 , ComponentType . StandardModule ) ,
181
+ ( "SubFolderModuleIncluded" , code2 , ComponentType . ClassModule ) ,
182
+ ( "SubFolderModuleNotIncluded" , code3 , ComponentType . ClassModule ) ,
183
+ ( "UnaffectedSubFolderModule" , code4 , ComponentType . StandardModule ) ,
184
+ ( "NoFolderModule" , code5 , ComponentType . StandardModule ) ) ;
185
+
186
+ Assert . AreEqual ( expectedCode1 , refactoredCode [ "SubSubFolderModule" ] ) ;
187
+ Assert . AreEqual ( expectedCode2 , refactoredCode [ "SubFolderModuleIncluded" ] ) ;
188
+ Assert . AreEqual ( expectedCode3 , refactoredCode [ "SubFolderModuleNotIncluded" ] ) ;
189
+ Assert . AreEqual ( expectedCode4 , refactoredCode [ "UnaffectedSubFolderModule" ] ) ;
190
+ Assert . AreEqual ( expectedCode5 , refactoredCode [ "NoFolderModule" ] ) ;
191
+ }
192
+
193
+ protected override IRefactoringAction < ChangeFolderModel > TestBaseRefactoring ( RubberduckParserState state , IRewritingManager rewritingManager )
194
+ {
195
+ var annotationUpdater = new AnnotationUpdater ( ) ;
196
+ var moveToFolderAction = new MoveToFolderRefactoringAction ( rewritingManager , annotationUpdater ) ;
197
+ return new ChangeFolderRefactoringAction ( rewritingManager , moveToFolderAction ) ;
198
+ }
199
+ }
200
+ }
0 commit comments