@@ -34,15 +34,15 @@ public void CanExecuteDisablesRefreshView()
3434 {
3535 RefreshView refreshView = new RefreshView ( ) ;
3636 refreshView . Command = new Command ( ( ) => { } , ( ) => false ) ;
37- Assert . False ( refreshView . IsEnabled ) ;
37+ Assert . False ( refreshView . IsRefreshEnabled ) ;
3838 }
3939
4040 [ Fact ]
4141 public void CanExecuteEnablesRefreshView ( )
4242 {
4343 RefreshView refreshView = new RefreshView ( ) ;
4444 refreshView . Command = new Command ( ( ) => { } , ( ) => true ) ;
45- Assert . True ( refreshView . IsEnabled ) ;
45+ Assert . True ( refreshView . IsRefreshEnabled ) ;
4646 }
4747
4848 [ Fact ]
@@ -78,12 +78,12 @@ public void CanExecuteChangesEnabled()
7878
7979 canExecute = false ;
8080 command . ChangeCanExecute ( ) ;
81- Assert . False ( refreshView . IsEnabled ) ;
81+ Assert . False ( refreshView . IsRefreshEnabled ) ;
8282
8383
8484 canExecute = true ;
8585 command . ChangeCanExecute ( ) ;
86- Assert . True ( refreshView . IsEnabled ) ;
86+ Assert . True ( refreshView . IsRefreshEnabled ) ;
8787 }
8888
8989 [ Fact ]
@@ -96,11 +96,11 @@ public void CommandPropertyChangesEnabled()
9696 refreshView . CommandParameter = true ;
9797 refreshView . Command = command ;
9898
99- Assert . True ( refreshView . IsEnabled ) ;
99+ Assert . True ( refreshView . IsRefreshEnabled ) ;
100100 refreshView . CommandParameter = false ;
101- Assert . False ( refreshView . IsEnabled ) ;
101+ Assert . False ( refreshView . IsRefreshEnabled ) ;
102102 refreshView . CommandParameter = true ;
103- Assert . True ( refreshView . IsEnabled ) ;
103+ Assert . True ( refreshView . IsRefreshEnabled ) ;
104104 }
105105
106106 [ Fact ]
@@ -111,11 +111,11 @@ public void RemovedCommandEnablesRefreshView()
111111 bool canExecute = true ;
112112 var command = new Command ( ( ) => { } , ( ) => false ) ;
113113 refreshView . Command = command ;
114- Assert . False ( refreshView . IsEnabled ) ;
114+ Assert . False ( refreshView . IsRefreshEnabled ) ;
115115 refreshView . Command = null ;
116- Assert . True ( refreshView . IsEnabled ) ;
116+ Assert . True ( refreshView . IsRefreshEnabled ) ;
117117 refreshView . Command = command ;
118- Assert . False ( refreshView . IsEnabled ) ;
118+ Assert . False ( refreshView . IsRefreshEnabled ) ;
119119 }
120120
121121 [ Fact ]
@@ -192,17 +192,6 @@ public void IsRefreshEnabledPreventsIsRefreshingFromBeingSetToTrue()
192192 Assert . False ( refreshView . IsRefreshing ) ;
193193 }
194194
195- [ Fact ]
196- public void IsRefreshingCanBeSetToFalseWhenIsRefreshEnabledIsFalse ( )
197- {
198- RefreshView refreshView = new RefreshView ( ) ;
199- refreshView . IsRefreshing = true ;
200- Assert . True ( refreshView . IsRefreshing ) ;
201-
202- refreshView . IsRefreshEnabled = false ;
203- Assert . False ( refreshView . IsRefreshing ) ; // Should be automatically cleared
204- }
205-
206195 [ Fact ]
207196 public void SettingIsRefreshEnabledToFalseWhileRefreshingStopsRefresh ( )
208197 {
@@ -214,28 +203,20 @@ public void SettingIsRefreshEnabledToFalseWhileRefreshingStopsRefresh()
214203 Assert . False ( refreshView . IsRefreshing ) ;
215204 }
216205
217- [ Fact ]
218- public void BothIsEnabledAndIsRefreshEnabledMustBeTrueToAllowRefresh ( )
206+ [ Theory ]
207+ [ InlineData ( true , true , true , true ) ] // Both enabled - should allow refresh
208+ [ InlineData ( false , true , true , false ) ] // IsEnabled false - should prevent refresh
209+ [ InlineData ( true , false , true , false ) ] // IsRefreshEnabled false - should prevent refresh
210+ [ InlineData ( false , false , true , false ) ] // Both false - should prevent refresh
211+ public void RefreshBehaviorDependsOnIsEnabledAndIsRefreshEnabled ( bool isEnabled , bool isRefreshEnabled , bool setRefreshing , bool expectedRefreshing )
219212 {
220213 RefreshView refreshView = new RefreshView ( ) ;
221214
222- // Both true - should allow refresh
223- refreshView . IsEnabled = true ;
224- refreshView . IsRefreshEnabled = true ;
225- refreshView . IsRefreshing = true ;
226- Assert . True ( refreshView . IsRefreshing ) ;
215+ refreshView . IsEnabled = isEnabled ;
216+ refreshView . IsRefreshEnabled = isRefreshEnabled ;
217+ refreshView . IsRefreshing = setRefreshing ;
227218
228- // IsEnabled false - should prevent refresh
229- refreshView . IsRefreshing = false ;
230- refreshView . IsEnabled = false ;
231- refreshView . IsRefreshing = true ;
232- Assert . False ( refreshView . IsRefreshing ) ;
233-
234- // IsRefreshEnabled false - should prevent refresh
235- refreshView . IsEnabled = true ;
236- refreshView . IsRefreshEnabled = false ;
237- refreshView . IsRefreshing = true ;
238- Assert . False ( refreshView . IsRefreshing ) ;
219+ Assert . Equal ( expectedRefreshing , refreshView . IsRefreshing ) ;
239220 }
240221
241222 [ Fact ]
@@ -260,5 +241,70 @@ public void IsRefreshEnabledWorksWithCommand()
260241 Assert . False ( refreshView . IsRefreshing ) ;
261242 Assert . False ( commandExecuted ) ;
262243 }
244+
245+ [ Fact ]
246+ public void IsRefreshEnabledRespectsCommandCanExecute ( )
247+ {
248+ RefreshView refreshView = new RefreshView ( ) ;
249+ bool canExecute = true ;
250+ bool commandExecuted = false ;
251+
252+ refreshView . Command = new Command ( ( ) => commandExecuted = true , ( ) => canExecute ) ;
253+
254+ // Initially can execute and IsRefreshEnabled is true by default
255+ Assert . True ( refreshView . IsRefreshEnabled ) ;
256+
257+ // When command cannot execute, IsRefreshEnabled should be false
258+ canExecute = false ;
259+ ( ( Command ) refreshView . Command ) . ChangeCanExecute ( ) ;
260+ Assert . False ( refreshView . IsRefreshEnabled ) ;
261+
262+ // When command can execute again, IsRefreshEnabled should be true (if explicitly set)
263+ canExecute = true ;
264+ ( ( Command ) refreshView . Command ) . ChangeCanExecute ( ) ;
265+ Assert . True ( refreshView . IsRefreshEnabled ) ;
266+ }
267+
268+ [ Fact ]
269+ public void IsRefreshEnabledWithCommandCanExecuteFalseBlocksRefresh ( )
270+ {
271+ RefreshView refreshView = new RefreshView ( ) ;
272+ bool canExecute = false ;
273+ bool commandExecuted = false ;
274+
275+ refreshView . Command = new Command ( ( ) => commandExecuted = true , ( ) => canExecute ) ;
276+
277+ // Even though IsRefreshEnabled is explicitly true, command cannot execute
278+ refreshView . IsRefreshEnabled = true ;
279+ Assert . False ( refreshView . IsRefreshEnabled ) ; // Should be coerced to false
280+
281+ // Trying to refresh should fail
282+ refreshView . IsRefreshing = true ;
283+ Assert . False ( refreshView . IsRefreshing ) ;
284+ Assert . False ( commandExecuted ) ;
285+ }
286+
287+ [ Fact ]
288+ public void CommandCanExecuteChangeClearsIsRefreshingWhenBecomesFalse ( )
289+ {
290+ RefreshView refreshView = new RefreshView ( ) ;
291+ bool canExecute = true ;
292+ bool commandExecuted = false ;
293+
294+ refreshView . Command = new Command ( ( ) => commandExecuted = true , ( ) => canExecute ) ;
295+
296+ // Start refreshing
297+ refreshView . IsRefreshing = true ;
298+ Assert . True ( refreshView . IsRefreshing ) ;
299+ Assert . True ( commandExecuted ) ;
300+
301+ // When command can no longer execute, refreshing should stop
302+ canExecute = false ;
303+ ( ( Command ) refreshView . Command ) . ChangeCanExecute ( ) ;
304+
305+ // The refresh should not be stopped by CanExecuteChanged when already refreshing
306+ // This matches the behavior in the CanExecuteChanged method
307+ Assert . True ( refreshView . IsRefreshing ) ;
308+ }
263309 }
264310}
0 commit comments