DateTimeTests.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. using System;
  2. namespace DesktopClock.Tests;
  3. public class DateTimeTests
  4. {
  5. [Theory]
  6. [InlineData("2024-07-18T12:30:45.123Z", "2024-07-18T12:30:45.456Z", true)] // Different millisecond
  7. [InlineData("2024-07-18T12:30:45.123Z", "2024-07-18T12:30:46.123Z", false)] // Different second
  8. [InlineData("2024-07-18T12:30:45.123Z", "2024-07-18T12:31:45.123Z", false)] // Different minute
  9. [InlineData("2024-07-18T12:30:45.123Z", "2024-07-18T13:30:45.123Z", false)] // Different hour
  10. [InlineData("2024-07-18T12:30:45.123Z", "2024-07-19T12:30:45.123Z", false)] // Different day
  11. [InlineData("2024-07-18T12:30:45.123Z", "2024-08-18T12:30:45.123Z", false)] // Different month
  12. [InlineData("2024-07-18T12:30:45.123Z", "2025-07-18T12:30:45.123Z", false)] // Different year
  13. public void EqualExcludingMilliseconds(string dt1String, string dt2String, bool expected)
  14. {
  15. // Arrange
  16. var dt1 = DateTime.Parse(dt1String);
  17. var dt2 = DateTime.Parse(dt2String);
  18. // Act
  19. var result = dt1.EqualExcludingMillisecond(dt2);
  20. // Assert
  21. Assert.Equal(expected, result);
  22. }
  23. [Fact]
  24. public void EqualExcludingMilliseconds_SameDateTime_ShouldBeTrue()
  25. {
  26. // Arrange
  27. var dt1 = new DateTime(2024, 7, 18, 12, 30, 45, 123);
  28. var dt2 = new DateTime(2024, 7, 18, 12, 30, 45, 123);
  29. // Act
  30. var result = dt1.EqualExcludingMillisecond(dt2);
  31. // Assert
  32. Assert.True(result);
  33. }
  34. [Fact]
  35. public void EqualExcludingMilliseconds_OnlyMillisecondsDiffer_ShouldBeTrue()
  36. {
  37. // Arrange
  38. var dt1 = new DateTime(2024, 7, 18, 12, 30, 45, 0);
  39. var dt2 = new DateTime(2024, 7, 18, 12, 30, 45, 999);
  40. // Act
  41. var result = dt1.EqualExcludingMillisecond(dt2);
  42. // Assert
  43. Assert.True(result);
  44. }
  45. [Fact]
  46. public void EqualExcludingMilliseconds_Reflexive_ShouldBeTrue()
  47. {
  48. // Arrange
  49. var dt = DateTime.Now;
  50. // Act & Assert
  51. Assert.True(dt.EqualExcludingMillisecond(dt));
  52. }
  53. [Fact]
  54. public void EqualExcludingMilliseconds_Symmetric_ShouldWork()
  55. {
  56. // Arrange
  57. var dt1 = new DateTime(2024, 7, 18, 12, 30, 45, 100);
  58. var dt2 = new DateTime(2024, 7, 18, 12, 30, 45, 200);
  59. // Act & Assert
  60. Assert.Equal(dt1.EqualExcludingMillisecond(dt2), dt2.EqualExcludingMillisecond(dt1));
  61. }
  62. [Theory]
  63. [InlineData("2024-07-18 12:30:00", "2024-07-18 12:30:00", 30, true)] // Countdown reached, on interval
  64. [InlineData("2024-07-18 12:30:01", "2024-07-18 12:30:01", 30, true)] // Countdown reached, not on interval
  65. [InlineData("2024-07-18 12:29:00", "2024-07-18 12:30:00", 30, true)] // Not yet reached, on interval
  66. [InlineData("2024-07-18 12:29:01", "2024-07-18 12:30:01", 30, true)] // Not yet reached, on interval
  67. [InlineData("2024-07-18 12:29:02", "2024-07-18 12:30:01", 30, false)] // Not yet reached, not on interval
  68. [InlineData("2024-07-18 12:31:00", "2024-07-18 12:30:00", 30, true)] // Past countdown, on interval
  69. [InlineData("2024-07-18 12:31:02", "2024-07-18 12:30:01", 30, false)] // Past countdown, not on interval
  70. public void IsOnInterval(string nowString, string countdownString, int intervalSeconds, bool expected)
  71. {
  72. // Arrange
  73. var dateTime = DateTime.Parse(nowString);
  74. var countdownTo = DateTime.Parse(countdownString);
  75. var interval = TimeSpan.FromSeconds(intervalSeconds);
  76. // Act
  77. var result = DateTimeUtil.IsNowOrCountdownOnInterval(dateTime, countdownTo, interval);
  78. // Assert
  79. Assert.Equal(expected, result);
  80. }
  81. [Fact]
  82. public void IsOnInterval_DefaultCountdown_ShouldUseNowTimeOfDay()
  83. {
  84. // Arrange - when countdown is default, it uses now.TimeOfDay
  85. var now = new DateTime(2024, 7, 18, 12, 30, 0); // 12:30:00 = 45000 seconds
  86. var countdownTo = default(DateTime);
  87. var interval = TimeSpan.FromMinutes(30); // 1800 seconds
  88. // Act
  89. var result = DateTimeUtil.IsNowOrCountdownOnInterval(now, countdownTo, interval);
  90. // Assert - 45000 % 1800 = 0, so should be on interval
  91. Assert.True(result);
  92. }
  93. [Fact]
  94. public void IsOnInterval_DefaultInterval_ShouldReturnFalseUnlessCountdownReached()
  95. {
  96. // Arrange
  97. var now = new DateTime(2024, 7, 18, 12, 30, 0);
  98. var countdownTo = new DateTime(2024, 7, 18, 12, 35, 0);
  99. var interval = TimeSpan.Zero;
  100. // Act
  101. var result = DateTimeUtil.IsNowOrCountdownOnInterval(now, countdownTo, interval);
  102. // Assert
  103. Assert.False(result);
  104. }
  105. [Fact]
  106. public void IsOnInterval_CountdownReached_ShouldReturnTrue()
  107. {
  108. // Arrange
  109. var now = new DateTime(2024, 7, 18, 12, 30, 45);
  110. var countdownTo = new DateTime(2024, 7, 18, 12, 30, 45);
  111. var interval = TimeSpan.Zero; // No interval
  112. // Act
  113. var result = DateTimeUtil.IsNowOrCountdownOnInterval(now, countdownTo, interval);
  114. // Assert
  115. Assert.True(result);
  116. }
  117. }