/XamarinCommunityToolkit.UnitTests/ObjectModel/ICommandTests/AsyncValueCommandTests/AsyncValueCommand_Tests.cs

https://github.com/xamarin/XamarinCommunityToolkit · C# · 264 lines · 149 code · 66 blank · 49 comment · 0 complexity · cbf5464f013f418de99f66354b0d3565 MD5 · raw file

  1. using System;
  2. using System.Threading.Tasks;
  3. using Xamarin.CommunityToolkit.ObjectModel;
  4. using Xunit;
  5. namespace Xamarin.CommunityToolkit.UnitTests.ObjectModel.ICommandTests.AsyncValueCommandTests
  6. {
  7. public class AsyncValueCommandTests : BaseAsyncValueCommandTests
  8. {
  9. [Fact]
  10. public void AsyncValueCommandNullExecuteParameter()
  11. {
  12. // Arrange
  13. // Act
  14. // Assert
  15. #pragma warning disable CS8625 //Cannot convert null literal to non-nullable reference type
  16. Assert.Throws<ArgumentNullException>(() => new AsyncValueCommand(null));
  17. #pragma warning restore CS8625
  18. }
  19. [Fact]
  20. public void AsyncValueCommandT_NullExecuteParameter()
  21. {
  22. // Arrange
  23. // Act
  24. // Assert
  25. #pragma warning disable CS8625 //Cannot convert null literal to non-nullable reference type
  26. Assert.Throws<ArgumentNullException>(() => new AsyncValueCommand<object>(null));
  27. #pragma warning restore CS8625
  28. }
  29. [Theory]
  30. [InlineData(500)]
  31. [InlineData(0)]
  32. public async Task AsyncValueCommandExecuteAsync_IntParameter_Test(int parameter)
  33. {
  34. // Arrange
  35. var command = new AsyncValueCommand<int>(IntParameterTask);
  36. var command2 = new AsyncValueCommand<int, string>(IntParameterTask, CanExecuteTrue);
  37. // Act
  38. await command.ExecuteAsync(parameter);
  39. await command2.ExecuteAsync(parameter);
  40. // Assert
  41. }
  42. [Theory]
  43. [InlineData("Hello")]
  44. [InlineData(default)]
  45. public async Task AsyncValueCommandExecuteAsync_StringParameter_Test(string parameter)
  46. {
  47. // Arrange
  48. var command = new AsyncValueCommand<string>(StringParameterTask);
  49. var command2 = new AsyncValueCommand<string, bool>(StringParameterTask, CanExecuteTrue);
  50. // Act
  51. await command.ExecuteAsync(parameter);
  52. await command2.ExecuteAsync(parameter);
  53. // Assert
  54. }
  55. [Fact]
  56. public void AsyncValueCommandParameter_CanExecuteTrue_Test()
  57. {
  58. // Arrange
  59. var command = new AsyncValueCommand<int>(IntParameterTask, CanExecuteTrue);
  60. var command2 = new AsyncValueCommand<int, bool>(IntParameterTask, CanExecuteTrue);
  61. // Act
  62. // Assert
  63. Assert.True(command.CanExecute(null));
  64. Assert.True(command2.CanExecute(true));
  65. }
  66. [Fact]
  67. public void AsyncValueCommandParameter_CanExecuteFalse_Test()
  68. {
  69. // Arrange
  70. var command = new AsyncValueCommand<int>(IntParameterTask, CanExecuteFalse);
  71. var command2 = new AsyncValueCommand<int, string>(IntParameterTask, CanExecuteFalse);
  72. // Act
  73. // Assert
  74. Assert.False(command.CanExecute(null));
  75. Assert.False(command2.CanExecute("Hello World"));
  76. }
  77. [Fact]
  78. public void AsyncValueCommandNoParameter_CanExecuteTrue_Test()
  79. {
  80. // Arrange
  81. var command = new AsyncValueCommand(NoParameterTask, CanExecuteTrue);
  82. // Act
  83. // Assert
  84. Assert.True(command.CanExecute(null));
  85. }
  86. [Fact]
  87. public void AsyncValueCommandNoParameter_CanExecuteFalse_Test()
  88. {
  89. // Arrange
  90. var command = new AsyncValueCommand(NoParameterTask, CanExecuteFalse);
  91. // Act
  92. // Assert
  93. Assert.False(command.CanExecute(null));
  94. }
  95. [Fact]
  96. public void AsyncValueCommandCanExecuteChanged_Test()
  97. {
  98. // Arrange
  99. var canCommandExecute = false;
  100. var didCanExecuteChangeFire = false;
  101. var command = new AsyncValueCommand(NoParameterTask, commandCanExecute);
  102. command.CanExecuteChanged += handleCanExecuteChanged;
  103. bool commandCanExecute(object parameter) => canCommandExecute;
  104. Assert.False(command.CanExecute(null));
  105. // Act
  106. canCommandExecute = true;
  107. // Assert
  108. Assert.True(command.CanExecute(null));
  109. Assert.False(didCanExecuteChangeFire);
  110. // Act
  111. command.RaiseCanExecuteChanged();
  112. // Assert
  113. Assert.True(didCanExecuteChangeFire);
  114. Assert.True(command.CanExecute(null));
  115. void handleCanExecuteChanged(object sender, EventArgs e) => didCanExecuteChangeFire = true;
  116. }
  117. [Fact]
  118. public async Task AsyncValueCommand_Parameter_CanExecuteChanged_AllowsMultipleExecutions_Test()
  119. {
  120. // Arrange
  121. var canExecuteChangedCount = 0;
  122. var command = new AsyncValueCommand<int>(IntParameterTask);
  123. command.CanExecuteChanged += handleCanExecuteChanged;
  124. void handleCanExecuteChanged(object sender, EventArgs e) => canExecuteChangedCount++;
  125. Assert.True(command.AllowsMultipleExecutions);
  126. // Act
  127. var asyncCommandTask = command.ExecuteAsync(Delay);
  128. // Assert
  129. Assert.True(command.IsExecuting);
  130. Assert.True(command.CanExecute(null));
  131. // Act
  132. await asyncCommandTask;
  133. // Assert
  134. Assert.True(command.CanExecute(null));
  135. Assert.Equal(0, canExecuteChangedCount);
  136. }
  137. [Fact]
  138. public async Task AsyncValueCommand_Parameter_CanExecuteChanged_DoesNotAllowMultipleExecutions_Test()
  139. {
  140. // Arrange
  141. var canExecuteChangedCount = 0;
  142. var command = new AsyncValueCommand<int>(IntParameterTask, allowsMultipleExecutions: false);
  143. command.CanExecuteChanged += handleCanExecuteChanged;
  144. void handleCanExecuteChanged(object sender, EventArgs e) => canExecuteChangedCount++;
  145. Assert.False(command.AllowsMultipleExecutions);
  146. // Act
  147. var asyncCommandTask = command.ExecuteAsync(Delay);
  148. // Assert
  149. Assert.True(command.IsExecuting);
  150. Assert.False(command.CanExecute(null));
  151. // Act
  152. await asyncCommandTask;
  153. // Assert
  154. Assert.True(command.CanExecute(null));
  155. Assert.Equal(2, canExecuteChangedCount);
  156. }
  157. [Fact]
  158. public async Task AsyncValueCommand_NoParameter_CanExecuteChanged_AllowsMultipleExecutions_Test()
  159. {
  160. // Arrange
  161. var canExecuteChangedCount = 0;
  162. var command = new AsyncValueCommand(() => IntParameterTask(Delay));
  163. command.CanExecuteChanged += handleCanExecuteChanged;
  164. void handleCanExecuteChanged(object sender, EventArgs e) => canExecuteChangedCount++;
  165. Assert.True(command.AllowsMultipleExecutions);
  166. // Act
  167. var asyncCommandTask = command.ExecuteAsync();
  168. // Assert
  169. Assert.True(command.IsExecuting);
  170. Assert.True(command.CanExecute(null));
  171. // Act
  172. await asyncCommandTask;
  173. // Assert
  174. Assert.True(command.CanExecute(null));
  175. Assert.Equal(0, canExecuteChangedCount);
  176. }
  177. [Fact]
  178. public async Task AsyncValueCommand_NoParameter_CanExecuteChanged_DoesNotAllowMultipleExecutions_Test()
  179. {
  180. // Arrange
  181. var canExecuteChangedCount = 0;
  182. var command = new AsyncValueCommand(() => IntParameterTask(Delay), allowsMultipleExecutions: false);
  183. command.CanExecuteChanged += handleCanExecuteChanged;
  184. void handleCanExecuteChanged(object sender, EventArgs e) => canExecuteChangedCount++;
  185. Assert.False(command.AllowsMultipleExecutions);
  186. // Act
  187. var asyncCommandTask = command.ExecuteAsync();
  188. // Assert
  189. Assert.True(command.IsExecuting);
  190. Assert.False(command.CanExecute(null));
  191. // Act
  192. await asyncCommandTask;
  193. // Assert
  194. Assert.True(command.CanExecute(null));
  195. Assert.Equal(2, canExecuteChangedCount);
  196. }
  197. }
  198. }