1
+ using System ;
2
+ using System . Linq ;
3
+ using Moq ;
4
+ using NUnit . Framework ;
5
+ using Rubberduck . Parsing . Rewriter ;
6
+ using Rubberduck . Parsing . Symbols ;
7
+ using Rubberduck . Parsing . UIContext ;
8
+ using Rubberduck . Parsing . VBA ;
9
+ using Rubberduck . Refactorings ;
10
+ using Rubberduck . Refactorings . Exceptions ;
11
+ using Rubberduck . Refactorings . MoveToFolder ;
12
+ using Rubberduck . VBEditor . SafeComWrappers ;
13
+ using Rubberduck . VBEditor . Utility ;
14
+ using RubberduckTests . Mocks ;
15
+
16
+ namespace RubberduckTests . Refactoring . MoveToFolder
17
+ {
18
+ [ TestFixture ]
19
+ public class MoveToFolderRefactoringTests : InteractiveRefactoringTestBase < IMoveMultipleToFolderPresenter , MoveMultipleToFolderModel >
20
+ {
21
+ [ Test ]
22
+ [ Category ( "Refactorings" ) ]
23
+ public void MoveToFolderRefactoring_NoAnnotation ( )
24
+ {
25
+ const string code = @"
26
+ Public Sub Foo()
27
+ End Sub
28
+ " ;
29
+ const string expectedCode = @"'@Folder ""MyNewFolder.MySubFolder""
30
+
31
+ Public Sub Foo()
32
+ End Sub
33
+ " ;
34
+ Func < MoveMultipleToFolderModel , MoveMultipleToFolderModel > presenterAction = ( model ) =>
35
+ {
36
+ model . TargetFolder = "MyNewFolder.MySubFolder" ;
37
+ return model ;
38
+ } ;
39
+
40
+ var refactoredCode = RefactoredCode (
41
+ "TestModule" ,
42
+ DeclarationType . Module ,
43
+ presenterAction ,
44
+ null ,
45
+ ( "TestModule" , code , ComponentType . StandardModule ) ) ;
46
+
47
+ Assert . AreEqual ( expectedCode , refactoredCode [ "TestModule" ] ) ;
48
+ }
49
+
50
+ [ Test ]
51
+ [ Category ( "Refactorings" ) ]
52
+ public void MoveToFolderRefactoring_UpdateAnnotation ( )
53
+ {
54
+ const string code = @"
55
+ '@Folder(""MyOldFolder.MyOldSubfolder.SubSub"")
56
+ Public Sub Foo()
57
+ End Sub
58
+ " ;
59
+ const string expectedCode = @"
60
+ '@Folder ""MyNewFolder.MySubFolder""
61
+ Public Sub Foo()
62
+ End Sub
63
+ " ;
64
+ Func < MoveMultipleToFolderModel , MoveMultipleToFolderModel > presenterAction = ( model ) =>
65
+ {
66
+ model . TargetFolder = "MyNewFolder.MySubFolder" ;
67
+ return model ;
68
+ } ;
69
+
70
+ var refactoredCode = RefactoredCode (
71
+ "TestModule" ,
72
+ DeclarationType . Module ,
73
+ presenterAction ,
74
+ null ,
75
+ ( "TestModule" , code , ComponentType . StandardModule ) ) ;
76
+
77
+ Assert . AreEqual ( expectedCode , refactoredCode [ "TestModule" ] ) ;
78
+ }
79
+
80
+ [ Test ]
81
+ [ Category ( "Refactorings" ) ]
82
+ public void MoveToFolderRefactoring_NameContainingDoubleQuotes ( )
83
+ {
84
+ const string code = @"
85
+ Public Sub Foo()
86
+ End Sub
87
+ " ;
88
+ const string expectedCode = @"'@Folder ""MyNew""""Folder.My""""""""""""""""SubFolder""
89
+
90
+ Public Sub Foo()
91
+ End Sub
92
+ " ;
93
+ Func < MoveMultipleToFolderModel , MoveMultipleToFolderModel > presenterAction = ( model ) =>
94
+ {
95
+ model . TargetFolder = "MyNew\" Folder.My\" \" \" \" SubFolder" ;
96
+ return model ;
97
+ } ;
98
+
99
+ var refactoredCode = RefactoredCode (
100
+ "TestModule" ,
101
+ DeclarationType . Module ,
102
+ presenterAction ,
103
+ null ,
104
+ ( "TestModule" , code , ComponentType . StandardModule ) ) ;
105
+
106
+ Assert . AreEqual ( expectedCode , refactoredCode [ "TestModule" ] ) ;
107
+ }
108
+
109
+
110
+ [ Test ]
111
+ [ Category ( "Refactorings" ) ]
112
+ public void MoveToFolderRefactoring_InitialModel_NoAnnotation ( )
113
+ {
114
+ const string code = @"
115
+ Public Sub Foo()
116
+ End Sub
117
+ " ;
118
+ var vbe = new MockVbeBuilder ( )
119
+ . ProjectBuilder ( "TestProject" , ProjectProtection . Unprotected )
120
+ . AddComponent ( "TestModule" , ComponentType . StandardModule , code )
121
+ . AddProjectToVbeBuilder ( )
122
+ . Build ( )
123
+ . Object ;
124
+
125
+ var model = InitialModel ( vbe , "TestModule" , DeclarationType . ProceduralModule ) ;
126
+
127
+ var targetName = model . Targets . Single ( ) . IdentifierName ;
128
+ var initialTargetFolder = model . TargetFolder ;
129
+
130
+ Assert . AreEqual ( "TestModule" , targetName ) ;
131
+ Assert . AreEqual ( "TestProject" , initialTargetFolder ) ;
132
+ }
133
+
134
+ [ Test ]
135
+ [ Category ( "Refactorings" ) ]
136
+ public void MoveToFolderRefactoring_InitialModel_UpdateAnnotation ( )
137
+ {
138
+ const string code = @"
139
+ '@Folder(""MyOldFolder.MyOldSubfolder.SubSub"")
140
+ Public Sub Foo()
141
+ End Sub
142
+ " ;
143
+ var model = InitialModel (
144
+ "TestModule" ,
145
+ DeclarationType . ProceduralModule ,
146
+ ( "TestModule" , code , ComponentType . StandardModule ) ) ;
147
+
148
+ var targetName = model . Targets . Single ( ) . IdentifierName ;
149
+ var initialTargetFolder = model . TargetFolder ;
150
+
151
+ Assert . AreEqual ( "TestModule" , targetName ) ;
152
+ Assert . AreEqual ( "MyOldFolder.MyOldSubfolder.SubSub" , initialTargetFolder ) ;
153
+ }
154
+
155
+ [ Test ]
156
+ [ Category ( "Refactorings" ) ]
157
+ public void MoveToFolderRefactoring_InitialModel_NameContainingDoubleQuotes ( )
158
+ {
159
+ const string code = @"
160
+ '@Folder(""MyNew""""Folder.My""""""""""""""""SubFolder"")
161
+ Public Sub Foo()
162
+ End Sub
163
+ " ;
164
+ var model = InitialModel (
165
+ "TestModule" ,
166
+ DeclarationType . ProceduralModule ,
167
+ ( "TestModule" , code , ComponentType . StandardModule ) ) ;
168
+
169
+ var targetName = model . Targets . Single ( ) . IdentifierName ;
170
+ var initialTargetFolder = model . TargetFolder ;
171
+
172
+ Assert . AreEqual ( "TestModule" , targetName ) ;
173
+ Assert . AreEqual ( "MyNew\" Folder.My\" \" \" \" SubFolder" , initialTargetFolder ) ;
174
+ }
175
+
176
+ [ Test ]
177
+ [ Category ( "Refactorings" ) ]
178
+ public void MoveToFolderRefactoring_TargetNotAModule_Throws ( )
179
+ {
180
+ const string code = @"
181
+ Public Sub Foo()
182
+ End Sub
183
+ " ;
184
+ Func < MoveMultipleToFolderModel , MoveMultipleToFolderModel > presenterAction = ( model ) =>
185
+ {
186
+ model . TargetFolder = "MyNewFolder.MySubFolder" ;
187
+ return model ;
188
+ } ;
189
+
190
+ var refactoredCode = RefactoredCode (
191
+ "Foo" ,
192
+ DeclarationType . Procedure ,
193
+ presenterAction ,
194
+ typeof ( InvalidDeclarationTypeException ) ,
195
+ ( "TestModule" , code , ComponentType . StandardModule ) ) ;
196
+ }
197
+
198
+
199
+ protected override IRefactoring TestRefactoring (
200
+ IRewritingManager rewritingManager ,
201
+ RubberduckParserState state ,
202
+ IRefactoringPresenterFactory factory ,
203
+ ISelectionService selectionService )
204
+ {
205
+ var uiDispatcherMock = new Mock < IUiDispatcher > ( ) ;
206
+ uiDispatcherMock
207
+ . Setup ( m => m . Invoke ( It . IsAny < Action > ( ) ) )
208
+ . Callback ( ( Action action ) => action . Invoke ( ) ) ;
209
+
210
+ var annotationUpdater = new AnnotationUpdater ( ) ;
211
+ var moveToFolderAction = new MoveToFolderRefactoringAction ( rewritingManager , annotationUpdater ) ;
212
+ var moveMultipleToFolderAction = new MoveMultipleToFolderRefactoringAction ( rewritingManager , moveToFolderAction ) ;
213
+
214
+ var selectedDeclarationProvider = new SelectedDeclarationProvider ( selectionService , state ) ;
215
+ return new MoveToFolderRefactoring ( moveMultipleToFolderAction , selectedDeclarationProvider , selectionService , factory , uiDispatcherMock . Object , state ) ;
216
+ }
217
+ }
218
+ }
0 commit comments