1
+ using System ;
2
+ using System . Collections . Generic ;
3
+ using System . Linq ;
4
+ using Moq ;
5
+ using NUnit . Framework ;
6
+ using Rubberduck . Parsing . Rewriter ;
7
+ using Rubberduck . Parsing . VBA . Parsing ;
8
+
9
+ namespace RubberduckTests . Rewriter
10
+ {
11
+ [ TestFixture ]
12
+ public class RewriteManagerTests
13
+ {
14
+ [ Test ]
15
+ [ Category ( "Rewriter" ) ]
16
+ public void ReturnsValidCodePaneSessions ( )
17
+ {
18
+ var rewritingManager = RewritingManager ( out _ ) ;
19
+ var codePaneSession = rewritingManager . CheckOutCodePaneSession ( ) ;
20
+ Assert . IsFalse ( codePaneSession . IsInvalidated ) ;
21
+ }
22
+
23
+
24
+ [ Test ]
25
+ [ Category ( "Rewriter" ) ]
26
+ public void ReturnsValidAttributesSessions ( )
27
+ {
28
+ var rewritingManager = RewritingManager ( out _ ) ;
29
+ var attributesSession = rewritingManager . CheckOutAttributesSession ( ) ;
30
+ Assert . IsFalse ( attributesSession . IsInvalidated ) ;
31
+ }
32
+
33
+
34
+ [ Test ]
35
+ [ Category ( "Rewriter" ) ]
36
+ public void InvalidateAllSessionsCallsInvalidateOnAllActiveSessions ( )
37
+ {
38
+ var rewritingManager = RewritingManager ( out var mockFactory ) ;
39
+ rewritingManager . CheckOutCodePaneSession ( ) ;
40
+ rewritingManager . CheckOutAttributesSession ( ) ;
41
+ rewritingManager . CheckOutCodePaneSession ( ) ;
42
+ rewritingManager . CheckOutAttributesSession ( ) ;
43
+
44
+ rewritingManager . InvalidateAllSessions ( ) ;
45
+
46
+ foreach ( var mockSession in mockFactory . RequestedCodePaneSessions ( ) . Concat ( mockFactory . RequestedAttributesSessions ( ) ) )
47
+ {
48
+ mockSession . Verify ( m => m . Invalidate ( ) , Times . Once ) ;
49
+ }
50
+ }
51
+
52
+ [ Test ]
53
+ [ Category ( "Rewriter" ) ]
54
+ public void CallingTheRewritingAllowedCallbackFromAnActiveCodePaneSessionCallsInvalidateOnAllActiveSessions ( )
55
+ {
56
+ var rewritingManager = RewritingManager ( out var mockFactory ) ;
57
+ var codePaneSession = rewritingManager . CheckOutCodePaneSession ( ) ;
58
+ rewritingManager . CheckOutAttributesSession ( ) ;
59
+ rewritingManager . CheckOutCodePaneSession ( ) ;
60
+ rewritingManager . CheckOutAttributesSession ( ) ;
61
+
62
+ codePaneSession . Rewrite ( ) ;
63
+
64
+ foreach ( var mockSession in mockFactory . RequestedCodePaneSessions ( ) . Concat ( mockFactory . RequestedAttributesSessions ( ) ) )
65
+ {
66
+ mockSession . Verify ( m => m . Invalidate ( ) , Times . Once ) ;
67
+ }
68
+ }
69
+
70
+ [ Test ]
71
+ [ Category ( "Rewriter" ) ]
72
+ public void CallingTheRewritingAllowedCallbackFromAnActiveAttributesSessionCallsInvalidateOnAllActiveSessions ( )
73
+ {
74
+ var rewritingManager = RewritingManager ( out var mockFactory ) ;
75
+ rewritingManager . CheckOutCodePaneSession ( ) ;
76
+ var attributesSession = rewritingManager . CheckOutAttributesSession ( ) ;
77
+ rewritingManager . CheckOutCodePaneSession ( ) ;
78
+ rewritingManager . CheckOutAttributesSession ( ) ;
79
+
80
+ attributesSession . Rewrite ( ) ;
81
+
82
+ foreach ( var mockSession in mockFactory . RequestedCodePaneSessions ( ) . Concat ( mockFactory . RequestedAttributesSessions ( ) ) )
83
+ {
84
+ mockSession . Verify ( m => m . Invalidate ( ) , Times . Once ) ;
85
+ }
86
+ }
87
+
88
+ [ Test ]
89
+ [ Category ( "Rewriter" ) ]
90
+ public void CallingTheRewritingAllowedCallbackFromANoLongerActiveCodePaneSessionDoesNotCallInvalidateOnAnyActiveSession_InactiveDueToRewrite ( )
91
+ {
92
+ var rewritingManager = RewritingManager ( out var mockFactory ) ;
93
+ var codePaneSession = rewritingManager . CheckOutCodePaneSession ( ) ;
94
+ var attributesSession = rewritingManager . CheckOutAttributesSession ( ) ;
95
+
96
+ rewritingManager . InvalidateAllSessions ( ) ;
97
+
98
+ rewritingManager . CheckOutCodePaneSession ( ) ;
99
+ rewritingManager . CheckOutAttributesSession ( ) ;
100
+
101
+ codePaneSession . Rewrite ( ) ;
102
+
103
+ foreach ( var mockSession in mockFactory . RequestedCodePaneSessions ( )
104
+ . Concat ( mockFactory . RequestedAttributesSessions ( ) )
105
+ . Where ( session => session . Object != codePaneSession && session . Object != attributesSession ) )
106
+ {
107
+ mockSession . Verify ( m => m . Invalidate ( ) , Times . Never ) ;
108
+ }
109
+ }
110
+
111
+ [ Test ]
112
+ [ Category ( "Rewriter" ) ]
113
+ public void CallingTheRewritingAllowedCallbackFromANoLongerActiveAttributesSessionDoesNotCallInvalidateOnAnyActiveSession_InactiveDueToRewrite ( )
114
+ {
115
+ var rewritingManager = RewritingManager ( out var mockFactory ) ;
116
+ var codePaneSession = rewritingManager . CheckOutCodePaneSession ( ) ;
117
+ var attributesSession = rewritingManager . CheckOutAttributesSession ( ) ;
118
+
119
+ rewritingManager . InvalidateAllSessions ( ) ;
120
+
121
+ rewritingManager . CheckOutCodePaneSession ( ) ;
122
+ rewritingManager . CheckOutAttributesSession ( ) ;
123
+
124
+ codePaneSession . Rewrite ( ) ;
125
+
126
+ foreach ( var mockSession in mockFactory . RequestedCodePaneSessions ( )
127
+ . Concat ( mockFactory . RequestedAttributesSessions ( ) )
128
+ . Where ( session => session . Object != codePaneSession && session . Object != attributesSession ) )
129
+ {
130
+ mockSession . Verify ( m => m . Invalidate ( ) , Times . Never ) ;
131
+ }
132
+ }
133
+
134
+ [ Test ]
135
+ [ Category ( "Rewriter" ) ]
136
+ public void CallingTheRewritingAllowedCallbackFromANoLongerActiveCodePaneSessionDoesNotCallInvalidateOnAnyActiveSession_InactiveDueToInvalidateAll ( )
137
+ {
138
+ var rewritingManager = RewritingManager ( out var mockFactory ) ;
139
+ var codePaneSession = rewritingManager . CheckOutCodePaneSession ( ) ;
140
+ var attributesSession = rewritingManager . CheckOutAttributesSession ( ) ;
141
+
142
+ attributesSession . Rewrite ( ) ;
143
+
144
+ rewritingManager . CheckOutCodePaneSession ( ) ;
145
+ rewritingManager . CheckOutAttributesSession ( ) ;
146
+
147
+ codePaneSession . Rewrite ( ) ;
148
+
149
+ foreach ( var mockSession in mockFactory . RequestedCodePaneSessions ( )
150
+ . Concat ( mockFactory . RequestedAttributesSessions ( ) )
151
+ . Where ( session => session . Object != codePaneSession && session . Object != attributesSession ) )
152
+ {
153
+ mockSession . Verify ( m => m . Invalidate ( ) , Times . Never ) ;
154
+ }
155
+ }
156
+
157
+ [ Test ]
158
+ [ Category ( "Rewriter" ) ]
159
+ public void CallingTheRewritingAllowedCallbackFromANoLongerActiveAttributesSessionDoesNotCallInvalidateOnAnyActiveSession_InactiveDueToInvalidateAll ( )
160
+ {
161
+ var rewritingManager = RewritingManager ( out var mockFactory ) ;
162
+ var codePaneSession = rewritingManager . CheckOutCodePaneSession ( ) ;
163
+ var attributesSession = rewritingManager . CheckOutAttributesSession ( ) ;
164
+
165
+ codePaneSession . Rewrite ( ) ;
166
+
167
+ rewritingManager . CheckOutCodePaneSession ( ) ;
168
+ rewritingManager . CheckOutAttributesSession ( ) ;
169
+
170
+ attributesSession . Rewrite ( ) ;
171
+
172
+ foreach ( var mockSession in mockFactory . RequestedCodePaneSessions ( )
173
+ . Concat ( mockFactory . RequestedAttributesSessions ( ) )
174
+ . Where ( session => session . Object != codePaneSession && session . Object != attributesSession ) )
175
+ {
176
+ mockSession . Verify ( m => m . Invalidate ( ) , Times . Never ) ;
177
+ }
178
+ }
179
+
180
+ private IRewritingManager RewritingManager ( out MockRewriteSessionFactory mockFactory )
181
+ {
182
+ mockFactory = new MockRewriteSessionFactory ( ) ;
183
+ return new RewritingManager ( mockFactory ) ;
184
+ }
185
+ }
186
+
187
+ public class MockRewriteSessionFactory : IRewriteSessionFactory
188
+ {
189
+ private readonly List < Mock < IRewriteSession > > _requestedCodePaneSessions = new List < Mock < IRewriteSession > > ( ) ;
190
+ private readonly List < Mock < IRewriteSession > > _requestedAttributesSessions = new List < Mock < IRewriteSession > > ( ) ;
191
+
192
+ public IEnumerable < Mock < IRewriteSession > > RequestedCodePaneSessions ( )
193
+ {
194
+ return _requestedCodePaneSessions ;
195
+ }
196
+
197
+ public IEnumerable < Mock < IRewriteSession > > RequestedAttributesSessions ( )
198
+ {
199
+ return _requestedAttributesSessions ;
200
+ }
201
+
202
+ public IRewriteSession CodePaneSession ( Func < IRewriteSession , bool > rewritingAllowed )
203
+ {
204
+ var mockSession = MockSession ( rewritingAllowed , CodeKind . CodePaneCode ) ;
205
+ _requestedCodePaneSessions . Add ( mockSession ) ;
206
+ return mockSession . Object ;
207
+ }
208
+
209
+ private Mock < IRewriteSession > MockSession ( Func < IRewriteSession , bool > rewritingAllowed , CodeKind targetCodeKind )
210
+ {
211
+ var mockSession = new Mock < IRewriteSession > ( ) ;
212
+ mockSession . Setup ( m => m . Rewrite ( ) ) . Callback ( ( ) => rewritingAllowed . Invoke ( mockSession . Object ) ) ;
213
+ var isInvalidated = false ;
214
+ mockSession . Setup ( m => m . IsInvalidated ) . Returns ( ( ) => isInvalidated ) ;
215
+ mockSession . Setup ( m => m . Invalidate ( ) ) . Callback ( ( ) => isInvalidated = true ) ;
216
+ mockSession . Setup ( m => m . TargetCodeKind ) . Returns ( targetCodeKind ) ;
217
+
218
+ return mockSession ;
219
+ }
220
+
221
+ public IRewriteSession AttributesSession ( Func < IRewriteSession , bool > rewritingAllowed )
222
+ {
223
+ var mockSession = MockSession ( rewritingAllowed , CodeKind . AttributesCode ) ;
224
+ _requestedAttributesSessions . Add ( mockSession ) ;
225
+ return mockSession . Object ;
226
+ }
227
+ }
228
+ }
0 commit comments