using System; using System.Diagnostics; using System.Globalization; using System.Linq; using NUnit.Framework; namespace Developpez.Dotnet.Tests { [TestFixture] public class DateExtensionsTests { [TestFixtureSetUp] public void Setup() { _timeProvider = new FixedTimeProvider(); DateExtensions.TimeProvider = _timeProvider; } private DateExtensions.ITimeProvider _timeProvider; [TestFixtureTearDown] public void TearDown() { DateExtensions.ResetTimeProvider(); } class FixedTimeProvider : DateExtensions.ITimeProvider { public FixedTimeProvider() { UtcNow = DateTime.UtcNow; Now = UtcNow.ToLocalTime(); } public DateTime Now { get; set; } public DateTime UtcNow { get; set; } } private DateTime y2k = new DateTime(2000, 1, 1); private long y2kAsUnix = 946684800; [Test] public void Check_that_20_minutes_from_is_correct() { Assert.AreEqual(20.Minutes().From(y2k), y2k.AddMinutes(20)); } [Test] public void Check_that_20_minutes_fromnow_is_correct() { Assert.AreEqual(20.Minutes().FromNow(), _timeProvider.Now.AddMinutes(20)); } [Test] public void Check_that_20_minutes_before_is_correct() { Assert.AreEqual(20.Minutes().Before(y2k), y2k.AddMinutes(-20)); } [Test] public void Check_that_20_minutes_ago_is_correct() { // TODO: peut échouer car DateTime.Now est appelé 2 fois Assert.AreEqual(20.Minutes().Ago(), _timeProvider.Now.AddMinutes(-20)); } [Test] public void Check_that_20_hours_is_correct() { Assert.AreEqual(20.Hours(), TimeSpan.FromHours(20)); } [Test] public void Check_that_20_seconds_is_correct() { Assert.AreEqual(20.Seconds(), TimeSpan.FromSeconds(20)); } [Test] public void Check_that_20_days_is_correct() { Assert.AreEqual(20.Days(), TimeSpan.FromDays(20)); } [Test] public void Check_that_ToUnixTimestamp_Returns_y2kasUnix_timestamp_when_given_y2k() { Assert.AreEqual(y2k.ToUnixTimestamp(), y2kAsUnix); } [Test] public void Check_that_ToDateTime_Returns_y2k_timestamp_when_given_y2kAsUnix() { Assert.AreEqual(y2kAsUnix.ToDateTime(), y2k); } [Test] public void Check_next_previous_DayOfWeek() { DateTime date = new DateTime(1981, 9, 10); DateTime nextSaturday = date.Next(DayOfWeek.Saturday); Assert.AreEqual(new DateTime(1981, 9, 12), nextSaturday); DateTime lastMonday = date.Previous(DayOfWeek.Monday); Assert.AreEqual(new DateTime(1981, 9, 7), lastMonday); } [Test] public void Check_AddWorkingDays() { var actual = // Monday 7 to Sunday 13 March 2011 from i in Enumerable.Range(7, 7).ToArray() let date = new DateTime(2011, 3, i) // Add -8 to 8 working days from days in Enumerable.Range(-8, 17) select date.AddWorkingDays(days).Day; var expected = new int[] { 23, 24, 25, 28, 1, 2, 3, 4, // from Monday 7 (days < 0) 7, 8, 9, 10, 11, 14, 15, 16, 17, // from Monday 7 (days >= 0) 24, 25, 28, 1, 2, 3, 4, 7, // from Tuesday 8 (days < 0) 8, 9, 10, 11, 14, 15, 16, 17, 18, // from Tuesday 8 (days >= 0) 25, 28, 1, 2, 3, 4, 7, 8, // from Wednesday 9 (days < 0) 9, 10, 11, 14, 15, 16, 17, 18, 21, // from Wednesday 9 (days >= 0) 28, 1, 2, 3, 4, 7, 8, 9, // from Thursday 10 (days < 0) 10, 11, 14, 15, 16, 17, 18, 21, 22, // from Thursday 10 (days >= 0) 1, 2, 3, 4, 7, 8, 9, 10, // from Friday 11 (days < 0) 11, 14, 15, 16, 17, 18, 21, 22, 23, // from Friday 12 (days >= 0) 2, 3, 4, 7, 8, 9, 10, 11, // from Saturday 12 (days < 0) 12, 14, 15, 16, 17, 18, 21, 22, 23, // from Saturday 12 (days >= 0) 2, 3, 4, 7, 8, 9, 10, 11, // from Sunday 13 (days < 0) 13, 14, 15, 16, 17, 18, 21, 22, 23, // from Sunday 13 (days >= 0) }; CollectionAssert.AreEqual(expected, actual); } [Test] public void Check_IsWorkingDays() { DateTime monday = new DateTime(2011, 3, 7); DateTime tuesday = monday.AddDays(1); DateTime wednesday = monday.AddDays(2); DateTime thursday = monday.AddDays(3); DateTime friday = monday.AddDays(4); DateTime saturday = monday.AddDays(5); DateTime sunday = monday.AddDays(6); Assert.IsTrue(monday.IsWorkingDay()); Assert.IsTrue(tuesday.IsWorkingDay()); Assert.IsTrue(wednesday.IsWorkingDay()); Assert.IsTrue(thursday.IsWorkingDay()); Assert.IsTrue(friday.IsWorkingDay()); Assert.IsFalse(saturday.IsWorkingDay()); Assert.IsFalse(sunday.IsWorkingDay()); } [Test] public void Check_Truncate() { DateTime expected = _timeProvider.Now; DateTime actual = expected.Truncate(DateTimeComponent.Millisecond); Assert.AreEqual(expected.Year, actual.Year); Assert.AreEqual(expected.Month, actual.Month); Assert.AreEqual(expected.Day, actual.Day); Assert.AreEqual(expected.Hour, actual.Hour); Assert.AreEqual(expected.Minute, actual.Minute); Assert.AreEqual(expected.Second, actual.Second); Assert.AreEqual(expected.Millisecond, actual.Millisecond); actual = expected.Truncate(DateTimeComponent.Second); Assert.AreEqual(expected.Year, actual.Year); Assert.AreEqual(expected.Month, actual.Month); Assert.AreEqual(expected.Day, actual.Day); Assert.AreEqual(expected.Hour, actual.Hour); Assert.AreEqual(expected.Minute, actual.Minute); Assert.AreEqual(expected.Second, actual.Second); Assert.AreEqual(0, actual.Millisecond); actual = expected.Truncate(DateTimeComponent.Minute); Assert.AreEqual(expected.Year, actual.Year); Assert.AreEqual(expected.Month, actual.Month); Assert.AreEqual(expected.Day, actual.Day); Assert.AreEqual(expected.Hour, actual.Hour); Assert.AreEqual(expected.Minute, actual.Minute); Assert.AreEqual(0, actual.Second); Assert.AreEqual(0, actual.Millisecond); actual = expected.Truncate(DateTimeComponent.Hour); Assert.AreEqual(expected.Year, actual.Year); Assert.AreEqual(expected.Month, actual.Month); Assert.AreEqual(expected.Day, actual.Day); Assert.AreEqual(expected.Hour, actual.Hour); Assert.AreEqual(0, actual.Minute); Assert.AreEqual(0, actual.Second); Assert.AreEqual(0, actual.Millisecond); actual = expected.Truncate(DateTimeComponent.Day); Assert.AreEqual(expected.Year, actual.Year); Assert.AreEqual(expected.Month, actual.Month); Assert.AreEqual(expected.Day, actual.Day); Assert.AreEqual(0, actual.Hour); Assert.AreEqual(0, actual.Minute); Assert.AreEqual(0, actual.Second); Assert.AreEqual(0, actual.Millisecond); actual = expected.Truncate(DateTimeComponent.Month); Assert.AreEqual(expected.Year, actual.Year); Assert.AreEqual(expected.Month, actual.Month); Assert.AreEqual(1, actual.Day); Assert.AreEqual(0, actual.Hour); Assert.AreEqual(0, actual.Minute); Assert.AreEqual(0, actual.Second); Assert.AreEqual(0, actual.Millisecond); actual = expected.Truncate(DateTimeComponent.Year); Assert.AreEqual(expected.Year, actual.Year); Assert.AreEqual(1, actual.Month); Assert.AreEqual(1, actual.Day); Assert.AreEqual(0, actual.Hour); Assert.AreEqual(0, actual.Minute); Assert.AreEqual(0, actual.Second); Assert.AreEqual(0, actual.Millisecond); } [Test] public void TestStartOfWeek() { // Just test that results are consistent with Calendar.GetWeekOfYear var rules = Enum.GetValues(typeof(CalendarWeekRule)).Cast(); var daysOfWeek = Enum.GetValues(typeof(DayOfWeek)).Cast(); var query = from y in Enumerable.Range(1990, 30) from w in Enumerable.Range(1, 54) from r in rules from f in daysOfWeek let nStartOfWeek = TryGetStartOfWeek(y, w, r, f) where nStartOfWeek.HasValue let startOfWeek = nStartOfWeek.Value let weekNumberCheck = CultureInfo.CurrentCulture.Calendar.GetWeekOfYear(startOfWeek, r, f) let correctDay = (startOfWeek.Month == 1 && startOfWeek.Day == 1) || startOfWeek.DayOfWeek == f select new { Year = y, Week = w, Rule = r, FirstDayOfWeek = f, StartOfWeek = startOfWeek, OK = correctDay && w == weekNumberCheck }; Assert.IsTrue(query.All(r => r.OK)); } static DateTime? TryGetStartOfWeek(int year, int weekOfYear, CalendarWeekRule rule, DayOfWeek firstDayOfWeek) { try { return DateExtensions.GetStartOfWeek(year, weekOfYear, rule, firstDayOfWeek); } catch { return null; } } } }