瀏覽代碼

Adds Unit Tests for the Calendar Control

sdoroff 8 年之前
父節點
當前提交
bd17aeffe2
共有 1 個文件被更改,包括 277 次插入0 次删除
  1. 277 0
      tests/Avalonia.Controls.UnitTests/CalendarTests.cs

+ 277 - 0
tests/Avalonia.Controls.UnitTests/CalendarTests.cs

@@ -0,0 +1,277 @@
+// Copyright (c) The Avalonia Project. All rights reserved.
+// Licensed under the MIT license. See licence.md file in the project root for full license information.
+
+using Xunit;
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Avalonia.Controls.UnitTests
+{
+    public class CalendarTests
+    {
+        private static bool CompareDates(DateTime first, DateTime second)
+        {
+            return first.Year == second.Year && 
+                first.Month == second.Month &&
+                first.Day == second.Day;
+        }
+
+        [Fact]
+        public void SelectedDatesChanged_Should_Fire_When_SelectedDate_Set()
+        {
+            bool handled = false;
+            Calendar calendar = new Calendar();
+            calendar.SelectionMode = CalendarSelectionMode.SingleDate;
+            calendar.SelectedDatesChanged += new EventHandler<SelectionChangedEventArgs>(delegate
+            {
+                handled = true;
+            });
+            DateTime value = new DateTime(2000, 10, 10);
+            calendar.SelectedDate = value;
+            Assert.True(handled);
+        }
+
+        [Fact]
+        public void DisplayDateChanged_Should_Fire_When_DisplayDate_Set()
+        {
+            bool handled = false;
+            Calendar calendar = new Calendar();
+            calendar.SelectionMode = CalendarSelectionMode.SingleDate;
+            calendar.DisplayDateChanged += new EventHandler<CalendarDateChangedEventArgs>(delegate
+            {
+                handled = true;
+            });
+            DateTime value = new DateTime(2000, 10, 10);
+            calendar.DisplayDate = value;
+            Assert.True(handled);
+        }
+
+        [Fact]
+        public void Setting_Selected_Date_To_Blackout_Date_Should_Throw()
+        {
+            Calendar calendar = new Calendar();
+            calendar.BlackoutDates.AddDatesInPast();
+
+            Assert.ThrowsAny<ArgumentOutOfRangeException>(
+                () => calendar.SelectedDate = DateTime.Today.AddDays(-1));
+        }
+
+        [Fact]
+        public void Setting_Selected_Date_To_Blackout_Date_Should_Throw_Range()
+        {
+            Calendar calendar = new Calendar();
+            calendar.BlackoutDates.Add(new CalendarDateRange(DateTime.Today, DateTime.Today.AddDays(10)));
+
+            calendar.SelectedDate = DateTime.Today.AddDays(-1);
+            Assert.True(CompareDates(calendar.SelectedDate.Value, DateTime.Today.AddDays(-1)));
+            Assert.True(CompareDates(calendar.SelectedDate.Value, calendar.SelectedDates[0]));
+
+            calendar.SelectedDate = DateTime.Today.AddDays(11);
+            Assert.True(CompareDates(calendar.SelectedDate.Value, DateTime.Today.AddDays(11)));
+            Assert.True(CompareDates(calendar.SelectedDate.Value, calendar.SelectedDates[0]));
+
+            Assert.ThrowsAny<ArgumentOutOfRangeException>(
+                () => calendar.SelectedDate = DateTime.Today.AddDays(5));
+        }
+
+        [Fact]
+        public void Adding_Blackout_Dates_Containing_Selected_Date_Should_Throw()
+        {
+            Calendar calendar = new Calendar();
+            calendar.SelectedDate = DateTime.Today.AddDays(5);
+
+            Assert.ThrowsAny<ArgumentOutOfRangeException>(
+                () => calendar.BlackoutDates.Add(new CalendarDateRange(DateTime.Today, DateTime.Today.AddDays(10))));
+        }
+
+        [Fact]
+        public void DisplayDateStartEnd_Should_Constrain_Display_Date()
+        {
+            Calendar calendar = new Calendar();
+            calendar.SelectionMode = CalendarSelectionMode.SingleDate;
+            calendar.DisplayDateStart = new DateTime(2005, 12, 30);
+
+            DateTime value = new DateTime(2005, 12, 15);
+            calendar.DisplayDate = value;
+            Assert.True(CompareDates(calendar.DisplayDate, calendar.DisplayDateStart.Value));
+
+            value = new DateTime(2005, 12, 30);
+            calendar.DisplayDate = value;
+            Assert.True(CompareDates(calendar.DisplayDate, value));
+
+            value = DateTime.MaxValue;
+            calendar.DisplayDate = value;
+            Assert.True(CompareDates(calendar.DisplayDate, value));
+
+            calendar.DisplayDateEnd = new DateTime(2010, 12, 30);
+            Assert.True(CompareDates(calendar.DisplayDate, calendar.DisplayDateEnd.Value));
+        }
+
+        [Fact]
+        public void Setting_DisplayDateEnd_Should_Alter_DispalyDate_And_DisplayDateStart()
+        {
+            Calendar calendar = new Calendar();
+            DateTime value = new DateTime(2000, 1, 30);
+
+            calendar.DisplayDate = value;
+            calendar.DisplayDateEnd = value;
+            calendar.DisplayDateStart = value;
+            Assert.True(CompareDates(calendar.DisplayDateStart.Value, value));
+            Assert.True(CompareDates(calendar.DisplayDateEnd.Value, value));
+
+            value = value.AddMonths(2);
+            calendar.DisplayDateStart = value;
+            Assert.True(CompareDates(calendar.DisplayDateStart.Value, value));
+            Assert.True(CompareDates(calendar.DisplayDateEnd.Value, value));
+            Assert.True(CompareDates(calendar.DisplayDate, value));
+        }
+
+        [Fact]
+        public void Display_Date_Range_End_Will_Contain_SelectedDate()
+        {
+            Calendar calendar = new Calendar();
+            calendar.SelectionMode = CalendarSelectionMode.SingleDate;
+
+            calendar.SelectedDate = DateTime.MaxValue;
+            Assert.True(CompareDates((DateTime)calendar.SelectedDate, DateTime.MaxValue));
+
+            calendar.DisplayDateEnd = DateTime.MaxValue.AddDays(-1);
+            Assert.True(CompareDates((DateTime)calendar.DisplayDateEnd, DateTime.MaxValue));
+        }
+
+
+        /// <summary>
+        /// The days added to the SelectedDates collection.
+        /// </summary>
+        private IList<object> _selectedDatesChangedAddedDays;
+
+        /// <summary>
+        /// The days removed from the SelectedDates collection.
+        /// </summary>
+        private IList<object> _selectedDateChangedRemovedDays;
+
+        /// <summary>
+        /// The number of times the SelectedDatesChanged event has been fired.
+        /// </summary>
+        private int _selectedDatesChangedCount;
+
+        /// <summary>
+        /// Handle the SelectedDatesChanged event.
+        /// </summary>
+        /// <param name="sender">The calendar.</param>
+        /// <param name="e">Event arguments.</param>
+        private void OnSelectedDatesChanged(object sender, SelectionChangedEventArgs e)
+        {
+            _selectedDatesChangedAddedDays =
+                e.AddedItems
+                 .Cast<object>()
+                 .ToList();
+            _selectedDateChangedRemovedDays = 
+                e.RemovedItems
+                 .Cast<object>()
+                 .ToList();
+            _selectedDatesChangedCount++;
+        }
+
+        /// <summary>
+        /// Clear the variables used to track the SelectedDatesChanged event.
+        /// </summary>
+        private void ResetSelectedDatesChanged()
+        {
+            if (_selectedDatesChangedAddedDays != null)
+            {
+                _selectedDatesChangedAddedDays.Clear();
+            }
+
+            if (_selectedDateChangedRemovedDays != null)
+            {
+                _selectedDateChangedRemovedDays.Clear();
+            }
+
+            _selectedDatesChangedCount = 0;
+        }
+
+        [Fact]
+        public void SingleDate_Selection_Behavior()
+        {
+            ResetSelectedDatesChanged();
+            Calendar calendar = new Calendar();
+            calendar.SelectedDatesChanged += new EventHandler<SelectionChangedEventArgs>(OnSelectedDatesChanged);
+            calendar.SelectionMode = CalendarSelectionMode.SingleDate;
+            calendar.SelectedDate = DateTime.Today;
+            Assert.True(CompareDates(calendar.SelectedDate.Value, DateTime.Today));
+            Assert.True(calendar.SelectedDates.Count == 1);
+            Assert.True(CompareDates(calendar.SelectedDates[0], DateTime.Today));
+            Assert.True(_selectedDatesChangedCount == 1);
+            Assert.True(_selectedDatesChangedAddedDays.Count == 1);
+            Assert.True(_selectedDateChangedRemovedDays.Count == 0);
+            ResetSelectedDatesChanged();
+
+            calendar.SelectedDate = DateTime.Today;
+            Assert.True(CompareDates(calendar.SelectedDate.Value, DateTime.Today));
+            Assert.True(calendar.SelectedDates.Count == 1);
+            Assert.True(CompareDates(calendar.SelectedDates[0], DateTime.Today));
+            Assert.True(_selectedDatesChangedCount == 0);
+
+            calendar.ClearValue(Calendar.SelectedDateProperty);
+
+            calendar.SelectionMode = CalendarSelectionMode.None;
+            Assert.True(calendar.SelectedDates.Count == 0);
+            Assert.Null(calendar.SelectedDate);
+
+            calendar.SelectionMode = CalendarSelectionMode.SingleDate;
+
+            calendar.SelectedDates.Add(DateTime.Today.AddDays(1));
+            Assert.True(CompareDates(calendar.SelectedDate.Value, DateTime.Today.AddDays(1)));
+            Assert.True(calendar.SelectedDates.Count == 1);
+
+            Assert.ThrowsAny<InvalidOperationException>(
+                () => calendar.SelectedDates.Add(DateTime.Today.AddDays(2)));
+        }
+
+        [Fact]
+        public void SingleRange_Selection_Behavior()
+        {
+            ResetSelectedDatesChanged();
+            Calendar calendar = new Calendar();
+            calendar.SelectedDatesChanged += new EventHandler<SelectionChangedEventArgs>(OnSelectedDatesChanged);
+            calendar.SelectionMode = CalendarSelectionMode.SingleRange;
+            calendar.SelectedDate = DateTime.Today;
+            Assert.True(CompareDates(calendar.SelectedDate.Value, DateTime.Today));
+            Assert.True(calendar.SelectedDates.Count == 1);
+            Assert.True(CompareDates(calendar.SelectedDates[0], DateTime.Today));
+            Assert.True(_selectedDatesChangedCount == 1);
+            Assert.True(_selectedDatesChangedAddedDays.Count == 1);
+            Assert.True(_selectedDateChangedRemovedDays.Count == 0);
+            ResetSelectedDatesChanged();
+
+            calendar.SelectedDates.Clear();
+            Assert.Null(calendar.SelectedDate);
+            ResetSelectedDatesChanged();
+
+            calendar.SelectedDates.AddRange(DateTime.Today, DateTime.Today.AddDays(10));
+            Assert.True(CompareDates(calendar.SelectedDate.Value, DateTime.Today));
+            Assert.True(calendar.SelectedDates.Count == 11);
+            ResetSelectedDatesChanged();
+
+            calendar.SelectedDates.AddRange(DateTime.Today, DateTime.Today.AddDays(10));
+            Assert.True(calendar.SelectedDates.Count == 11);
+            Assert.True(_selectedDatesChangedCount == 0);
+            ResetSelectedDatesChanged();
+
+            calendar.SelectedDates.AddRange(DateTime.Today.AddDays(-20), DateTime.Today);
+            Assert.True(CompareDates(calendar.SelectedDate.Value, DateTime.Today.AddDays(-20)));
+            Assert.True(calendar.SelectedDates.Count == 21);
+            Assert.True(_selectedDatesChangedCount == 1);
+            Assert.True(_selectedDatesChangedAddedDays.Count == 21);
+            Assert.True(_selectedDateChangedRemovedDays.Count == 11);
+            ResetSelectedDatesChanged();
+
+            calendar.SelectedDates.Add(DateTime.Today.AddDays(100));
+            Assert.True(CompareDates(calendar.SelectedDate.Value, DateTime.Today.AddDays(100)));
+            Assert.True(calendar.SelectedDates.Count == 1);
+        }
+    }
+}