diff --git a/DavidBerry.Framework/DavidBerry.Framework.Tests/Util/ITimePeriodExtensionsTests.cs b/DavidBerry.Framework/DavidBerry.Framework.Tests/Util/ITimePeriodExtensionsTests.cs new file mode 100644 index 0000000..cdba95d --- /dev/null +++ b/DavidBerry.Framework/DavidBerry.Framework.Tests/Util/ITimePeriodExtensionsTests.cs @@ -0,0 +1,224 @@ +using DavidBerry.Framework.Util; +using Shouldly; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace DavidBerry.Framework.Tests.Util; + +public class ITimePeriodExtensionsTests +{ + + + + private class TimePeriod : ITimePeriod + { + public DateTime StartTime { get; set; } + public DateTime EndTime { get; set; } + public TimePeriod(DateTime startTime, DateTime endTime) + { + StartTime = startTime; + EndTime = endTime; + } + } + + + [Fact] + public void TestOverlapsReturnsTrueWhenPeriodsAreTheSame() + { + // Arrange + var period1 = new TimePeriod(DateTime.Parse("2024-10-18T11:00:00"), DateTime.Parse("2024-10-18T13:00:00")); + var period2 = new TimePeriod(DateTime.Parse("2024-10-18T11:00:00"), DateTime.Parse("2024-10-18T13:00:00")); + + // Act + bool overlaps = period1.Overlaps(period2); // Should be true + + // Assert + overlaps.ShouldBeTrue(); + } + + + [Fact] + public void TestOverlapsReturnsTrueWhenPeriodOneEndsDuringPeriodTwo() + { + // Arrange + var period1 = new TimePeriod(DateTime.Parse("2024-10-18T11:00:00"), DateTime.Parse("2024-10-18T14:00:00")); + var period2 = new TimePeriod(DateTime.Parse("2024-10-18T12:00:00"), DateTime.Parse("2024-10-18T16:00:00")); + + // Act + bool overlaps = period1.Overlaps(period2); // Should be true + + // Assert + overlaps.ShouldBeTrue(); + } + + + + [Fact] + public void TestOverlapsReturnsTrueWhenPeriodTwoEndsDuringPeriodOne() + { + // Arrange + var period1 = new TimePeriod(DateTime.Parse("2024-10-18T11:00:00"), DateTime.Parse("2024-10-18T14:00:00")); + var period2 = new TimePeriod(DateTime.Parse("2024-10-18T09:00:00"), DateTime.Parse("2024-10-18T12:00:00")); + + // Act + bool overlaps = period1.Overlaps(period2); // Should be true + + // Assert + overlaps.ShouldBeTrue(); + } + + + [Fact] + public void TestOverlapsReturnFalseWhenPeriodOneIsBeforePeriodTwo() + { + // Arrange + var period1 = new TimePeriod(DateTime.Parse("2024-10-18T11:00:00"), DateTime.Parse("2024-10-18T13:00:00")); + var period2 = new TimePeriod(DateTime.Parse("2024-10-18T14:00:00"), DateTime.Parse("2024-10-18T17:00:00")); + + // Act + bool overlaps = period1.Overlaps(period2); // Should be true + + // Assert + overlaps.ShouldBeFalse(); + } + + + + [Fact] + public void TestOverlapsReturnFalseWhenPeriodTwoIsBeforePeriodOne() + { + // Arrange + var period1 = new TimePeriod(DateTime.Parse("2024-10-18T11:00:00"), DateTime.Parse("2024-10-18T13:00:00")); + var period2 = new TimePeriod(DateTime.Parse("2024-10-18T09:00:00"), DateTime.Parse("2024-10-18T10:00:00")); + + // Act + bool overlaps = period1.Overlaps(period2); // Should be true + + // Assert + overlaps.ShouldBeFalse(); + } + + + + [Fact] + public void TestOverlapsReturnFalseWhenPeriodTwoStartsWhenPeriodOneEndse() + { + // Arrange + var period1 = new TimePeriod(DateTime.Parse("2024-10-18T11:00:00"), DateTime.Parse("2024-10-18T13:00:00")); + var period2 = new TimePeriod(DateTime.Parse("2024-10-18T13:00:00"), DateTime.Parse("2024-10-18T15:00:00")); + + // Act + bool overlaps = period1.Overlaps(period2); // Should be true + + // Assert + overlaps.ShouldBeFalse(); + } + + + [Fact] + public void TestOverlapsReturnFalseWhenPeriodOneStartsWhenPeriodTwoEndse() + { + // Arrange + var period1 = new TimePeriod(DateTime.Parse("2024-10-18T11:00:00"), DateTime.Parse("2024-10-18T13:00:00")); + var period2 = new TimePeriod(DateTime.Parse("2024-10-18T09:00:00"), DateTime.Parse("2024-10-18T11:00:00")); + + // Act + bool overlaps = period1.Overlaps(period2); // Should be true + + // Assert + overlaps.ShouldBeFalse(); + } + + + [Fact] + public void TestContainsResturnsTrueWhenDateTimeIsWithinPeriod() + { + // Arrange + var period = new TimePeriod(DateTime.Parse("2024-10-18T11:00:00"), DateTime.Parse("2024-10-18T13:00:00")); + var dateTime = DateTime.Parse("2024-10-18T12:00:00"); + + // Act + bool contains = period.Contains(dateTime); // Should be true + + // Assert + contains.ShouldBeTrue(); + } + + [Fact] + public void TestContainsResturnsFalseWhenDateTimeIsOutsidePeriod() + { + // Arrange + var period = new TimePeriod(DateTime.Parse("2024-10-18T11:00:00"), DateTime.Parse("2024-10-18T13:00:00")); + var dateTime = DateTime.Parse("2024-10-18T14:00:00"); + + // Act + bool contains = period.Contains(dateTime); // Should be true + + // Assert + contains.ShouldBeFalse(); + } + + [Fact] + public void TestDurationReturnsCorrectTimeSpan() + { + // Arrange + var period = new TimePeriod(DateTime.Parse("2024-10-18T11:00:00"), DateTime.Parse("2024-10-18T13:30:00")); + + // Act + TimeSpan duration = period.Duration(); // Should be 2 hours and 30 minutes + + // Assert + duration.ShouldBe(TimeSpan.FromHours(2.5)); + } + + [Fact] + public void TestIsInsideReturnsTrueWhenPeriodTwoInsidePeriodOne() + { + // Arrange + var period1 = new TimePeriod(DateTime.Parse("2024-10-18T11:00:00"), DateTime.Parse("2024-10-18T16:00:00")); + var period2 = new TimePeriod(DateTime.Parse("2024-10-18T12:00:00"), DateTime.Parse("2024-10-18T13:00:00")); + + // Act + bool isInside = period2.IsInside(period1); // Should be true + + // Assert + isInside.ShouldBeTrue(); + } + + + + [Fact] + public void TestIsInsideReturnsFalseWhenPeriodOneEncompassesPeriodTwo() + { + // Arrange + var period1 = new TimePeriod(DateTime.Parse("2024-10-18T11:00:00"), DateTime.Parse("2024-10-18T16:00:00")); + var period2 = new TimePeriod(DateTime.Parse("2024-10-18T12:00:00"), DateTime.Parse("2024-10-18T13:00:00")); + + // Act + bool isInside = period1.IsInside(period2); // Should be false + + // Assert + isInside.ShouldBeFalse(); + } + + + [Fact] + public void TestIsInsideReturnsFalseWhenPeriodsOverlapButAreNotInside() + { + // Arrange + var period1 = new TimePeriod(DateTime.Parse("2024-10-18T11:00:00"), DateTime.Parse("2024-10-18T14:00:00")); + var period2 = new TimePeriod(DateTime.Parse("2024-10-18T12:00:00"), DateTime.Parse("2024-10-18T16:00:00")); + + // Act + bool overlaps = period1.IsInside(period2); // Should be False + + // Assert + overlaps.ShouldBeFalse(); + } + + +} \ No newline at end of file diff --git a/DavidBerry.Framework/DavidBerry.Framework/Util/ITimePeriod.cs b/DavidBerry.Framework/DavidBerry.Framework/Util/ITimePeriod.cs new file mode 100644 index 0000000..b9c8a90 --- /dev/null +++ b/DavidBerry.Framework/DavidBerry.Framework/Util/ITimePeriod.cs @@ -0,0 +1,45 @@ +using Microsoft.EntityFrameworkCore.Diagnostics; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DavidBerry.Framework.Util; + +public interface ITimePeriod +{ + + public DateTime StartTime { get; } + + public DateTime EndTime { get; } + +} + + + +public static class ITimePeriodExtensions +{ + + public static bool Overlaps(this ITimePeriod period1, ITimePeriod period2) + { + return period1.StartTime < period2.EndTime && period2.StartTime < period1.EndTime; + } + + public static bool Contains(this ITimePeriod period, DateTime dateTime) + { + return period.StartTime <= dateTime && dateTime <= period.EndTime; + } + + public static TimeSpan Duration(this ITimePeriod period) + { + return period.EndTime - period.StartTime; + } + + public static bool IsInside(this ITimePeriod innerPeriod, ITimePeriod outerPeriod) + { + return outerPeriod.StartTime <= innerPeriod.StartTime && innerPeriod.EndTime <= outerPeriod.EndTime; + } + + +} \ No newline at end of file