CalendarTests.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. using Xunit;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. namespace Avalonia.Controls.UnitTests
  7. {
  8. public class CalendarTests
  9. {
  10. private static bool CompareDates(DateTime first, DateTime second)
  11. {
  12. return first.Year == second.Year &&
  13. first.Month == second.Month &&
  14. first.Day == second.Day;
  15. }
  16. [Fact(Skip ="FIX ME ASAP")]
  17. public void SelectedDatesChanged_Should_Fire_When_SelectedDate_Set()
  18. {
  19. bool handled = false;
  20. Calendar calendar = new Calendar();
  21. calendar.SelectionMode = CalendarSelectionMode.SingleDate;
  22. calendar.SelectedDatesChanged += new EventHandler<SelectionChangedEventArgs>(delegate
  23. {
  24. handled = true;
  25. });
  26. DateTime value = new DateTime(2000, 10, 10);
  27. calendar.SelectedDate = value;
  28. Assert.True(handled);
  29. }
  30. [Fact]
  31. public void DisplayDateChanged_Should_Fire_When_DisplayDate_Set()
  32. {
  33. bool handled = false;
  34. Calendar calendar = new Calendar();
  35. calendar.SelectionMode = CalendarSelectionMode.SingleDate;
  36. calendar.DisplayDateChanged += new EventHandler<CalendarDateChangedEventArgs>(delegate
  37. {
  38. handled = true;
  39. });
  40. DateTime value = new DateTime(2000, 10, 10);
  41. calendar.DisplayDate = value;
  42. Assert.True(handled);
  43. }
  44. [Fact]
  45. public void Setting_Selected_Date_To_Blackout_Date_Should_Throw()
  46. {
  47. Calendar calendar = new Calendar();
  48. calendar.BlackoutDates.AddDatesInPast();
  49. Assert.ThrowsAny<ArgumentOutOfRangeException>(
  50. () => calendar.SelectedDate = DateTime.Today.AddDays(-1));
  51. }
  52. [Fact]
  53. public void Setting_Selected_Date_To_Blackout_Date_Should_Throw_Range()
  54. {
  55. Calendar calendar = new Calendar();
  56. calendar.BlackoutDates.Add(new CalendarDateRange(DateTime.Today, DateTime.Today.AddDays(10)));
  57. calendar.SelectedDate = DateTime.Today.AddDays(-1);
  58. Assert.True(CompareDates(calendar.SelectedDate.Value, DateTime.Today.AddDays(-1)));
  59. Assert.True(CompareDates(calendar.SelectedDate.Value, calendar.SelectedDates[0]));
  60. calendar.SelectedDate = DateTime.Today.AddDays(11);
  61. Assert.True(CompareDates(calendar.SelectedDate.Value, DateTime.Today.AddDays(11)));
  62. Assert.True(CompareDates(calendar.SelectedDate.Value, calendar.SelectedDates[0]));
  63. Assert.ThrowsAny<ArgumentOutOfRangeException>(
  64. () => calendar.SelectedDate = DateTime.Today.AddDays(5));
  65. }
  66. [Fact]
  67. public void Adding_Blackout_Dates_Containing_Selected_Date_Should_Throw()
  68. {
  69. Calendar calendar = new Calendar();
  70. calendar.SelectedDate = DateTime.Today.AddDays(5);
  71. Assert.ThrowsAny<ArgumentOutOfRangeException>(
  72. () => calendar.BlackoutDates.Add(new CalendarDateRange(DateTime.Today, DateTime.Today.AddDays(10))));
  73. }
  74. [Fact]
  75. public void DisplayDateStartEnd_Should_Constrain_Display_Date()
  76. {
  77. Calendar calendar = new Calendar();
  78. calendar.SelectionMode = CalendarSelectionMode.SingleDate;
  79. calendar.DisplayDateStart = new DateTime(2005, 12, 30);
  80. DateTime value = new DateTime(2005, 12, 15);
  81. calendar.DisplayDate = value;
  82. Assert.True(CompareDates(calendar.DisplayDate, calendar.DisplayDateStart.Value));
  83. value = new DateTime(2005, 12, 30);
  84. calendar.DisplayDate = value;
  85. Assert.True(CompareDates(calendar.DisplayDate, value));
  86. value = DateTime.MaxValue;
  87. calendar.DisplayDate = value;
  88. Assert.True(CompareDates(calendar.DisplayDate, value));
  89. calendar.DisplayDateEnd = new DateTime(2010, 12, 30);
  90. Assert.True(CompareDates(calendar.DisplayDate, calendar.DisplayDateEnd.Value));
  91. }
  92. [Fact]
  93. public void Setting_DisplayDateEnd_Should_Alter_DispalyDate_And_DisplayDateStart()
  94. {
  95. Calendar calendar = new Calendar();
  96. DateTime value = new DateTime(2000, 1, 30);
  97. calendar.DisplayDate = value;
  98. calendar.DisplayDateEnd = value;
  99. calendar.DisplayDateStart = value;
  100. Assert.True(CompareDates(calendar.DisplayDateStart.Value, value));
  101. Assert.True(CompareDates(calendar.DisplayDateEnd.Value, value));
  102. value = value.AddMonths(2);
  103. calendar.DisplayDateStart = value;
  104. Assert.True(CompareDates(calendar.DisplayDateStart.Value, value));
  105. Assert.True(CompareDates(calendar.DisplayDateEnd.Value, value));
  106. Assert.True(CompareDates(calendar.DisplayDate, value));
  107. }
  108. [Fact]
  109. public void Display_Date_Range_End_Will_Contain_SelectedDate()
  110. {
  111. Calendar calendar = new Calendar();
  112. calendar.SelectionMode = CalendarSelectionMode.SingleDate;
  113. calendar.SelectedDate = DateTime.MaxValue;
  114. Assert.True(CompareDates((DateTime)calendar.SelectedDate, DateTime.MaxValue));
  115. calendar.DisplayDateEnd = DateTime.MaxValue.AddDays(-1);
  116. Assert.True(CompareDates((DateTime)calendar.DisplayDateEnd, DateTime.MaxValue));
  117. }
  118. /// <summary>
  119. /// The days added to the SelectedDates collection.
  120. /// </summary>
  121. private IList<object> _selectedDatesChangedAddedDays;
  122. /// <summary>
  123. /// The days removed from the SelectedDates collection.
  124. /// </summary>
  125. private IList<object> _selectedDateChangedRemovedDays;
  126. /// <summary>
  127. /// The number of times the SelectedDatesChanged event has been fired.
  128. /// </summary>
  129. private int _selectedDatesChangedCount;
  130. /// <summary>
  131. /// Handle the SelectedDatesChanged event.
  132. /// </summary>
  133. /// <param name="sender">The calendar.</param>
  134. /// <param name="e">Event arguments.</param>
  135. private void OnSelectedDatesChanged(object sender, SelectionChangedEventArgs e)
  136. {
  137. _selectedDatesChangedAddedDays =
  138. e.AddedItems
  139. .Cast<object>()
  140. .ToList();
  141. _selectedDateChangedRemovedDays =
  142. e.RemovedItems
  143. .Cast<object>()
  144. .ToList();
  145. _selectedDatesChangedCount++;
  146. }
  147. /// <summary>
  148. /// Clear the variables used to track the SelectedDatesChanged event.
  149. /// </summary>
  150. private void ResetSelectedDatesChanged()
  151. {
  152. if (_selectedDatesChangedAddedDays != null)
  153. {
  154. _selectedDatesChangedAddedDays.Clear();
  155. }
  156. if (_selectedDateChangedRemovedDays != null)
  157. {
  158. _selectedDateChangedRemovedDays.Clear();
  159. }
  160. _selectedDatesChangedCount = 0;
  161. }
  162. [Fact]
  163. public void SingleDate_Selection_Behavior()
  164. {
  165. ResetSelectedDatesChanged();
  166. Calendar calendar = new Calendar();
  167. calendar.SelectedDatesChanged += new EventHandler<SelectionChangedEventArgs>(OnSelectedDatesChanged);
  168. calendar.SelectionMode = CalendarSelectionMode.SingleDate;
  169. calendar.SelectedDate = DateTime.Today;
  170. Assert.True(CompareDates(calendar.SelectedDate.Value, DateTime.Today));
  171. Assert.True(calendar.SelectedDates.Count == 1);
  172. Assert.True(CompareDates(calendar.SelectedDates[0], DateTime.Today));
  173. Assert.True(_selectedDatesChangedCount == 1);
  174. Assert.True(_selectedDatesChangedAddedDays.Count == 1);
  175. Assert.True(_selectedDateChangedRemovedDays.Count == 0);
  176. ResetSelectedDatesChanged();
  177. calendar.SelectedDate = DateTime.Today;
  178. Assert.True(CompareDates(calendar.SelectedDate.Value, DateTime.Today));
  179. Assert.True(calendar.SelectedDates.Count == 1);
  180. Assert.True(CompareDates(calendar.SelectedDates[0], DateTime.Today));
  181. Assert.True(_selectedDatesChangedCount == 0);
  182. calendar.ClearValue(Calendar.SelectedDateProperty);
  183. calendar.SelectionMode = CalendarSelectionMode.None;
  184. Assert.True(calendar.SelectedDates.Count == 0);
  185. Assert.Null(calendar.SelectedDate);
  186. calendar.SelectionMode = CalendarSelectionMode.SingleDate;
  187. calendar.SelectedDates.Add(DateTime.Today.AddDays(1));
  188. Assert.True(CompareDates(calendar.SelectedDate.Value, DateTime.Today.AddDays(1)));
  189. Assert.True(calendar.SelectedDates.Count == 1);
  190. Assert.ThrowsAny<InvalidOperationException>(
  191. () => calendar.SelectedDates.Add(DateTime.Today.AddDays(2)));
  192. }
  193. [Fact]
  194. public void SingleRange_Selection_Behavior()
  195. {
  196. ResetSelectedDatesChanged();
  197. Calendar calendar = new Calendar();
  198. calendar.SelectedDatesChanged += new EventHandler<SelectionChangedEventArgs>(OnSelectedDatesChanged);
  199. calendar.SelectionMode = CalendarSelectionMode.SingleRange;
  200. calendar.SelectedDate = DateTime.Today;
  201. Assert.True(CompareDates(calendar.SelectedDate.Value, DateTime.Today));
  202. Assert.True(calendar.SelectedDates.Count == 1);
  203. Assert.True(CompareDates(calendar.SelectedDates[0], DateTime.Today));
  204. Assert.True(_selectedDatesChangedCount == 1);
  205. Assert.True(_selectedDatesChangedAddedDays.Count == 1);
  206. Assert.True(_selectedDateChangedRemovedDays.Count == 0);
  207. ResetSelectedDatesChanged();
  208. calendar.SelectedDates.Clear();
  209. Assert.Null(calendar.SelectedDate);
  210. ResetSelectedDatesChanged();
  211. calendar.SelectedDates.AddRange(DateTime.Today, DateTime.Today.AddDays(10));
  212. Assert.True(CompareDates(calendar.SelectedDate.Value, DateTime.Today));
  213. Assert.True(calendar.SelectedDates.Count == 11);
  214. ResetSelectedDatesChanged();
  215. calendar.SelectedDates.AddRange(DateTime.Today, DateTime.Today.AddDays(10));
  216. Assert.True(calendar.SelectedDates.Count == 11);
  217. Assert.True(_selectedDatesChangedCount == 0);
  218. ResetSelectedDatesChanged();
  219. calendar.SelectedDates.AddRange(DateTime.Today.AddDays(-20), DateTime.Today);
  220. Assert.True(CompareDates(calendar.SelectedDate.Value, DateTime.Today.AddDays(-20)));
  221. Assert.True(calendar.SelectedDates.Count == 21);
  222. Assert.True(_selectedDatesChangedCount == 1);
  223. Assert.True(_selectedDatesChangedAddedDays.Count == 21);
  224. Assert.True(_selectedDateChangedRemovedDays.Count == 11);
  225. ResetSelectedDatesChanged();
  226. calendar.SelectedDates.Add(DateTime.Today.AddDays(100));
  227. Assert.True(CompareDates(calendar.SelectedDate.Value, DateTime.Today.AddDays(100)));
  228. Assert.True(calendar.SelectedDates.Count == 1);
  229. }
  230. }
  231. }