DateTimeRangeTest.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. using System;
  2. using Masuit.Tools.Models;
  3. using Xunit;
  4. namespace Masuit.Tools.Abstractions.Test.DateTimeExt;
  5. public class DateTimeRangeTest
  6. {
  7. [Fact]
  8. public void Constructor_WithValidDates_ShouldCreateInstance()
  9. {
  10. var start = new DateTime(2025, 1, 1);
  11. var end = new DateTime(2025, 1, 10);
  12. var range = new DateTimeRange(start, end);
  13. Assert.Equal(start, range.Start);
  14. Assert.Equal(end, range.End);
  15. }
  16. [Fact]
  17. public void Constructor_StartAfterEnd_ShouldThrowException()
  18. {
  19. var start = new DateTime(2025, 1, 10);
  20. var end = new DateTime(2025, 1, 1);
  21. Assert.Throws<Exception>(() => new DateTimeRange(start, end));
  22. }
  23. [Fact]
  24. public void ParameterlessConstructor_ShouldCreateInstanceWithNulls()
  25. {
  26. var range = new DateTimeRange();
  27. Assert.Null(range.Start);
  28. Assert.Null(range.End);
  29. }
  30. [Theory]
  31. [InlineData("2025-01-05", "2025-01-15", "2025-01-10", "2025-01-20", true)] // Overlap
  32. [InlineData("2025-01-05", "2025-01-15", "2025-01-15", "2025-01-20", true)] // Touch at end
  33. [InlineData("2025-01-05", "2025-01-15", "2025-01-01", "2025-01-05", true)] // Touch at start
  34. [InlineData("2025-01-05", "2025-01-15", "2025-01-20", "2025-01-25", false)] // No overlap
  35. [InlineData("2025-01-01", "2025-01-31", "2025-01-10", "2025-01-20", true)] // Contain
  36. [InlineData("2025-01-10", "2025-01-20", "2025-01-01", "2025-01-31", true)] // Inside
  37. public void HasIntersect_ShouldReturnCorrectly(string s1, string e1, string s2, string e2, bool expected)
  38. {
  39. var range1 = new DateTimeRange(DateTime.Parse(s1), DateTime.Parse(e1));
  40. var range2 = new DateTimeRange(DateTime.Parse(s2), DateTime.Parse(e2));
  41. Assert.Equal(expected, range1.HasIntersect(range2));
  42. }
  43. [Fact]
  44. public void Intersect_WithOverlappingRanges_ShouldReturnIntersection()
  45. {
  46. var range1 = new DateTimeRange(new DateTime(2025, 1, 5), new DateTime(2025, 1, 15));
  47. var range2 = new DateTimeRange(new DateTime(2025, 1, 10), new DateTime(2025, 1, 20));
  48. var (intersected, range) = range1.Intersect(range2);
  49. Assert.True(intersected);
  50. Assert.Equal(new DateTime(2025, 1, 10), range.Start);
  51. Assert.Equal(new DateTime(2025, 1, 15), range.End);
  52. }
  53. [Fact]
  54. public void Intersect_WithNonOverlappingRanges_ShouldReturnFalse()
  55. {
  56. var range1 = new DateTimeRange(new DateTime(2025, 1, 5), new DateTime(2025, 1, 15));
  57. var range2 = new DateTimeRange(new DateTime(2025, 1, 20), new DateTime(2025, 1, 25));
  58. var (intersected, range) = range1.Intersect(range2);
  59. Assert.False(intersected);
  60. Assert.Null(range);
  61. }
  62. [Fact]
  63. public void Contains_WithOverlappingRange_ShouldReturnTrue_DueToIncorrectImplementation()
  64. {
  65. var range1 = new DateTimeRange(new DateTime(2025, 1, 1), new DateTime(2025, 1, 20));
  66. var range2 = new DateTimeRange(new DateTime(2025, 1, 15), new DateTime(2025, 1, 25));
  67. Assert.True(range1.Contains(range2));
  68. }
  69. [Fact]
  70. public void Contains_WithInnerRange_ShouldReturnTrue()
  71. {
  72. var outer = new DateTimeRange(new DateTime(2025, 1, 1), new DateTime(2025, 1, 31));
  73. var inner = new DateTimeRange(new DateTime(2025, 1, 10), new DateTime(2025, 1, 20));
  74. Assert.True(outer.Contains(inner));
  75. }
  76. [Fact]
  77. public void In_WithOuterRange_ShouldReturnTrue()
  78. {
  79. var inner = new DateTimeRange(new DateTime(2025, 1, 10), new DateTime(2025, 1, 20));
  80. var outer = new DateTimeRange(new DateTime(2025, 1, 1), new DateTime(2025, 1, 31));
  81. Assert.True(inner.In(outer));
  82. }
  83. [Fact]
  84. public void In_WithOverlappingRange_ShouldReturnTrue_DueToIncorrectImplementation()
  85. {
  86. var range1 = new DateTimeRange(new DateTime(2025, 1, 15), new DateTime(2025, 1, 25));
  87. var range2 = new DateTimeRange(new DateTime(2025, 1, 1), new DateTime(2025, 1, 20));
  88. Assert.True(range1.In(range2));
  89. }
  90. [Fact]
  91. public void Union_WithOverlappingRanges_ShouldReturnCombinedRange()
  92. {
  93. var range1 = new DateTimeRange(new DateTime(2025, 1, 5), new DateTime(2025, 1, 15));
  94. var range2 = new DateTimeRange(new DateTime(2025, 1, 10), new DateTime(2025, 1, 20));
  95. var union = range1.Union(range2);
  96. Assert.Equal(new DateTime(2025, 1, 5), union.Start);
  97. Assert.Equal(new DateTime(2025, 1, 20), union.End);
  98. }
  99. [Fact]
  100. public void Union_WithNonOverlappingRanges_ShouldThrowException()
  101. {
  102. var range1 = new DateTimeRange(new DateTime(2025, 1, 5), new DateTime(2025, 1, 15));
  103. var range2 = new DateTimeRange(new DateTime(2025, 1, 20), new DateTime(2025, 1, 25));
  104. Assert.Throws<Exception>(() => range1.Union(range2));
  105. }
  106. [Fact]
  107. public void ToString_ShouldReturnFormattedString()
  108. {
  109. var start = new DateTime(2025, 1, 1, 10, 30, 0);
  110. var end = new DateTime(2025, 1, 10, 18, 45, 0);
  111. var range = new DateTimeRange(start, end);
  112. var expected = "2025-01-01 10:30:00~2025-01-10 18:45:00";
  113. Assert.Equal(expected, range.ToString());
  114. }
  115. [Fact]
  116. public void Equals_WithSameDatesAndTimes_ShouldReturnTrue()
  117. {
  118. var start = new DateTime(2025, 1, 1, 10, 0, 0);
  119. var end = new DateTime(2025, 1, 10, 20, 0, 0);
  120. var range1 = new DateTimeRange(start, end);
  121. var range2 = new DateTimeRange(start, end);
  122. Assert.True(range1.Equals(range2));
  123. }
  124. [Fact]
  125. public void Equals_WithSameDatesDifferentTimes_ShouldReturnTrue_DueToDateOnlyComparison()
  126. {
  127. var start1 = new DateTime(2025, 1, 1, 10, 0, 0);
  128. var end1 = new DateTime(2025, 1, 10, 20, 0, 0);
  129. var start2 = new DateTime(2025, 1, 1, 12, 0, 0);
  130. var end2 = new DateTime(2025, 1, 10, 22, 0, 0);
  131. var range1 = new DateTimeRange(start1, end1);
  132. var range2 = new DateTimeRange(start2, end2);
  133. Assert.True(range1.Equals(range2));
  134. }
  135. [Fact]
  136. public void Equals_WithDifferentDates_ShouldReturnFalse()
  137. {
  138. var range1 = new DateTimeRange(new DateTime(2025, 1, 1), new DateTime(2025, 1, 10));
  139. var range2 = new DateTimeRange(new DateTime(2025, 2, 1), new DateTime(2025, 2, 10));
  140. Assert.False(range1.Equals(range2));
  141. }
  142. [Fact]
  143. public void Equals_WithDifferentObject_ShouldReturnFalse()
  144. {
  145. var range = new DateTimeRange(new DateTime(2025, 1, 1), new DateTime(2025, 1, 10));
  146. var other = new object();
  147. Assert.False(range.Equals(other));
  148. }
  149. }