123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- using System;
- using Masuit.Tools.Models;
- using Xunit;
- namespace Masuit.Tools.Abstractions.Test.DateTimeExt;
- public class DateTimeRangeTest
- {
- [Fact]
- public void Constructor_WithValidDates_ShouldCreateInstance()
- {
- var start = new DateTime(2025, 1, 1);
- var end = new DateTime(2025, 1, 10);
- var range = new DateTimeRange(start, end);
- Assert.Equal(start, range.Start);
- Assert.Equal(end, range.End);
- }
- [Fact]
- public void Constructor_StartAfterEnd_ShouldThrowException()
- {
- var start = new DateTime(2025, 1, 10);
- var end = new DateTime(2025, 1, 1);
- Assert.Throws<Exception>(() => new DateTimeRange(start, end));
- }
- [Fact]
- public void ParameterlessConstructor_ShouldCreateInstanceWithNulls()
- {
- var range = new DateTimeRange();
- Assert.Null(range.Start);
- Assert.Null(range.End);
- }
- [Theory]
- [InlineData("2025-01-05", "2025-01-15", "2025-01-10", "2025-01-20", true)] // Overlap
- [InlineData("2025-01-05", "2025-01-15", "2025-01-15", "2025-01-20", true)] // Touch at end
- [InlineData("2025-01-05", "2025-01-15", "2025-01-01", "2025-01-05", true)] // Touch at start
- [InlineData("2025-01-05", "2025-01-15", "2025-01-20", "2025-01-25", false)] // No overlap
- [InlineData("2025-01-01", "2025-01-31", "2025-01-10", "2025-01-20", true)] // Contain
- [InlineData("2025-01-10", "2025-01-20", "2025-01-01", "2025-01-31", true)] // Inside
- public void HasIntersect_ShouldReturnCorrectly(string s1, string e1, string s2, string e2, bool expected)
- {
- var range1 = new DateTimeRange(DateTime.Parse(s1), DateTime.Parse(e1));
- var range2 = new DateTimeRange(DateTime.Parse(s2), DateTime.Parse(e2));
- Assert.Equal(expected, range1.HasIntersect(range2));
- }
- [Fact]
- public void Intersect_WithOverlappingRanges_ShouldReturnIntersection()
- {
- var range1 = new DateTimeRange(new DateTime(2025, 1, 5), new DateTime(2025, 1, 15));
- var range2 = new DateTimeRange(new DateTime(2025, 1, 10), new DateTime(2025, 1, 20));
- var (intersected, range) = range1.Intersect(range2);
- Assert.True(intersected);
- Assert.Equal(new DateTime(2025, 1, 10), range.Start);
- Assert.Equal(new DateTime(2025, 1, 15), range.End);
- }
- [Fact]
- public void Intersect_WithNonOverlappingRanges_ShouldReturnFalse()
- {
- var range1 = new DateTimeRange(new DateTime(2025, 1, 5), new DateTime(2025, 1, 15));
- var range2 = new DateTimeRange(new DateTime(2025, 1, 20), new DateTime(2025, 1, 25));
- var (intersected, range) = range1.Intersect(range2);
- Assert.False(intersected);
- Assert.Null(range);
- }
- [Fact]
- public void Contains_WithOverlappingRange_ShouldReturnTrue_DueToIncorrectImplementation()
- {
- var range1 = new DateTimeRange(new DateTime(2025, 1, 1), new DateTime(2025, 1, 20));
- var range2 = new DateTimeRange(new DateTime(2025, 1, 15), new DateTime(2025, 1, 25));
- Assert.True(range1.Contains(range2));
- }
- [Fact]
- public void Contains_WithInnerRange_ShouldReturnTrue()
- {
- var outer = new DateTimeRange(new DateTime(2025, 1, 1), new DateTime(2025, 1, 31));
- var inner = new DateTimeRange(new DateTime(2025, 1, 10), new DateTime(2025, 1, 20));
- Assert.True(outer.Contains(inner));
- }
- [Fact]
- public void In_WithOuterRange_ShouldReturnTrue()
- {
- var inner = new DateTimeRange(new DateTime(2025, 1, 10), new DateTime(2025, 1, 20));
- var outer = new DateTimeRange(new DateTime(2025, 1, 1), new DateTime(2025, 1, 31));
- Assert.True(inner.In(outer));
- }
- [Fact]
- public void In_WithOverlappingRange_ShouldReturnTrue_DueToIncorrectImplementation()
- {
- var range1 = new DateTimeRange(new DateTime(2025, 1, 15), new DateTime(2025, 1, 25));
- var range2 = new DateTimeRange(new DateTime(2025, 1, 1), new DateTime(2025, 1, 20));
- Assert.True(range1.In(range2));
- }
- [Fact]
- public void Union_WithOverlappingRanges_ShouldReturnCombinedRange()
- {
- var range1 = new DateTimeRange(new DateTime(2025, 1, 5), new DateTime(2025, 1, 15));
- var range2 = new DateTimeRange(new DateTime(2025, 1, 10), new DateTime(2025, 1, 20));
- var union = range1.Union(range2);
- Assert.Equal(new DateTime(2025, 1, 5), union.Start);
- Assert.Equal(new DateTime(2025, 1, 20), union.End);
- }
- [Fact]
- public void Union_WithNonOverlappingRanges_ShouldThrowException()
- {
- var range1 = new DateTimeRange(new DateTime(2025, 1, 5), new DateTime(2025, 1, 15));
- var range2 = new DateTimeRange(new DateTime(2025, 1, 20), new DateTime(2025, 1, 25));
- Assert.Throws<Exception>(() => range1.Union(range2));
- }
- [Fact]
- public void ToString_ShouldReturnFormattedString()
- {
- var start = new DateTime(2025, 1, 1, 10, 30, 0);
- var end = new DateTime(2025, 1, 10, 18, 45, 0);
- var range = new DateTimeRange(start, end);
- var expected = "2025-01-01 10:30:00~2025-01-10 18:45:00";
- Assert.Equal(expected, range.ToString());
- }
- [Fact]
- public void Equals_WithSameDatesAndTimes_ShouldReturnTrue()
- {
- var start = new DateTime(2025, 1, 1, 10, 0, 0);
- var end = new DateTime(2025, 1, 10, 20, 0, 0);
- var range1 = new DateTimeRange(start, end);
- var range2 = new DateTimeRange(start, end);
- Assert.True(range1.Equals(range2));
- }
- [Fact]
- public void Equals_WithSameDatesDifferentTimes_ShouldReturnTrue_DueToDateOnlyComparison()
- {
- var start1 = new DateTime(2025, 1, 1, 10, 0, 0);
- var end1 = new DateTime(2025, 1, 10, 20, 0, 0);
- var start2 = new DateTime(2025, 1, 1, 12, 0, 0);
- var end2 = new DateTime(2025, 1, 10, 22, 0, 0);
- var range1 = new DateTimeRange(start1, end1);
- var range2 = new DateTimeRange(start2, end2);
- Assert.True(range1.Equals(range2));
- }
- [Fact]
- public void Equals_WithDifferentDates_ShouldReturnFalse()
- {
- var range1 = new DateTimeRange(new DateTime(2025, 1, 1), new DateTime(2025, 1, 10));
- var range2 = new DateTimeRange(new DateTime(2025, 2, 1), new DateTime(2025, 2, 10));
- Assert.False(range1.Equals(range2));
- }
- [Fact]
- public void Equals_WithDifferentObject_ShouldReturnFalse()
- {
- var range = new DateTimeRange(new DateTime(2025, 1, 1), new DateTime(2025, 1, 10));
- var other = new object();
- Assert.False(range.Equals(other));
- }
- }
|