diff --git a/TUnit.Assertions.Tests/DateTimeAssertionTests.cs b/TUnit.Assertions.Tests/DateTimeAssertionTests.cs index 0a73e2653e..d87c8a641c 100644 --- a/TUnit.Assertions.Tests/DateTimeAssertionTests.cs +++ b/TUnit.Assertions.Tests/DateTimeAssertionTests.cs @@ -210,4 +210,58 @@ public async Task Test_DateTime_IsNotDaylightSavingTime() await Assert.That(winterDate).IsNotDaylightSavingTime(); } } + + [Test] + public async Task Test_DateTime_IsAfter() + { + var dateTimeBefore = new DateTime(2024, 1, 1, 12, 0, 0); + var dateTimeAfter = new DateTime(2024, 1, 2, 12, 0, 0); + await Assert.That(dateTimeAfter).IsAfter(dateTimeBefore); + } + + [Test] + public async Task Test_DateTime_IsAfter_SameTime_Fails() + { + var dateTime = new DateTime(2024, 1, 1, 12, 0, 0); + await Assert.That(async () => await Assert.That(dateTime).IsAfter(dateTime)) + .ThrowsException(); + } + + [Test] + public async Task Test_DateTime_IsBefore() + { + var dateTimeBefore = new DateTime(2024, 1, 1, 12, 0, 0); + var dateTimeAfter = new DateTime(2024, 1, 2, 12, 0, 0); + await Assert.That(dateTimeBefore).IsBefore(dateTimeAfter); + } + + [Test] + public async Task Test_DateTime_IsBefore_SameTime_Fails() + { + var dateTime = new DateTime(2024, 1, 1, 12, 0, 0); + await Assert.That(async () => await Assert.That(dateTime).IsBefore(dateTime)) + .ThrowsException(); + } + + [Test] + public async Task Test_DateTime_IsBeforeOrEqualTo() + { + var dateTimeBefore = new DateTime(2024, 1, 1, 12, 0, 0); + var dateTimeAfter = new DateTime(2024, 1, 2, 12, 0, 0); + await Assert.That(dateTimeBefore).IsBeforeOrEqualTo(dateTimeAfter); + } + + [Test] + public async Task Test_DateTime_IsBeforeOrEqualTo_SameTime() + { + var dateTime = new DateTime(2024, 1, 1, 12, 0, 0); + await Assert.That(dateTime).IsBeforeOrEqualTo(dateTime); + } + + [Test] + public async Task Test_DateTime_IsAfterOrEqualTo_SameTime() + { + var dateTime = new DateTime(2024, 1, 1, 12, 0, 0); + await Assert.That(dateTime).IsAfterOrEqualTo(dateTime); + } } diff --git a/TUnit.Assertions.Tests/DateTimeOffsetAssertionTests.cs b/TUnit.Assertions.Tests/DateTimeOffsetAssertionTests.cs index ea2c15c005..b8a8434c39 100644 --- a/TUnit.Assertions.Tests/DateTimeOffsetAssertionTests.cs +++ b/TUnit.Assertions.Tests/DateTimeOffsetAssertionTests.cs @@ -189,4 +189,66 @@ public async Task Test_DateTimeOffset_IsOnWeekday_Wednesday() var wednesday = new DateTimeOffset(daysUntilWednesday == 0 ? today : today.AddDays(daysUntilWednesday)); await Assert.That(wednesday).IsOnWeekday(); } + + [Test] + public async Task Test_DateTimeOffset_IsAfter() + { + var before = new DateTimeOffset(2024, 1, 1, 12, 0, 0, TimeSpan.Zero); + var after = new DateTimeOffset(2024, 1, 2, 12, 0, 0, TimeSpan.Zero); + await Assert.That(after).IsAfter(before); + } + + [Test] + public async Task Test_DateTimeOffset_IsAfter_SameTime_Fails() + { + var dateTimeOffset = new DateTimeOffset(2024, 1, 1, 12, 0, 0, TimeSpan.Zero); + await Assert.That(async () => await Assert.That(dateTimeOffset).IsAfter(dateTimeOffset)) + .ThrowsException(); + } + + [Test] + public async Task Test_DateTimeOffset_IsBefore() + { + var before = new DateTimeOffset(2024, 1, 1, 12, 0, 0, TimeSpan.Zero); + var after = new DateTimeOffset(2024, 1, 2, 12, 0, 0, TimeSpan.Zero); + await Assert.That(before).IsBefore(after); + } + + [Test] + public async Task Test_DateTimeOffset_IsBefore_SameTime_Fails() + { + var dateTimeOffset = new DateTimeOffset(2024, 1, 1, 12, 0, 0, TimeSpan.Zero); + await Assert.That(async () => await Assert.That(dateTimeOffset).IsBefore(dateTimeOffset)) + .ThrowsException(); + } + + [Test] + public async Task Test_DateTimeOffset_IsAfterOrEqualTo() + { + var before = new DateTimeOffset(2024, 1, 1, 12, 0, 0, TimeSpan.Zero); + var after = new DateTimeOffset(2024, 1, 2, 12, 0, 0, TimeSpan.Zero); + await Assert.That(after).IsAfterOrEqualTo(before); + } + + [Test] + public async Task Test_DateTimeOffset_IsAfterOrEqualTo_SameTime() + { + var dateTimeOffset = new DateTimeOffset(2024, 1, 1, 12, 0, 0, TimeSpan.Zero); + await Assert.That(dateTimeOffset).IsAfterOrEqualTo(dateTimeOffset); + } + + [Test] + public async Task Test_DateTimeOffset_IsBeforeOrEqualTo() + { + var before = new DateTimeOffset(2024, 1, 1, 12, 0, 0, TimeSpan.Zero); + var after = new DateTimeOffset(2024, 1, 2, 12, 0, 0, TimeSpan.Zero); + await Assert.That(before).IsBeforeOrEqualTo(after); + } + + [Test] + public async Task Test_DateTimeOffset_IsBeforeOrEqualTo_SameTime() + { + var dateTimeOffset = new DateTimeOffset(2024, 1, 1, 12, 0, 0, TimeSpan.Zero); + await Assert.That(dateTimeOffset).IsBeforeOrEqualTo(dateTimeOffset); + } } diff --git a/TUnit.Assertions/Extensions/AssertionExtensions.cs b/TUnit.Assertions/Extensions/AssertionExtensions.cs index 69b03d78f6..794176e0a1 100644 --- a/TUnit.Assertions/Extensions/AssertionExtensions.cs +++ b/TUnit.Assertions/Extensions/AssertionExtensions.cs @@ -1518,6 +1518,203 @@ public static GreaterThanOrEqualAssertion IsAfterOrEqualTo( return new GreaterThanOrEqualAssertion(source.Context, expected); } + /// + /// Asserts that the DateTime is after the expected DateTime. + /// Alias for IsGreaterThan for better readability with dates. + /// + public static GreaterThanAssertion IsAfter( + this IAssertionSource source, + DateTime expected, + [CallerArgumentExpression(nameof(expected))] string? expression = null) + { + source.Context.ExpressionBuilder.Append($".IsAfter({expression})"); + return new GreaterThanAssertion(source.Context, expected); + } + + /// + /// Asserts that the DateTime is before the expected DateTime. + /// Alias for IsLessThan for better readability with dates. + /// + public static LessThanAssertion IsBefore( + this IAssertionSource source, + DateTime expected, + [CallerArgumentExpression(nameof(expected))] string? expression = null) + { + source.Context.ExpressionBuilder.Append($".IsBefore({expression})"); + return new LessThanAssertion(source.Context, expected); + } + + /// + /// Asserts that the DateTime is before or equal to the expected DateTime. + /// Alias for IsLessThanOrEqualTo for better readability with dates. + /// + public static LessThanOrEqualAssertion IsBeforeOrEqualTo( + this IAssertionSource source, + DateTime expected, + [CallerArgumentExpression(nameof(expected))] string? expression = null) + { + source.Context.ExpressionBuilder.Append($".IsBeforeOrEqualTo({expression})"); + return new LessThanOrEqualAssertion(source.Context, expected); + } + + /// + /// Asserts that the DateTimeOffset is after the expected DateTimeOffset. + /// Alias for IsGreaterThan for better readability with dates. + /// + public static GreaterThanAssertion IsAfter( + this IAssertionSource source, + DateTimeOffset expected, + [CallerArgumentExpression(nameof(expected))] string? expression = null) + { + source.Context.ExpressionBuilder.Append($".IsAfter({expression})"); + return new GreaterThanAssertion(source.Context, expected); + } + + /// + /// Asserts that the DateTimeOffset is before the expected DateTimeOffset. + /// Alias for IsLessThan for better readability with dates. + /// + public static LessThanAssertion IsBefore( + this IAssertionSource source, + DateTimeOffset expected, + [CallerArgumentExpression(nameof(expected))] string? expression = null) + { + source.Context.ExpressionBuilder.Append($".IsBefore({expression})"); + return new LessThanAssertion(source.Context, expected); + } + + /// + /// Asserts that the DateTimeOffset is after or equal to the expected DateTimeOffset. + /// Alias for IsGreaterThanOrEqualTo for better readability with dates. + /// + public static GreaterThanOrEqualAssertion IsAfterOrEqualTo( + this IAssertionSource source, + DateTimeOffset expected, + [CallerArgumentExpression(nameof(expected))] string? expression = null) + { + source.Context.ExpressionBuilder.Append($".IsAfterOrEqualTo({expression})"); + return new GreaterThanOrEqualAssertion(source.Context, expected); + } + + /// + /// Asserts that the DateTimeOffset is before or equal to the expected DateTimeOffset. + /// Alias for IsLessThanOrEqualTo for better readability with dates. + /// + public static LessThanOrEqualAssertion IsBeforeOrEqualTo( + this IAssertionSource source, + DateTimeOffset expected, + [CallerArgumentExpression(nameof(expected))] string? expression = null) + { + source.Context.ExpressionBuilder.Append($".IsBeforeOrEqualTo({expression})"); + return new LessThanOrEqualAssertion(source.Context, expected); + } + +#if NET6_0_OR_GREATER + /// + /// Asserts that the DateOnly is after the expected DateOnly. + /// Alias for IsGreaterThan for better readability with dates. + /// + public static GreaterThanAssertion IsAfter( + this IAssertionSource source, + DateOnly expected, + [CallerArgumentExpression(nameof(expected))] string? expression = null) + { + source.Context.ExpressionBuilder.Append($".IsAfter({expression})"); + return new GreaterThanAssertion(source.Context, expected); + } + + /// + /// Asserts that the DateOnly is before the expected DateOnly. + /// Alias for IsLessThan for better readability with dates. + /// + public static LessThanAssertion IsBefore( + this IAssertionSource source, + DateOnly expected, + [CallerArgumentExpression(nameof(expected))] string? expression = null) + { + source.Context.ExpressionBuilder.Append($".IsBefore({expression})"); + return new LessThanAssertion(source.Context, expected); + } + + /// + /// Asserts that the DateOnly is after or equal to the expected DateOnly. + /// Alias for IsGreaterThanOrEqualTo for better readability with dates. + /// + public static GreaterThanOrEqualAssertion IsAfterOrEqualTo( + this IAssertionSource source, + DateOnly expected, + [CallerArgumentExpression(nameof(expected))] string? expression = null) + { + source.Context.ExpressionBuilder.Append($".IsAfterOrEqualTo({expression})"); + return new GreaterThanOrEqualAssertion(source.Context, expected); + } + + /// + /// Asserts that the DateOnly is before or equal to the expected DateOnly. + /// Alias for IsLessThanOrEqualTo for better readability with dates. + /// + public static LessThanOrEqualAssertion IsBeforeOrEqualTo( + this IAssertionSource source, + DateOnly expected, + [CallerArgumentExpression(nameof(expected))] string? expression = null) + { + source.Context.ExpressionBuilder.Append($".IsBeforeOrEqualTo({expression})"); + return new LessThanOrEqualAssertion(source.Context, expected); + } + + /// + /// Asserts that the TimeOnly is after the expected TimeOnly. + /// Alias for IsGreaterThan for better readability with times. + /// + public static GreaterThanAssertion IsAfter( + this IAssertionSource source, + TimeOnly expected, + [CallerArgumentExpression(nameof(expected))] string? expression = null) + { + source.Context.ExpressionBuilder.Append($".IsAfter({expression})"); + return new GreaterThanAssertion(source.Context, expected); + } + + /// + /// Asserts that the TimeOnly is before the expected TimeOnly. + /// Alias for IsLessThan for better readability with times. + /// + public static LessThanAssertion IsBefore( + this IAssertionSource source, + TimeOnly expected, + [CallerArgumentExpression(nameof(expected))] string? expression = null) + { + source.Context.ExpressionBuilder.Append($".IsBefore({expression})"); + return new LessThanAssertion(source.Context, expected); + } + + /// + /// Asserts that the TimeOnly is after or equal to the expected TimeOnly. + /// Alias for IsGreaterThanOrEqualTo for better readability with times. + /// + public static GreaterThanOrEqualAssertion IsAfterOrEqualTo( + this IAssertionSource source, + TimeOnly expected, + [CallerArgumentExpression(nameof(expected))] string? expression = null) + { + source.Context.ExpressionBuilder.Append($".IsAfterOrEqualTo({expression})"); + return new GreaterThanOrEqualAssertion(source.Context, expected); + } + + /// + /// Asserts that the TimeOnly is before or equal to the expected TimeOnly. + /// Alias for IsLessThanOrEqualTo for better readability with times. + /// + public static LessThanOrEqualAssertion IsBeforeOrEqualTo( + this IAssertionSource source, + TimeOnly expected, + [CallerArgumentExpression(nameof(expected))] string? expression = null) + { + source.Context.ExpressionBuilder.Append($".IsBeforeOrEqualTo({expression})"); + return new LessThanOrEqualAssertion(source.Context, expected); + } +#endif + // IsDefault and IsNotDefault are now generated by AssertionExtensionGenerator // ============ TIMING ASSERTIONS ============ diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt index bbb838e56f..acf25fdd17 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet10_0.verified.txt @@ -1694,9 +1694,24 @@ namespace .Extensions where TEnum : struct, { } public static . HasSingleItem(this . source) where TValue : .IEnumerable { } + public static .<> IsAfter(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsAfter(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsAfter(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsAfter(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsAfterOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsAfterOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsAfterOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } public static .<> IsAfterOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } public static . IsAssignableTo(this . source) { } public static . IsAssignableTo(this . source) { } + public static .<> IsBefore(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsBefore(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsBefore(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsBefore(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsBeforeOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsBeforeOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsBeforeOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsBeforeOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } public static ..IsDefinedAssertion IsDefined(this . source) where TEnum : struct, { } public static . IsEmpty(this . source) diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt index c0bb464850..c50907409b 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet8_0.verified.txt @@ -1694,9 +1694,24 @@ namespace .Extensions where TEnum : struct, { } public static . HasSingleItem(this . source) where TValue : .IEnumerable { } + public static .<> IsAfter(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsAfter(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsAfter(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsAfter(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsAfterOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsAfterOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsAfterOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } public static .<> IsAfterOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } public static . IsAssignableTo(this . source) { } public static . IsAssignableTo(this . source) { } + public static .<> IsBefore(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsBefore(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsBefore(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsBefore(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsBeforeOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsBeforeOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsBeforeOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsBeforeOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } public static ..IsDefinedAssertion IsDefined(this . source) where TEnum : struct, { } public static . IsEmpty(this . source) diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt index 62e5f4c4fe..9393d48762 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.DotNet9_0.verified.txt @@ -1694,9 +1694,24 @@ namespace .Extensions where TEnum : struct, { } public static . HasSingleItem(this . source) where TValue : .IEnumerable { } + public static .<> IsAfter(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsAfter(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsAfter(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsAfter(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsAfterOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsAfterOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsAfterOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } public static .<> IsAfterOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } public static . IsAssignableTo(this . source) { } public static . IsAssignableTo(this . source) { } + public static .<> IsBefore(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsBefore(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsBefore(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsBefore(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsBeforeOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsBeforeOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsBeforeOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsBeforeOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } public static ..IsDefinedAssertion IsDefined(this . source) where TEnum : struct, { } public static . IsEmpty(this . source) diff --git a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt index bed7efbb80..95ce6230ae 100644 --- a/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt +++ b/TUnit.PublicAPI/Tests.Assertions_Library_Has_No_API_Changes.Net4_7.verified.txt @@ -1599,9 +1599,16 @@ namespace .Extensions where TEnum : struct, { } public static . HasSingleItem(this . source) where TValue : .IEnumerable { } + public static .<> IsAfter(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsAfter(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsAfterOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } public static .<> IsAfterOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } public static . IsAssignableTo(this . source) { } public static . IsAssignableTo(this . source) { } + public static .<> IsBefore(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsBefore(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsBeforeOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } + public static .<> IsBeforeOrEqualTo(this .<> source, expected, [.("expected")] string? expression = null) { } public static ..IsDefinedAssertion IsDefined(this . source) where TEnum : struct, { } public static . IsEmpty(this . source)